Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 9897011 | 1557 days ago | IN | Create: BancorConverter | 0 ETH | 0.13456474 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BancorConverter
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-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/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/IBancorConverter.sol pragma solidity 0.4.26; /* Bancor Converter interface */ contract IBancorConverter { function getReturn(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount) public view returns (uint256, uint256); function convert2(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) public returns (uint256); function quickConvert2(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) public payable returns (uint256); function conversionWhitelist() public view returns (IWhitelist) {this;} function conversionFee() public view returns (uint32) {this;} function reserves(address _address) public view returns (uint256, uint32, bool, bool, bool) {_address; this;} function getReserveBalance(IERC20Token _reserveToken) public view returns (uint256); function reserveTokens(uint256 _index) public view returns (IERC20Token) {_index; this;} // deprecated, backward compatibility function change(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256); function convert(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256); function quickConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256); 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/IBancorConverterUpgrader.sol pragma solidity 0.4.26; /* Bancor Converter Upgrader interface */ contract IBancorConverterUpgrader { function upgrade(bytes32 _version) public; function upgrade(uint16 _version) public; } // File: contracts/converter/interfaces/IBancorFormula.sol pragma solidity 0.4.26; /* Bancor Formula interface */ contract IBancorFormula { function calculatePurchaseReturn(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _depositAmount) public view returns (uint256); function calculateSaleReturn(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _sellAmount) public view returns (uint256); function calculateCrossReserveReturn(uint256 _fromReserveBalance, uint32 _fromReserveRatio, uint256 _toReserveBalance, uint32 _toReserveRatio, uint256 _amount) public view returns (uint256); function calculateFundCost(uint256 _supply, uint256 _reserveBalance, uint32 _totalRatio, uint256 _amount) public view returns (uint256); function calculateLiquidateReturn(uint256 _supply, uint256 _reserveBalance, uint32 _totalRatio, uint256 _amount) public view returns (uint256); // deprecated, backward compatibility function calculateCrossConnectorReturn(uint256 _fromConnectorBalance, uint32 _fromConnectorWeight, uint256 _toConnectorBalance, uint32 _toConnectorWeight, uint256 _amount) public view returns (uint256); } // 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); // deprecated, backward compatibility function convertForPrioritized4( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256[] memory _signature, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); // deprecated, backward compatibility function convertForPrioritized3( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _customVal, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); // deprecated, backward compatibility function convertForPrioritized2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); // deprecated, backward compatibility function convertForPrioritized( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint256 _nonce, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); } // File: contracts/FeatureIds.sol pragma solidity 0.4.26; /** * @dev Id definitions for bancor contract features * * Can be used to query the ContractFeatures contract to check whether a certain feature is supported by a contract */ contract FeatureIds { // converter features uint256 public constant CONVERTER_CONVERSION_WHITELIST = 1 << 0; } // 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); 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); 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); return z; } /** * ev Integer division of two numbers truncating the quotient, reverts on division by zero. * * aram _x dividend * aram _y divisor * * eturn quotient */ function div(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_y > 0); uint256 c = _x / _y; return c; } } // 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/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 { require(msg.sender == owner); _; } /** * @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); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() public { require(msg.sender == newOwner); 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 { /** * constructor */ constructor() public { } // verifies that an amount is greater than zero modifier greaterThanZero(uint256 _amount) { require(_amount > 0); _; } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { require(_address != address(0)); _; } // verifies that the address is different than this contract address modifier notThis(address _address) { require(_address != address(this)); _; } } // 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_FEATURES = "ContractFeatures"; bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 internal constant BANCOR_NETWORK = "BancorNetwork"; bytes32 internal constant BANCOR_FORMULA = "BancorFormula"; bytes32 internal constant BANCOR_CONVERTER_FACTORY = "BancorConverterFactory"; bytes32 internal constant BANCOR_CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 internal constant BANCOR_CONVERTER_REGISTRY = "BancorConverterRegistry"; bytes32 internal constant BANCOR_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) { require(msg.sender == addressOf(_contractName)); _; } /** * @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); // get the new contract-registry address newRegistry = addressOf(CONTRACT_REGISTRY); // verify that the new contract-registry is different and not zero require(newRegistry != address(registry) && newRegistry != address(0)); // verify that the new contract-registry is pointing to a non-zero contract-registry require(IContractRegistry(newRegistry).addressOf(CONTRACT_REGISTRY) != address(0)); // save a backup of the current contract-registry before replacing it prevRegistry = registry; // replace the current contract-registry with the new contract-registry registry = IContractRegistry(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) ownerOnly public { // 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/interfaces/IContractFeatures.sol pragma solidity 0.4.26; /* Contract Features interface */ contract IContractFeatures { function isSupported(address _contract, uint256 _features) public view returns (bool); function enableFeatures(uint256 _features, bool _enable) public; } // File: contracts/token/interfaces/ISmartToken.sol pragma solidity 0.4.26; /* Smart Token interface */ contract ISmartToken is IOwned, IERC20Token { function disableTransfers(bool _disable) public; function issue(address _to, uint256 _amount) public; function destroy(address _from, uint256 _amount) public; } // File: contracts/token/interfaces/ISmartTokenController.sol pragma solidity 0.4.26; /* Smart Token Controller interface */ contract ISmartTokenController { function claimTokens(address _from, uint256 _amount) public; function token() public view returns (ISmartToken) {this;} } // 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/token/interfaces/INonStandardERC20.sol pragma solidity 0.4.26; /* ERC20 Standard Token interface which doesn't return true/false for transfer, transferFrom and approve */ contract INonStandardERC20 { // 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; function transferFrom(address _from, address _to, uint256 _value) public; function approve(address _spender, uint256 _value) public; } // 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, Owned, Utils { /** * @dev initializes a new TokenHolder instance */ constructor() public { } /** * @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) { INonStandardERC20(_token).transfer(_to, _amount); } } // File: contracts/token/SmartTokenController.sol pragma solidity 0.4.26; /** * @dev The smart token controller is an upgradable part of the smart token that allows * more functionality as well as fixes for bugs/exploits. * Once it accepts ownership of the token, it becomes the token's sole controller * that can execute any of its functions. * * To upgrade the controller, ownership must be transferred to a new controller, along with * any relevant data. * * The smart token must be set on construction and cannot be changed afterwards. * Wrappers are provided (as opposed to a single 'execute' function) for each of the token's functions, for easier access. * * Note that the controller can transfer token ownership to a new controller that * doesn't allow executing any function on the token, for a trustless solution. * Doing that will also remove the owner's ability to upgrade the controller. */ contract SmartTokenController is ISmartTokenController, TokenHolder { ISmartToken public token; // Smart Token contract address public bancorX; // BancorX contract /** * @dev initializes a new SmartTokenController instance * * @param _token smart token governed by the controller */ constructor(ISmartToken _token) public validAddress(_token) { token = _token; } // ensures that the controller is the token's owner modifier active() { require(token.owner() == address(this)); _; } // ensures that the controller is not the token's owner modifier inactive() { require(token.owner() != address(this)); _; } /** * @dev allows transferring the token ownership * the new owner needs to accept the transfer * can only be called by the contract owner * * @param _newOwner new token owner */ function transferTokenOwnership(address _newOwner) public ownerOnly { token.transferOwnership(_newOwner); } /** * @dev used by a new owner to accept a token ownership transfer * can only be called by the contract owner */ function acceptTokenOwnership() public ownerOnly { token.acceptOwnership(); } /** * @dev withdraws tokens held by the controller 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 withdrawFromToken(IERC20Token _token, address _to, uint256 _amount) public ownerOnly { ITokenHolder(token).withdrawTokens(_token, _to, _amount); } /** * @dev allows the associated BancorX contract to claim tokens from any address (so that users * dont have to first give allowance when calling BancorX) * * @param _from address to claim the tokens from * @param _amount the amount of tokens to claim */ function claimTokens(address _from, uint256 _amount) public { // only the associated BancorX contract may call this method require(msg.sender == bancorX); // destroy the tokens belonging to _from, and issue the same amount to bancorX token.destroy(_from, _amount); token.issue(msg.sender, _amount); } /** * @dev allows the owner to set the associated BancorX contract * @param _bancorX BancorX contract */ function setBancorX(address _bancorX) public ownerOnly { bancorX = _bancorX; } } // 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/bancorx/interfaces/IBancorX.sol pragma solidity 0.4.26; contract IBancorX { function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public; function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256); } // File: contracts/converter/BancorConverter.sol pragma solidity 0.4.26; /** * @dev Bancor Converter * * The Bancor converter allows for conversions between a Smart Token and other ERC20 tokens and between different ERC20 tokens and themselves. * * This mechanism opens the possibility to create different financial tools (for example, lower slippage in conversions). * * The converter is upgradable (just like any SmartTokenController) and all upgrades are opt-in. * * WARNING: It is NOT RECOMMENDED to use the converter with Smart Tokens that have less than 8 decimal digits or with very small numbers because of precision loss * * Open issues: * - Front-running attacks are currently mitigated by providing the minimum return argument for each conversion * Other potential solutions might include a commit/reveal based schemes */ contract BancorConverter is IBancorConverter, SmartTokenController, ContractRegistryClient, FeatureIds { using SafeMath for uint256; uint32 private constant RATIO_RESOLUTION = 1000000; uint64 private constant CONVERSION_FEE_RESOLUTION = 1000000; struct Reserve { uint256 virtualBalance; // reserve virtual balance uint32 ratio; // reserve ratio, represented in ppm, 1-1000000 bool isVirtualBalanceEnabled; // true if virtual balance is enabled, false if not bool isSaleEnabled; // is sale of the reserve token enabled, can be set by the owner bool isSet; // used to tell if the mapping element is defined } /** * @dev version number */ uint16 public version = 27; IWhitelist public conversionWhitelist; // whitelist contract with list of addresses that are allowed to use the converter IERC20Token[] public reserveTokens; // ERC20 standard token addresses (prior version 17, use 'connectorTokens' instead) mapping (address => Reserve) public reserves; // reserve token addresses -> reserve data (prior version 17, use 'connectors' instead) uint32 public totalReserveRatio = 0; // total ratio of all reservces, also used to efficiently prevent increasing // the total reserve ratio above 100% uint32 public maxConversionFee = 0; // maximum conversion fee for the lifetime of the contract, // represented in ppm, 0...1000000 (0 = no fee, 100 = 0.01%, 1000000 = 100%) uint32 public conversionFee = 0; // current conversion fee, represented in ppm, 0...maxConversionFee bool public conversionsEnabled = true; // deprecated, backward compatibility bool private locked = false; // re-entrancy protection /** * @dev triggered when a conversion between two tokens occurs * * @param _fromToken ERC20 token converted from * @param _toToken ERC20 token converted to * @param _trader wallet that initiated the trade * @param _amount amount converted, in fromToken * @param _return amount returned, minus conversion fee * @param _conversionFee conversion fee */ event Conversion( address indexed _fromToken, address indexed _toToken, address indexed _trader, uint256 _amount, uint256 _return, int256 _conversionFee ); /** * @dev triggered after a conversion with new price data * * @param _connectorToken reserve token * @param _tokenSupply smart token supply * @param _connectorBalance reserve balance * @param _connectorWeight reserve ratio */ event PriceDataUpdate( address indexed _connectorToken, uint256 _tokenSupply, uint256 _connectorBalance, uint32 _connectorWeight ); /** * @dev triggered when the conversion fee is updated * * @param _prevFee previous fee percentage, represented in ppm * @param _newFee new fee percentage, represented in ppm */ event ConversionFeeUpdate(uint32 _prevFee, uint32 _newFee); /** * @dev initializes a new BancorConverter instance * * @param _token smart token governed by the converter * @param _registry address of a contract registry contract * @param _maxConversionFee maximum conversion fee, represented in ppm * @param _reserveToken optional, initial reserve, allows defining the first reserve at deployment time * @param _reserveRatio optional, ratio for the initial reserve */ constructor( ISmartToken _token, IContractRegistry _registry, uint32 _maxConversionFee, IERC20Token _reserveToken, uint32 _reserveRatio ) ContractRegistryClient(_registry) public SmartTokenController(_token) validConversionFee(_maxConversionFee) { IContractFeatures features = IContractFeatures(addressOf(CONTRACT_FEATURES)); // initialize supported features if (features != address(0)) features.enableFeatures(FeatureIds.CONVERTER_CONVERSION_WHITELIST, true); maxConversionFee = _maxConversionFee; if (_reserveToken != address(0)) addReserve(_reserveToken, _reserveRatio); } // protects a function against reentrancy attacks modifier protected() { require(!locked); locked = true; _; locked = false; } // validates a reserve token address - verifies that the address belongs to one of the reserve tokens modifier validReserve(IERC20Token _address) { require(reserves[_address].isSet); _; } // validates conversion fee modifier validConversionFee(uint32 _conversionFee) { require(_conversionFee >= 0 && _conversionFee <= CONVERSION_FEE_RESOLUTION); _; } // validates reserve ratio modifier validReserveRatio(uint32 _ratio) { require(_ratio > 0 && _ratio <= RATIO_RESOLUTION); _; } // allows execution only if the total-supply of the token is greater than zero modifier totalSupplyGreaterThanZeroOnly { require(token.totalSupply() > 0); _; } // allows execution only on a multiple-reserve converter modifier multipleReservesOnly { require(reserveTokens.length > 1); _; } /** * @dev returns the number of reserve tokens defined * note that prior to version 17, you should use 'connectorTokenCount' instead * * @return number of reserve tokens */ function reserveTokenCount() public view returns (uint16) { return uint16(reserveTokens.length); } /** * @dev allows the owner to update & enable the conversion whitelist contract address * when set, only addresses that are whitelisted are actually allowed to use the converter * note that the whitelist check is actually done by the BancorNetwork contract * * @param _whitelist address of a whitelist contract */ function setConversionWhitelist(IWhitelist _whitelist) public ownerOnly notThis(_whitelist) { conversionWhitelist = _whitelist; } /** * @dev allows transferring the token ownership * the new owner needs to accept the transfer * can only be called by the contract owner * note that token ownership can only be transferred while the owner is the converter upgrader contract * * @param _newOwner new token owner */ function transferTokenOwnership(address _newOwner) public ownerOnly only(BANCOR_CONVERTER_UPGRADER) { super.transferTokenOwnership(_newOwner); } /** * @dev used by a new owner to accept a token ownership transfer * can only be called by the contract owner * note that token ownership can only be accepted if its total-supply is greater than zero */ function acceptTokenOwnership() public ownerOnly totalSupplyGreaterThanZeroOnly { super.acceptTokenOwnership(); } /** * @dev updates the current conversion fee * can only be called by the contract owner * * @param _conversionFee new conversion fee, represented in ppm */ function setConversionFee(uint32 _conversionFee) public ownerOnly { require(_conversionFee >= 0 && _conversionFee <= maxConversionFee); emit ConversionFeeUpdate(conversionFee, _conversionFee); conversionFee = _conversionFee; } /** * @dev given a return amount, returns the amount minus the conversion fee * * @param _amount return amount * @param _magnitude 1 for standard conversion, 2 for cross reserve conversion * * @return return amount minus conversion fee */ function getFinalAmount(uint256 _amount, uint8 _magnitude) public view returns (uint256) { return _amount.mul((CONVERSION_FEE_RESOLUTION - conversionFee) ** _magnitude).div(CONVERSION_FEE_RESOLUTION ** _magnitude); } /** * @dev withdraws tokens held by the converter and sends them to an account * can only be called by the owner * note that reserve tokens can only be withdrawn by the owner while the converter is inactive * unless the owner is the converter upgrader contract * * @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 { address converterUpgrader = addressOf(BANCOR_CONVERTER_UPGRADER); // if the token is not a reserve token, allow withdrawal // otherwise verify that the converter is inactive or that the owner is the upgrader contract require(!reserves[_token].isSet || token.owner() != address(this) || owner == converterUpgrader); super.withdrawTokens(_token, _to, _amount); } /** * @dev upgrades the converter to the latest version * can only be called by the owner * note that the owner needs to call acceptOwnership on the new converter after the upgrade */ function upgrade() public ownerOnly { IBancorConverterUpgrader converterUpgrader = IBancorConverterUpgrader(addressOf(BANCOR_CONVERTER_UPGRADER)); transferOwnership(converterUpgrader); converterUpgrader.upgrade(version); acceptOwnership(); } /** * @dev defines a new reserve for the token * can only be called by the owner while the converter is inactive * note that prior to version 17, you should use 'addConnector' instead * * @param _token address of the reserve token * @param _ratio constant reserve ratio, represented in ppm, 1-1000000 */ function addReserve(IERC20Token _token, uint32 _ratio) public ownerOnly inactive validAddress(_token) notThis(_token) validReserveRatio(_ratio) { require(_token != token && !reserves[_token].isSet && totalReserveRatio + _ratio <= RATIO_RESOLUTION); // validate input reserves[_token].ratio = _ratio; reserves[_token].isVirtualBalanceEnabled = false; reserves[_token].virtualBalance = 0; reserves[_token].isSaleEnabled = true; reserves[_token].isSet = true; reserveTokens.push(_token); totalReserveRatio += _ratio; } /** * @dev updates a reserve's virtual balance * only used during an upgrade process * can only be called by the contract owner while the owner is the converter upgrader contract * note that prior to version 17, you should use 'updateConnector' instead * * @param _reserveToken address of the reserve token * @param _virtualBalance new reserve virtual balance, or 0 to disable virtual balance */ function updateReserveVirtualBalance(IERC20Token _reserveToken, uint256 _virtualBalance) public ownerOnly only(BANCOR_CONVERTER_UPGRADER) validReserve(_reserveToken) { Reserve storage reserve = reserves[_reserveToken]; reserve.isVirtualBalanceEnabled = _virtualBalance != 0; reserve.virtualBalance = _virtualBalance; } /** * @dev returns the reserve's ratio * added in version 22 * * @param _reserveToken reserve token contract address * * @return reserve ratio */ function getReserveRatio(IERC20Token _reserveToken) public view validReserve(_reserveToken) returns (uint256) { return reserves[_reserveToken].ratio; } /** * @dev returns the reserve's balance * note that prior to version 17, you should use 'getConnectorBalance' instead * * @param _reserveToken reserve token contract address * * @return reserve balance */ function getReserveBalance(IERC20Token _reserveToken) public view validReserve(_reserveToken) returns (uint256) { return _reserveToken.balanceOf(this); } /** * @dev calculates the expected return of converting a given amount of tokens * * @param _fromToken contract address of the token to convert from * @param _toToken contract address of the token to convert to * @param _amount amount of tokens received from the user * * @return amount of tokens that the user will receive * @return amount of tokens that the user will pay as fee */ function getReturn(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount) public view returns (uint256, uint256) { require(_fromToken != _toToken); // validate input // conversion between the token and one of its reserves if (_toToken == token) return getPurchaseReturn(_fromToken, _amount); else if (_fromToken == token) return getSaleReturn(_toToken, _amount); // conversion between 2 reserves return getCrossReserveReturn(_fromToken, _toToken, _amount); } /** * @dev calculates the expected return of buying with a given amount of tokens * * @param _reserveToken contract address of the reserve token * @param _depositAmount amount of reserve-tokens received from the user * * @return amount of supply-tokens that the user will receive * @return amount of supply-tokens that the user will pay as fee */ function getPurchaseReturn(IERC20Token _reserveToken, uint256 _depositAmount) public view active validReserve(_reserveToken) returns (uint256, uint256) { Reserve storage reserve = reserves[_reserveToken]; uint256 tokenSupply = token.totalSupply(); uint256 reserveBalance = _reserveToken.balanceOf(this); IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); uint256 amount = formula.calculatePurchaseReturn(tokenSupply, reserveBalance, reserve.ratio, _depositAmount); uint256 finalAmount = getFinalAmount(amount, 1); // return the amount minus the conversion fee and the conversion fee return (finalAmount, amount - finalAmount); } /** * @dev calculates the expected return of selling a given amount of tokens * * @param _reserveToken contract address of the reserve token * @param _sellAmount amount of supply-tokens received from the user * * @return amount of reserve-tokens that the user will receive * @return amount of reserve-tokens that the user will pay as fee */ function getSaleReturn(IERC20Token _reserveToken, uint256 _sellAmount) public view active validReserve(_reserveToken) returns (uint256, uint256) { Reserve storage reserve = reserves[_reserveToken]; uint256 tokenSupply = token.totalSupply(); uint256 reserveBalance = _reserveToken.balanceOf(this); IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); uint256 amount = formula.calculateSaleReturn(tokenSupply, reserveBalance, reserve.ratio, _sellAmount); uint256 finalAmount = getFinalAmount(amount, 1); // return the amount minus the conversion fee and the conversion fee return (finalAmount, amount - finalAmount); } /** * @dev calculates the expected return of converting a given amount from one reserve to another * note that prior to version 17, you should use 'getCrossConnectorReturn' instead * * @param _fromReserveToken contract address of the reserve token to convert from * @param _toReserveToken contract address of the reserve token to convert to * @param _amount amount of tokens received from the user * * @return amount of tokens that the user will receive * @return amount of tokens that the user will pay as fee */ function getCrossReserveReturn(IERC20Token _fromReserveToken, IERC20Token _toReserveToken, uint256 _amount) public view active validReserve(_fromReserveToken) validReserve(_toReserveToken) returns (uint256, uint256) { Reserve storage fromReserve = reserves[_fromReserveToken]; Reserve storage toReserve = reserves[_toReserveToken]; IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); uint256 amount = formula.calculateCrossReserveReturn( getReserveBalance(_fromReserveToken), fromReserve.ratio, getReserveBalance(_toReserveToken), toReserve.ratio, _amount); uint256 finalAmount = getFinalAmount(amount, 2); // return the amount minus the conversion fee and the conversion fee // the fee is higher (magnitude = 2) since cross reserve conversion equals 2 conversions (from / to the smart token) return (finalAmount, amount - finalAmount); } /** * @dev converts a specific amount of _fromToken to _toToken * can only be called by the bancor network contract * * @param _fromToken ERC20 token to convert from * @param _toToken ERC20 token to convert to * @param _amount amount to convert, in fromToken * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * * @return conversion return amount */ function convertInternal(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public protected only(BANCOR_NETWORK) greaterThanZero(_minReturn) returns (uint256) { require(_fromToken != _toToken); // validate input // conversion between the token and one of its reserves if (_toToken == token) return buy(_fromToken, _amount, _minReturn); else if (_fromToken == token) return sell(_toToken, _amount, _minReturn); uint256 amount; uint256 feeAmount; // conversion between 2 reserves (amount, feeAmount) = getCrossReserveReturn(_fromToken, _toToken, _amount); // ensure the trade gives something in return and meets the minimum requested amount require(amount != 0 && amount >= _minReturn); Reserve storage fromReserve = reserves[_fromToken]; Reserve storage toReserve = reserves[_toToken]; // ensure that the trade won't deplete the reserve balance uint256 toReserveBalance = getReserveBalance(_toToken); assert(amount < toReserveBalance); // transfer funds from the caller in the from reserve token ensureTransferFrom(_fromToken, msg.sender, this, _amount); // transfer funds to the caller in the to reserve token ensureTransferFrom(_toToken, this, msg.sender, amount); // dispatch the conversion event // the fee is higher (magnitude = 2) since cross reserve conversion equals 2 conversions (from / to the smart token) dispatchConversionEvent(_fromToken, _toToken, _amount, amount, feeAmount); // dispatch price data updates for the smart token / both reserves emit PriceDataUpdate(_fromToken, token.totalSupply(), _fromToken.balanceOf(this), fromReserve.ratio); emit PriceDataUpdate(_toToken, token.totalSupply(), _toToken.balanceOf(this), toReserve.ratio); return amount; } /** * @dev buys the token by depositing one of its reserve tokens * * @param _reserveToken reserve token contract address * @param _depositAmount amount to deposit (in the reserve token) * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * * @return buy return amount */ function buy(IERC20Token _reserveToken, uint256 _depositAmount, uint256 _minReturn) internal returns (uint256) { uint256 amount; uint256 feeAmount; (amount, feeAmount) = getPurchaseReturn(_reserveToken, _depositAmount); // ensure the trade gives something in return and meets the minimum requested amount require(amount != 0 && amount >= _minReturn); Reserve storage reserve = reserves[_reserveToken]; // transfer funds from the caller in the reserve token ensureTransferFrom(_reserveToken, msg.sender, this, _depositAmount); // issue new funds to the caller in the smart token token.issue(msg.sender, amount); // dispatch the conversion event dispatchConversionEvent(_reserveToken, token, _depositAmount, amount, feeAmount); // dispatch price data update for the smart token/reserve emit PriceDataUpdate(_reserveToken, token.totalSupply(), _reserveToken.balanceOf(this), reserve.ratio); return amount; } /** * @dev sells the token by withdrawing from one of its reserve tokens * * @param _reserveToken reserve token contract address * @param _sellAmount amount to sell (in the smart token) * @param _minReturn if the conversion results in an amount smaller the minimum return - it is cancelled, must be nonzero * * @return sell return amount */ function sell(IERC20Token _reserveToken, uint256 _sellAmount, uint256 _minReturn) internal returns (uint256) { require(_sellAmount <= token.balanceOf(msg.sender)); // validate input uint256 amount; uint256 feeAmount; (amount, feeAmount) = getSaleReturn(_reserveToken, _sellAmount); // ensure the trade gives something in return and meets the minimum requested amount require(amount != 0 && amount >= _minReturn); // ensure that the trade will only deplete the reserve balance if the total supply is depleted as well uint256 tokenSupply = token.totalSupply(); uint256 reserveBalance = _reserveToken.balanceOf(this); assert(amount < reserveBalance || (amount == reserveBalance && _sellAmount == tokenSupply)); Reserve storage reserve = reserves[_reserveToken]; // destroy _sellAmount from the caller's balance in the smart token token.destroy(msg.sender, _sellAmount); // transfer funds to the caller in the reserve token ensureTransferFrom(_reserveToken, this, msg.sender, amount); // dispatch the conversion event dispatchConversionEvent(token, _reserveToken, _sellAmount, amount, feeAmount); // dispatch price data update for the smart token/reserve emit PriceDataUpdate(_reserveToken, token.totalSupply(), _reserveToken.balanceOf(this), reserve.ratio); return amount; } /** * @dev converts a specific amount of _fromToken to _toToken * note that prior to version 16, you should use 'convert' instead * * @param _fromToken ERC20 token to convert from * @param _toToken ERC20 token to convert to * @param _amount amount to convert, in fromToken * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return conversion return amount */ function convert2(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) public returns (uint256) { IERC20Token[] memory path = new IERC20Token[](3); (path[0], path[1], path[2]) = (_fromToken, token, _toToken); return quickConvert2(path, _amount, _minReturn, _affiliateAccount, _affiliateFee); } /** * @dev converts the token to any other token in the bancor network by following a predefined conversion path * note that when converting from an ERC20 token (as opposed to a smart token), allowance must be set beforehand * note that prior to version 16, you should use 'quickConvert' instead * * @param _path conversion path, see conversion path format in the BancorNetwork contract * @param _amount amount to convert from (in the initial source token) * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return tokens issued in return */ function quickConvert2(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee) public payable returns (uint256) { IBancorNetwork bancorNetwork = IBancorNetwork(addressOf(BANCOR_NETWORK)); // we need to transfer the source tokens from the caller to the BancorNetwork contract, // so it can execute the conversion on behalf of the caller if (msg.value == 0) { // not ETH, send the source tokens to the BancorNetwork contract // if the token is the smart token, no allowance is required - destroy the tokens // from the caller and issue them to the BancorNetwork contract if (_path[0] == token) { token.destroy(msg.sender, _amount); // destroy _amount tokens from the caller's balance in the smart token token.issue(bancorNetwork, _amount); // issue _amount new tokens to the BancorNetwork contract } else { // otherwise, we assume we already have allowance, transfer the tokens directly to the BancorNetwork contract ensureTransferFrom(_path[0], msg.sender, bancorNetwork, _amount); } } // execute the conversion and pass on the ETH with the call return bancorNetwork.convertFor2.value(msg.value)(_path, _amount, _minReturn, msg.sender, _affiliateAccount, _affiliateFee); } /** * @dev allows a user to convert BNT that was sent from another blockchain into any other * token on the BancorNetwork without specifying the amount of BNT to be converted, but * rather by providing the xTransferId which allows us to get the amount from BancorX. * note that prior to version 16, you should use 'completeXConversion' instead * * @param _path conversion path, see conversion path format in the BancorNetwork contract * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * * @return tokens issued in return */ function completeXConversion2( IERC20Token[] _path, uint256 _minReturn, uint256 _conversionId ) public returns (uint256) { IBancorX bancorX = IBancorX(addressOf(BANCOR_X)); IBancorNetwork bancorNetwork = IBancorNetwork(addressOf(BANCOR_NETWORK)); // verify that the first token in the path is BNT require(_path[0] == addressOf(BNT_TOKEN)); // get conversion amount from BancorX contract uint256 amount = bancorX.getXTransferAmount(_conversionId, msg.sender); // send BNT from msg.sender to the BancorNetwork contract token.destroy(msg.sender, amount); token.issue(bancorNetwork, amount); return bancorNetwork.convertFor2(_path, amount, _minReturn, msg.sender, address(0), 0); } /** * @dev ensures transfer of tokens, taking into account that some ERC-20 implementations don't return * true on success but revert on failure instead * * @param _token the token to transfer * @param _from the address to transfer the tokens from * @param _to the address to transfer the tokens to * @param _amount the amount to transfer */ function ensureTransferFrom(IERC20Token _token, address _from, address _to, uint256 _amount) private { // We must assume that functions `transfer` and `transferFrom` do not return anything, // because not all tokens abide the requirement of the ERC20 standard to return success or failure. // This is because in the current compiler version, the calling contract can handle more returned data than expected but not less. // This may change in the future, so that the calling contract will revert if the size of the data is not exactly what it expects. uint256 prevBalance = _token.balanceOf(_to); if (_from == address(this)) INonStandardERC20(_token).transfer(_to, _amount); else INonStandardERC20(_token).transferFrom(_from, _to, _amount); uint256 postBalance = _token.balanceOf(_to); require(postBalance > prevBalance); } /** * @dev buys the token with all reserve tokens using the same percentage * for example, if the caller increases the supply by 10%, * then it will cost an amount equal to 10% of each reserve token balance * note that the function can be called only when conversions are enabled * * @param _amount amount to increase the supply by (in the smart token) */ function fund(uint256 _amount) public protected multipleReservesOnly { uint256 supply = token.totalSupply(); IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); // iterate through the reserve tokens and transfer a percentage equal to the ratio between _amount // and the total supply in each reserve from the caller to the converter IERC20Token reserveToken; uint256 reserveBalance; uint256 reserveAmount; for (uint16 i = 0; i < reserveTokens.length; i++) { reserveToken = reserveTokens[i]; reserveBalance = reserveToken.balanceOf(this); reserveAmount = formula.calculateFundCost(supply, reserveBalance, totalReserveRatio, _amount); Reserve storage reserve = reserves[reserveToken]; // transfer funds from the caller in the reserve token ensureTransferFrom(reserveToken, msg.sender, this, reserveAmount); // dispatch price data update for the smart token/reserve emit PriceDataUpdate(reserveToken, supply + _amount, reserveBalance + reserveAmount, reserve.ratio); } // issue new funds to the caller in the smart token token.issue(msg.sender, _amount); } /** * @dev sells the token for all reserve tokens using the same percentage * for example, if the holder sells 10% of the supply, * then they will receive 10% of each reserve token balance in return * note that the function can be called also when conversions are disabled * * @param _amount amount to liquidate (in the smart token) */ function liquidate(uint256 _amount) public protected multipleReservesOnly { uint256 supply = token.totalSupply(); IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); // destroy _amount from the caller's balance in the smart token token.destroy(msg.sender, _amount); // iterate through the reserve tokens and send a percentage equal to the ratio between _amount // and the total supply from each reserve balance to the caller IERC20Token reserveToken; uint256 reserveBalance; uint256 reserveAmount; for (uint16 i = 0; i < reserveTokens.length; i++) { reserveToken = reserveTokens[i]; reserveBalance = reserveToken.balanceOf(this); reserveAmount = formula.calculateLiquidateReturn(supply, reserveBalance, totalReserveRatio, _amount); Reserve storage reserve = reserves[reserveToken]; // transfer funds to the caller in the reserve token ensureTransferFrom(reserveToken, this, msg.sender, reserveAmount); // dispatch price data update for the smart token/reserve emit PriceDataUpdate(reserveToken, supply - _amount, reserveBalance - reserveAmount, reserve.ratio); } } /** * @dev helper, dispatches the Conversion event * * @param _fromToken ERC20 token to convert from * @param _toToken ERC20 token to convert to * @param _amount amount purchased/sold (in the source token) * @param _returnAmount amount returned (in the target token) */ function dispatchConversionEvent(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _returnAmount, uint256 _feeAmount) private { // fee amount is converted to 255 bits - // negative amount means the fee is taken from the source token, positive amount means its taken from the target token // currently the fee is always taken from the target token // since we convert it to a signed number, we first ensure that it's capped at 255 bits to prevent overflow assert(_feeAmount < 2 ** 255); emit Conversion(_fromToken, _toToken, msg.sender, _amount, _returnAmount, int256(_feeAmount)); } /** * @dev deprecated, backward compatibility */ function change(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256) { return convertInternal(_fromToken, _toToken, _amount, _minReturn); } /** * @dev deprecated, backward compatibility */ function convert(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256) { return convert2(_fromToken, _toToken, _amount, _minReturn, address(0), 0); } /** * @dev deprecated, backward compatibility */ function quickConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) { return quickConvert2(_path, _amount, _minReturn, address(0), 0); } /** * @dev deprecated, backward compatibility */ function quickConvertPrioritized2(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, uint256[] memory, address _affiliateAccount, uint256 _affiliateFee) public payable returns (uint256) { return quickConvert2(_path, _amount, _minReturn, _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function quickConvertPrioritized(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, uint256, uint8, bytes32, bytes32) public payable returns (uint256) { return quickConvert2(_path, _amount, _minReturn, address(0), 0); } /** * @dev deprecated, backward compatibility */ function completeXConversion(IERC20Token[] _path, uint256 _minReturn, uint256 _conversionId, uint256, uint8, bytes32, bytes32) public returns (uint256) { return completeXConversion2(_path, _minReturn, _conversionId); } /** * @dev deprecated, backward compatibility */ function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool) { Reserve storage reserve = reserves[_address]; return(reserve.virtualBalance, reserve.ratio, reserve.isVirtualBalanceEnabled, reserve.isSaleEnabled, reserve.isSet); } /** * @dev deprecated, backward compatibility */ function connectorTokens(uint256 _index) public view returns (IERC20Token) { return BancorConverter.reserveTokens[_index]; } /** * @dev deprecated, backward compatibility */ function connectorTokenCount() public view returns (uint16) { return reserveTokenCount(); } /** * @dev deprecated, backward compatibility */ function addConnector(IERC20Token _token, uint32 _weight, bool /*_enableVirtualBalance*/) public { addReserve(_token, _weight); } /** * @dev deprecated, backward compatibility */ function updateConnector(IERC20Token _connectorToken, uint32 /*_weight*/, bool /*_enableVirtualBalance*/, uint256 _virtualBalance) public { updateReserveVirtualBalance(_connectorToken, _virtualBalance); } /** * @dev deprecated, backward compatibility */ function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256) { return getReserveBalance(_connectorToken); } /** * @dev deprecated, backward compatibility */ function getCrossConnectorReturn(IERC20Token _fromConnectorToken, IERC20Token _toConnectorToken, uint256 _amount) public view returns (uint256, uint256) { return getCrossReserveReturn(_fromConnectorToken, _toConnectorToken, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_connectorToken","type":"address"},{"name":"","type":"uint32"},{"name":"","type":"bool"},{"name":"_virtualBalance","type":"uint256"}],"name":"updateConnector","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"connectors","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint32"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorX","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserveToken","type":"address"}],"name":"getReserveBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"connectorTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_fromToken","type":"address"},{"name":"_toToken","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getReturn","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"bytes32"},{"name":"","type":"bytes32"}],"name":"quickConvertPrioritized","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_fromToken","type":"address"},{"name":"_toToken","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convertInternal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_reserveToken","type":"address"}],"name":"getReserveRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptTokenOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_magnitude","type":"uint8"}],"name":"getFinalAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_weight","type":"uint32"},{"name":"","type":"bool"}],"name":"addConnector","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"liquidate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawFromToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_whitelist","type":"address"}],"name":"setConversionWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_minReturn","type":"uint256"},{"name":"_conversionId","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"bytes32"},{"name":"","type":"bytes32"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"conversionFee","outputs":[{"name":"","type":"uint32"}],"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":false,"inputs":[{"name":"_fromToken","type":"address"},{"name":"_toToken","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"change","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalReserveRatio","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_ratio","type":"uint32"}],"name":"addReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fromToken","type":"address"},{"name":"_toToken","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":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"connectorTokenCount","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserveToken","type":"address"},{"name":"_sellAmount","type":"uint256"}],"name":"getSaleReturn","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_fromToken","type":"address"},{"name":"_toToken","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","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":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_fromConnectorToken","type":"address"},{"name":"_toConnectorToken","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getCrossConnectorReturn","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONVERTER_CONVERSION_WHITELIST","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserveToken","type":"address"},{"name":"_virtualBalance","type":"uint256"}],"name":"updateReserveVirtualBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxConversionFee","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reserveTokenCount","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserveToken","type":"address"},{"name":"_depositAmount","type":"uint256"}],"name":"getPurchaseReturn","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":"","type":"uint256[]"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"quickConvertPrioritized2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"conversionsEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"conversionWhitelist","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_fromReserveToken","type":"address"},{"name":"_toReserveToken","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getCrossReserveReturn","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"reserveTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reserves","outputs":[{"name":"virtualBalance","type":"uint256"},{"name":"ratio","type":"uint32"},{"name":"isVirtualBalanceEnabled","type":"bool"},{"name":"isSaleEnabled","type":"bool"},{"name":"isSet","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_connectorToken","type":"address"}],"name":"getConnectorBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bancorX","type":"address"}],"name":"setBancorX","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":"quickConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_minReturn","type":"uint256"},{"name":"_conversionId","type":"uint256"}],"name":"completeXConversion2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_conversionFee","type":"uint32"}],"name":"setConversionFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"quickConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_registry","type":"address"},{"name":"_maxConversionFee","type":"uint32"},{"name":"_reserveToken","type":"address"},{"name":"_reserveRatio","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":true,"name":"_trader","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_return","type":"uint256"},{"indexed":false,"name":"_conversionFee","type":"int256"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_connectorToken","type":"address"},{"indexed":false,"name":"_tokenSupply","type":"uint256"},{"indexed":false,"name":"_connectorBalance","type":"uint256"},{"indexed":false,"name":"_connectorWeight","type":"uint32"}],"name":"PriceDataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevFee","type":"uint32"},{"indexed":false,"name":"_newFee","type":"uint32"}],"name":"ConversionFeeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
60806040526005805460a860020a61ffff021916751b000000000000000000000000000000000000000000179055600980546c010000000000000000000000006001606860020a031990911617606860020a60ff02191690553480156200006557600080fd5b5060405160a080620047258339810160409081528151602083015191830151606084015160809094015160008054600160a060020a0319163317815592949192848680600160a060020a0381161515620000be57600080fd5b5060028054600160a060020a031916600160a060020a03928316179055819081161515620000eb57600080fd5b5060048054600160a060020a03909216600160a060020a031992831681179091556005805490921617905583600063ffffffff821610801590620001385750620f424063ffffffff821611155b15156200014457600080fd5b620001787f436f6e74726163744665617475726573000000000000000000000000000000006401000000006200025f810204565b9150600160a060020a038216156200020d57604080517f2c7077c000000000000000000000000000000000000000000000000000000000815260016004820181905260248201529051600160a060020a03841691632c7077c091604480830192600092919082900301818387803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050505b6009805467ffffffff00000000191664010000000063ffffffff881602179055600160a060020a038416156200025257620002528484640100000000620002fb810204565b505050505050506200053f565b60048054604080517fbb34534c00000000000000000000000000000000000000000000000000000000815292830184905251600092600160a060020a039092169163bb34534c91602480830192602092919082900301818787803b158015620002c757600080fd5b505af1158015620002dc573d6000803e3d6000fd5b505050506040513d6020811015620002f357600080fd5b505192915050565b600054600160a060020a031633146200031357600080fd5b600254604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290513092600160a060020a031691638da5cb5b9160048083019260209291908290030181600087803b1580156200037357600080fd5b505af115801562000388573d6000803e3d6000fd5b505050506040513d60208110156200039f57600080fd5b5051600160a060020a03161415620003b657600080fd5b81600160a060020a0381161515620003cd57600080fd5b82600160a060020a038116301415620003e557600080fd5b8260008163ffffffff16118015620004065750620f424063ffffffff821611155b15156200041257600080fd5b600254600160a060020a03868116911614801590620004575750600160a060020a0385166000908152600860205260409020600101546601000000000000900460ff16155b8015620004765750600954620f424063ffffffff918216860190911611155b15156200048257600080fd5b505050600160a060020a03919091166000818152600860205260408120600180820180549284905566010000000000006501000000000063ffffffff1994851663ffffffff808a169190911765ffff0000000019169190911766ff0000000000001916919091179091556007805492830181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a0319169093179092556009805492831692821690930116179055565b6141d6806200054f6000396000f3006080604052600436106102a55763ffffffff60e060020a600035041663024c7ec781146102aa5780630ca78923146102c65780630e53aae9146102f85780631120a7761461034d57806315226b541461037e57806319b64015146103b15780631e1401f8146103c957806321e6b53d1461040c578063227425641461042d5780632a2e2f0c146104955780632c12b446146104c25780632fe8a6ad146104e357806338a5e0161461050c5780633aa0145a146105215780633f4d2fc21461053f578063415f12401461056e57806341a5b33d1461058657806349d10b64146105b05780634af80f0e146105c557806350057351146105e657806354fd4d501461065b578063579cd3ca146106875780635e35359e146106b55780635e5144eb146106df57806361cd756e1461070c5780636520d6fb146107215780636a49d2c4146107365780636ebf36c01461076057806371f52bf31461079857806372b44b2c146107ad57806375892cf1146107d157806379ba5097146107fe5780637b103999146108135780638da5cb5b146108285780638e3047e01461083d57806392d1abb714610867578063935e2ae11461087c57806394c275ad146108a05780639b99a8e2146108b5578063a2c4c336146108ca578063b3a426d5146108ee578063b4a176d31461098f578063bf754558146109a4578063c45d3d92146109b9578063ca1d209d146109ce578063cf73266a146109e6578063d031370b14610a10578063d4ee1d9014610a28578063d55ec69714610a3d578063d66bd52414610a52578063d895951214610a73578063d924f0c314610a94578063e4dd22f614610ab5578063ebf9470014610b18578063ecbca55d14610b76578063f0843ba914610b94578063f2fde38b14610be5578063fc0c546a14610c06578063fe417fa514610c1b575b600080fd5b3480156102b657600080fd5b506102c46004351515610c3f565b005b3480156102d257600080fd5b506102c4600160a060020a036004351663ffffffff602435166044351515606435610c96565b34801561030457600080fd5b50610319600160a060020a0360043516610ca6565b6040805195865263ffffffff9094166020860152911515848401521515606084015215156080830152519081900360a00190f35b34801561035957600080fd5b50610362610cf8565b60408051600160a060020a039092168252519081900360200190f35b34801561038a57600080fd5b5061039f600160a060020a0360043516610d07565b60408051918252519081900360200190f35b3480156103bd57600080fd5b50610362600435610dbb565b3480156103d557600080fd5b506103f3600160a060020a0360043581169060243516604435610de7565b6040805192835260208301919091528051918290030190f35b34801561041857600080fd5b506102c4600160a060020a0360043516610e64565b6040805160206004803580820135838102808601850190965280855261039f95369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a00135610eb4565b3480156104a157600080fd5b5061039f600160a060020a0360043581169060243516604435606435610ed0565b3480156104ce57600080fd5b5061039f600160a060020a036004351661132a565b3480156104ef57600080fd5b506104f8611386565b604080519115158252519081900360200190f35b34801561051857600080fd5b506102c46113a7565b34801561052d57600080fd5b5061039f60043560ff6024351661145d565b34801561054b57600080fd5b506102c4600160a060020a036004351663ffffffff6024351660443515156114bb565b34801561057a57600080fd5b506102c46004356114ca565b34801561059257600080fd5b506102c4600160a060020a0360043581169060243516604435611829565b3480156105bc57600080fd5b506102c46118d3565b3480156105d157600080fd5b506102c4600160a060020a0360043516611a64565b3480156105f257600080fd5b506040805160206004803580820135838102808601850190965280855261039f95369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a00135611ab5565b34801561066757600080fd5b50610670611ac2565b6040805161ffff9092168252519081900360200190f35b34801561069357600080fd5b5061069c611ae5565b6040805163ffffffff9092168252519081900360200190f35b3480156106c157600080fd5b506102c4600160a060020a0360043581169060243516604435611afd565b3480156106eb57600080fd5b5061039f600160a060020a0360043581169060243516604435606435611c0e565b34801561071857600080fd5b50610362611c25565b34801561072d57600080fd5b5061069c611c34565b34801561074257600080fd5b506102c4600160a060020a036004351663ffffffff60243516611c40565b34801561076c57600080fd5b5061039f600160a060020a0360043581169060243581169060443590606435906084351660a435611e78565b3480156107a457600080fd5b50610670611f1e565b3480156107b957600080fd5b506103f3600160a060020a0360043516602435611f2d565b3480156107dd57600080fd5b5061039f600160a060020a036004358116906024351660443560643561220d565b34801561080a57600080fd5b506102c461221e565b34801561081f57600080fd5b50610362612299565b34801561083457600080fd5b506103626122a8565b34801561084957600080fd5b506103f3600160a060020a03600435811690602435166044356122b7565b34801561087357600080fd5b5061039f6122c5565b34801561088857600080fd5b506102c4600160a060020a03600435166024356122ca565b3480156108ac57600080fd5b5061069c61237f565b3480156108c157600080fd5b50610670612393565b3480156108d657600080fd5b506103f3600160a060020a0360043516602435612399565b6040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437505060408051818801358901803560208181028481018201909552818452989b8a359b8a8c01359b919a9099506060909101975092955090820193509182918501908490808284375094975050508335600160a060020a031694505050602090910135905061262c565b34801561099b57600080fd5b506102c4612646565b3480156109b057600080fd5b506104f8612681565b3480156109c557600080fd5b5061036261269a565b3480156109da57600080fd5b506102c46004356126a9565b3480156109f257600080fd5b506103f3600160a060020a0360043581169060243516604435612a07565b348015610a1c57600080fd5b50610362600435612c37565b348015610a3457600080fd5b50610362612c5f565b348015610a4957600080fd5b506102c4612c6e565b348015610a5e57600080fd5b50610319600160a060020a0360043516612d4a565b348015610a7f57600080fd5b5061039f600160a060020a0360043516612d90565b348015610aa057600080fd5b506102c4600160a060020a0360043516612da1565b6040805160206004803580820135838102808601850190965280855261039f9536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050612dda565b348015610b2457600080fd5b506040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437509497505084359550505060209092013591506130589050565b348015610b8257600080fd5b506102c463ffffffff60043516613385565b6040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437509497505084359550505060209092013591506134539050565b348015610bf157600080fd5b506102c4600160a060020a036004351661346b565b348015610c1257600080fd5b506103626134bf565b348015610c2757600080fd5b506102c4600160a060020a03600435166024356134ce565b600054600160a060020a03163314610c5657600080fd5b60058054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610ca084826122ca565b50505050565b600160a060020a031660009081526008602052604090208054600190910154909163ffffffff82169160ff64010000000082048116926501000000000083048216926601000000000000900490911690565b600354600160a060020a031681565b600160a060020a03811660009081526008602052604081206001015482906601000000000000900460ff161515610d3d57600080fd5b6040805160e060020a6370a082310281523060048201529051600160a060020a038516916370a082319160248083019260209291908290030181600087803b158015610d8857600080fd5b505af1158015610d9c573d6000803e3d6000fd5b505050506040513d6020811015610db257600080fd5b50519392505050565b6000600782815481101515610dcc57fe5b600091825260209091200154600160a060020a031692915050565b600080600160a060020a038581169085161415610e0357600080fd5b600254600160a060020a0385811691161415610e2c57610e238584612399565b91509150610e5c565b600254600160a060020a0386811691161415610e4c57610e238484611f2d565b610e57858585612a07565b915091505b935093915050565b600054600160a060020a03163314610e7b57600080fd5b60008051602061416b833981519152610e93816135c7565b600160a060020a03163314610ea757600080fd5b610eb082613660565b5050565b6000610ec4888888600080612dda565b98975050505050505050565b6000806000806000806009600d9054906101000a900460ff16151515610ef557600080fd5b600980546dff0000000000000000000000000019166d01000000000000000000000000001790557f42616e636f724e6574776f726b00000000000000000000000000000000000000610f46816135c7565b600160a060020a03163314610f5a57600080fd5b8760008111610f6857600080fd5b600160a060020a038c8116908c161415610f8157600080fd5b600254600160a060020a038c811691161415610fa957610fa28c8b8b6136f9565b9750611303565b600254600160a060020a038d811691161415610fca57610fa28b8b8b613917565b610fd58c8c8c612a07565b90975095508615801590610fe95750888710155b1515610ff457600080fd5b600160a060020a03808d16600090815260086020526040808220928e168252902090955093506110238b610d07565b925082871061102e57fe5b61103a8c33308d613cd2565b6110468b30338a613cd2565b6110538c8c8c8a8a613f10565b8b600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050508e600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115557600080fd5b505af1158015611169573d6000803e3d6000fd5b505050506040513d602081101561117f57600080fd5b5051600189015460408051938452602084019290925263ffffffff1682820152519081900360600190a28a600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561121557600080fd5b505af1158015611229573d6000803e3d6000fd5b505050506040513d602081101561123f57600080fd5b81019080805190602001909291905050508d600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156112ab57600080fd5b505af11580156112bf573d6000803e3d6000fd5b505050506040513d60208110156112d557600080fd5b5051600188015460408051938452602084019290925263ffffffff1682820152519081900360600190a28697505b5050600980546dff0000000000000000000000000019169055509398975050505050505050565b600160a060020a03811660009081526008602052604081206001015482906601000000000000900460ff16151561136057600080fd5b5050600160a060020a031660009081526008602052604090206001015463ffffffff1690565b60055474010000000000000000000000000000000000000000900460ff1681565b600054600160a060020a031633146113be57600080fd5b600254604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916318160ddd91600480830192602092919082900301818787803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b505050506040513d602081101561144757600080fd5b50511161145357600080fd5b61145b613f93565b565b6009546000906114b49060ff8416620f424081810a67ffffffffffffffff908116936114a893899363ffffffff680100000000000000009093048316900383160a9091169061401116565b9063ffffffff61404a16565b9392505050565b6114c58383611c40565b505050565b60008060008060008060006009600d9054906101000a900460ff161515156114f157600080fd5b600980546dff0000000000000000000000000019166d010000000000000000000000000017905560075460011061152757600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561157a57600080fd5b505af115801561158e573d6000803e3d6000fd5b505050506040513d60208110156115a457600080fd5b505196506115bf60008051602061414b8339815191526135c7565b6002546040805160e060020a63a24835d1028152336004820152602481018c90529051929850600160a060020a039091169163a24835d19160448082019260009290919082900301818387803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b50505050600091505b60075461ffff83161015611808576007805461ffff841690811061165557fe5b60009182526020808320909101546040805160e060020a6370a082310281523060048201529051600160a060020a03909216985088936370a082319360248084019491939192918390030190829087803b1580156116b257600080fd5b505af11580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b5051600954604080517fabfd231d000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905263ffffffff9092166044830152606482018b905251919550600160a060020a0388169163abfd231d916084808201926020929091908290030181600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b505050506040513d602081101561178b57600080fd5b5051600160a060020a038616600090815260086020526040902090935090506117b685303386613cd2565b6001810154604080518a8a038152858703602082015263ffffffff9092168282015251600160a060020a0387169160008051602061418b833981519152919081900360600190a2600190910190611635565b5050600980546dff0000000000000000000000000019169055505050505050565b600054600160a060020a0316331461184057600080fd5b600254604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015285811660248301526044820185905291519190921691635e35359e91606480830192600092919082900301818387803b1580156118b657600080fd5b505af11580156118ca573d6000803e3d6000fd5b50505050505050565b60008054600160a060020a0316331480611908575060055474010000000000000000000000000000000000000000900460ff16155b151561191357600080fd5b61193c7f436f6e74726163745265676973747279000000000000000000000000000000006135c7565b600454909150600160a060020a038083169116148015906119655750600160a060020a03811615155b151561197057600080fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050506040513d6020811015611a1e57600080fd5b5051600160a060020a03161415611a3457600080fd5b6004805460058054600160a060020a03808416600160a060020a0319928316179092559091169216919091179055565b600054600160a060020a03163314611a7b57600080fd5b80600160a060020a038116301415611a9257600080fd5b5060068054600160a060020a031916600160a060020a0392909216919091179055565b6000610ec4888888613058565b6005547501000000000000000000000000000000000000000000900461ffff1681565b60095468010000000000000000900463ffffffff1681565b6000611b1660008051602061416b8339815191526135c7565b600160a060020a0385166000908152600860205260409020600101549091506601000000000000900460ff161580611be05750600254604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290513092600160a060020a031691638da5cb5b9160048083019260209291908290030181600087803b158015611ba857600080fd5b505af1158015611bbc573d6000803e3d6000fd5b505050506040513d6020811015611bd257600080fd5b5051600160a060020a031614155b80611bf85750600054600160a060020a038281169116145b1515611c0357600080fd5b610ca084848461406d565b6000611c1c85858585610ed0565b95945050505050565b600554600160a060020a031681565b60095463ffffffff1681565b600054600160a060020a03163314611c5757600080fd5b600254604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290513092600160a060020a031691638da5cb5b9160048083019260209291908290030181600087803b158015611cb657600080fd5b505af1158015611cca573d6000803e3d6000fd5b505050506040513d6020811015611ce057600080fd5b5051600160a060020a03161415611cf657600080fd5b81600160a060020a0381161515611d0c57600080fd5b82600160a060020a038116301415611d2357600080fd5b8260008163ffffffff16118015611d435750620f424063ffffffff821611155b1515611d4e57600080fd5b600254600160a060020a03868116911614801590611d925750600160a060020a0385166000908152600860205260409020600101546601000000000000900460ff16155b8015611db05750600954620f424063ffffffff918216860190911611155b1515611dbb57600080fd5b505050600160a060020a03919091166000818152600860205260408120600180820180549284905566010000000000006501000000000063ffffffff1994851663ffffffff808a169190911765ffff0000000019169190911766ff0000000000001916919091179091556007805492830181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a0319169093179092556009805492831692821690930116179055565b6040805160038082526080820190925260009160609190602082018380388339505060025482519293508a92600160a060020a039091169150899084906000908110611ec057fe5b906020019060200201846001815181101515611ed857fe5b906020019060200201856002815181101515611ef057fe5b600160a060020a0394851660209182029092010152928216909252919091169052610ec48187878787612dda565b6000611f28612393565b905090565b60008060008060008060008030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f9657600080fd5b505af1158015611faa573d6000803e3d6000fd5b505050506040513d6020811015611fc057600080fd5b5051600160a060020a031614611fd557600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff16151561200b57600080fd5b600160a060020a03808c16600090815260086020908152604080832060025482517f18160ddd0000000000000000000000000000000000000000000000000000000081529251919c50909416936318160ddd93600480840194938390030190829087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50516040805160e060020a6370a082310281523060048201529051919750600160a060020a038d16916370a08231916024808201926020929091908290030181600087803b1580156120f657600080fd5b505af115801561210a573d6000803e3d6000fd5b505050506040513d602081101561212057600080fd5b5051945061213b60008051602061414b8339815191526135c7565b6001880154604080517f49f9b0f7000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905263ffffffff9092166044830152606482018d905251919550600160a060020a038616916349f9b0f7916084808201926020929091908290030181600087803b1580156121c057600080fd5b505af11580156121d4573d6000803e3d6000fd5b505050506040513d60208110156121ea57600080fd5b505192506121f983600161145d565b9b928c90039a509198505050505050505050565b6000611c1c85858585600080611e78565b600154600160a060020a0316331461223557600080fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a36001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b600454600160a060020a031681565b600054600160a060020a031681565b600080610e57858585612a07565b600181565b60008054600160a060020a031633146122e257600080fd5b60008051602061416b8339815191526122fa816135c7565b600160a060020a0316331461230e57600080fd5b600160a060020a03841660009081526008602052604090206001015484906601000000000000900460ff16151561234457600080fd5b505050600160a060020a0391909116600090815260086020526040902060018101805464ff0000000019168315156401000000000217905555565b600954640100000000900463ffffffff1681565b60075490565b60008060008060008060008030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d602081101561242c57600080fd5b5051600160a060020a03161461244157600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff16151561247757600080fd5b600160a060020a03808c16600090815260086020908152604080832060025482517f18160ddd0000000000000000000000000000000000000000000000000000000081529251919c50909416936318160ddd93600480840194938390030190829087803b1580156124e757600080fd5b505af11580156124fb573d6000803e3d6000fd5b505050506040513d602081101561251157600080fd5b50516040805160e060020a6370a082310281523060048201529051919750600160a060020a038d16916370a08231916024808201926020929091908290030181600087803b15801561256257600080fd5b505af1158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505194506125a760008051602061414b8339815191526135c7565b6001880154604080517f29a00e7c000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905263ffffffff9092166044830152606482018d905251919550600160a060020a038616916329a00e7c916084808201926020929091908290030181600087803b1580156121c057600080fd5b600061263b8787878686612dda565b979650505050505050565b600054600160a060020a0316331461265d57600080fd5b60055460048054600160a060020a031916600160a060020a03909216919091179055565b6009546c01000000000000000000000000900460ff1681565b600654600160a060020a031681565b60008060008060008060006009600d9054906101000a900460ff161515156126d057600080fd5b600980546dff0000000000000000000000000019166d010000000000000000000000000017905560075460011061270657600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050506040513d602081101561278357600080fd5b5051965061279e60008051602061414b8339815191526135c7565b9550600091505b60075461ffff83161015612978576007805461ffff84169081106127c557fe5b60009182526020808320909101546040805160e060020a6370a082310281523060048201529051600160a060020a03909216985088936370a082319360248084019491939192918390030190829087803b15801561282257600080fd5b505af1158015612836573d6000803e3d6000fd5b505050506040513d602081101561284c57600080fd5b5051600954604080517f1da6bbfb000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905263ffffffff9092166044830152606482018b905251919550600160a060020a03881691631da6bbfb916084808201926020929091908290030181600087803b1580156128d157600080fd5b505af11580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b5051600160a060020a0386166000908152600860205260409020909350905061292685333086613cd2565b600181015460408051898b018152868601602082015263ffffffff9092168282015251600160a060020a0387169160008051602061418b833981519152919081900360600190a26001909101906127a5565b6002546040805160e260020a63219e412d028152336004820152602481018b90529051600160a060020a039092169163867904b49160448082019260009290919082900301818387803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b5050600980546dff000000000000000000000000001916905550505050505050505050565b600080600080600080600030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612a6f57600080fd5b505af1158015612a83573d6000803e3d6000fd5b505050506040513d6020811015612a9957600080fd5b5051600160a060020a031614612aae57600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff161515612ae457600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff161515612b1a57600080fd5b600160a060020a03808d16600090815260086020526040808220928e16825290209097509550612b5760008051602061414b8339815191526135c7565b945084600160a060020a03166379c1b450612b718e610d07565b60018a015463ffffffff16612b858f610d07565b60018b01546040805163ffffffff87811660e060020a028252600482019690965293851660248501526044840192909252929092166064820152608481018e9052905160a48083019260209291908290030181600087803b158015612be957600080fd5b505af1158015612bfd573d6000803e3d6000fd5b505050506040513d6020811015612c1357600080fd5b50519350612c2284600261145d565b9c938d90039b50929950505050505050505050565b6007805482908110612c4557fe5b600091825260209091200154600160a060020a0316905081565b600154600160a060020a031681565b60008054600160a060020a03163314612c8657600080fd5b612c9d60008051602061416b8339815191526135c7565b9050612ca88161346b565b600554604080517f90f58c96000000000000000000000000000000000000000000000000000000008152750100000000000000000000000000000000000000000090920461ffff16600483015251600160a060020a038316916390f58c9691602480830192600092919082900301818387803b158015612d2757600080fd5b505af1158015612d3b573d6000803e3d6000fd5b50505050612d4761221e565b50565b6008602052600090815260409020805460019091015463ffffffff81169060ff640100000000820481169165010000000000810482169166010000000000009091041685565b6000612d9b82610d07565b92915050565b600054600160a060020a03163314612db857600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b600080612e067f42616e636f724e6574776f726b000000000000000000000000000000000000006135c7565b9050341515612f4d576002548751600160a060020a039091169088906000908110612e2d57fe5b90602001906020020151600160a060020a03161415612f29576002546040805160e060020a63a24835d1028152336004820152602481018990529051600160a060020a039092169163a24835d19160448082019260009290919082900301818387803b158015612e9c57600080fd5b505af1158015612eb0573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152600160a060020a038681166004830152602482018c9052915191909216935063867904b49250604480830192600092919082900301818387803b158015612f0c57600080fd5b505af1158015612f20573d6000803e3d6000fd5b50505050612f4d565b612f4d876000815181101515612f3b57fe5b90602001906020020151338389613cd2565b80600160a060020a031663ab6214ce34898989338a8a6040518863ffffffff1660e060020a028152600401808060200187815260200186815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015612ff7578181015183820152602001612fdf565b505050509050019750505050505050506020604051808303818588803b15801561302057600080fd5b505af1158015613034573d6000803e3d6000fd5b50505050506040513d602081101561304b57600080fd5b5051979650505050505050565b6000806000806130877f42616e636f7258000000000000000000000000000000000000000000000000006135c7565b92506130b27f42616e636f724e6574776f726b000000000000000000000000000000000000006135c7565b91506130dd7f424e54546f6b656e0000000000000000000000000000000000000000000000006135c7565b600160a060020a03168760008151811015156130f557fe5b60209081029091010151600160a060020a03161461311257600080fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0385169163aafd6b769160448083019260209291908290030181600087803b15801561317a57600080fd5b505af115801561318e573d6000803e3d6000fd5b505050506040513d60208110156131a457600080fd5b50516002546040805160e060020a63a24835d1028152336004820152602481018490529051929350600160a060020a039091169163a24835d19160448082019260009290919082900301818387803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152600160a060020a03878116600483015260248201879052915191909216935063867904b49250604480830192600092919082900301818387803b15801561326f57600080fd5b505af1158015613283573d6000803e3d6000fd5b5050505081600160a060020a031663ab6214ce888389336000806040518763ffffffff1660e060020a028152600401808060200187815260200186815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015613331578181015183820152602001613319565b50505050905001975050505050505050602060405180830381600087803b15801561335b57600080fd5b505af115801561336f573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b600054600160a060020a0316331461339c57600080fd5b60008163ffffffff16101580156133c7575060095463ffffffff640100000000909104811690821611155b15156133d257600080fd5b6009546040805163ffffffff6801000000000000000090930483168152918316602083015280517f81cd2ffb37dd237c0e4e2a3de5265fcf9deb43d3e7801e80db9f1ccfba7ee6009281900390910190a16009805463ffffffff90921668010000000000000000026bffffffff000000000000000019909216919091179055565b6000613463848484600080612dda565b949350505050565b600054600160a060020a0316331461348257600080fd5b600054600160a060020a038281169116141561349d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600354600160a060020a031633146134e557600080fd5b6002546040805160e060020a63a24835d1028152600160a060020a038581166004830152602482018590529151919092169163a24835d191604480830192600092919082900301818387803b15801561353d57600080fd5b505af1158015613551573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152336004820152602481018690529051600160a060020a03909216935063867904b4925060448082019260009290919082900301818387803b1580156135ab57600080fd5b505af11580156135bf573d6000803e3d6000fd5b505050505050565b60048054604080517fbb34534c00000000000000000000000000000000000000000000000000000000815292830184905251600092600160a060020a039092169163bb34534c91602480830192602092919082900301818787803b15801561362e57600080fd5b505af1158015613642573d6000803e3d6000fd5b505050506040513d602081101561365857600080fd5b505192915050565b600054600160a060020a0316331461367757600080fd5b600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b1580156136de57600080fd5b505af11580156136f2573d6000803e3d6000fd5b5050505050565b6000806000806137098787612399565b9093509150821580159061371d5750848310155b151561372857600080fd5b50600160a060020a038616600090815260086020526040902061374d87333089613cd2565b6002546040805160e260020a63219e412d028152336004820152602481018690529051600160a060020a039092169163867904b49160448082019260009290919082900301818387803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b50506002546137d59250899150600160a060020a0316888686613f10565b86600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561384157600080fd5b505af1158015613855573d6000803e3d6000fd5b505050506040513d602081101561386b57600080fd5b50516040805160e060020a6370a082310281523060048201529051600160a060020a038c16916370a082319160248083019260209291908290030181600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d60208110156138e257600080fd5b5051600185015460408051938452602084019290925263ffffffff1682820152519081900360600190a2509095945050505050565b6002546040805160e060020a6370a08231028152336004820152905160009283928392839283928392600160a060020a03909216916370a082319160248082019260209290919082900301818787803b15801561397357600080fd5b505af1158015613987573d6000803e3d6000fd5b505050506040513d602081101561399d57600080fd5b50518811156139ab57600080fd5b6139b58989611f2d565b909550935084158015906139c95750868510155b15156139d457600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613a2757600080fd5b505af1158015613a3b573d6000803e3d6000fd5b505050506040513d6020811015613a5157600080fd5b50516040805160e060020a6370a082310281523060048201529051919450600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015613aa257600080fd5b505af1158015613ab6573d6000803e3d6000fd5b505050506040513d6020811015613acc57600080fd5b5051915081851080613ae757508185148015613ae757508288145b1515613aef57fe5b50600160a060020a03808916600090815260086020526040808220600254825160e060020a63a24835d1028152336004820152602481018d905292519194169263a24835d1926044808201939182900301818387803b158015613b5157600080fd5b505af1158015613b65573d6000803e3d6000fd5b50505050613b7589303388613cd2565b600254613b8e90600160a060020a03168a8a8888613f10565b88600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bfa57600080fd5b505af1158015613c0e573d6000803e3d6000fd5b505050506040513d6020811015613c2457600080fd5b50516040805160e060020a6370a082310281523060048201529051600160a060020a038e16916370a082319160248083019260209291908290030181600087803b158015613c7157600080fd5b505af1158015613c85573d6000803e3d6000fd5b505050506040513d6020811015613c9b57600080fd5b5051600185015460408051938452602084019290925263ffffffff1682820152519081900360600190a25092979650505050505050565b60008085600160a060020a03166370a08231856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015613d3057600080fd5b505af1158015613d44573d6000803e3d6000fd5b505050506040513d6020811015613d5a57600080fd5b50519150600160a060020a038516301415613def5785600160a060020a031663a9059cbb85856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b50505050613e7b565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152604482018690529151918816916323b872dd9160648082019260009290919082900301818387803b158015613e6257600080fd5b505af1158015613e76573d6000803e3d6000fd5b505050505b85600160a060020a03166370a08231856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015613ed657600080fd5b505af1158015613eea573d6000803e3d6000fd5b505050506040513d6020811015613f0057600080fd5b505190508181116135bf57600080fd5b7f80000000000000000000000000000000000000000000000000000000000000008110613f3957fe5b604080518481526020810184905280820183905290513391600160a060020a0387811692908916917f276856b36cbc45526a0ba64f44611557a2a8b68662c5388e9fe6d72e86e1c8cb919081900360600190a45050505050565b600054600160a060020a03163314613faa57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015613ffd57600080fd5b505af1158015610ca0573d6000803e3d6000fd5b6000808315156140245760009150614043565b5082820282848281151561403457fe5b041461403f57600080fd5b8091505b5092915050565b60008080831161405957600080fd5b828481151561406457fe5b04949350505050565b600054600160a060020a0316331461408457600080fd5b82600160a060020a038116151561409a57600080fd5b82600160a060020a03811615156140b057600080fd5b83600160a060020a0381163014156140c757600080fd5b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561412a57600080fd5b505af115801561413e573d6000803e3d6000fd5b50505050505050505050560042616e636f72466f726d756c610000000000000000000000000000000000000042616e636f72436f6e76657274657255706772616465720000000000000000008a6a7f53b3c8fa1dc4b83e3f1be668c1b251ff8d44cdcb83eb3acec3fec6a788a165627a7a723058201983de0b2f89c507b09181d1c8e92fe079ec5cafbc347d4cdcfa2d102119d06f00290000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102a55763ffffffff60e060020a600035041663024c7ec781146102aa5780630ca78923146102c65780630e53aae9146102f85780631120a7761461034d57806315226b541461037e57806319b64015146103b15780631e1401f8146103c957806321e6b53d1461040c578063227425641461042d5780632a2e2f0c146104955780632c12b446146104c25780632fe8a6ad146104e357806338a5e0161461050c5780633aa0145a146105215780633f4d2fc21461053f578063415f12401461056e57806341a5b33d1461058657806349d10b64146105b05780634af80f0e146105c557806350057351146105e657806354fd4d501461065b578063579cd3ca146106875780635e35359e146106b55780635e5144eb146106df57806361cd756e1461070c5780636520d6fb146107215780636a49d2c4146107365780636ebf36c01461076057806371f52bf31461079857806372b44b2c146107ad57806375892cf1146107d157806379ba5097146107fe5780637b103999146108135780638da5cb5b146108285780638e3047e01461083d57806392d1abb714610867578063935e2ae11461087c57806394c275ad146108a05780639b99a8e2146108b5578063a2c4c336146108ca578063b3a426d5146108ee578063b4a176d31461098f578063bf754558146109a4578063c45d3d92146109b9578063ca1d209d146109ce578063cf73266a146109e6578063d031370b14610a10578063d4ee1d9014610a28578063d55ec69714610a3d578063d66bd52414610a52578063d895951214610a73578063d924f0c314610a94578063e4dd22f614610ab5578063ebf9470014610b18578063ecbca55d14610b76578063f0843ba914610b94578063f2fde38b14610be5578063fc0c546a14610c06578063fe417fa514610c1b575b600080fd5b3480156102b657600080fd5b506102c46004351515610c3f565b005b3480156102d257600080fd5b506102c4600160a060020a036004351663ffffffff602435166044351515606435610c96565b34801561030457600080fd5b50610319600160a060020a0360043516610ca6565b6040805195865263ffffffff9094166020860152911515848401521515606084015215156080830152519081900360a00190f35b34801561035957600080fd5b50610362610cf8565b60408051600160a060020a039092168252519081900360200190f35b34801561038a57600080fd5b5061039f600160a060020a0360043516610d07565b60408051918252519081900360200190f35b3480156103bd57600080fd5b50610362600435610dbb565b3480156103d557600080fd5b506103f3600160a060020a0360043581169060243516604435610de7565b6040805192835260208301919091528051918290030190f35b34801561041857600080fd5b506102c4600160a060020a0360043516610e64565b6040805160206004803580820135838102808601850190965280855261039f95369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a00135610eb4565b3480156104a157600080fd5b5061039f600160a060020a0360043581169060243516604435606435610ed0565b3480156104ce57600080fd5b5061039f600160a060020a036004351661132a565b3480156104ef57600080fd5b506104f8611386565b604080519115158252519081900360200190f35b34801561051857600080fd5b506102c46113a7565b34801561052d57600080fd5b5061039f60043560ff6024351661145d565b34801561054b57600080fd5b506102c4600160a060020a036004351663ffffffff6024351660443515156114bb565b34801561057a57600080fd5b506102c46004356114ca565b34801561059257600080fd5b506102c4600160a060020a0360043581169060243516604435611829565b3480156105bc57600080fd5b506102c46118d3565b3480156105d157600080fd5b506102c4600160a060020a0360043516611a64565b3480156105f257600080fd5b506040805160206004803580820135838102808601850190965280855261039f95369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a00135611ab5565b34801561066757600080fd5b50610670611ac2565b6040805161ffff9092168252519081900360200190f35b34801561069357600080fd5b5061069c611ae5565b6040805163ffffffff9092168252519081900360200190f35b3480156106c157600080fd5b506102c4600160a060020a0360043581169060243516604435611afd565b3480156106eb57600080fd5b5061039f600160a060020a0360043581169060243516604435606435611c0e565b34801561071857600080fd5b50610362611c25565b34801561072d57600080fd5b5061069c611c34565b34801561074257600080fd5b506102c4600160a060020a036004351663ffffffff60243516611c40565b34801561076c57600080fd5b5061039f600160a060020a0360043581169060243581169060443590606435906084351660a435611e78565b3480156107a457600080fd5b50610670611f1e565b3480156107b957600080fd5b506103f3600160a060020a0360043516602435611f2d565b3480156107dd57600080fd5b5061039f600160a060020a036004358116906024351660443560643561220d565b34801561080a57600080fd5b506102c461221e565b34801561081f57600080fd5b50610362612299565b34801561083457600080fd5b506103626122a8565b34801561084957600080fd5b506103f3600160a060020a03600435811690602435166044356122b7565b34801561087357600080fd5b5061039f6122c5565b34801561088857600080fd5b506102c4600160a060020a03600435166024356122ca565b3480156108ac57600080fd5b5061069c61237f565b3480156108c157600080fd5b50610670612393565b3480156108d657600080fd5b506103f3600160a060020a0360043516602435612399565b6040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437505060408051818801358901803560208181028481018201909552818452989b8a359b8a8c01359b919a9099506060909101975092955090820193509182918501908490808284375094975050508335600160a060020a031694505050602090910135905061262c565b34801561099b57600080fd5b506102c4612646565b3480156109b057600080fd5b506104f8612681565b3480156109c557600080fd5b5061036261269a565b3480156109da57600080fd5b506102c46004356126a9565b3480156109f257600080fd5b506103f3600160a060020a0360043581169060243516604435612a07565b348015610a1c57600080fd5b50610362600435612c37565b348015610a3457600080fd5b50610362612c5f565b348015610a4957600080fd5b506102c4612c6e565b348015610a5e57600080fd5b50610319600160a060020a0360043516612d4a565b348015610a7f57600080fd5b5061039f600160a060020a0360043516612d90565b348015610aa057600080fd5b506102c4600160a060020a0360043516612da1565b6040805160206004803580820135838102808601850190965280855261039f9536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050612dda565b348015610b2457600080fd5b506040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437509497505084359550505060209092013591506130589050565b348015610b8257600080fd5b506102c463ffffffff60043516613385565b6040805160206004803580820135838102808601850190965280855261039f953695939460249493850192918291850190849080828437509497505084359550505060209092013591506134539050565b348015610bf157600080fd5b506102c4600160a060020a036004351661346b565b348015610c1257600080fd5b506103626134bf565b348015610c2757600080fd5b506102c4600160a060020a03600435166024356134ce565b600054600160a060020a03163314610c5657600080fd5b60058054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610ca084826122ca565b50505050565b600160a060020a031660009081526008602052604090208054600190910154909163ffffffff82169160ff64010000000082048116926501000000000083048216926601000000000000900490911690565b600354600160a060020a031681565b600160a060020a03811660009081526008602052604081206001015482906601000000000000900460ff161515610d3d57600080fd5b6040805160e060020a6370a082310281523060048201529051600160a060020a038516916370a082319160248083019260209291908290030181600087803b158015610d8857600080fd5b505af1158015610d9c573d6000803e3d6000fd5b505050506040513d6020811015610db257600080fd5b50519392505050565b6000600782815481101515610dcc57fe5b600091825260209091200154600160a060020a031692915050565b600080600160a060020a038581169085161415610e0357600080fd5b600254600160a060020a0385811691161415610e2c57610e238584612399565b91509150610e5c565b600254600160a060020a0386811691161415610e4c57610e238484611f2d565b610e57858585612a07565b915091505b935093915050565b600054600160a060020a03163314610e7b57600080fd5b60008051602061416b833981519152610e93816135c7565b600160a060020a03163314610ea757600080fd5b610eb082613660565b5050565b6000610ec4888888600080612dda565b98975050505050505050565b6000806000806000806009600d9054906101000a900460ff16151515610ef557600080fd5b600980546dff0000000000000000000000000019166d01000000000000000000000000001790557f42616e636f724e6574776f726b00000000000000000000000000000000000000610f46816135c7565b600160a060020a03163314610f5a57600080fd5b8760008111610f6857600080fd5b600160a060020a038c8116908c161415610f8157600080fd5b600254600160a060020a038c811691161415610fa957610fa28c8b8b6136f9565b9750611303565b600254600160a060020a038d811691161415610fca57610fa28b8b8b613917565b610fd58c8c8c612a07565b90975095508615801590610fe95750888710155b1515610ff457600080fd5b600160a060020a03808d16600090815260086020526040808220928e168252902090955093506110238b610d07565b925082871061102e57fe5b61103a8c33308d613cd2565b6110468b30338a613cd2565b6110538c8c8c8a8a613f10565b8b600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050508e600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115557600080fd5b505af1158015611169573d6000803e3d6000fd5b505050506040513d602081101561117f57600080fd5b5051600189015460408051938452602084019290925263ffffffff1682820152519081900360600190a28a600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561121557600080fd5b505af1158015611229573d6000803e3d6000fd5b505050506040513d602081101561123f57600080fd5b81019080805190602001909291905050508d600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156112ab57600080fd5b505af11580156112bf573d6000803e3d6000fd5b505050506040513d60208110156112d557600080fd5b5051600188015460408051938452602084019290925263ffffffff1682820152519081900360600190a28697505b5050600980546dff0000000000000000000000000019169055509398975050505050505050565b600160a060020a03811660009081526008602052604081206001015482906601000000000000900460ff16151561136057600080fd5b5050600160a060020a031660009081526008602052604090206001015463ffffffff1690565b60055474010000000000000000000000000000000000000000900460ff1681565b600054600160a060020a031633146113be57600080fd5b600254604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916318160ddd91600480830192602092919082900301818787803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b505050506040513d602081101561144757600080fd5b50511161145357600080fd5b61145b613f93565b565b6009546000906114b49060ff8416620f424081810a67ffffffffffffffff908116936114a893899363ffffffff680100000000000000009093048316900383160a9091169061401116565b9063ffffffff61404a16565b9392505050565b6114c58383611c40565b505050565b60008060008060008060006009600d9054906101000a900460ff161515156114f157600080fd5b600980546dff0000000000000000000000000019166d010000000000000000000000000017905560075460011061152757600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561157a57600080fd5b505af115801561158e573d6000803e3d6000fd5b505050506040513d60208110156115a457600080fd5b505196506115bf60008051602061414b8339815191526135c7565b6002546040805160e060020a63a24835d1028152336004820152602481018c90529051929850600160a060020a039091169163a24835d19160448082019260009290919082900301818387803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b50505050600091505b60075461ffff83161015611808576007805461ffff841690811061165557fe5b60009182526020808320909101546040805160e060020a6370a082310281523060048201529051600160a060020a03909216985088936370a082319360248084019491939192918390030190829087803b1580156116b257600080fd5b505af11580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b5051600954604080517fabfd231d000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905263ffffffff9092166044830152606482018b905251919550600160a060020a0388169163abfd231d916084808201926020929091908290030181600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b505050506040513d602081101561178b57600080fd5b5051600160a060020a038616600090815260086020526040902090935090506117b685303386613cd2565b6001810154604080518a8a038152858703602082015263ffffffff9092168282015251600160a060020a0387169160008051602061418b833981519152919081900360600190a2600190910190611635565b5050600980546dff0000000000000000000000000019169055505050505050565b600054600160a060020a0316331461184057600080fd5b600254604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015285811660248301526044820185905291519190921691635e35359e91606480830192600092919082900301818387803b1580156118b657600080fd5b505af11580156118ca573d6000803e3d6000fd5b50505050505050565b60008054600160a060020a0316331480611908575060055474010000000000000000000000000000000000000000900460ff16155b151561191357600080fd5b61193c7f436f6e74726163745265676973747279000000000000000000000000000000006135c7565b600454909150600160a060020a038083169116148015906119655750600160a060020a03811615155b151561197057600080fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050506040513d6020811015611a1e57600080fd5b5051600160a060020a03161415611a3457600080fd5b6004805460058054600160a060020a03808416600160a060020a0319928316179092559091169216919091179055565b600054600160a060020a03163314611a7b57600080fd5b80600160a060020a038116301415611a9257600080fd5b5060068054600160a060020a031916600160a060020a0392909216919091179055565b6000610ec4888888613058565b6005547501000000000000000000000000000000000000000000900461ffff1681565b60095468010000000000000000900463ffffffff1681565b6000611b1660008051602061416b8339815191526135c7565b600160a060020a0385166000908152600860205260409020600101549091506601000000000000900460ff161580611be05750600254604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290513092600160a060020a031691638da5cb5b9160048083019260209291908290030181600087803b158015611ba857600080fd5b505af1158015611bbc573d6000803e3d6000fd5b505050506040513d6020811015611bd257600080fd5b5051600160a060020a031614155b80611bf85750600054600160a060020a038281169116145b1515611c0357600080fd5b610ca084848461406d565b6000611c1c85858585610ed0565b95945050505050565b600554600160a060020a031681565b60095463ffffffff1681565b600054600160a060020a03163314611c5757600080fd5b600254604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290513092600160a060020a031691638da5cb5b9160048083019260209291908290030181600087803b158015611cb657600080fd5b505af1158015611cca573d6000803e3d6000fd5b505050506040513d6020811015611ce057600080fd5b5051600160a060020a03161415611cf657600080fd5b81600160a060020a0381161515611d0c57600080fd5b82600160a060020a038116301415611d2357600080fd5b8260008163ffffffff16118015611d435750620f424063ffffffff821611155b1515611d4e57600080fd5b600254600160a060020a03868116911614801590611d925750600160a060020a0385166000908152600860205260409020600101546601000000000000900460ff16155b8015611db05750600954620f424063ffffffff918216860190911611155b1515611dbb57600080fd5b505050600160a060020a03919091166000818152600860205260408120600180820180549284905566010000000000006501000000000063ffffffff1994851663ffffffff808a169190911765ffff0000000019169190911766ff0000000000001916919091179091556007805492830181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a0319169093179092556009805492831692821690930116179055565b6040805160038082526080820190925260009160609190602082018380388339505060025482519293508a92600160a060020a039091169150899084906000908110611ec057fe5b906020019060200201846001815181101515611ed857fe5b906020019060200201856002815181101515611ef057fe5b600160a060020a0394851660209182029092010152928216909252919091169052610ec48187878787612dda565b6000611f28612393565b905090565b60008060008060008060008030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f9657600080fd5b505af1158015611faa573d6000803e3d6000fd5b505050506040513d6020811015611fc057600080fd5b5051600160a060020a031614611fd557600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff16151561200b57600080fd5b600160a060020a03808c16600090815260086020908152604080832060025482517f18160ddd0000000000000000000000000000000000000000000000000000000081529251919c50909416936318160ddd93600480840194938390030190829087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50516040805160e060020a6370a082310281523060048201529051919750600160a060020a038d16916370a08231916024808201926020929091908290030181600087803b1580156120f657600080fd5b505af115801561210a573d6000803e3d6000fd5b505050506040513d602081101561212057600080fd5b5051945061213b60008051602061414b8339815191526135c7565b6001880154604080517f49f9b0f7000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905263ffffffff9092166044830152606482018d905251919550600160a060020a038616916349f9b0f7916084808201926020929091908290030181600087803b1580156121c057600080fd5b505af11580156121d4573d6000803e3d6000fd5b505050506040513d60208110156121ea57600080fd5b505192506121f983600161145d565b9b928c90039a509198505050505050505050565b6000611c1c85858585600080611e78565b600154600160a060020a0316331461223557600080fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a36001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b600454600160a060020a031681565b600054600160a060020a031681565b600080610e57858585612a07565b600181565b60008054600160a060020a031633146122e257600080fd5b60008051602061416b8339815191526122fa816135c7565b600160a060020a0316331461230e57600080fd5b600160a060020a03841660009081526008602052604090206001015484906601000000000000900460ff16151561234457600080fd5b505050600160a060020a0391909116600090815260086020526040902060018101805464ff0000000019168315156401000000000217905555565b600954640100000000900463ffffffff1681565b60075490565b60008060008060008060008030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d602081101561242c57600080fd5b5051600160a060020a03161461244157600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff16151561247757600080fd5b600160a060020a03808c16600090815260086020908152604080832060025482517f18160ddd0000000000000000000000000000000000000000000000000000000081529251919c50909416936318160ddd93600480840194938390030190829087803b1580156124e757600080fd5b505af11580156124fb573d6000803e3d6000fd5b505050506040513d602081101561251157600080fd5b50516040805160e060020a6370a082310281523060048201529051919750600160a060020a038d16916370a08231916024808201926020929091908290030181600087803b15801561256257600080fd5b505af1158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505194506125a760008051602061414b8339815191526135c7565b6001880154604080517f29a00e7c000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905263ffffffff9092166044830152606482018d905251919550600160a060020a038616916329a00e7c916084808201926020929091908290030181600087803b1580156121c057600080fd5b600061263b8787878686612dda565b979650505050505050565b600054600160a060020a0316331461265d57600080fd5b60055460048054600160a060020a031916600160a060020a03909216919091179055565b6009546c01000000000000000000000000900460ff1681565b600654600160a060020a031681565b60008060008060008060006009600d9054906101000a900460ff161515156126d057600080fd5b600980546dff0000000000000000000000000019166d010000000000000000000000000017905560075460011061270657600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050506040513d602081101561278357600080fd5b5051965061279e60008051602061414b8339815191526135c7565b9550600091505b60075461ffff83161015612978576007805461ffff84169081106127c557fe5b60009182526020808320909101546040805160e060020a6370a082310281523060048201529051600160a060020a03909216985088936370a082319360248084019491939192918390030190829087803b15801561282257600080fd5b505af1158015612836573d6000803e3d6000fd5b505050506040513d602081101561284c57600080fd5b5051600954604080517f1da6bbfb000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905263ffffffff9092166044830152606482018b905251919550600160a060020a03881691631da6bbfb916084808201926020929091908290030181600087803b1580156128d157600080fd5b505af11580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b5051600160a060020a0386166000908152600860205260409020909350905061292685333086613cd2565b600181015460408051898b018152868601602082015263ffffffff9092168282015251600160a060020a0387169160008051602061418b833981519152919081900360600190a26001909101906127a5565b6002546040805160e260020a63219e412d028152336004820152602481018b90529051600160a060020a039092169163867904b49160448082019260009290919082900301818387803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b5050600980546dff000000000000000000000000001916905550505050505050505050565b600080600080600080600030600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612a6f57600080fd5b505af1158015612a83573d6000803e3d6000fd5b505050506040513d6020811015612a9957600080fd5b5051600160a060020a031614612aae57600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff161515612ae457600080fd5b600160a060020a038a166000908152600860205260409020600101548a906601000000000000900460ff161515612b1a57600080fd5b600160a060020a03808d16600090815260086020526040808220928e16825290209097509550612b5760008051602061414b8339815191526135c7565b945084600160a060020a03166379c1b450612b718e610d07565b60018a015463ffffffff16612b858f610d07565b60018b01546040805163ffffffff87811660e060020a028252600482019690965293851660248501526044840192909252929092166064820152608481018e9052905160a48083019260209291908290030181600087803b158015612be957600080fd5b505af1158015612bfd573d6000803e3d6000fd5b505050506040513d6020811015612c1357600080fd5b50519350612c2284600261145d565b9c938d90039b50929950505050505050505050565b6007805482908110612c4557fe5b600091825260209091200154600160a060020a0316905081565b600154600160a060020a031681565b60008054600160a060020a03163314612c8657600080fd5b612c9d60008051602061416b8339815191526135c7565b9050612ca88161346b565b600554604080517f90f58c96000000000000000000000000000000000000000000000000000000008152750100000000000000000000000000000000000000000090920461ffff16600483015251600160a060020a038316916390f58c9691602480830192600092919082900301818387803b158015612d2757600080fd5b505af1158015612d3b573d6000803e3d6000fd5b50505050612d4761221e565b50565b6008602052600090815260409020805460019091015463ffffffff81169060ff640100000000820481169165010000000000810482169166010000000000009091041685565b6000612d9b82610d07565b92915050565b600054600160a060020a03163314612db857600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b600080612e067f42616e636f724e6574776f726b000000000000000000000000000000000000006135c7565b9050341515612f4d576002548751600160a060020a039091169088906000908110612e2d57fe5b90602001906020020151600160a060020a03161415612f29576002546040805160e060020a63a24835d1028152336004820152602481018990529051600160a060020a039092169163a24835d19160448082019260009290919082900301818387803b158015612e9c57600080fd5b505af1158015612eb0573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152600160a060020a038681166004830152602482018c9052915191909216935063867904b49250604480830192600092919082900301818387803b158015612f0c57600080fd5b505af1158015612f20573d6000803e3d6000fd5b50505050612f4d565b612f4d876000815181101515612f3b57fe5b90602001906020020151338389613cd2565b80600160a060020a031663ab6214ce34898989338a8a6040518863ffffffff1660e060020a028152600401808060200187815260200186815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015612ff7578181015183820152602001612fdf565b505050509050019750505050505050506020604051808303818588803b15801561302057600080fd5b505af1158015613034573d6000803e3d6000fd5b50505050506040513d602081101561304b57600080fd5b5051979650505050505050565b6000806000806130877f42616e636f7258000000000000000000000000000000000000000000000000006135c7565b92506130b27f42616e636f724e6574776f726b000000000000000000000000000000000000006135c7565b91506130dd7f424e54546f6b656e0000000000000000000000000000000000000000000000006135c7565b600160a060020a03168760008151811015156130f557fe5b60209081029091010151600160a060020a03161461311257600080fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0385169163aafd6b769160448083019260209291908290030181600087803b15801561317a57600080fd5b505af115801561318e573d6000803e3d6000fd5b505050506040513d60208110156131a457600080fd5b50516002546040805160e060020a63a24835d1028152336004820152602481018490529051929350600160a060020a039091169163a24835d19160448082019260009290919082900301818387803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152600160a060020a03878116600483015260248201879052915191909216935063867904b49250604480830192600092919082900301818387803b15801561326f57600080fd5b505af1158015613283573d6000803e3d6000fd5b5050505081600160a060020a031663ab6214ce888389336000806040518763ffffffff1660e060020a028152600401808060200187815260200186815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015613331578181015183820152602001613319565b50505050905001975050505050505050602060405180830381600087803b15801561335b57600080fd5b505af115801561336f573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b600054600160a060020a0316331461339c57600080fd5b60008163ffffffff16101580156133c7575060095463ffffffff640100000000909104811690821611155b15156133d257600080fd5b6009546040805163ffffffff6801000000000000000090930483168152918316602083015280517f81cd2ffb37dd237c0e4e2a3de5265fcf9deb43d3e7801e80db9f1ccfba7ee6009281900390910190a16009805463ffffffff90921668010000000000000000026bffffffff000000000000000019909216919091179055565b6000613463848484600080612dda565b949350505050565b600054600160a060020a0316331461348257600080fd5b600054600160a060020a038281169116141561349d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600354600160a060020a031633146134e557600080fd5b6002546040805160e060020a63a24835d1028152600160a060020a038581166004830152602482018590529151919092169163a24835d191604480830192600092919082900301818387803b15801561353d57600080fd5b505af1158015613551573d6000803e3d6000fd5b50506002546040805160e260020a63219e412d028152336004820152602481018690529051600160a060020a03909216935063867904b4925060448082019260009290919082900301818387803b1580156135ab57600080fd5b505af11580156135bf573d6000803e3d6000fd5b505050505050565b60048054604080517fbb34534c00000000000000000000000000000000000000000000000000000000815292830184905251600092600160a060020a039092169163bb34534c91602480830192602092919082900301818787803b15801561362e57600080fd5b505af1158015613642573d6000803e3d6000fd5b505050506040513d602081101561365857600080fd5b505192915050565b600054600160a060020a0316331461367757600080fd5b600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b1580156136de57600080fd5b505af11580156136f2573d6000803e3d6000fd5b5050505050565b6000806000806137098787612399565b9093509150821580159061371d5750848310155b151561372857600080fd5b50600160a060020a038616600090815260086020526040902061374d87333089613cd2565b6002546040805160e260020a63219e412d028152336004820152602481018690529051600160a060020a039092169163867904b49160448082019260009290919082900301818387803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b50506002546137d59250899150600160a060020a0316888686613f10565b86600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561384157600080fd5b505af1158015613855573d6000803e3d6000fd5b505050506040513d602081101561386b57600080fd5b50516040805160e060020a6370a082310281523060048201529051600160a060020a038c16916370a082319160248083019260209291908290030181600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d60208110156138e257600080fd5b5051600185015460408051938452602084019290925263ffffffff1682820152519081900360600190a2509095945050505050565b6002546040805160e060020a6370a08231028152336004820152905160009283928392839283928392600160a060020a03909216916370a082319160248082019260209290919082900301818787803b15801561397357600080fd5b505af1158015613987573d6000803e3d6000fd5b505050506040513d602081101561399d57600080fd5b50518811156139ab57600080fd5b6139b58989611f2d565b909550935084158015906139c95750868510155b15156139d457600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613a2757600080fd5b505af1158015613a3b573d6000803e3d6000fd5b505050506040513d6020811015613a5157600080fd5b50516040805160e060020a6370a082310281523060048201529051919450600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015613aa257600080fd5b505af1158015613ab6573d6000803e3d6000fd5b505050506040513d6020811015613acc57600080fd5b5051915081851080613ae757508185148015613ae757508288145b1515613aef57fe5b50600160a060020a03808916600090815260086020526040808220600254825160e060020a63a24835d1028152336004820152602481018d905292519194169263a24835d1926044808201939182900301818387803b158015613b5157600080fd5b505af1158015613b65573d6000803e3d6000fd5b50505050613b7589303388613cd2565b600254613b8e90600160a060020a03168a8a8888613f10565b88600160a060020a031660008051602061418b833981519152600260009054906101000a9004600160a060020a0316600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bfa57600080fd5b505af1158015613c0e573d6000803e3d6000fd5b505050506040513d6020811015613c2457600080fd5b50516040805160e060020a6370a082310281523060048201529051600160a060020a038e16916370a082319160248083019260209291908290030181600087803b158015613c7157600080fd5b505af1158015613c85573d6000803e3d6000fd5b505050506040513d6020811015613c9b57600080fd5b5051600185015460408051938452602084019290925263ffffffff1682820152519081900360600190a25092979650505050505050565b60008085600160a060020a03166370a08231856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015613d3057600080fd5b505af1158015613d44573d6000803e3d6000fd5b505050506040513d6020811015613d5a57600080fd5b50519150600160a060020a038516301415613def5785600160a060020a031663a9059cbb85856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b50505050613e7b565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152604482018690529151918816916323b872dd9160648082019260009290919082900301818387803b158015613e6257600080fd5b505af1158015613e76573d6000803e3d6000fd5b505050505b85600160a060020a03166370a08231856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015613ed657600080fd5b505af1158015613eea573d6000803e3d6000fd5b505050506040513d6020811015613f0057600080fd5b505190508181116135bf57600080fd5b7f80000000000000000000000000000000000000000000000000000000000000008110613f3957fe5b604080518481526020810184905280820183905290513391600160a060020a0387811692908916917f276856b36cbc45526a0ba64f44611557a2a8b68662c5388e9fe6d72e86e1c8cb919081900360600190a45050505050565b600054600160a060020a03163314613faa57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015613ffd57600080fd5b505af1158015610ca0573d6000803e3d6000fd5b6000808315156140245760009150614043565b5082820282848281151561403457fe5b041461403f57600080fd5b8091505b5092915050565b60008080831161405957600080fd5b828481151561406457fe5b04949350505050565b600054600160a060020a0316331461408457600080fd5b82600160a060020a038116151561409a57600080fd5b82600160a060020a03811615156140b057600080fd5b83600160a060020a0381163014156140c757600080fd5b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561412a57600080fd5b505af115801561413e573d6000803e3d6000fd5b50505050505050505050560042616e636f72466f726d756c610000000000000000000000000000000000000042616e636f72436f6e76657274657255706772616465720000000000000000008a6a7f53b3c8fa1dc4b83e3f1be668c1b251ff8d44cdcb83eb3acec3fec6a788a165627a7a723058201983de0b2f89c507b09181d1c8e92fe079ec5cafbc347d4cdcfa2d102119d06f0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _token (address): 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C
Arg [1] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
Arg [2] : _maxConversionFee (uint32): 0
Arg [3] : _reserveToken (address): 0x0000000000000000000000000000000000000000
Arg [4] : _reserveRatio (uint32): 0
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c
Arg [1] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
25615:38497:0:-;;;;;;;;;-1:-1:-1;;;25615:38497:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16097:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16097:224:0;;;;;;;;;63346:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;63346:218:0;-1:-1:-1;;;;;63346:218:0;;;;;;;;;;;;;;;62380:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;62380:284:0;-1:-1:-1;;;;;62380:284:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21397:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21397:22:0;;;;;;;;-1:-1:-1;;;;;21397:22:0;;;;;;;;;;;;;;38365:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38365:208:0;-1:-1:-1;;;;;38365:208:0;;;;;;;;;;;;;;;;;;;;;62738:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;62738:138:0;;;;;39041:555;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39041:555:0;-1:-1:-1;;;;;39041:555:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32672:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32672:190:0;-1:-1:-1;;;;;32672:190:0;;;;;61760:240;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61760:240:0;;-1:-1:-1;;61760:240:0;;;-1:-1:-1;;;61760:240:0;;;;;;;;;;-1:-1:-1;61760:240:0;;;;;;;-1:-1:-1;61760:240:0;;;;;;;;;;44169:2036;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44169:2036:0;-1:-1:-1;;;;;44169:2036:0;;;;;;;;;;;;;;37888:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37888:206:0;-1:-1:-1;;;;;37888:206:0;;;;;14008:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14008:38:0;;;;;;;;;;;;;;;;;;;;;;33105:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33105:159:0;;;;34057:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34057:230:0;;;;;;;;;63129:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;63129:143:0;-1:-1:-1;;;;;63129:143:0;;;;;;;;;;;;;58127:1330;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58127:1330:0;;;;;22947:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22947:169:0;-1:-1:-1;;;;;22947:169:0;;;;;;;;;;;;14801:865;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14801:865:0;;;;32151:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32151:175:0;-1:-1:-1;;;;;32151:175:0;;;;;62074:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;62074:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62074:232:0;;-1:-1:-1;;62074:232:0;;;-1:-1:-1;;;62074:232:0;;;;;;;;;;-1:-1:-1;62074:232:0;;;;;;;-1:-1:-1;62074:232:0;;;;;;;;;;26409:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26409:26:0;;;;;;;;;;;;;;;;;;;;;;;27322:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27322:31:0;;;;;;;;;;;;;;;;;;;;;;;34764:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34764:495:0;-1:-1:-1;;;;;34764:495:0;;;;;;;;;;;;60550:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60550:208:0;-1:-1:-1;;;;;60550:208:0;;;;;;;;;;;;;;13918:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13918:37:0;;;;26858:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26858:35:0;;;;36165:653;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36165:653:0;-1:-1:-1;;;;;36165:653:0;;;;;;;;;50253:405;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;50253:405:0;-1:-1:-1;;;;;50253:405:0;;;;;;;;;;;;;;;;;;;;;;;62950:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62950:105:0;;;;41211:760;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41211:760:0;-1:-1:-1;;;;;41211:760:0;;;;;;;60832:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60832:217:0;-1:-1:-1;;;;;60832:217:0;;;;;;;;;;;;;;11526:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11526:187:0;;;;13829:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13829:33:0;;;;10500:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10500:20:0;;;;63860:249;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;63860:249:0;-1:-1:-1;;;;;63860:249:0;;;;;;;;;;;;8094:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8094:63:0;;;;37286:391;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37286:391:0;-1:-1:-1;;;;;37286:391:0;;;;;;;27079:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27079:34:0;;;;31667:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31667:112:0;;;;40017:776;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40017:776:0;-1:-1:-1;;;;;40017:776:0;;;;;;;61392:294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61392:294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61392:294:0;;;;;-1:-1:-1;61392:294:0;;-1:-1:-1;61392:294:0;;;;-1:-1:-1;61392:294:0;;;;;;;;;;;;-1:-1:-1;61392:294:0;;-1:-1:-1;;;61392:294:0;;-1:-1:-1;;;;;61392:294:0;;-1:-1:-1;;;61392:294:0;;;;;;-1:-1:-1;61392:294:0;;15745:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15745:137:0;;;;27443:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27443:37:0;;;;26444;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26444:37:0;;;;56410:1319;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56410:1319:0;;;;;42589:1063;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42589:1063:0;-1:-1:-1;;;;;42589:1063:0;;;;;;;;;;;;26580:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26580:34:0;;;;;10527:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10527:23:0;;;;35482:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35482:284:0;;;;26717:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26717:44:0;-1:-1:-1;;;;;26717:44:0;;;;;63638:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;63638:148:0;-1:-1:-1;;;;;63638:148:0;;;;;23928:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23928:92:0;-1:-1:-1;;;;;23928:92:0;;;;;51514:1473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51514:1473:0;;-1:-1:-1;;51514:1473:0;;;-1:-1:-1;;;51514:1473:0;;;;;-1:-1:-1;;;;;51514:1473:0;;;;;;-1:-1:-1;51514:1473:0;;;;-1:-1:-1;51514:1473:0;;53793:835;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53793:835:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53793:835:0;;-1:-1:-1;;53793:835:0;;;-1:-1:-1;;;53793:835:0;;;;;;-1:-1:-1;53793:835:0;;-1:-1:-1;53793:835:0;33468:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33468:281:0;;;;;;;61123:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61123:195:0;;-1:-1:-1;;61123:195:0;;;-1:-1:-1;;;61123:195:0;;;;;;-1:-1:-1;61123:195:0;;-1:-1:-1;61123:195:0;11295:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11295:140:0;-1:-1:-1;;;;;11295:140:0;;;;;21340:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21340:24:0;;;;23435:352;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23435:352:0;-1:-1:-1;;;;;23435:352:0;;;;;;;16097:224;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;16257:26;:56;;;;;;;-1:-1:-1;;16257:56:0;;;;;;;;;16097:224::o;63346:218::-;63495:61;63523:15;63540;63495:27;:61::i;:::-;63346:218;;;;:::o;62380:284::-;-1:-1:-1;;;;;62511:18:0;62439:7;62511:18;;;:8;:18;;;;;62547:22;;62571:13;;;;;62547:22;;62571:13;;;;62586:31;;;;;;;62619:21;;;;;;62642:13;;;;;;;62380:284::o;21397:22::-;;;-1:-1:-1;;;;;21397:22:0;;:::o;38365:208::-;-1:-1:-1;;;;;30682:18:0;;38504:7;30682:18;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;38536:29;;;-1:-1:-1;;;;;38536:29:0;;38560:4;38536:29;;;;;;-1:-1:-1;;;;;38536:23:0;;;;;:29;;;;;;;;;;;;;;-1:-1:-1;38536:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;38536:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38536:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38536:29:0;;38365:208;-1:-1:-1;;;38365:208:0:o;62738:138::-;62800:11;62831:29;62861:6;62831:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62831:37:0;;62738:138;-1:-1:-1;;62738:138:0:o;39041:555::-;39144:7;;-1:-1:-1;;;;;39181:22:0;;;;;;;;39173:31;;;;;;39316:5;;-1:-1:-1;;;;;39304:17:0;;;39316:5;;39304:17;39300:174;;;39343:38;39361:10;39373:7;39343:17;:38::i;:::-;39336:45;;;;;;39300:174;39415:5;;-1:-1:-1;;;;;39401:19:0;;;39415:5;;39401:19;39397:77;;;39442:32;39456:8;39466:7;39442:13;:32::i;39397:77::-;39536:52;39558:10;39570:8;39580:7;39536:21;:52::i;:::-;39529:59;;;;39041:555;;;;;;;:::o;32672:190::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;-1:-1:-1;;;;;;;;;;;14325:24:0;14335:13;14325:9;:24::i;:::-;-1:-1:-1;;;;;14311:38:0;:10;:38;14303:47;;;;;;32815:39;32844:9;32815:28;:39::i;:::-;11038:1;32672:190;:::o;61760:240::-;61909:7;61936:56;61950:5;61957:7;61966:10;61986:1;61990;61936:13;:56::i;:::-;61929:63;61760:240;-1:-1:-1;;;;;;;;61760:240:0:o;44169:2036::-;44397:7;44737:14;44762:17;45070:27;45131:25;45258:24;30428:6;;;;;;;;;;;30427:7;30419:16;;;;;;;;30446:6;:13;;-1:-1:-1;;30446:13:0;;;;;44326:14;14325:24;44326:14;14325:9;:24::i;:::-;-1:-1:-1;;;;;14311:38:0;:10;:38;14303:47;;;;;;44367:10;12056:1;12046:11;;12038:20;;;;;;-1:-1:-1;;;;;44430:22:0;;;;;;;;44422:31;;;;;;44565:5;;-1:-1:-1;;;;;44553:17:0;;;44565:5;;44553:17;44549:175;;;44592:36;44596:10;44608:7;44617:10;44592:3;:36::i;:::-;44585:43;;;;44549:175;44662:5;;-1:-1:-1;;;;;44648:19:0;;;44662:5;;44648:19;44644:80;;;44689:35;44694:8;44704:7;44713:10;44689:4;:35::i;44644:80::-;44856:52;44878:10;44890:8;44900:7;44856:21;:52::i;:::-;44834:74;;-1:-1:-1;44834:74:0;-1:-1:-1;45021:11:0;;;;;:35;;;45046:10;45036:6;:20;;45021:35;45013:44;;;;;;;;-1:-1:-1;;;;;45100:20:0;;;;;;;:8;:20;;;;;;45159:18;;;;;;;45100:20;;-1:-1:-1;45159:18:0;-1:-1:-1;45285:27:0;45168:8;45285:17;:27::i;:::-;45258:54;-1:-1:-1;45330:25:0;;;45323:33;;;;45438:57;45457:10;45469;45481:4;45487:7;45438:18;:57::i;:::-;45571:54;45590:8;45600:4;45606:10;45618:6;45571:18;:54::i;:::-;45806:73;45830:10;45842:8;45852:7;45861:6;45869:9;45806:23;:73::i;:::-;45989:10;-1:-1:-1;;;;;45973:95:0;-1:-1:-1;;;;;;;;;;;46001:5:0;;;;;;;;;-1:-1:-1;;;;;46001:5:0;-1:-1:-1;;;;;46001:17:0;;:19;;;;;-1:-1:-1;;;46001:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46001:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46001:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46001:19:0;;;;;;;;;;;;;;;;46022:10;-1:-1:-1;;;;;46022:20:0;;46043:4;46022:26;;;;;-1:-1:-1;;;46022:26:0;;;;;;;-1:-1:-1;;;;;46022:26:0;-1:-1:-1;;;;;46022:26:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46022:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46022:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46022:26:0;46050:17;;;;45973:95;;;;;;46022:26;45973:95;;;;;;46050:17;;45973:95;;;;;;;;;;;;;46100:8;-1:-1:-1;;;;;46084:89:0;-1:-1:-1;;;;;;;;;;;46110:5:0;;;;;;;;;-1:-1:-1;;;;;46110:5:0;-1:-1:-1;;;;;46110:17:0;;:19;;;;;-1:-1:-1;;;46110:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46110:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46110:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46110:19:0;;;;;;;;;;;;;;;;46131:8;-1:-1:-1;;;;;46131:18:0;;46150:4;46131:24;;;;;-1:-1:-1;;;46131:24:0;;;;;;;-1:-1:-1;;;;;46131:24:0;-1:-1:-1;;;;;46131:24:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46131:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46131:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46131:24:0;46157:15;;;;46084:89;;;;;;46131:24;46084:89;;;;;;46157:15;;46084:89;;;;;;;;;;;;;46191:6;46184:13;;12069:1;-1:-1:-1;;30482:6:0;:14;;-1:-1:-1;;30482:14:0;;;-1:-1:-1;44169:2036:0;;;-1:-1:-1;;;;;;;;44169:2036:0:o;37888:206::-;-1:-1:-1;;;;;30682:18:0;;38025:7;30682:18;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;;;38057:23:0;;;;;:8;:23;;;;;:29;;;;;;37888:206::o;14008:38::-;;;;;;;;;:::o;33105:159::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;31238:5;;:19;;;;;;;;31260:1;;-1:-1:-1;;;;;31238:5:0;;:17;;:19;;;;;;;;;;;;;;31260:1;31238:5;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;31238:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31238:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31238:19:0;:23;31230:32;;;;;;33228:28;:26;:28::i;:::-;33105:159::o;34057:230::-;34205:13;;34137:7;;34164:115;;34239:39;;;25869:7;34239:39;;;;34164:115;;;;:70;;:7;;34205:13;;;;;;;34177:41;;34176:57;;;34164:70;;;;:11;:70;:::i;:::-;:74;:115;:74;:115;:::i;:::-;34157:122;34057:230;-1:-1:-1;;;34057:230:0:o;63129:143::-;63237:27;63248:6;63256:7;63237:10;:27::i;:::-;63129:143;;;:::o;58127:1330::-;58244:14;58291:22;58667:24;58702:22;58735:21;58772:8;59055:23;30428:6;;;;;;;;;;;30427:7;30419:16;;;;;;;;30446:6;:13;;-1:-1:-1;;30446:13:0;;;;;31401;:20;30455:4;-1:-1:-1;31393:33:0;;;;;;58261:5;;;;;;;;;-1:-1:-1;;;;;58261:5:0;-1:-1:-1;;;;;58261:17:0;;:19;;;;;-1:-1:-1;;;58261:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58261:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58261:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58261:19:0;;-1:-1:-1;58331:25:0;-1:-1:-1;;;;;;;;;;;58331:9:0;:25::i;:::-;58443:5;;:34;;;-1:-1:-1;;;;;58443:34:0;;58457:10;58443:34;;;;;;;;;;;;58291:66;;-1:-1:-1;;;;;;58443:5:0;;;;:13;;:34;;;;;:5;;:34;;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;58443:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58443:34:0;;;;58783:1;58772:12;;58767:683;58790:13;:20;58786:24;;;;58767:683;;;58847:13;:16;;;;;;;;;;;;;;;;;;;;;;;;58895:28;;;-1:-1:-1;;;;;58895:28:0;;58918:4;58895:28;;;;;;-1:-1:-1;;;;;58847:16:0;;;;-1:-1:-1;58847:16:0;;58895:22;;:28;;;;;58847:16;;58895:28;;;;;;;;;;58847:16;58895:28;;;5:2:-1;;;;30:1;27;20:12;5:2;58895:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58895:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58895:28:0;59011:17;;58954:84;;;;;;;;;;;;;;;;;;59011:17;;;;58954:84;;;;;;;;;;;58895:28;;-1:-1:-1;;;;;;58954:32:0;;;;;:84;;;;;58895:28;;58954:84;;;;;;;;59011:17;58954:32;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;58954:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58954:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58954:84:0;-1:-1:-1;;;;;59081:22:0;;;;;;:8;58954:84;59081:22;;;;58954:84;;-1:-1:-1;59081:22:0;-1:-1:-1;59186:65:0;59090:12;59219:4;59225:10;58954:84;59186:18;:65::i;:::-;59424:13;;;;59344:94;;;59374:16;;;59344:94;;59392:30;;;59344:94;;;;59424:13;;;;59344:94;;;;;-1:-1:-1;;;;;59344:94:0;;;-1:-1:-1;;;;;;;;;;;59344:94:0;;;;;;;;;58812:3;;;;;58767:683;;;-1:-1:-1;;30482:6:0;:14;;-1:-1:-1;;30482:14:0;;;-1:-1:-1;;;;;;58127:1330:0:o;22947:169::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;23065:5;;23052:56;;;;;;-1:-1:-1;;;;;23052:56:0;;;;;;;;;;;;;;;;;;;;;;23065:5;;;;;23052:34;;:56;;;;;23065:5;;23052:56;;;;;;;23065:5;;23052:56;;;5:2:-1;;;;30:1;27;20:12;5:2;23052:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23052:56:0;;;;22947:169;;;:::o;14801:865::-;15010:19;14918:5;;-1:-1:-1;;;;;14918:5:0;14904:10;:19;;:50;;-1:-1:-1;14928:26:0;;;;;;;14927:27;14904:50;14896:59;;;;;;;;15032:28;15042:17;15032:9;:28::i;:::-;15180:8;;15010:50;;-1:-1:-1;;;;;;15157:32:0;;;15180:8;;15157:32;;;;:61;;-1:-1:-1;;;;;;15193:25:0;;;;15157:61;15149:70;;;;;;;;15334:59;;;;;;15375:17;15334:59;;;;;;15405:1;;-1:-1:-1;;;;;15334:40:0;;;;;:59;;;;;;;;;;;;;;;15405:1;15334:40;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;15334:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15334:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15334:59:0;-1:-1:-1;;;;;15334:73:0;;;15326:82;;;;;;15515:8;;;15500:12;:23;;-1:-1:-1;;;;;15515:8:0;;;-1:-1:-1;;;;;;15500:23:0;;;;;;;15617:41;;;;;;;;;;;14801:865::o;32151:175::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;32258:10;-1:-1:-1;;;;;12396:25:0;;12416:4;12396:25;;12388:34;;;;;;-1:-1:-1;32286:19:0;:32;;-1:-1:-1;;;;;;32286:32:0;-1:-1:-1;;;;;32286:32:0;;;;;;;;;;32151:175::o;62074:232::-;62217:7;62244:54;62265:5;62272:10;62284:13;62244:20;:54::i;26409:26::-;;;;;;;;;:::o;27322:31::-;;;;;;;;;:::o;34764:495::-;34856:25;34884:36;-1:-1:-1;;;;;;;;;;;34884:9:0;:36::i;:::-;-1:-1:-1;;;;;35111:16:0;;;;;;:8;:16;;;;;:22;;;34856:64;;-1:-1:-1;35111:22:0;;;;;35110:23;;:57;;-1:-1:-1;35137:5:0;;:13;;;;;;;;35162:4;;-1:-1:-1;;;;;35137:5:0;;:11;;:13;;;;;;;;;;;;;;:5;;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;35137:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35137:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35137:13:0;-1:-1:-1;;;;;35137:30:0;;;35110:57;:87;;;-1:-1:-1;35171:5:0;;-1:-1:-1;;;;;35171:26:0;;;:5;;:26;35110:87;35102:96;;;;;;;;35209:42;35230:6;35238:3;35243:7;35209:20;:42::i;60550:208::-;60665:7;60692:58;60708:10;60720:8;60730:7;60739:10;60692:15;:58::i;:::-;60685:65;60550:208;-1:-1:-1;;;;;60550:208:0:o;13918:37::-;;;-1:-1:-1;;;;;13918:37:0;;:::o;26858:35::-;;;;;;:::o;36165:653::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;21986:5;;:13;;;;;;;;22011:4;;-1:-1:-1;;;;;21986:5:0;;:11;;:13;;;;;;;;;;;;;;:5;;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;21986:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21986:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21986:13:0;-1:-1:-1;;;;;21986:30:0;;;21978:39;;;;;;36295:6;-1:-1:-1;;;;;12217:22:0;;;;12209:31;;;;;;36320:6;-1:-1:-1;;;;;12396:25:0;;12416:4;12396:25;;12388:34;;;;;;36355:6;31035:1;31026:6;:10;;;:40;;;;-1:-1:-1;25803:7:0;31040:26;;;;;31026:40;31018:49;;;;;;;;36397:5;;-1:-1:-1;;;;;36387:15:0;;;36397:5;;36387:15;;;;:42;;-1:-1:-1;;;;;;36407:16:0;;;;;;:8;:16;;;;;:22;;;;;;;;36406:23;36387:42;:92;;;;-1:-1:-1;36433:17:0;;25803:7;36433:46;:17;;;:26;;:46;;;;;36387:92;36379:101;;;;;;;;-1:-1:-1;;;;;;;;36511:16:0;;;;;;;;:8;:16;;;;;:22;;;;:31;;36612:35;;;;36706:29;36658:37;-1:-1:-1;;36511:31:0;;;;;;;;;;;-1:-1:-1;;36658:37:0;;;;;-1:-1:-1;;36706:29:0;;;;;;;;36746:13;27:10:-1;;23:18;;;45:23;;36746:26:0;;;;;;;-1:-1:-1;;;;;;36746:26:0;;;;;;;36783:17;:27;;;;;;;;;;;;;;;36165:653::o;50253:405::-;50468:20;;;50486:1;50468:20;;;;;;;;;50420:7;;50440:25;;50468:20;;;;50440:25;;105:10:-1;50468:20:0;88:34:-1;-1:-1;;50542:5:0;;50500:7;;;;-1:-1:-1;50530:10:0;;-1:-1:-1;;;;;50542:5:0;;;;-1:-1:-1;50549:8:0;;50500:7;;50542:5;;50500:7;;;;;;;;;;;;;50509:4;50514:1;50509:7;;;;;;;;;;;;;;;;;50518:4;50523:1;50518:7;;;;;;;;;;-1:-1:-1;;;;;50499:59:0;;;50518:7;;;;;;;;50499:59;;;;;;;;;;;;;50576:74;50590:4;50596:7;50605:10;50617:17;50636:13;50576;:74::i;62950:105::-;63002:6;63028:19;:17;:19::i;:::-;63021:26;;62950:105;:::o;41211:760::-;41383:7;41392;41417:23;41477:19;41529:22;41594;41671:14;41783:19;21852:4;-1:-1:-1;;;;;21827:30:0;:5;;;;;;;;;-1:-1:-1;;;;;21827:5:0;-1:-1:-1;;;;;21827:11:0;;:13;;;;;-1:-1:-1;;;21827:13:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21827:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21827:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21827:13:0;-1:-1:-1;;;;;21827:30:0;;21819:39;;;;;;-1:-1:-1;;;;;30682:18:0;;;;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;41443:23:0;;;;;;;:8;:23;;;;;;;;41499:5;;:19;;;;;;;41443:23;;-1:-1:-1;41499:5:0;;;;:17;;:19;;;;;41443:23;41499:19;;;;;;;:5;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;41499:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41499:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41499:19:0;41554:29;;;-1:-1:-1;;;;;41554:29:0;;41578:4;41554:29;;;;;;41499:19;;-1:-1:-1;;;;;;41554:23:0;;;;;:29;;;;;41499:19;;41554:29;;;;;;;;-1:-1:-1;41554:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;41554:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41554:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41554:29:0;;-1:-1:-1;41634:25:0;-1:-1:-1;;;;;;;;;;;41634:9:0;:25::i;:::-;41745:13;;;;41688:84;;;;;;;;;;;;;;;;;;41745:13;;;;41688:84;;;;;;;;;;;41594:66;;-1:-1:-1;;;;;;41688:27:0;;;;;:84;;;;;;;;;;;;;;;41745:13;41688:27;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;41688:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41688:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41688:84:0;;-1:-1:-1;41805:25:0;41688:84;41828:1;41805:14;:25::i;:::-;41783:47;41942:20;;;;;-1:-1:-1;41211:760:0;;-1:-1:-1;;;;;;;;;41211:760:0:o;60832:217::-;60948:7;60975:66;60984:10;60996:8;61006:7;61015:10;61035:1;61039;60975:8;:66::i;11526:187::-;11593:8;;-1:-1:-1;;;;;11593:8:0;11579:10;:22;11571:31;;;;;;11637:8;;;11630:5;;11618:28;;-1:-1:-1;;;;;11637:8:0;;;;11630:5;;;;11618:28;;;11665:8;;;;11657:16;;-1:-1:-1;;;;;;11657:16:0;;;-1:-1:-1;;;;;11665:8:0;;11657:16;;;;11684:21;;;11526:187::o;13829:33::-;;;-1:-1:-1;;;;;13829:33:0;;:::o;10500:20::-;;;-1:-1:-1;;;;;10500:20:0;;:::o;63860:249::-;63995:7;64004;64031:70;64053:19;64074:17;64093:7;64031:21;:70::i;8094:63::-;8151:6;8094:63;:::o;37286:391::-;37504:23;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;-1:-1:-1;;;;;;;;;;;14325:24:0;14335:13;14325:9;:24::i;:::-;-1:-1:-1;;;;;14311:38:0;:10;:38;14303:47;;;;;;-1:-1:-1;;;;;30682:18:0;;;;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;;;;37530:23:0;;;;;;;;:8;:23;;;;;37564:31;;;:54;;-1:-1:-1;;37564:54:0;37598:20;;;37564:54;;;;;37629:40;37286:391::o;27079:34::-;;;;;;;;;:::o;31667:112::-;31750:13;:20;31667:112;:::o;40017:776::-;40196:7;40205;40230:23;40292:19;40344:22;40409;40486:14;40605:19;21852:4;-1:-1:-1;;;;;21827:30:0;:5;;;;;;;;;-1:-1:-1;;;;;21827:5:0;-1:-1:-1;;;;;21827:11:0;;:13;;;;;-1:-1:-1;;;21827:13:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21827:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21827:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21827:13:0;-1:-1:-1;;;;;21827:30:0;;21819:39;;;;;;-1:-1:-1;;;;;30682:18:0;;;;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;40256:23:0;;;;;;;:8;:23;;;;;;;;40314:5;;:19;;;;;;;40256:23;;-1:-1:-1;40314:5:0;;;;:17;;:19;;;;;40256:23;40314:19;;;;;;;:5;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;40314:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40314:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40314:19:0;40369:29;;;-1:-1:-1;;;;;40369:29:0;;40393:4;40369:29;;;;;;40314:19;;-1:-1:-1;;;;;;40369:23:0;;;;;:29;;;;;40314:19;;40369:29;;;;;;;;-1:-1:-1;40369:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40369:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40369:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40369:29:0;;-1:-1:-1;40449:25:0;-1:-1:-1;;;;;;;;;;;40449:9:0;:25::i;:::-;40564:13;;;;40503:91;;;;;;;;;;;;;;;;;;40564:13;;;;40503:91;;;;;;;;;;;40409:66;;-1:-1:-1;;;;;;40503:31:0;;;;;:91;;;;;;;;;;;;;;;40564:13;40503:31;:91;;;5:2:-1;;;;30:1;27;20:12;61392:294:0;61576:7;61603:75;61617:5;61624:7;61633:10;61645:17;61664:13;61603;:75::i;:::-;61596:82;61392:294;-1:-1:-1;;;;;;;61392:294:0:o;15745:137::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;15862:12;;15851:8;:23;;-1:-1:-1;;;;;;15851:23:0;-1:-1:-1;;;;;15862:12:0;;;15851:23;;;;;;15745:137::o;27443:37::-;;;;;;;;;:::o;26444:::-;;;-1:-1:-1;;;;;26444:37:0;;:::o;56410:1319::-;56522:14;56569:22;56838:24;56873:22;56906:21;56943:8;57219:23;30428:6;;;;;;;;;;;30427:7;30419:16;;;;;;;;30446:6;:13;;-1:-1:-1;;30446:13:0;;;;;31401;:20;30455:4;-1:-1:-1;31393:33:0;;;;;;56539:5;;;;;;;;;-1:-1:-1;;;;;56539:5:0;-1:-1:-1;;;;;56539:17:0;;:19;;;;;-1:-1:-1;;;56539:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56539:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56539:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56539:19:0;;-1:-1:-1;56609:25:0;-1:-1:-1;;;;;;;;;;;56609:9:0;:25::i;:::-;56569:66;;56954:1;56943:12;;56938:678;56961:13;:20;56957:24;;;;56938:678;;;57018:13;:16;;;;;;;;;;;;;;;;;;;;;;;;57066:28;;;-1:-1:-1;;;;;57066:28:0;;57089:4;57066:28;;;;;;-1:-1:-1;;;;;57018:16:0;;;;-1:-1:-1;57018:16:0;;57066:22;;:28;;;;;57018:16;;57066:28;;;;;;;;;;57018:16;57066:28;;;5:2:-1;;;;30:1;27;20:12;5:2;57066:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57066:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57066:28:0;57175:17;;57125:77;;;;;;;;;;;;;;;;;;57175:17;;;;57125:77;;;;;;;;;;;57066:28;;-1:-1:-1;;;;;;57125:25:0;;;;;:77;;;;;57066:28;;57125:77;;;;;;;;57175:17;57125:25;:77;;;5:2:-1;;;;30:1;27;20:12;5:2;57125:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57125:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57125:77:0;-1:-1:-1;;;;;57245:22:0;;;;;;:8;57125:77;57245:22;;;;57125:77;;-1:-1:-1;57245:22:0;-1:-1:-1;57352:65:0;57254:12;57385:10;57397:4;57125:77;57352:18;:65::i;:::-;57590:13;;;;57510:94;;;57540:16;;;57510:94;;57558:30;;;57510:94;;;;57590:13;;;;57510:94;;;;;-1:-1:-1;;;;;57510:94:0;;;-1:-1:-1;;;;;;;;;;;57510:94:0;;;;;;;;;56983:3;;;;;56938:678;;;57689:5;;:32;;;-1:-1:-1;;;;;57689:32:0;;57701:10;57689:32;;;;;;;;;;;;-1:-1:-1;;;;;57689:5:0;;;;:11;;:32;;;;;:5;;:32;;;;;;;;:5;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;57689:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30482:6:0;:14;;-1:-1:-1;;30482:14:0;;;-1:-1:-1;;;;;;;;;;56410:1319:0:o;42589:1063::-;42841:7;42850;42875:27;42943:25;43009:22;43086:14;43338:19;21852:4;-1:-1:-1;;;;;21827:30:0;:5;;;;;;;;;-1:-1:-1;;;;;21827:5:0;-1:-1:-1;;;;;21827:11:0;;:13;;;;;-1:-1:-1;;;21827:13:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21827:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21827:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21827:13:0;-1:-1:-1;;;;;21827:30:0;;21819:39;;;;;;-1:-1:-1;;;;;30682:18:0;;;;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;30682:18:0;;;;;;:8;:18;;;;;:24;;;:18;;:24;;;;;30674:33;;;;;;;;-1:-1:-1;;;;;42905:27:0;;;;;;;:8;:27;;;;;;42971:25;;;;;;;42905:27;;-1:-1:-1;42971:25:0;-1:-1:-1;43049:25:0;-1:-1:-1;;;;;;;;;;;43049:9:0;:25::i;:::-;43009:66;;43103:7;-1:-1:-1;;;;;43103:35:0;;43153:36;43171:17;43153;:36::i;:::-;43205:17;;;;;;43238:34;43256:15;43238:17;:34::i;:::-;43288:15;;;;43103:224;;;43288:15;43103:224;;;-1:-1:-1;;;43103:224:0;;;;;;;;;;;;;;;;;;;;;;;;43288:15;;;;43103:224;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43103:224:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;43103:224:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43103:224:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43103:224:0;;-1:-1:-1;43360:25:0;43103:224;43383:1;43360:14;:25::i;:::-;43338:47;43623:20;;;;;-1:-1:-1;42589:1063:0;;-1:-1:-1;;;;;;;;;;42589:1063:0:o;26580:34::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26580:34:0;;-1:-1:-1;26580:34:0;:::o;10527:23::-;;;-1:-1:-1;;;;;10527:23:0;;:::o;35482:284::-;35529:42;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;35599:36;-1:-1:-1;;;;;;;;;;;35599:9:0;:36::i;:::-;35529:107;;35649:36;35667:17;35649;:36::i;:::-;35722:7;;35696:34;;;;;;35722:7;;;;;;35696:34;;;;;-1:-1:-1;;;;;35696:25:0;;;;;:34;;;;;-1:-1:-1;;35696:34:0;;;;;;;-1:-1:-1;35696:25:0;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;35696:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35696:34:0;;;;35741:17;:15;:17::i;:::-;35482:284;:::o;26717:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63638:148::-;63717:7;63744:34;63762:15;63744:17;:34::i;:::-;63737:41;63638:148;-1:-1:-1;;63638:148:0:o;23928:92::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;23994:7;:18;;-1:-1:-1;;;;;;23994:18:0;-1:-1:-1;;;;;23994:18:0;;;;;;;;;;23928:92::o;51514:1473::-;51696:7;51721:28;51767:25;51777:14;51767:9;:25::i;:::-;51721:72;-1:-1:-1;51976:9:0;:14;51972:803;;;52273:5;;52261:8;;-1:-1:-1;;;;;52273:5:0;;;;52261;;52273;;52261:8;;;;;;;;;;;;;;-1:-1:-1;;;;;52261:17:0;;52257:507;;;52299:5;;:34;;;-1:-1:-1;;;;;52299:34:0;;52313:10;52299:34;;;;;;;;;;;;-1:-1:-1;;;;;52299:5:0;;;;:13;;:34;;;;;:5;;:34;;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;52299:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52423:5:0;;:35;;;-1:-1:-1;;;;;52423:35:0;;-1:-1:-1;;;;;52423:35:0;;;;;;;;;;;;;;;:5;;;;;-1:-1:-1;52423:11:0;;-1:-1:-1;52423:35:0;;;;;:5;;:35;;;;;;;:5;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;52423:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52423:35:0;;;;52257:507;;;52684:64;52703:5;52709:1;52703:8;;;;;;;;;;;;;;;;;;52713:10;52725:13;52740:7;52684:18;:64::i;:::-;52863:13;-1:-1:-1;;;;;52863:25:0;;52895:9;52906:5;52913:7;52922:10;52934;52946:17;52965:13;52863:116;;;;;-1:-1:-1;;;52863:116:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52863:116:0;-1:-1:-1;;;;;52863:116:0;;;;;;-1:-1:-1;;;;;52863:116:0;-1:-1:-1;;;;;52863:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52863:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52863:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52863:116:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52863:116:0;;51514:1473;-1:-1:-1;;;;;;;51514:1473:0:o;53793:835::-;53955:7;53980:16;54039:28;54293:14;54008:19;54018:8;54008:9;:19::i;:::-;53980:48;;54085:25;54095:14;54085:9;:25::i;:::-;54039:72;;54203:20;54213:9;54203;:20::i;:::-;-1:-1:-1;;;;;54191:32:0;:5;54197:1;54191:8;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54191:32:0;;54183:41;;;;;;54310:53;;;;;;;;;;;;54352:10;54310:53;;;;;;-1:-1:-1;;;;;54310:26:0;;;;;:53;;;;;;;;;;;;;;-1:-1:-1;54310:26:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;54310:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54310:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54310:53:0;54443:5;;:33;;;-1:-1:-1;;;;;54443:33:0;;54457:10;54443:33;;;;;;;;;;;;54310:53;;-1:-1:-1;;;;;;54443:5:0;;;;:13;;:33;;;;;:5;;:33;;;;;;;;:5;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;54443:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;54487:5:0;;:34;;;-1:-1:-1;;;;;54487:34:0;;-1:-1:-1;;;;;54487:34:0;;;;;;;;;;;;;;;:5;;;;;-1:-1:-1;54487:11:0;;-1:-1:-1;54487:34:0;;;;;:5;;:34;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;54487:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54487:34:0;;;;54541:13;-1:-1:-1;;;;;54541:25:0;;54567:5;54574:6;54582:10;54594;54614:1;54618;54541:79;;;;;-1:-1:-1;;;54541:79:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54541:79:0;-1:-1:-1;;;;;54541:79:0;;;;;;-1:-1:-1;;;;;54541:79:0;-1:-1:-1;;;;;54541:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54541:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54541:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54541:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;33468:281:0;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;33594:1;33576:14;:19;;;;:57;;;;-1:-1:-1;33617:16:0;;;;;;;;;33599:34;;;;;33576:57;33568:66;;;;;;;;33670:13;;33650:50;;;33670:13;;;;;;;33650:50;;;;;;;;;;;;;;;;;;;;;33711:13;:30;;;;;;;;-1:-1:-1;;33711:30:0;;;;;;;;;33468:281::o;61123:195::-;61227:7;61254:56;61268:5;61275:7;61284:10;61304:1;61308;61254:13;:56::i;:::-;61247:63;61123:195;-1:-1:-1;;;;61123:195:0:o;11295:140::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;11390:5;;-1:-1:-1;;;;;11377:18:0;;;11390:5;;11377:18;;11369:27;;;;;;11407:8;:20;;-1:-1:-1;;;;;;11407:20:0;-1:-1:-1;;;;;11407:20:0;;;;;;;;;;11295:140::o;21340:24::-;;;-1:-1:-1;;;;;21340:24:0;;:::o;23435:352::-;23598:7;;-1:-1:-1;;;;;23598:7:0;23584:10;:21;23576:30;;;;;;23707:5;;:29;;;-1:-1:-1;;;;;23707:29:0;;-1:-1:-1;;;;;23707:29:0;;;;;;;;;;;;;;;:5;;;;;:13;;:29;;;;;:5;;:29;;;;;;;:5;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;23707:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23747:5:0;;:32;;;-1:-1:-1;;;;;23747:32:0;;23759:10;23747:32;;;;;;;;;;;;-1:-1:-1;;;;;23747:5:0;;;;-1:-1:-1;23747:11:0;;-1:-1:-1;23747:32:0;;;;;:5;;:32;;;;;;;;:5;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;23747:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23747:32:0;;;;23435:352;;:::o;16521:133::-;16613:8;;;:33;;;;;;;;;;;;;16586:7;;-1:-1:-1;;;;;16613:8:0;;;;:18;;:33;;;;;;;;;;;;;;16586:7;16613:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;16613:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16613:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16613:33:0;;16521:133;-1:-1:-1;;16521:133:0:o;22273:121::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;22352:5;;:34;;;;;;-1:-1:-1;;;;;22352:34:0;;;;;;;;;:5;;;;;:23;;:34;;;;;:5;;:34;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;22352:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22352:34:0;;;;22273:121;:::o;46631:1052::-;46733:7;46753:14;46778:17;47038:23;46828:48;46846:13;46861:14;46828:17;:48::i;:::-;46806:70;;-1:-1:-1;46806:70:0;-1:-1:-1;46989:11:0;;;;;:35;;;47014:10;47004:6;:20;;46989:35;46981:44;;;;;;;;-1:-1:-1;;;;;;47064:23:0;;;;;;:8;:23;;;;;47164:67;47073:13;47198:10;47210:4;47216:14;47164:18;:67::i;:::-;47303:5;;:31;;;-1:-1:-1;;;;;47303:31:0;;47315:10;47303:31;;;;;;;;;;;;-1:-1:-1;;;;;47303:5:0;;;;:11;;:31;;;;;:5;;:31;;;;;;;;:5;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;47303:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;47428:5:0;;47389:80;;-1:-1:-1;47413:13:0;;-1:-1:-1;;;;;;47428:5:0;47435:14;47451:6;47459:9;47389:23;:80::i;:::-;47570:13;-1:-1:-1;;;;;47554:97:0;-1:-1:-1;;;;;;;;;;;47585:5:0;;;;;;;;;-1:-1:-1;;;;;47585:5:0;-1:-1:-1;;;;;47585:17:0;;:19;;;;;-1:-1:-1;;;47585:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47585:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47585:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47585:19:0;47606:29;;;-1:-1:-1;;;;;47606:29:0;;47630:4;47606:29;;;;;;-1:-1:-1;;;;;47606:23:0;;;;;:29;;;;;47585:19;;47606:29;;;;;;;-1:-1:-1;47606:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;47606:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47606:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47606:29:0;47637:13;;;;47554:97;;;;;;47606:29;47554:97;;;;;;47637:13;;47554:97;;;;;;;;;;;;;-1:-1:-1;47669:6:0;;46631:1052;-1:-1:-1;;;;;46631:1052:0:o;48107:1466::-;48250:5;;:27;;;-1:-1:-1;;;;;48250:27:0;;48266:10;48250:27;;;;;;48207:7;;;;;;;;;;;;-1:-1:-1;;;;;48250:5:0;;;;:15;;:27;;;;;;;;;;;;;;;48207:7;48250:5;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;48250:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48250:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48250:27:0;48235:42;;;48227:51;;;;;;48382:41;48396:13;48411:11;48382:13;:41::i;:::-;48360:63;;-1:-1:-1;48360:63:0;-1:-1:-1;48536:11:0;;;;;:35;;;48561:10;48551:6;:20;;48536:35;48528:44;;;;;;;;48719:5;;;;;;;;;-1:-1:-1;;;;;48719:5:0;-1:-1:-1;;;;;48719:17:0;;:19;;;;;-1:-1:-1;;;48719:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48719:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48719:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48719:19:0;48774:29;;;-1:-1:-1;;;;;48774:29:0;;48798:4;48774:29;;;;;;48719:19;;-1:-1:-1;;;;;;48774:23:0;;;;;:29;;;;;48719:19;;48774:29;;;;;;;;-1:-1:-1;48774:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;48774:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48774:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48774:29:0;;-1:-1:-1;48821:23:0;;;;:83;;;48859:14;48849:6;:24;:54;;;;;48892:11;48877;:26;48849:54;48814:91;;;;;;-1:-1:-1;;;;;;48944:23:0;;;;;;;:8;:23;;;;;;49057:5;;:38;;-1:-1:-1;;;;;49057:38:0;;49071:10;49057:38;;;;;;;;;;;;48944:23;;49057:5;;:13;;:38;;;;;;;;;;;48944:23;49057:5;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;49057:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49057:38:0;;;;49168:59;49187:13;49202:4;49208:10;49220:6;49168:18;:59::i;:::-;49306:5;;49282:77;;-1:-1:-1;;;;;49306:5:0;49313:13;49328:11;49341:6;49349:9;49282:23;:77::i;:::-;49460:13;-1:-1:-1;;;;;49444:97:0;-1:-1:-1;;;;;;;;;;;49475:5:0;;;;;;;;;-1:-1:-1;;;;;49475:5:0;-1:-1:-1;;;;;49475:17:0;;:19;;;;;-1:-1:-1;;;49475:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49475:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49475:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49475:19:0;49496:29;;;-1:-1:-1;;;;;49496:29:0;;49520:4;49496:29;;;;;;-1:-1:-1;;;;;49496:23:0;;;;;:29;;;;;49475:19;;49496:29;;;;;;;-1:-1:-1;49496:23:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;49496:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49496:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49496:29:0;49527:13;;;;49444:97;;;;;;49496:29;49444:97;;;;;;49527:13;;49444:97;;;;;;;;;;;;;-1:-1:-1;49559:6:0;;48107:1466;-1:-1:-1;;;;;;;48107:1466:0:o;55057:935::-;55654:19;55896;55676:6;-1:-1:-1;;;;;55676:16:0;;55693:3;55676:21;;;;;-1:-1:-1;;;55676:21:0;;;;;;;-1:-1:-1;;;;;55676:21:0;-1:-1:-1;;;;;55676:21:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55676:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55676:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55676:21:0;;-1:-1:-1;;;;;;55712:22:0;;55729:4;55712:22;55708:177;;;55767:6;-1:-1:-1;;;;;55749:34:0;;55784:3;55789:7;55749:48;;;;;-1:-1:-1;;;55749:48:0;;;;;;;-1:-1:-1;;;;;55749:48:0;-1:-1:-1;;;;;55749:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55749:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55749:48:0;;;;55708:177;;;55826:59;;;;;;-1:-1:-1;;;;;55826:59:0;;;;;;;;;;;;;;;;;;;;;;:38;;;;;;:59;;;;;-1:-1:-1;;55826:59:0;;;;;;;;-1:-1:-1;55826:38:0;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;55826:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55826:59:0;;;;55708:177;55918:6;-1:-1:-1;;;;;55918:16:0;;55935:3;55918:21;;;;;-1:-1:-1;;;55918:21:0;;;;;;;-1:-1:-1;;;;;55918:21:0;-1:-1:-1;;;;;55918:21:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55918:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55918:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55918:21:0;;-1:-1:-1;55958:25:0;;;55950:34;;;;;59814:662;60355:8;60342:21;;60335:29;;;;60380:88;;;;;;;;;;;;;;;;;;;;60413:10;;-1:-1:-1;;;;;60380:88:0;;;;;;;;;;;;;;;;;;59814:662;;;;;:::o;22540:91::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;22600:5;;;;;;;;;-1:-1:-1;;;;;22600:5:0;-1:-1:-1;;;;;22600:21:0;;:23;;;;;-1:-1:-1;;;22600:23:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22600:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;9278:234:0;9338:7;;9391;;9387:34;;;9420:1;9413:8;;;;9387:34;-1:-1:-1;9446:7:0;;;9451:2;9446;:7;9472:6;;;;;;;;:12;9464:21;;;;;;9503:1;9496:8;;9278:234;;;;;;:::o;9748:154::-;9808:7;;9836:6;;;9828:15;;;;;;9871:2;9866;:7;;;;;;;;;9748:154;-1:-1:-1;;;;9748:154:0:o;20035:260::-;11021:5;;-1:-1:-1;;;;;11021:5:0;11007:10;:19;10999:28;;;;;;20166:6;-1:-1:-1;;;;;12217:22:0;;;;12209:31;;;;;;20196:3;-1:-1:-1;;;;;12217:22:0;;;;12209:31;;;;;;20218:3;-1:-1:-1;;;;;12396:25:0;;12416:4;12396:25;;12388:34;;;;;;20257:6;-1:-1:-1;;;;;20239:34:0;;20274:3;20279:7;20239:48;;;;;-1:-1:-1;;;20239:48:0;;;;;;;-1:-1:-1;;;;;20239:48:0;-1:-1:-1;;;;;20239:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20239:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20239:48:0;;;;12251:1;;11038;20035:260;;;:::o
Swarm Source
bzzr://1983de0b2f89c507b09181d1c8e92fe079ec5cafbc347d4cdcfa2d102119d06f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.