More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xb428771cf5ce0006f0fed6d41e11dfe4904e683bc9f5e0fe5744adad16fbf2b0 | Convert By Path | (pending) | 6 days ago | IN | 0.00113 ETH | (Pending) | |||
Convert By Path | 22054968 | 2 hrs ago | IN | 0.04 ETH | 0.00028924 | ||||
Convert By Path | 22054920 | 2 hrs ago | IN | 0.027 ETH | 0.00028603 | ||||
Convert By Path | 22054408 | 4 hrs ago | IN | 0.63421 ETH | 0.00061511 | ||||
Convert By Path | 22053459 | 7 hrs ago | IN | 0.03435 ETH | 0.00010738 | ||||
Convert By Path | 22052238 | 11 hrs ago | IN | 0 ETH | 0.00019 | ||||
Convert By Path | 22043321 | 41 hrs ago | IN | 0.00002546 ETH | 0.00020778 | ||||
Convert By Path | 22039568 | 2 days ago | IN | 0.06 ETH | 0.00026557 | ||||
Convert By Path | 22038355 | 2 days ago | IN | 0 ETH | 0.00022386 | ||||
Convert By Path | 22037907 | 2 days ago | IN | 0.05 ETH | 0.00021676 | ||||
Convert By Path | 22037903 | 2 days ago | IN | 0.15 ETH | 0.00021584 | ||||
Convert By Path | 22037505 | 2 days ago | IN | 0 ETH | 0.00012609 | ||||
Convert By Path | 22031107 | 3 days ago | IN | 0.00002445 ETH | 0.00041788 | ||||
Convert By Path | 22028773 | 3 days ago | IN | 0.65307 ETH | 0.00044474 | ||||
Convert By Path | 22028342 | 3 days ago | IN | 0 ETH | 0.00017159 | ||||
Convert By Path | 22027960 | 3 days ago | IN | 0 ETH | 0.00016165 | ||||
Convert By Path | 22025706 | 4 days ago | IN | 0 ETH | 0.00034065 | ||||
Convert By Path | 22025651 | 4 days ago | IN | 0 ETH | 0.00067477 | ||||
Convert By Path | 22024074 | 4 days ago | IN | 0 ETH | 0.00033157 | ||||
Convert By Path | 22023495 | 4 days ago | IN | 0 ETH | 0.00019911 | ||||
Convert By Path | 22022876 | 4 days ago | IN | 0.00005 ETH | 0.00029487 | ||||
Convert By Path | 22021683 | 4 days ago | IN | 0.02775258 ETH | 0.00057338 | ||||
Convert By Path | 22020840 | 4 days ago | IN | 0.00001489 ETH | 0.00018896 | ||||
Convert By Path | 22019150 | 5 days ago | IN | 0 ETH | 0.00062 | ||||
Convert By Path | 22018772 | 5 days ago | IN | 0 ETH | 0.00104737 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Convert | 22055506 | 43 mins ago | 0.55821703 ETH | ||||
Convert By Path | 22055506 | 43 mins ago | 0.55821703 ETH | ||||
Convert | 22055463 | 52 mins ago | 0.30351561 ETH | ||||
Convert By Path | 22055463 | 52 mins ago | 0.30351561 ETH | ||||
Convert | 22055434 | 58 mins ago | 0.58183592 ETH | ||||
Convert By Path | 22055434 | 58 mins ago | 0.58183592 ETH | ||||
Convert | 22055429 | 1 hrs ago | 0.44570311 ETH | ||||
Convert By Path | 22055429 | 1 hrs ago | 0.44570311 ETH | ||||
Convert | 22055408 | 1 hr ago | 0.25048826 ETH | ||||
Convert By Path | 22055408 | 1 hr ago | 0.25048826 ETH | ||||
Convert | 22055339 | 1 hr ago | 0.17699999 ETH | ||||
Convert By Path | 22055339 | 1 hr ago | 0.17699999 ETH | ||||
Convert | 22055059 | 2 hrs ago | 0.52499998 ETH | ||||
Convert By Path | 22055059 | 2 hrs ago | 0.52499998 ETH | ||||
Convert | 22055058 | 2 hrs ago | 0.37460935 ETH | ||||
Convert By Path | 22055058 | 2 hrs ago | 0.37460935 ETH | ||||
Convert | 22054968 | 2 hrs ago | 0.04 ETH | ||||
Convert | 22054928 | 2 hrs ago | 0.64921873 ETH | ||||
Convert By Path | 22054928 | 2 hrs ago | 0.64921873 ETH | ||||
Convert | 22054920 | 2 hrs ago | 0.027 ETH | ||||
Convert | 22054665 | 3 hrs ago | 0.15953113 ETH | ||||
Convert By Path | 22054665 | 3 hrs ago | 0.15953113 ETH | ||||
Convert | 22054622 | 3 hrs ago | 0.00275357 ETH | ||||
Convert | 22054622 | 3 hrs ago | 0.00275357 ETH | ||||
Convert | 22054534 | 3 hrs ago | 0.07267647 ETH |
Loading...
Loading
Contract Name:
BancorNetwork
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-18 */ // File: contracts/token/interfaces/IERC20Token.sol pragma solidity 0.4.26; /* ERC20 Standard Token interface */ contract IERC20Token { // these functions aren't abstract since the compiler emits automatically generated getter functions as external function name() public view returns (string) {this;} function symbol() public view returns (string) {this;} function decimals() public view returns (uint8) {this;} function totalSupply() public view returns (uint256) {this;} function balanceOf(address _owner) public view returns (uint256) {_owner; this;} function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;} function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); } // File: contracts/IBancorNetwork.sol pragma solidity 0.4.26; /* Bancor Network interface */ contract IBancorNetwork { function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); // deprecated, backward compatibility function convert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public returns (uint256); // deprecated, backward compatibility function convertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public returns (uint256); } // File: contracts/IConversionPathFinder.sol pragma solidity 0.4.26; /* Conversion Path Finder interface */ contract IConversionPathFinder { function findPath(address _sourceToken, address _targetToken) public view returns (address[] memory); } // File: contracts/utility/interfaces/IOwned.sol pragma solidity 0.4.26; /* Owned contract interface */ contract IOwned { // this function isn't abstract since the compiler emits automatically generated getter functions as external function owner() public view returns (address) {this;} function transferOwnership(address _newOwner) public; function acceptOwnership() public; } // File: contracts/utility/interfaces/ITokenHolder.sol pragma solidity 0.4.26; /* Token Holder interface */ contract ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; } // File: contracts/converter/interfaces/IConverterAnchor.sol pragma solidity 0.4.26; /* Converter Anchor interface */ contract IConverterAnchor is IOwned, ITokenHolder { } // File: contracts/utility/interfaces/IWhitelist.sol pragma solidity 0.4.26; /* Whitelist interface */ contract IWhitelist { function isWhitelisted(address _address) public view returns (bool); } // File: contracts/converter/interfaces/IConverter.sol pragma solidity 0.4.26; /* Converter interface */ contract IConverter is IOwned { function converterType() public pure returns (uint16); function anchor() public view returns (IConverterAnchor) {this;} function isActive() public view returns (bool); function rateAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256); function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address _beneficiary) public payable returns (uint256); function conversionWhitelist() public view returns (IWhitelist) {this;} function conversionFee() public view returns (uint32) {this;} function maxConversionFee() public view returns (uint32) {this;} function reserveBalance(IERC20Token _reserveToken) public view returns (uint256); function() external payable; function transferAnchorOwnership(address _newOwner) public; function acceptAnchorOwnership() public; function setConversionFee(uint32 _conversionFee) public; function setConversionWhitelist(IWhitelist _whitelist) public; function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; function withdrawETH(address _to) public; function addReserve(IERC20Token _token, uint32 _ratio) public; // deprecated, backward compatibility function token() public view returns (IConverterAnchor); function transferTokenOwnership(address _newOwner) public; function acceptTokenOwnership() public; function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool); function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256); function connectorTokens(uint256 _index) public view returns (IERC20Token); function connectorTokenCount() public view returns (uint16); } // File: contracts/converter/interfaces/IBancorFormula.sol pragma solidity 0.4.26; /* Bancor Formula interface */ contract IBancorFormula { function purchaseRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function saleRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function crossReserveRate(uint256 _sourceReserveBalance, uint32 _sourceReserveWeight, uint256 _targetReserveBalance, uint32 _targetReserveWeight, uint256 _amount) public view returns (uint256); function fundCost(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); function liquidateRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); } // File: contracts/utility/Owned.sol pragma solidity 0.4.26; /** * @dev Provides support and utilities for contract ownership */ contract Owned is IOwned { address public owner; address public newOwner; /** * @dev triggered when the owner is updated * * @param _prevOwner previous owner * @param _newOwner new owner */ event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner); /** * @dev initializes a new Owned instance */ constructor() public { owner = msg.sender; } // allows execution by the owner only modifier ownerOnly { _ownerOnly(); _; } // error message binary size optimization function _ownerOnly() internal view { require(msg.sender == owner, "ERR_ACCESS_DENIED"); } /** * @dev allows transferring the contract ownership * the new owner still needs to accept the transfer * can only be called by the contract owner * * @param _newOwner new contract owner */ function transferOwnership(address _newOwner) public ownerOnly { require(_newOwner != owner, "ERR_SAME_OWNER"); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() public { require(msg.sender == newOwner, "ERR_ACCESS_DENIED"); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: contracts/utility/Utils.sol pragma solidity 0.4.26; /** * @dev Utilities & Common Modifiers */ contract Utils { // verifies that a value is greater than zero modifier greaterThanZero(uint256 _value) { _greaterThanZero(_value); _; } // error message binary size optimization function _greaterThanZero(uint256 _value) internal pure { require(_value > 0, "ERR_ZERO_VALUE"); } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { _validAddress(_address); _; } // error message binary size optimization function _validAddress(address _address) internal pure { require(_address != address(0), "ERR_INVALID_ADDRESS"); } // verifies that the address is different than this contract address modifier notThis(address _address) { _notThis(_address); _; } // error message binary size optimization function _notThis(address _address) internal view { require(_address != address(this), "ERR_ADDRESS_IS_SELF"); } } // File: contracts/utility/interfaces/IContractRegistry.sol pragma solidity 0.4.26; /* Contract Registry interface */ contract IContractRegistry { function addressOf(bytes32 _contractName) public view returns (address); // deprecated, backward compatibility function getAddress(bytes32 _contractName) public view returns (address); } // File: contracts/utility/ContractRegistryClient.sol pragma solidity 0.4.26; /** * @dev Base contract for ContractRegistry clients */ contract ContractRegistryClient is Owned, Utils { bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 internal constant BANCOR_NETWORK = "BancorNetwork"; bytes32 internal constant BANCOR_FORMULA = "BancorFormula"; bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory"; bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder"; bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry"; bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData"; bytes32 internal constant BNT_TOKEN = "BNTToken"; bytes32 internal constant BANCOR_X = "BancorX"; bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader"; IContractRegistry public registry; // address of the current contract-registry IContractRegistry public prevRegistry; // address of the previous contract-registry bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry /** * @dev verifies that the caller is mapped to the given contract name * * @param _contractName contract name */ modifier only(bytes32 _contractName) { _only(_contractName); _; } // error message binary size optimization function _only(bytes32 _contractName) internal view { require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED"); } /** * @dev initializes a new ContractRegistryClient instance * * @param _registry address of a contract-registry contract */ constructor(IContractRegistry _registry) internal validAddress(_registry) { registry = IContractRegistry(_registry); prevRegistry = IContractRegistry(_registry); } /** * @dev updates to the new contract-registry */ function updateRegistry() public { // verify that this function is permitted require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED"); // get the new contract-registry IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY)); // verify that the new contract-registry is different and not zero require(newRegistry != address(registry) && newRegistry != address(0), "ERR_INVALID_REGISTRY"); // verify that the new contract-registry is pointing to a non-zero contract-registry require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY"); // save a backup of the current contract-registry before replacing it prevRegistry = registry; // replace the current contract-registry with the new contract-registry registry = newRegistry; } /** * @dev restores the previous contract-registry */ function restoreRegistry() public ownerOnly { // restore the previous contract-registry registry = prevRegistry; } /** * @dev restricts the permission to update the contract-registry * * @param _onlyOwnerCanUpdateRegistry indicates whether or not permission is restricted to owner only */ function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly { // change the permission to update the contract-registry onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry; } /** * @dev returns the address associated with the given contract name * * @param _contractName contract name * * @return contract address */ function addressOf(bytes32 _contractName) internal view returns (address) { return registry.addressOf(_contractName); } } // File: contracts/utility/ReentrancyGuard.sol pragma solidity 0.4.26; /** * @dev ReentrancyGuard * * The contract provides protection against re-entrancy - calling a function (directly or * indirectly) from within itself. */ contract ReentrancyGuard { // true while protected code is being executed, false otherwise bool private locked = false; /** * @dev ensures instantiation only by sub-contracts */ constructor() internal {} // protects a function against reentrancy attacks modifier protected() { _protected(); locked = true; _; locked = false; } // error message binary size optimization function _protected() internal view { require(!locked, "ERR_REENTRANCY"); } } // File: contracts/utility/TokenHandler.sol pragma solidity 0.4.26; contract TokenHandler { bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)")); bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)")); bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)")); /** * @dev executes the ERC20 token's `approve` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _spender approved address * @param _value allowance amount */ function safeApprove(IERC20Token _token, address _spender, uint256 _value) internal { execute(_token, abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value)); } /** * @dev executes the ERC20 token's `transfer` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _to target address * @param _value transfer amount */ function safeTransfer(IERC20Token _token, address _to, uint256 _value) internal { execute(_token, abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value)); } /** * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _from source address * @param _to target address * @param _value transfer amount */ function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) internal { execute(_token, abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value)); } /** * @dev executes a function on the ERC20 token and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _data data to pass in to the token's contract for execution */ function execute(IERC20Token _token, bytes memory _data) private { uint256[1] memory ret = [uint256(1)]; assembly { let success := call( gas, // gas remaining _token, // destination address 0, // no ether add(_data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(_data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) if iszero(success) { revert(0, 0) } } require(ret[0] != 0, "ERR_TRANSFER_FAILED"); } } // File: contracts/utility/TokenHolder.sol pragma solidity 0.4.26; /** * @dev We consider every contract to be a 'token holder' since it's currently not possible * for a contract to deny receiving tokens. * * The TokenHolder's contract sole purpose is to provide a safety mechanism that allows * the owner to send tokens that were sent to the contract by mistake back to their sender. * * Note that we use the non standard ERC-20 interface which has no return value for transfer * in order to support both non standard as well as standard token contracts. * see https://github.com/ethereum/solidity/issues/4116 */ contract TokenHolder is ITokenHolder, TokenHandler, Owned, Utils { /** * @dev withdraws tokens held by the contract and sends them to an account * can only be called by the owner * * @param _token ERC20 token contract address * @param _to account to receive the new amount * @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public ownerOnly validAddress(_token) validAddress(_to) notThis(_to) { safeTransfer(_token, _to, _amount); } } // File: contracts/utility/SafeMath.sol pragma solidity 0.4.26; /** * @dev Library for basic math operations with overflow/underflow protection */ library SafeMath { /** * @dev returns the sum of _x and _y, reverts if the calculation overflows * * @param _x value 1 * @param _y value 2 * * @return sum */ function add(uint256 _x, uint256 _y) internal pure returns (uint256) { uint256 z = _x + _y; require(z >= _x, "ERR_OVERFLOW"); return z; } /** * @dev returns the difference of _x minus _y, reverts if the calculation underflows * * @param _x minuend * @param _y subtrahend * * @return difference */ function sub(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_x >= _y, "ERR_UNDERFLOW"); return _x - _y; } /** * @dev returns the product of multiplying _x by _y, reverts if the calculation overflows * * @param _x factor 1 * @param _y factor 2 * * @return product */ function mul(uint256 _x, uint256 _y) internal pure returns (uint256) { // gas optimization if (_x == 0) return 0; uint256 z = _x * _y; require(z / _x == _y, "ERR_OVERFLOW"); return z; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. * * @param _x dividend * @param _y divisor * * @return quotient */ function div(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_y > 0, "ERR_DIVIDE_BY_ZERO"); uint256 c = _x / _y; return c; } } // File: contracts/token/interfaces/IEtherToken.sol pragma solidity 0.4.26; /* Ether Token interface */ contract IEtherToken is IERC20Token { function deposit() public payable; function withdraw(uint256 _amount) public; function depositTo(address _to) public payable; function withdrawTo(address _to, uint256 _amount) public; } // File: contracts/token/interfaces/ISmartToken.sol pragma solidity 0.4.26; /* Smart Token interface */ contract ISmartToken is IConverterAnchor, IERC20Token { function disableTransfers(bool _disable) public; function issue(address _to, uint256 _amount) public; function destroy(address _from, uint256 _amount) public; } // File: contracts/bancorx/interfaces/IBancorX.sol pragma solidity 0.4.26; contract IBancorX { function token() public view returns (IERC20Token) {this;} function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public; function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256); } // File: contracts/BancorNetwork.sol pragma solidity 0.4.26; // interface of older converters for backward compatibility contract ILegacyConverter { function change(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, uint256 _minReturn) public returns (uint256); } /** * @dev The BancorNetwork contract is the main entry point for Bancor token conversions. * It also allows for the conversion of any token in the Bancor Network to any other token in a single * transaction by providing a conversion path. * * A note on Conversion Path: Conversion path is a data structure that is used when converting a token * to another token in the Bancor Network, when the conversion cannot necessarily be done by a single * converter and might require multiple 'hops'. * The path defines which converters should be used and what kind of conversion should be done in each step. * * The path format doesn't include complex structure; instead, it is represented by a single array * in which each 'hop' is represented by a 2-tuple - converter anchor & target token. * In addition, the first element is always the source token. * The converter anchor is only used as a pointer to a converter (since converter addresses are more * likely to change as opposed to anchor addresses). * * Format: * [source token, converter anchor, target token, converter anchor, target token...] */ contract BancorNetwork is IBancorNetwork, TokenHolder, ContractRegistryClient, ReentrancyGuard { using SafeMath for uint256; uint256 private constant CONVERSION_FEE_RESOLUTION = 1000000; uint256 private constant AFFILIATE_FEE_RESOLUTION = 1000000; address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; struct ConversionStep { IConverter converter; IConverterAnchor anchor; IERC20Token sourceToken; IERC20Token targetToken; address beneficiary; bool isV28OrHigherConverter; bool processAffiliateFee; } uint256 public maxAffiliateFee = 30000; // maximum affiliate-fee mapping (address => bool) public etherTokens; // list of all supported ether tokens /** * @dev triggered when a conversion between two tokens occurs * * @param _smartToken anchor governed by the converter * @param _fromToken source ERC20 token * @param _toToken target ERC20 token * @param _fromAmount amount converted, in the source token * @param _toAmount amount returned, minus conversion fee * @param _trader wallet that initiated the trade */ event Conversion( address indexed _smartToken, address indexed _fromToken, address indexed _toToken, uint256 _fromAmount, uint256 _toAmount, address _trader ); /** * @dev initializes a new BancorNetwork instance * * @param _registry address of a contract registry contract */ constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public { etherTokens[ETH_RESERVE_ADDRESS] = true; } /** * @dev allows the owner to update the maximum affiliate-fee * * @param _maxAffiliateFee maximum affiliate-fee */ function setMaxAffiliateFee(uint256 _maxAffiliateFee) public ownerOnly { require(_maxAffiliateFee <= AFFILIATE_FEE_RESOLUTION, "ERR_INVALID_AFFILIATE_FEE"); maxAffiliateFee = _maxAffiliateFee; } /** * @dev allows the owner to register/unregister ether tokens * * @param _token ether token contract address * @param _register true to register, false to unregister */ function registerEtherToken(IEtherToken _token, bool _register) public ownerOnly validAddress(_token) notThis(_token) { etherTokens[_token] = _register; } /** * @dev returns the conversion path between two tokens in the network * note that this method is quite expensive in terms of gas and should generally be called off-chain * * @param _sourceToken source token address * @param _targetToken target token address * * @return conversion path between the two tokens */ function conversionPath(IERC20Token _sourceToken, IERC20Token _targetToken) public view returns (address[]) { IConversionPathFinder pathFinder = IConversionPathFinder(addressOf(CONVERSION_PATH_FINDER)); return pathFinder.findPath(_sourceToken, _targetToken); } /** * @dev returns the expected rate of converting a given amount on a given path * note that there is no support for circular paths * * @param _path conversion path (see conversion path format above) * @param _amount amount of _path[0] tokens received from the sender * * @return expected rate */ function rateByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256) { uint256 amount; uint256 fee; uint256 supply; uint256 balance; uint32 weight; IConverter converter; IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); amount = _amount; // verify that the number of elements is larger than 2 and odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // iterate over the conversion path for (uint256 i = 2; i < _path.length; i += 2) { IERC20Token sourceToken = _path[i - 2]; IERC20Token anchor = _path[i - 1]; IERC20Token targetToken = _path[i]; converter = IConverter(IConverterAnchor(anchor).owner()); // backward compatibility sourceToken = getConverterTokenAddress(converter, sourceToken); targetToken = getConverterTokenAddress(converter, targetToken); if (targetToken == anchor) { // buy the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) supply = ISmartToken(anchor).totalSupply(); // get the amount & the conversion fee balance = converter.getConnectorBalance(sourceToken); (, weight, , , ) = converter.connectors(sourceToken); amount = formula.purchaseRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.add(amount); } else if (sourceToken == anchor) { // sell the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) supply = ISmartToken(anchor).totalSupply(); // get the amount & the conversion fee balance = converter.getConnectorBalance(targetToken); (, weight, , , ) = converter.connectors(targetToken); amount = formula.saleRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.sub(amount); } else { // cross reserve conversion (amount, fee) = getReturn(converter, sourceToken, targetToken, amount); } } return amount; } /** * @dev converts the token to any other token in the bancor network by following * a predefined conversion path and transfers the result tokens to a target account * affiliate account/fee can also be passed in to receive a conversion fee (on top of the liquidity provider fees) * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _beneficiary account that will receive the conversion result or 0x0 to send the result to the sender account * @param _affiliateAccount wallet address to receive the affiliate fee or 0x0 to disable affiliate fee * @param _affiliateFee affiliate fee in PPM or 0 to disable affiliate fee * * @return amount of tokens received from the conversion */ function convertByPath(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee) public payable protected greaterThanZero(_minReturn) returns (uint256) { // verify that the path contrains at least a single 'hop' and that the number of elements is odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // validate msg.value and prepare the source token for the conversion handleSourceToken(_path[0], IConverterAnchor(_path[1]), _amount); // check if affiliate fee is enabled bool affiliateFeeEnabled = false; if (address(_affiliateAccount) == 0) { require(_affiliateFee == 0, "ERR_INVALID_AFFILIATE_FEE"); } else { require(0 < _affiliateFee && _affiliateFee <= maxAffiliateFee, "ERR_INVALID_AFFILIATE_FEE"); affiliateFeeEnabled = true; } // check if beneficiary is set address beneficiary = msg.sender; if (_beneficiary != address(0)) beneficiary = _beneficiary; // convert and get the resulting amount ConversionStep[] memory data = createConversionData(_path, beneficiary, affiliateFeeEnabled); uint256 amount = doConversion(data, _amount, _minReturn, _affiliateAccount, _affiliateFee); // handle the conversion target tokens handleTargetToken(data, amount, beneficiary); return amount; } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * * @return the amount of BNT received from this conversion */ function xConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId ) public payable returns (uint256) { return xConvert2(_path, _amount, _minReturn, _targetBlockchain, _targetAccount, _conversionId, address(0), 0); } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return the amount of BNT received from this conversion */ function xConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { IERC20Token targetToken = _path[_path.length - 1]; IBancorX bancorX = IBancorX(addressOf(BANCOR_X)); // verify that the destination token is BNT require(targetToken == addressOf(BNT_TOKEN), "ERR_INVALID_TARGET_TOKEN"); // convert and get the resulting amount uint256 amount = convertByPath(_path, _amount, _minReturn, this, _affiliateAccount, _affiliateFee); // grant BancorX allowance ensureAllowance(targetToken, bancorX, amount); // transfer the resulting amount to BancorX bancorX.xTransfer(_targetBlockchain, _targetAccount, amount, _conversionId); return amount; } /** * @dev allows a user to convert a token that was sent from another blockchain into any other * token on the BancorNetwork * ideally this transaction is created before the previous conversion is even complete, so * so the input amount isn't known at that point - the amount is actually take from the * BancorX contract directly by specifying the conversion id * * @param _path conversion path * @param _bancorX address of the BancorX contract for the source token * @param _conversionId pre-determined unique (if non zero) id which refers to this conversion * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received from the conversion */ function completeXConversion(IERC20Token[] _path, IBancorX _bancorX, uint256 _conversionId, uint256 _minReturn, address _beneficiary) public returns (uint256) { // verify that the source token is the BancorX token require(_path[0] == _bancorX.token(), "ERR_INVALID_SOURCE_TOKEN"); // get conversion amount from BancorX contract uint256 amount = _bancorX.getXTransferAmount(_conversionId, msg.sender); // perform the conversion return convertByPath(_path, amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev executes the actual conversion by following the conversion path * * @param _data conversion data, see ConversionStep struct above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return amount of tokens received from the conversion */ function doConversion( ConversionStep[] _data, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) private returns (uint256) { uint256 toAmount; uint256 fromAmount = _amount; // iterate over the conversion data for (uint256 i = 0; i < _data.length; i++) { ConversionStep memory stepData = _data[i]; // newer converter if (stepData.isV28OrHigherConverter) { // transfer the tokens to the converter only if the network contract currently holds the tokens // not needed with ETH or if it's the first conversion step if (i != 0 && _data[i - 1].beneficiary == address(this) && !etherTokens[stepData.sourceToken]) safeTransfer(stepData.sourceToken, stepData.converter, fromAmount); } // older converter // if the source token is the smart token, no need to do any transfers as the converter controls it else if (stepData.sourceToken != ISmartToken(stepData.anchor)) { // grant allowance for it to transfer the tokens from the network contract ensureAllowance(stepData.sourceToken, stepData.converter, fromAmount); } // do the conversion if (!stepData.isV28OrHigherConverter) toAmount = ILegacyConverter(stepData.converter).change(stepData.sourceToken, stepData.targetToken, fromAmount, 1); else if (etherTokens[stepData.sourceToken]) toAmount = stepData.converter.convert.value(msg.value)(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); else toAmount = stepData.converter.convert(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); // pay affiliate-fee if needed if (stepData.processAffiliateFee) { uint256 affiliateAmount = toAmount.mul(_affiliateFee).div(AFFILIATE_FEE_RESOLUTION); require(stepData.targetToken.transfer(_affiliateAccount, affiliateAmount), "ERR_FEE_TRANSFER_FAILED"); toAmount -= affiliateAmount; } emit Conversion(stepData.anchor, stepData.sourceToken, stepData.targetToken, fromAmount, toAmount, msg.sender); fromAmount = toAmount; } // ensure the trade meets the minimum requested amount require(toAmount >= _minReturn, "ERR_RETURN_TOO_LOW"); return toAmount; } /** * @dev validates msg.value and prepares the conversion source token for the conversion * * @param _sourceToken source token of the first conversion step * @param _anchor converter anchor of the first conversion step * @param _amount amount to convert from, in the source token */ function handleSourceToken(IERC20Token _sourceToken, IConverterAnchor _anchor, uint256 _amount) private { IConverter firstConverter = IConverter(_anchor.owner()); bool isNewerConverter = isV28OrHigherConverter(firstConverter); // ETH if (msg.value > 0) { // validate msg.value require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH"); // EtherToken converter - deposit the ETH into the EtherToken // note that it can still be a non ETH converter if the path is wrong // but such conversion will simply revert if (!isNewerConverter) IEtherToken(getConverterEtherTokenAddress(firstConverter)).deposit.value(msg.value)(); } // EtherToken else if (etherTokens[_sourceToken]) { // claim the tokens - if the source token is ETH reserve, this call will fail // since in that case the transaction must be sent with msg.value safeTransferFrom(_sourceToken, msg.sender, this, _amount); // ETH converter - withdraw the ETH if (isNewerConverter) IEtherToken(_sourceToken).withdraw(_amount); } // other ERC20 token else { // newer converter - transfer the tokens from the sender directly to the converter // otherwise claim the tokens if (isNewerConverter) safeTransferFrom(_sourceToken, msg.sender, firstConverter, _amount); else safeTransferFrom(_sourceToken, msg.sender, this, _amount); } } /** * @dev handles the conversion target token if the network still holds it at the end of the conversion * * @param _data conversion data, see ConversionStep struct above * @param _amount conversion return amount, in the target token * @param _beneficiary wallet to receive the conversion result */ function handleTargetToken(ConversionStep[] _data, uint256 _amount, address _beneficiary) private { ConversionStep memory stepData = _data[_data.length - 1]; // network contract doesn't hold the tokens, do nothing if (stepData.beneficiary != address(this)) return; IERC20Token targetToken = stepData.targetToken; // ETH / EtherToken if (etherTokens[targetToken]) { // newer converter should send ETH directly to the beneficiary assert(!stepData.isV28OrHigherConverter); // EtherToken converter - withdraw the ETH and transfer to the beneficiary IEtherToken(targetToken).withdrawTo(_beneficiary, _amount); } // other ERC20 token else { safeTransfer(targetToken, _beneficiary, _amount); } } /** * @dev creates a memory cache of all conversion steps data to minimize logic and external calls during conversions * * @param _conversionPath conversion path, see conversion path format above * @param _beneficiary wallet to receive the conversion result * @param _affiliateFeeEnabled true if affiliate fee was requested by the sender, false if not * * @return cached conversion data to be ingested later on by the conversion flow */ function createConversionData(IERC20Token[] _conversionPath, address _beneficiary, bool _affiliateFeeEnabled) private view returns (ConversionStep[]) { ConversionStep[] memory data = new ConversionStep[](_conversionPath.length / 2); bool affiliateFeeProcessed = false; address bntToken = addressOf(BNT_TOKEN); // iterate the conversion path and create the conversion data for each step uint256 i; for (i = 0; i < _conversionPath.length - 1; i += 2) { IConverterAnchor anchor = IConverterAnchor(_conversionPath[i + 1]); IConverter converter = IConverter(anchor.owner()); IERC20Token targetToken = _conversionPath[i + 2]; // check if the affiliate fee should be processed in this step bool processAffiliateFee = _affiliateFeeEnabled && !affiliateFeeProcessed && targetToken == bntToken; if (processAffiliateFee) affiliateFeeProcessed = true; data[i / 2] = ConversionStep({ // set the converter anchor anchor: anchor, // set the converter converter: converter, // set the source/target tokens sourceToken: _conversionPath[i], targetToken: targetToken, // requires knowledge about the next step, so initialize in the next phase beneficiary: address(0), // set flags isV28OrHigherConverter: isV28OrHigherConverter(converter), processAffiliateFee: processAffiliateFee }); } // ETH support // source is ETH ConversionStep memory stepData = data[0]; if (etherTokens[stepData.sourceToken]) { // newer converter - replace the source token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.sourceToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the source token with the EtherToken address used by the converter else stepData.sourceToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // target is ETH stepData = data[data.length - 1]; if (etherTokens[stepData.targetToken]) { // newer converter - replace the target token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.targetToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the target token with the EtherToken address used by the converter else stepData.targetToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // set the beneficiary for each step for (i = 0; i < data.length; i++) { stepData = data[i]; // first check if the converter in this step is newer as older converters don't even support the beneficiary argument if (stepData.isV28OrHigherConverter) { // if affiliate fee is processed in this step, beneficiary is the network contract if (stepData.processAffiliateFee) stepData.beneficiary = this; // if it's the last step, beneficiary is the final beneficiary else if (i == data.length - 1) stepData.beneficiary = _beneficiary; // if the converter in the next step is newer, beneficiary is the next converter else if (data[i + 1].isV28OrHigherConverter) stepData.beneficiary = data[i + 1].converter; // the converter in the next step is older, beneficiary is the network contract else stepData.beneficiary = this; } else { // converter in this step is older, beneficiary is the network contract stepData.beneficiary = this; } } return data; } /** * @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't. * Note that we use the non standard erc-20 interface in which `approve` has no return value so that * this function will work for both standard and non standard tokens * * @param _token token to check the allowance in * @param _spender approved address * @param _value allowance amount */ function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private { uint256 allowance = _token.allowance(this, _spender); if (allowance < _value) { if (allowance > 0) safeApprove(_token, _spender, 0); safeApprove(_token, _spender, _value); } } // legacy - returns the address of an EtherToken used by the converter function getConverterEtherTokenAddress(IConverter _converter) private view returns (address) { uint256 reserveCount = _converter.connectorTokenCount(); for (uint256 i = 0; i < reserveCount; i++) { address reserveTokenAddress = _converter.connectorTokens(i); if (etherTokens[reserveTokenAddress]) return reserveTokenAddress; } return ETH_RESERVE_ADDRESS; } // legacy - if the token is an ether token, returns the ETH reserve address // used by the converter, otherwise returns the input token address function getConverterTokenAddress(IConverter _converter, IERC20Token _token) private view returns (IERC20Token) { if (!etherTokens[_token]) return _token; if (isV28OrHigherConverter(_converter)) return IERC20Token(ETH_RESERVE_ADDRESS); return IERC20Token(getConverterEtherTokenAddress(_converter)); } bytes4 private constant GET_RETURN_FUNC_SELECTOR = bytes4(keccak256("getReturn(address,address,uint256)")); // using assembly code since older converter versions have different return values function getReturn(address _dest, address _sourceToken, address _targetToken, uint256 _amount) internal view returns (uint256, uint256) { uint256[2] memory ret; bytes memory data = abi.encodeWithSelector(GET_RETURN_FUNC_SELECTOR, _sourceToken, _targetToken, _amount); assembly { let success := staticcall( gas, // gas remaining _dest, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 64 // output length ) if iszero(success) { revert(0, 0) } } return (ret[0], ret[1]); } bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()")); // using assembly code to identify converter version // can't rely on the version number since the function had a different signature in older converters function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) { bool success; uint256[1] memory ret; bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR); assembly { success := staticcall( 5000, // isV28OrHigher consumes 190 gas, but just for extra safety _converter, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) } return success && ret[0] != 0; } /** * @dev deprecated, backward compatibility */ function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) { return (rateByPath(_path, _amount), 0); } /** * @dev deprecated, backward compatibility */ function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvertFor2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxAffiliateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"rateByPath","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_bancorX","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertFor2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertByPath","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"xConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sourceToken","type":"address"},{"name":"_targetToken","type":"address"}],"name":"conversionPath","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvert2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxAffiliateFee","type":"uint256"}],"name":"setMaxAffiliateFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_smartToken","type":"address"},{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":false,"name":"_fromAmount","type":"uint256"},{"indexed":false,"name":"_toAmount","type":"uint256"},{"indexed":false,"name":"_trader","type":"address"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003791833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61362980620001686000396000f3006080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x6080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be466220029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode Sourcemap
24652:32764:0:-;;;;;;;;;-1:-1:-1;;;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14362:224:0;;;;;;;;;27054:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27054:209:0;-1:-1:-1;;;;;27054:209:0;;;;;;;;;54285:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;54285:159:0;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;;;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;57030:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57030:383:0;;-1:-1:-1;;57030:383:0;;;-1:-1:-1;;;57030:383:0;;;;;-1:-1:-1;;;;;57030:383:0;;;;;;;-1:-1:-1;57030:383:0;;;;;;-1:-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;12049:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12049:38:0;;;;;;;;;;;;;;;;;;;;;;13007:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13007:925:0;;;;54794:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54794:356:0;;-1:-1:-1;;54794:356:0;;;-1:-1:-1;;;54794:356:0;;;;;-1:-1:-1;;;;;54794:356:0;;;;;;-1:-1:-1;54794:356:0;;;;-1:-1:-1;54794:356:0;;25294:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25294:38:0;;;;20031:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20031:246:0;-1:-1:-1;;;;;20031:246:0;;;;;;;;;;;;11959:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11959:37:0;;;;;;;;-1:-1:-1;;;;;11959:37:0;;;;;;;;;;;;;;9140:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9140:208:0;;;;11870:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11870:33:0;;;;28305:2807;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28305:2807:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;28305:2807:0;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;;;28305:2807:0;25370:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25370:44:0;-1:-1:-1;;;;;25370:44:0;;;;;38369:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38369:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;;;;;;38369:583:0;;;;;-1:-1:-1;38369:583:0;;;;;;;;;;-1:-1:-1;38369:583:0;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;38369:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55527:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55527:429:0;;-1:-1:-1;;55527:429:0;;;-1:-1:-1;;;55527:429:0;;;;;-1:-1:-1;;;;;55527:429:0;;;;;;;-1:-1:-1;55527:429:0;;;;;;-1:-1:-1;55527:429:0;;;;;56727:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56727:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56727:229:0;;-1:-1:-1;;56727:229:0;;;-1:-1:-1;;;56727:229:0;;;;;;;;-1:-1:-1;;;;;56727:229:0;;-1:-1:-1;56727:229:0;;-1:-1:-1;56727:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32276:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32276:1573:0;;-1:-1:-1;;32276:1573:0;;;-1:-1:-1;;;32276:1573:0;;;;;-1:-1:-1;;;;;32276:1573:0;;;;;;;-1:-1:-1;32276:1573:0;;;;;;-1:-1:-1;32276:1573:0;;;;;34841:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34841:404:0;;-1:-1:-1;;34841:404:0;;;-1:-1:-1;;;34841:404:0;;;;;;;;;;-1:-1:-1;34841:404:0;;;;;-1:-1:-1;34841:404:0;;;;;56030:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56030:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;;56030:202:0;;;-1:-1:-1;;;56030:202:0;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;56030:202:0;55224:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55224:229:0;;-1:-1:-1;;55224:229:0;;;-1:-1:-1;;;55224:229:0;;;;;;;;-1:-1:-1;;;;;55224:229:0;;-1:-1:-1;55224:229:0;;-1:-1:-1;55224:229:0;36350:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36350:1068:0;;-1:-1:-1;;36350:1068:0;;;-1:-1:-1;;;36350:1068:0;;;;;;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;;;;;36350:1068:0;;;;;;;;;;;7982:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:23:0;;;;27645:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27645:283:0;-1:-1:-1;;;;;27645:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27645:283:0;;;;;;;;;;;;;;;;;56306:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56306:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56306:347:0;;-1:-1:-1;;56306:347:0;;;-1:-1:-1;;;56306:347:0;;;;;-1:-1:-1;;;;;56306:347:0;;;;;;-1:-1:-1;56306:347:0;;;;-1:-1:-1;56306:347:0;;8891:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8891:158:0;-1:-1:-1;;;;;8891:158:0;;;;;54518:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;;54518:202:0;;;-1:-1:-1;;;54518:202:0;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;54518:202:0;26588:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26588:240:0;;;;;14362:224;8453:12;:10;:12::i;:::-;14522:26;:56;;;;;;;-1:-1:-1;;14522:56:0;;;;;;;;;14362:224::o;27054:209::-;8453:12;:10;:12::i;:::-;27175:6;9937:23;9951:8;9937:13;:23::i;:::-;27200:6;10291:18;10300:8;10291;:18::i;:::-;-1:-1:-1;;;;;;;27224:19:0;;;;;;;;:11;:19;;;;;:31;;-1:-1:-1;;27224:31:0;;;;;;;;;;27054:209::o;54285:159::-;54369:7;54378;54406:26;54417:5;54424:7;54406:10;:26::i;:::-;54398:38;54434:1;;-1:-1:-1;54285:159:0;-1:-1:-1;;;54285:159:0:o;57030:383::-;57284:7;57316:89;57330:5;57337:7;57346:10;57358:12;57372:17;57391:13;57316;:89::i;:::-;57309:96;57030:383;-1:-1:-1;;;;;;;57030:383:0:o;12049:38::-;;;;;;;;;:::o;13007:925::-;13237:29;13124:5;;-1:-1:-1;;;;;13124:5:0;13110:10;:19;;:50;;-1:-1:-1;13134:26:0;;;;;;;13133:27;13110:50;13102:80;;;;;;;-1:-1:-1;;;;;13102:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13287:28;13297:17;13287:9;:28::i;:::-;13436:8;;13237:79;;-1:-1:-1;;;;;;13413:32:0;;;13436:8;;13413:32;;;;:61;;-1:-1:-1;;;;;;13449:25:0;;;;13413:61;13405:94;;;;;;;-1:-1:-1;;;;;13405:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13614:40;;;;;;13636:17;13614:40;;;;;;13666:1;;-1:-1:-1;;;;;13614:21:0;;;;;:40;;;;;;;;;;;;;;;13666:1;13614:21;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13614:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13614:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:40:0;-1:-1:-1;;;;;13614:54:0;;;13606:87;;;;;-1:-1:-1;;;;;13606:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13800:8;;;13785:12;:23;;-1:-1:-1;;;;;13800:8:0;;;-1:-1:-1;;13785:23:0;;;;;;;13902:22;;;;;;;;;;;13007:925::o;54794:356::-;55023:7;55055:87;55069:5;55076:7;55085:10;55105:1;55109:17;55128:13;55055;:87::i;:::-;55048:94;54794:356;-1:-1:-1;;;;;;54794:356:0:o;25294:38::-;;;;:::o;20031:246::-;8453:12;:10;:12::i;:::-;20162:6;9937:23;9951:8;9937:13;:23::i;:::-;20192:3;9937:23;9951:8;9937:13;:23::i;:::-;20214:3;10291:18;10300:8;10291;:18::i;:::-;20235:34;20248:6;20256:3;20261:7;20235:12;:34::i;:::-;9971:1;;8476;20031:246;;;:::o;11959:37::-;;;-1:-1:-1;;;;;11959:37:0;;:::o;9140:208::-;9207:8;;-1:-1:-1;;;;;9207:8:0;9193:10;:22;9185:52;;;;;-1:-1:-1;;;;;9185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:8;;;9265:5;;9253:28;;-1:-1:-1;;;;;9272:8:0;;;;9265:5;;;;9253:28;;;9300:8;;;;9292:16;;-1:-1:-1;;9292:16:0;;;-1:-1:-1;;;;;9300:8:0;;9292:16;;;;9319:21;;;9140:208::o;11870:33::-;;;-1:-1:-1;;;;;11870:33:0;;:::o;28305:2807::-;28384:7;28404:14;28429:11;28451:14;28476:15;28502:13;28526:20;28557:22;28870:9;28926:23;28979:18;29027:23;28597:25;28607:14;28597:9;:25::i;:::-;28557:66;;28645:7;28636:16;;28760:1;28745:5;:12;:16;:41;;;;-1:-1:-1;28765:12:0;;28780:1;;28765:16;28785:1;28765:21;28745:41;28737:70;;;;;;;-1:-1:-1;;;;;28737:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28882:1;28870:13;;28865:2214;28889:5;:12;28885:1;:16;28865:2214;;;28952:5;28962:1;28958;:5;28952:12;;;;;;;;;;;;;;;;;;28926:38;;29000:5;29010:1;29006;:5;29000:12;;;;;;;;;;;;;;;;;;28979:33;;29053:5;29059:1;29053:8;;;;;;;;;;;;;;;;;;29027:34;;29118:6;-1:-1:-1;;;;;29101:30:0;;:32;;;;;-1:-1:-1;;;29101:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29101:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29101:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29101:32:0;;-1:-1:-1;29204:48:0;29101:32;29240:11;29204:24;:48::i;:::-;29190:62;;29281:48;29306:9;29317:11;29281:24;:48::i;:::-;29267:62;;29365:6;-1:-1:-1;;;;;29350:21:0;:11;-1:-1:-1;;;;;29350:21:0;;29346:1722;;;29488:1;29484;:5;:31;;;;29503:5;29513:1;29509;:5;29503:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29493:22:0;:6;-1:-1:-1;;;;;29493:22:0;;;29484:31;29480:100;;;29559:6;-1:-1:-1;;;;;29547:31:0;;:33;;;;;-1:-1:-1;;;29547:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29547:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29547:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29547:33:0;;-1:-1:-1;29480:100:0;29667:9;-1:-1:-1;;;;;29667:29:0;;29697:11;29667:42;;;;;-1:-1:-1;;;29667:42:0;;;;;;;-1:-1:-1;;;;;29667:42:0;-1:-1:-1;;;;;29667:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29667:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29667:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29667:42:0;29747:33;;;;;;-1:-1:-1;;;;;29747:33:0;;;;;;;;;29667:42;;-1:-1:-1;29747:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29747:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29747:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29747:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29747:33:0;;;;;;29808:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29747:33;;-1:-1:-1;;;;;;29808:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29808:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29808:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29808:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29808:53:0;29897:25;;;;;;;;29808:53;;-1:-1:-1;29886:68:0;;24842:7;;29886:37;;-1:-1:-1;;;;;29897:23:0;;;;;:25;;;;;29808:53;;29897:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29897:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29897:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29897:25:0;29886:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;29973:13;;;;;29880:74;-1:-1:-1;30089:18:0;:6;29973:13;30089:18;:10;:18;:::i;:::-;30080:27;;29346:1722;;;30161:6;-1:-1:-1;;;;;30146:21:0;:11;-1:-1:-1;;;;;30146:21:0;;30142:926;;;30285:1;30281;:5;:31;;;;30300:5;30310:1;30306;:5;30300:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30290:22:0;:6;-1:-1:-1;;;;;30290:22:0;;;30281:31;30277:100;;;30356:6;-1:-1:-1;;;;;30344:31:0;;:33;;;;;-1:-1:-1;;;30344:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30344:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30344:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30344:33:0;;-1:-1:-1;30277:100:0;30464:9;-1:-1:-1;;;;;30464:29:0;;30494:11;30464:42;;;;;-1:-1:-1;;;30464:42:0;;;;;;;-1:-1:-1;;;;;30464:42:0;-1:-1:-1;;;;;30464:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30464:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30464:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30464:42:0;30544:33;;;;;;-1:-1:-1;;;;;30544:33:0;;;;;;;;;30464:42;;-1:-1:-1;30544:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30544:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30544:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30544:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30544:33:0;;;;;;30605:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:33;;-1:-1:-1;;;;;;30605:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30605:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30605:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30605:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30605:49:0;30690:25;;;;;;;;30605:49;;-1:-1:-1;30679:68:0;;24842:7;;30679:37;;-1:-1:-1;;;;;30690:23:0;;;;;:25;;;;;30605:49;;30690:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30679:68:0;30766:13;;;;;30673:74;-1:-1:-1;30882:18:0;:6;30766:13;30882:18;:10;:18;:::i;30142:926::-;30998:54;31008:9;31019:11;31032;31045:6;30998:9;:54::i;:::-;30982:70;;-1:-1:-1;30982:70:0;-1:-1:-1;30142:926:0;28908:1;28903:6;;;;28865:2214;;;-1:-1:-1;31098:6:0;;28305:2807;-1:-1:-1;;;;;;;;;;;;28305:2807:0:o;25370:44::-;;;;;;;;;;;;;;;:::o;38369:583::-;38528:7;38749:14;38635:8;-1:-1:-1;;;;;38635:14:0;;:16;;;;;-1:-1:-1;;;38635:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38635:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38635:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38635:16:0;38623:8;;-1:-1:-1;;;;;38623:28:0;;;;:5;;38629:1;;38623:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;38623:28:0;;38615:65;;;;;-1:-1:-1;;;;;38615:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38766:54;;;;;;;;;;;;38809:10;38766:54;;;;;;-1:-1:-1;;;;;38766:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38766:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38766:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38766:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38766:54:0;;-1:-1:-1;38875:69:0;38889:5;38766:54;38904:10;38916:12;38938:1;;38875:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55527:429::-;55827:7;55797:10;9595:24;9612:6;9595:16;:24::i;:::-;55859:89;55873:5;55880:7;55889:10;55901:12;55915:17;55934:13;55859;:89::i;:::-;55852:96;55527:429;-1:-1:-1;;;;;;;;55527:429:0:o;56727:229::-;56851:7;56878:70;56892:5;56899:7;56908:10;56920:12;56942:1;56946;56878:13;:70::i;:::-;56871:77;56727:229;-1:-1:-1;;;;;56727:229:0:o;14011:137::-;8453:12;:10;:12::i;:::-;14128;;14117:8;:23;;-1:-1:-1;;14117:23:0;-1:-1:-1;;;;;14128:12:0;;;14117:23;;;;;;14011:137::o;32276:1573::-;32536:7;32952:24;33341:19;33517:28;33620:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32506:10;9595:24;32506:10;9595:16;:24::i;:::-;32690:1;32675:5;:12;:16;:41;;;;-1:-1:-1;32695:12:0;;32710:1;;32695:16;32715:1;32695:21;32675:41;32667:70;;;;;;;-1:-1:-1;;;;;32667:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32829:64;32847:5;32853:1;32847:8;;;;;;;;;;;;;;;;;;32874:5;32880:1;32874:8;;;;;;;;;;;;;;;;;;32885:7;32829:17;:64::i;:::-;32979:5;;-1:-1:-1;;;;;;32999:31:0;;;32995:294;;;33055:18;;33047:56;;;;;-1:-1:-1;;;;;33047:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32995:294;;;33157:13;33153:1;:17;:53;;;;;33191:15;;33174:13;:32;;33153:53;33145:91;;;;;;;-1:-1:-1;;;;;33145:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33273:4;33251:26;;32995:294;33363:10;;-1:-1:-1;;;;;;33388:26:0;;;33384:71;;33443:12;33429:26;;33384:71;33548:61;33569:5;33576:11;33589:19;33548:20;:61::i;:::-;33517:92;;33637:73;33650:4;33656:7;33665:10;33677:17;33696:13;33637:12;:73::i;:::-;33620:90;;33771:44;33789:4;33795:6;33803:11;33771:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;33835:6;32276:1573;-1:-1:-1;;;;;;;;;;32276:1573:0:o;34841:404::-;35103:7;35135:102;35145:5;35152:7;35161:10;35173:17;35192:14;35208:13;35231:1;35235;35135:9;:102::i;56030:202::-;56129:7;56156:68;56170:5;56177:7;56186:10;56206:1;56218;56222;56156:13;:68::i;:::-;56149:75;56030:202;-1:-1:-1;;;;56030:202:0:o;36350:1068::-;36718:7;36743:23;36803:16;37051:14;36688:10;9595:24;9612:6;9595:16;:24::i;:::-;36775:12;;36769:5;;-1:-1:-1;;36775:16:0;;;36769:23;;;;;;;;;;;;;;36743:49;;36831:19;36841:8;36831:9;:19::i;:::-;36803:48;;36940:20;36950:9;36940;:20::i;:::-;-1:-1:-1;;;;;36925:35:0;;;;;;36917:72;;;;;-1:-1:-1;;;;;36917:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37068:81;37082:5;37089:7;37098:10;37110:4;37116:17;37135:13;37068;:81::i;:::-;37051:98;;37198:45;37214:11;37227:7;37236:6;37198:15;:45::i;:::-;37309:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37309:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37309:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37404:6:0;;36350:1068;-1:-1:-1;;;;;;;;;;;;;;;36350:1068:0:o;7982:23::-;;;-1:-1:-1;;;;;7982:23:0;;:::o;27645:283::-;27742:9;27764:32;27821:33;27831:22;27821:9;:33::i;:::-;27873:47;;;;;;-1:-1:-1;;;;;27873:47:0;;;;;;;;;;;;;;;;27764:91;;-1:-1:-1;27873:19:0;;;;;;:47;;;;;-1:-1:-1;;27873:47:0;;;;;;;;-1:-1:-1;27873:19:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;27873:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27873:47:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27873:47:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27873:47:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;224:3;218:10;339:9;333:2;319:12;315:21;297:16;293:44;290:59;268:11;254:12;251:29;239:119;236:2;;;371:1;368;361:12;236:2;-1:-1;27873:47:0;;-1:-1:-1;;;;;27645:283:0;;;;;;:::o;8891:158::-;8453:12;:10;:12::i;:::-;8986:5;;-1:-1:-1;;;;;8973:18:0;;;8986:5;;8973:18;;8965:45;;;;;-1:-1:-1;;;;;8965:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:8;:20;;-1:-1:-1;;9021:20:0;-1:-1:-1;;;;;9021:20:0;;;;;;;;;;8891:158::o;26588:240::-;8453:12;:10;:12::i;:::-;24908:7;26701:44;;;26693:82;;;;;-1:-1:-1;;;;;26693:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26786:15;:34;26588:240::o;8540:104::-;8609:5;;-1:-1:-1;;;;;8609:5:0;8595:10;:19;8587:49;;;;;-1:-1:-1;;;;;8587:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:104::o;10035:128::-;-1:-1:-1;;;;;10109:22:0;;;;10101:54;;;;;-1:-1:-1;;;;;10101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10035:128;:::o;10384:126::-;-1:-1:-1;;;;;10453:25:0;;10473:4;10453:25;;10445:57;;;;;-1:-1:-1;;;;;10445:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14784:133;14876:8;;:33;;;;;;;;;;;;;;14849:7;;-1:-1:-1;;;;;14876:8:0;;:18;;:33;;;;;;;;;;;;;;14849:7;14876:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;14876:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14876:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14876:33:0;;14784:133;-1:-1:-1;;14784:133:0:o;17060:174::-;15995:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17166:59:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17166:59:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17166:59:0;;;179:29:-1;;;;160:49;;;17150:76:0;;17158:6;;17150:7;:76::i;:::-;17060:174;;;:::o;51657:362::-;-1:-1:-1;;;;;51785:19:0;;51756:11;51785:19;;;:11;:19;;;;;;;;51784:20;51780:52;;;-1:-1:-1;51826:6:0;51819:13;;51780:52;51849:34;51872:10;51849:22;:34::i;:::-;51845:92;;;-1:-1:-1;24969:42:0;51898:39;;51845:92;51969:41;51999:10;51969:29;:41::i;:::-;51950:61;;51657:362;;;;;:::o;21424:250::-;21484:7;;21537;;21533:34;;;21566:1;21559:8;;;;21533:34;-1:-1:-1;21592:7:0;;;21597:2;21592;:7;21618:6;;;;;;;;:12;21610:37;;;;;-1:-1:-1;;;;;21610:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21665:1;21424:250;-1:-1:-1;;;21424:250:0:o;21902:174::-;21962:7;;21990:6;;;21982:37;;;;;-1:-1:-1;;;;;21982:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22047:2;22042;:7;;;;;;;;;21902:174;-1:-1:-1;;;;21902:174:0:o;20661:169::-;20721:7;20753;;;20779;;;;20771:32;;;;;-1:-1:-1;;;;;20771:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21053:147;21113:7;21141:8;;;;21133:34;;;;;-1:-1:-1;;;;;21133:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21185:7:0;;;21053:147::o;52230:900::-;52348:7;52357;52377:21;;:::i;:::-;52085:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52429:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52429:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52429:85:0;;;179:29:-1;;;;160:49;;52801:11:0;;52429:85;;52085:47;52902:3;;52644:5;52595:3;52566:431;53021:7;53014:15;53011:2;;;53059:1;53056;53049:12;53011:2;-1:-1:-1;;53107:6:0;;;53115;;;;53107;;53115;;-1:-1:-1;52230:900:0;-1:-1:-1;;;;;52230:900:0:o;9694:112::-;9778:1;9769:10;;9761:37;;;;;-1:-1:-1;;;;;9761:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:89;15694:6;;;;;;;15693:7;15685:34;;;;;-1:-1:-1;;;;;15685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;42581:1653;42696:25;42762:21;42735:7;-1:-1:-1;;;;;42735:13:0;;:15;;;;;-1:-1:-1;;;42735:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42735:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42735:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42735:15:0;;-1:-1:-1;42786:38:0;42735:15;42786:22;:38::i;:::-;42762:62;;42869:1;42857:9;:13;42853:1374;;;42930:9;:20;;42922:56;;;;;-1:-1:-1;;;;;42922:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43213:16;43212:17;43208:125;;;43260:45;43290:14;43260:29;:45::i;:::-;-1:-1:-1;;;;;43248:66:0;;43321:9;43248:85;;;;;-1:-1:-1;;;43248:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43248:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43248:85:0;;;;;43208:125;42853:1374;;;-1:-1:-1;;;;;43387:25:0;;;;;;:11;:25;;;;;;;;43383:844;;;43599:57;43616:12;43630:10;43642:4;43648:7;43599:16;:57::i;:::-;43726:16;43722:82;;;43773:12;-1:-1:-1;;;;;43761:34:0;;43796:7;43761:43;;;;;-1:-1:-1;;;43761:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43761:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43761:43:0;;;;43383:844;;;44019:16;44015:200;;;44054:67;44071:12;44085:10;44097:14;44113:7;44054:16;:67::i;44015:200::-;44158:57;44175:12;44189:10;44201:4;44207:7;44158:16;:57::i;:::-;42581:1653;;;;;:::o;45985:4180::-;46117:16;46146:28;46238:26;46283:16;46418:9;46505:23;46586:20;46650:23;46791:24;47716:30;;:::i;:::-;46198:22;;46223:1;;46198:26;46177:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46146:79;;46267:5;46238:34;;46302:20;46312:9;46302;:20::i;:::-;46283:39;;46447:1;46443:5;;46438:1216;46479:1;46454:15;:22;:26;46450:1;:30;46438:1216;;;46548:15;46564:1;46568;46564:5;46548:22;;;;;;;;;;;;;;;;;;46505:66;;46620:6;-1:-1:-1;;;;;46620:12:0;;:14;;;;;-1:-1:-1;;;46620:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46620:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46620:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46620:14:0;46676:22;;46620:14;;-1:-1:-1;46676:15:0;;46696:1;46692:5;;;46676:22;;;;;;;;;;;;;;46650:48;;46818:20;:46;;;;;46843:21;46842:22;46818:46;:73;;;;;46883:8;-1:-1:-1;;;;;46868:23:0;:11;-1:-1:-1;;;;;46868:23:0;;46818:73;46791:100;;46910:19;46906:70;;;46972:4;46948:28;;46906:70;47007:635;;;;;;;;;47170:9;-1:-1:-1;;;;;47007:635:0;;;;;47094:6;-1:-1:-1;;;;;47007:635:0;;;;;47262:15;47278:1;47262:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47007:635:0;;;;;47312:11;-1:-1:-1;;;;;47007:635:0;;;;;47457:1;-1:-1:-1;;;;;47007:635:0;;;;;47534:33;47557:9;47534:22;:33::i;:::-;47007:635;;;;;;;;;;;;46993:4;47002:1;46998;:5;46993:11;;;;;;;;;;;;;;;;;;:649;46487:1;46482:6;;;;;46438:1216;;;47749:4;47754:1;47749:7;;;;;;;;;;;;;;;;;;;;47783:20;;;;;-1:-1:-1;;;;;47771:33:0;;;;;:11;:33;;;;;;;47749:7;;-1:-1:-1;47771:33:0;;47767:498;;;47917:8;:31;;;47913:340;;;24969:42;47967:20;;;:55;47913:340;;;48233:18;;48203:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48168:85:0;:20;;;:85;47913:340;48319:11;;48314:4;;-1:-1:-1;;48319:15:0;;;48314:21;;;;;;;;;;;;;;;;48362:20;;;;-1:-1:-1;;;;;48350:33:0;;;;;:11;:33;;;;;;;;48314:21;;-1:-1:-1;48350:33:0;;48346:498;;;48496:8;:31;;;48492:340;;;24969:42;48546:20;;;:55;48492:340;;;48812:18;;48782:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48747:85:0;:20;;;:85;48492:340;48911:1;48907:5;;48902:1232;48918:4;:11;48914:1;:15;48902:1232;;;48962:4;48967:1;48962:7;;;;;;;;;;;;;;;;;;48951:18;;49121:8;:31;;;49117:1006;;;49277:8;:28;;;49273:664;;;49351:4;49328:20;;;:27;49273:664;;;49482:1;49468:4;:11;:15;49463:1;:20;49459:478;;;-1:-1:-1;;;;;49506:35:0;;:20;;;:35;49459:478;;;49667:4;49672:1;49676;49672:5;49667:11;;;;;;;;;;;;;;;;;;:34;;;49663:274;;;49747:4;49752:1;49756;49752:5;49747:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;49724:44:0;:20;;;:44;49663:274;;;49933:4;49910:20;;;:27;49663:274;49117:1006;;;50103:4;50080:20;;;:27;49117:1006;48931:3;;;;;48902:1232;;;-1:-1:-1;50153:4:0;;45985:4180;-1:-1:-1;;;;;;;;;;;45985:4180:0:o;39569:2665::-;39771:7;39791:16;39818:18;39909:9;39962:30;;:::i;:::-;41630:23;39839:7;39818:28;;39921:1;39909:13;;39904:2165;39928:5;:12;39924:1;:16;39904:2165;;;39995:5;40001:1;39995:8;;;;;;;;;;;;;;;;;;39962:41;;40056:8;:31;;;40052:862;;;40302:6;;;;;:51;;-1:-1:-1;40312:12:0;;40348:4;;40312:5;;-1:-1:-1;;40318:5:0;;;40312:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40312:41:0;;40302:51;:89;;;;-1:-1:-1;40370:20:0;;;;;-1:-1:-1;;;;;40358:33:0;;;;;:11;:33;;;;;;40357:34;40302:89;40298:182;;;40414:66;40427:8;:20;;;40449:8;:18;;;40469:10;40414:12;:66::i;:::-;40052:862;;;40700:8;:15;;;-1:-1:-1;;;;;40664:52:0;:8;:20;;;-1:-1:-1;;;;;40664:52:0;;;40660:254;;;40829:69;40845:8;:20;;;40867:8;:18;;;40887:10;40829:15;:69::i;:::-;40969:8;:31;;;40968:32;40964:552;;;41047:18;;41074:20;;;;;41096;;;;41030:102;;;;;-1:-1:-1;;;;;41030:102:0;;;;;;;;;;;;;;;;;;;;41130:1;41030:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41047:18;41030:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41030:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41030:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41030:102:0;;-1:-1:-1;40964:552:0;;;41168:20;;;;;-1:-1:-1;;;;;41156:33:0;;;;;:11;:33;;;;;;41152:364;;;41219:18;;41263:20;;;;;41285;;;;41331;;;;41219:133;;;;;-1:-1:-1;;;;;41219:133:0;;;;;;;;;;;;;;;;;;;;41319:10;41219:133;;;;;;;;;;;;:26;;;;;41252:9;;41219:133;;;;;;;;;;;;;;41252:9;41219:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41219:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41219:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41152:364:0;41400:18;;41427:20;;;;;41449;;;;41495;;;;41400:116;;;;;-1:-1:-1;;;;;41400:116:0;;;;;;;;;;;;;;;;;;;;41483:10;41400:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41400:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41400:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41400:116:0;;-1:-1:-1;41152:364:0;41581:8;:28;;;41577:318;;;41656:57;24908:7;41656:27;:8;41669:13;41656:27;:12;:27;:::i;:57::-;41630:83;;41740:8;:20;;;-1:-1:-1;;;;;41740:29:0;;41770:17;41789:15;41740:65;;;;;-1:-1:-1;;;41740:65:0;;;;;;;-1:-1:-1;;;;;41740:65:0;-1:-1:-1;;;;;41740:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41740:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41740:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41740:65:0;41732:101;;;;;;;-1:-1:-1;;;;;41732:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41864:15;41852:27;;;;41577:318;41966:8;:20;;;-1:-1:-1;;;;;41916:105:0;41944:8;:20;;;-1:-1:-1;;;;;41916:105:0;41927:8;:15;;;-1:-1:-1;;;;;41916:105:0;;41988:10;42000:8;42010:10;41916:105;;;;;;;;;;;;;;-1:-1:-1;;;;;41916:105:0;-1:-1:-1;;;;;41916:105:0;;;;;;;;;;;;;;;;;42049:8;;-1:-1:-1;39942:3:0;;;;;39904:2165;;;42153:22;;;;42145:53;;;;;-1:-1:-1;;;;;42145:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42218:8:0;;39569:2665;-1:-1:-1;;;;;;;;;39569:2665:0:o;44599:869::-;44708:30;;:::i;:::-;44917:23;44741:5;44762:1;44747:5;:12;:16;44741:23;;;;;;;;;;;;;;;;;;;44846:20;;;;44741:23;;-1:-1:-1;;;;;;44846:37:0;44878:4;44846:37;44842:63;;44898:7;;44842:63;-1:-1:-1;44943:20:0;;;;-1:-1:-1;;;;;45009:24:0;;;;;;:11;:24;;;;;;;;45005:456;;;45134:31;;;;45133:32;45126:40;;;;45283:11;-1:-1:-1;;;;;45271:35:0;;45307:12;45321:7;45271:58;;;;;-1:-1:-1;;;45271:58:0;;;;;;;-1:-1:-1;;;;;45271:58:0;-1:-1:-1;;;;;45271:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45005:456:0;45401:48;45414:11;45427:12;45441:7;45401:12;:48::i;50631:339::-;50749:32;;;;;;50766:4;50749:32;;;;-1:-1:-1;;;;;50749:32:0;;;;;;;;;50729:17;;50749:16;;;;;:32;;;;;;;;;;;;;;50729:17;50749:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50749:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50749:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50749:32:0;;-1:-1:-1;50796:18:0;;;50792:171;;;50847:1;50835:9;:13;50831:68;;;50867:32;50879:6;50887:8;50897:1;50867:11;:32::i;:::-;50914:37;50926:6;50934:8;50944:6;50914:11;:37::i;:::-;50631:339;;;;:::o;18195:793::-;18271:21;;:::i;:::-;:36;;;;;;;;;18304:1;18271:36;;;;;18788:2;18738:3;18642:5;18636:12;18544:2;18537:5;18533:14;18488:1;18432:6;18382:3;18359:476;18859:7;18852:15;18849:2;;;18897:1;18894;18887:12;18849:2;-1:-1:-1;18945:6:0;;:11;;18937:43;;;;;-1:-1:-1;;;;;18937:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53404:807;53482:4;53499:12;53522:21;;:::i;:::-;53202:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53574:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53574:54:0;;;179:29:-1;;;;160:49;;53955:11:0;;53202:28;;49:4:-1;;54056:3:0;;53798:10;53705:4;53676:475;53665:486;;54181:7;:22;;;;-1:-1:-1;54192:6:0;;:11;;54181:22;54174:29;;53404:807;;;;;;;:::o;51054:441::-;51138:7;51158:20;51229:9;51282:27;51181:10;-1:-1:-1;;;;;51181:30:0;;:32;;;;;-1:-1:-1;;;51181:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51181:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51181:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51181:32:0;51158:55;;;-1:-1:-1;51241:1:0;;-1:-1:-1;51224:225:0;51248:12;51244:1;:16;51224:225;;;51312:10;-1:-1:-1;;;;;51312:26:0;;51339:1;51312:29;;;;;-1:-1:-1;;;51312:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51312:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51312:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51312:29:0;-1:-1:-1;;;;;51360:32:0;;;;;;:11;51312:29;51360:32;;;;;51312:29;;-1:-1:-1;51360:32:0;;51356:81;;;51418:19;51411:26;;;;51356:81;51262:3;;;;;51224:225;;;-1:-1:-1;24969:42:0;;51054:441;-1:-1:-1;;;;51054:441:0:o;17639:205::-;16102:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17764:71:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17764:71:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17764:71:0;;;179:29:-1;;;;160:49;;;17748:88:0;;17756:6;;17748:7;:88::i;16517:182::-;15894:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16627:63:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16627:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16627:63:0;;;179:29:-1;;;;160:49;;;16611:80:0;;16619:6;;16611:7;:80::i;24652:32764::-;;;;;;;;;;;;;;;105:10:-1;24652:32764:0;88:34:-1;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o;:::-;;;;;;;;;-1:-1:-1;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o
Swarm Source
bzzr://4c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.