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 | 11239603 | 1446 days ago | IN | 0 ETH | 0.26198436 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FlashArbitrageController
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-12 */ // Sources flattened with hardhat v2.0.1 https://hardhat.org // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File @uniswap/lib/contracts/libraries/[email protected] // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.5.0; library AddressStringUtil { // converts an address to the uppercase hex string, extracting only len bytes (up to 20, multiple of 2) function toAsciiString(address addr, uint len) pure internal returns (string memory) { require(len % 2 == 0 && len > 0 && len <= 40, "AddressStringUtil: INVALID_LEN"); bytes memory s = new bytes(len); uint addrNum = uint(addr); for (uint i = 0; i < len / 2; i++) { // shift right and truncate all but the least significant byte to extract the byte at position 19-i uint8 b = uint8(addrNum >> (8 * (19 - i))); // first hex character is the most significant 4 bits uint8 hi = b >> 4; // second hex character is the least significant 4 bits uint8 lo = b - (hi << 4); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } // hi and lo are only 4 bits and between 0 and 16 // this method converts those values to the unicode/ascii code point for the hex representation // uses upper case for the characters function char(uint8 b) pure private returns (byte c) { if (b < 10) { return byte(b + 0x30); } else { return byte(b + 0x37); } } } // File @uniswap/lib/contracts/libraries/[email protected] pragma solidity >=0.5.0; // produces token descriptors from inconsistent or absent ERC20 symbol implementations that can return string or bytes32 // this library will always produce a string symbol to represent the token library SafeERC20Namer { function bytes32ToString(bytes32 x) pure private returns (string memory) { bytes memory bytesString = new bytes(32); uint charCount = 0; for (uint j = 0; j < 32; j++) { byte char = x[j]; if (char != 0) { bytesString[charCount] = char; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } // assumes the data is in position 2 function parseStringData(bytes memory b) pure private returns (string memory) { uint charCount = 0; // first parse the charCount out of the data for (uint i = 32; i < 64; i++) { charCount <<= 8; charCount += uint8(b[i]); } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint i = 0; i < charCount; i++) { bytesStringTrimmed[i] = b[i + 64]; } return string(bytesStringTrimmed); } // uses a heuristic to produce a token name from the address // the heuristic returns the full hex of the address string in upper case function addressToName(address token) pure private returns (string memory) { return AddressStringUtil.toAsciiString(token, 40); } // uses a heuristic to produce a token symbol from the address // the heuristic returns the first 6 hex of the address string in upper case function addressToSymbol(address token) pure private returns (string memory) { return AddressStringUtil.toAsciiString(token, 6); } // calls an external view token contract method that returns a symbol or name, and parses the output into a string function callAndParseStringReturn(address token, bytes4 selector) view private returns (string memory) { (bool success, bytes memory data) = token.staticcall(abi.encodeWithSelector(selector)); // if not implemented, or returns empty data, return empty string if (!success || data.length == 0) { return ""; } // bytes32 data always has length 32 if (data.length == 32) { bytes32 decoded = abi.decode(data, (bytes32)); return bytes32ToString(decoded); } else if (data.length > 64) { return abi.decode(data, (string)); } return ""; } // attempts to extract the token symbol. if it does not implement symbol, returns a symbol derived from the address function tokenSymbol(address token) internal view returns (string memory) { // 0x95d89b41 = bytes4(keccak256("symbol()")) string memory symbol = callAndParseStringReturn(token, 0x95d89b41); if (bytes(symbol).length == 0) { // fallback to 6 uppercase hex of address return addressToSymbol(token); } return symbol; } // attempts to extract the token name. if it does not implement name, returns a name derived from the address function tokenName(address token) internal view returns (string memory) { // 0x06fdde03 = bytes4(keccak256("name()")) string memory name = callAndParseStringReturn(token, 0x06fdde03); if (bytes(name).length == 0) { // fallback to full hex of address return addressToName(token); } return name; } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-ethereum-package/contracts/math/[email protected] pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File @openzeppelin/contracts-ethereum-package/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/access/[email protected] pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/v612/FlashArbitrageController.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // import "hardhat/console.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // _________ ________ _____________________ // \_ ___ \ \_____ \\______ \_ _____/ // / \ \/ / | \| _/| __)_ // \ \____/ | \ | \| \ // \______ /\_______ /____|_ /_______ / // \/ \/ \/ \/ // ___________.____ _____ _________ ___ ___ // \_ _____/| | / _ \ / _____// | \ // | __) | | / /_\ \ \_____ \/ ~ \ // | \ | |___/ | \/ \ Y / // \___ / |_______ \____|__ /_______ /\___|_ / // \/ \/ \/ \/ \/ // _____ ____________________.________________________ _____ ___________________ // / _ \\______ \______ \ \__ ___/\______ \ / _ \ / _____/\_ _____/ // / /_\ \| _/| | _/ | | | | _/ / /_\ \/ \ ___ | __)_ // / | \ | \| | \ | | | | | \/ | \ \_\ \| \ // \____|__ /____|_ /|______ /___| |____| |____|_ /\____|__ /\______ /_______ / // \/ \/ \/ \/ \/ \/ \/ // Controller // // This contract checks for opportunities to gain profit for all of DEXs out there // But especially the CORE ecosystem because this contract can tell another contrac to turn feeOff for the duration of its trades // By arbitraging all existing pools, and transfering profits to FeeSplitter // That will add rewards to specific pools to keep them at X% APY // And add liquidity and subsequently burn the liquidity tokens after all pools reach this threashold // // .edee... ..... .eeec. ..eee.. // .d*" """"*e..d*"""""**e..e*"" "*c.d"" ""*e. // z" "$ $"" *F **e. // z" "c d" *. "$. // .F " " 'F // d J% // 3 . e" // 4r e" . d" // $ .d" . .F z ..zeeeeed" // "*beeeP" P d e. $**"" " // "*b. Jbc. z*%e.. .$**eeeeP" // "*beee* "$$eeed" ^$$$"" " // '$$. .$$$c // "$$. e$$*$$c // "$$..$$P" '$$r // "$$$$" "$$. .d // z. .$$$" "$$. .dP" // ^*e e$$" "$$. .e$" // *b. .$$P" "$$. z$" // "$c e$$" "$$.z$*" // ^*e$$P" "$$$" // *$$ "$$r // '$$F .$$P // $$$ z$$" // 4$$ d$$b. // .$$% .$$*"*$$e. // e$$$*" z$$" "*$$e. // 4$$" d$P" "*$$e. // $P .d$$$c "*$$e.. // d$" z$$" *$b. "*$L // 4$" e$P" "*$c ^$$ // $" .d$" "$$. ^$r // dP z$$" ^*$e. "b // 4$ e$P "$$ " // J$F $$ // $$ .$F // 4$" $P" // $" dP kjRWG0tKD4A // // I'll have you know... interface IFlashArbitrageExecutor { function getStrategyProfitInReturnToken(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256); function executeStrategy(uint256) external; // Strategy that self calculates best input but costs gas function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; // strategy that does not calculate the best input meant for miners function executeStrategy(uint256 borrowAmt, address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; function getOptimalInput(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256); } contract FlashArbitrageController is OwnableUpgradeSafe { using SafeMath for uint256; event StrategyAdded(string indexed name, uint256 indexed id, address[] pairs, bool feeOff, address indexed originator); struct Strategy { string strategyName; bool[] token0Out; // An array saying if token 0 should be out in this step address[] pairs; // Array of pair addresses uint256[] feeOnTransfers; //Array of fee on transfers 1% = 10 bool cBTCSupport; // Should the algorithm check for cBTC and wrap/unwrap it // Note not checking saves gas bool feeOff; // Allows for adding CORE strategies - where there is no fee on the executor } uint256 public revenueSplitFeeOffStrategy; uint256 public revenueSplitFeeOnStrategy; address public distributor; IFlashArbitrageExecutor public executor; address public cBTC; address public CORE; address public wBTC; bool depreciated; // This contract can be upgraded to a new one // But we don't want people to add new strategies if its depreciated uint8 MAX_STEPS_LEN; // This variable is responsible to minimsing risk of gas limit strategies being added // Which would always have 0 gas cost because they could never complete Strategy[] public strategies; function initialize(address _executor, address _distributor) initializer public { require(tx.origin == address(0x5A16552f59ea34E44ec81E58b3817833E9fD5436)); OwnableUpgradeSafe.__Ownable_init(); cBTC = 0x7b5982dcAB054C377517759d0D2a3a5D02615AB8; CORE = 0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7; wBTC = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; distributor = _distributor; // we dont hard set it because its not live yet // So can't easily mock it in tests executor = IFlashArbitrageExecutor(_executor); revenueSplitFeeOffStrategy = 100; // 10% revenueSplitFeeOnStrategy = 650; // 65% MAX_STEPS_LEN = 20; } ///////////////// //// ADMIN SETTERS ////////////////// //In case executor needs to be updated function setExecutor(address _executor) onlyOwner public { executor = IFlashArbitrageExecutor(_executor); } //In case executor needs to be updated function setDistributor(address _distributor) onlyOwner public { distributor = _distributor; } function setMaxStrategySteps(uint8 _maxSteps) onlyOwner public { MAX_STEPS_LEN = _maxSteps; } function setDepreciated(bool _depreciated) onlyOwner public { depreciated = _depreciated; } function setFeeSplit(uint256 _revenueSplitFeeOffStrategy, uint256 _revenueSplitFeeOnStrategy) onlyOwner public { // We cap both fee splits to 20% max and 95% max // This means people calling feeOff strategies get max 20% revenue // And people calling feeOn strategies get max 95% require(revenueSplitFeeOffStrategy <= 200, "FA : 20% max fee for feeOff revenue split"); require(revenueSplitFeeOnStrategy <= 950, "FA : 95% max fee for feeOff revenue split"); revenueSplitFeeOffStrategy = _revenueSplitFeeOffStrategy; revenueSplitFeeOnStrategy = _revenueSplitFeeOnStrategy; } ///////////////// //// Views for strategies ////////////////// function getOptimalInput(uint256 strategyPID) public view returns (uint256) { Strategy memory currentStrategy = strategies[strategyPID]; return executor.getOptimalInput(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out); } // Returns the current profit of strateg if it was executed // In return token - this means if you borrow CORE from CORe/cBTC pair // This profit would be denominated in cBTC // Since thats what you have to return function strategyProfitInReturnToken(uint256 strategyID) public view returns (uint256 profit) { Strategy memory currentStrategy = strategies[strategyID]; return executor.getStrategyProfitInReturnToken(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out); } // Returns information about the strategy function strategyInfo(uint256 strategyPID) public view returns (Strategy memory){ return strategies[strategyPID]; } function numberOfStrategies() public view returns (uint256) { return strategies.length; } /////////////////// //// Strategy execution //// And profit assurances ////////////////// // Public function that executes a strategy // since its all a flash swap // the strategies can't lose money only gain // so its appropriate that they are public here // I don't think its possible that one of the strategies that is less profitable // takes away money from the more profitable one // Otherwise people would be able to do it anyway with their own contracts function executeStrategy(uint256 strategyPID) public { // function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; require(!depreciated, "This Contract is depreciated"); Strategy memory currentStrategy = strategies[strategyPID]; executor.executeStrategy(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out, currentStrategy.cBTCSupport); // console.log("Executed Strategy"); // Eg. Token 0 was out so profit token is token 1 address profitToken = currentStrategy.token0Out[0] ? IUniswapV2Pair(currentStrategy.pairs[0]).token1() : IUniswapV2Pair(currentStrategy.pairs[0]).token0(); // console.log("Profit token", profitToken); uint256 profit = IERC20(profitToken).balanceOf(address(this)); // console.log("Profit ", profit); // We split the profit based on the strategy if(currentStrategy.feeOff) { safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOffStrategy).div(1000)); } else { safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOnStrategy).div(1000)); } // console.log("Send revenue split now have ", IERC20(profitToken).balanceOf(address(this)) ); safeTransfer(profitToken, distributor, IERC20(profitToken).balanceOf(address(this))); } /////////////////// //// Adding strategies ////////////////// // Normal add without Fee Ontrasnfer being specified function addNewStrategy(bool borrowToken0, address[] memory pairs) public returns (uint256 strategyID) { uint256[] memory feeOnTransfers = new uint256[](pairs.length); strategyID = addNewStrategyWithFeeOnTransferTokens(borrowToken0, pairs, feeOnTransfers); } //Adding strategy with fee on transfer support function addNewStrategyWithFeeOnTransferTokens(bool borrowToken0, address[] memory pairs, uint256[] memory feeOnTransfers) public returns (uint256 strategyID) { require(!depreciated, "This Contract is depreciated"); require(pairs.length <= MAX_STEPS_LEN, "FA Controller - too many steps"); require(pairs.length > 1, "FA Controller - Specifying one pair is not arbitage"); require(pairs.length == feeOnTransfers.length, "FA Controller: Malformed Input - pairs and feeontransfers should equal"); bool[] memory token0Out = new bool[](pairs.length); // First token out is the same as borrowTokenOut token0Out[0] = borrowToken0; address token0 = IUniswapV2Pair(pairs[0]).token0(); address token1 = IUniswapV2Pair(pairs[0]).token1(); if(msg.sender != owner()) { require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin"); } bool cBTCSupport; // We turn on cbtc support if any of the borrow token pair has cbtc if(token0 == cBTC || token1 == cBTC) cBTCSupport = true; // Establish the first token out address lastToken = borrowToken0 ? token0 : token1; // console.log("Borrowing Token", lastToken); string memory strategyName = append( SafeERC20Namer.tokenSymbol(lastToken), " price too low. In ", SafeERC20Namer.tokenSymbol(token0), "/", SafeERC20Namer.tokenSymbol(token1), " pair"); // console.log(strategyName); // Loop over all other pairs for (uint256 i = 1; i < token0Out.length; i++) { address token0 = IUniswapV2Pair(pairs[i]).token0(); address token1 = IUniswapV2Pair(pairs[i]).token1(); if(msg.sender != owner()) { require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin"); } // console.log("Last token is", lastToken); // console.log("pair is",pairs[i]); // We turn on cbtc support if any of the pairs have cbts if(lastToken == cBTC || lastToken == wBTC){ require(token0 == cBTC || token1 == cBTC || token0 == wBTC || token1 == wBTC, "FA Controller: Malformed Input - pair does not contain previous token"); } else{ // We check if the token is in the next pair // If its not then its a wrong input // console.log("Last token", lastToken); require(token0 == lastToken || token1 == lastToken, "FA Controller: Malformed Input - pair does not contain previous token"); } // If last token is cBTC // And the this pair has wBTC in it // Then we should have the last token as wBTC if(lastToken == cBTC) { // console.log("Flipping here"); cBTCSupport = true; // If last token is cBTC and this pair has wBTC and no cBTC // Then we are inputting wBTC after unwrapping if(token0 == wBTC || token1 == wBTC && token0 != cBTC && token1 != cBTC){ // The token we take out here is opposite of wbtc // Token 0 is out if wBTC is token1 // Because we are inputting wBTC token0Out[i] = wBTC == token1; lastToken = wBTC == token1 ? token0 : token1; } } // If last token is wBTC // And cbtc is in this pair // And wbtc isn't in this pair // Then we wrapped cBTC else if(lastToken == wBTC && token0 == cBTC || token1 == cBTC && token0 != wBTC && token1 != wBTC){ // explained above with cbtc cBTCSupport = true; token0Out[i] = cBTC == token1; lastToken = cBTC == token1 ? token0 : token1; // console.log("Token0 out from last wBTC"); } //Default case with no cBTC support else { // If token 0 is the token we are inputting, the last one // Then we take the opposite here token0Out[i] = token1 == lastToken; // We take the opposite // So if we input token1 // Then token0 is out lastToken = token0 == lastToken ? token1 : token0; // console.log("Basic branch last token is ", lastToken); // console.log("Basic branch last token1 is ", token1); // console.log("Basic branch last token0 is ", token0); // console.log("Token0 out from basic branch"); } // console.log("Last token is", lastToken); } // address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport strategies.push( Strategy({ strategyName : strategyName, token0Out : token0Out, pairs : pairs, feeOnTransfers : feeOnTransfers, cBTCSupport : cBTCSupport, feeOff : msg.sender == owner() }) ); strategyID = strategies.length; emit StrategyAdded(strategyName, strategyID, pairs, msg.sender == owner(), msg.sender); } /////////////////// //// Helper functions ////////////////// function sendETH(address payable to, uint256 amt) internal { // console.log("I'm transfering ETH", amt/1e18, to); // throw exception on failure to.transfer(amt); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'FA Controller: TRANSFER_FAILED'); } function getTokenSafeName(address token) public view returns (string memory) { return SafeERC20Namer.tokenSymbol(token); } // A function that lets owner remove any tokens from this addrss // note this address shoudn't hold any tokens // And if it does that means someting already went wrong or someone send them to this address function rescueTokens(address token, uint256 amt) public onlyOwner { IERC20(token).transfer(owner(), amt); } function rescueETH(uint256 amt) public { sendETH(0xd5b47B80668840e7164C1D1d81aF8a9d9727B421, amt); } // appends two strings together function append(string memory a, string memory b, string memory c, string memory d, string memory e, string memory f) internal pure returns (string memory) { return string(abi.encodePacked(a, b,c,d,e,f)); } /////////////////// //// Additional functions ////////////////// // This function is for people who do not want to reveal their strategies // Note we can do this function because executor requires this contract to be a caller when doing feeoff stratgies function skimToken(address _token) public { IERC20 token = IERC20(_token); uint256 balToken = token.balanceOf(address(this)); safeTransfer(_token, msg.sender, balToken.mul(revenueSplitFeeOffStrategy).div(1000)); safeTransfer(_token, distributor, token.balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"pairs","type":"address[]"},{"indexed":false,"internalType":"bool","name":"feeOff","type":"bool"},{"indexed":true,"internalType":"address","name":"originator","type":"address"}],"name":"StrategyAdded","type":"event"},{"inputs":[],"name":"CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"}],"name":"addNewStrategy","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"}],"name":"addNewStrategyWithFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"executeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"contract IFlashArbitrageExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"getOptimalInput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenSafeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numberOfStrategies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueSplitFeeOffStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueSplitFeeOnStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_depreciated","type":"bool"}],"name":"setDepreciated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"setExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revenueSplitFeeOffStrategy","type":"uint256"},{"internalType":"uint256","name":"_revenueSplitFeeOnStrategy","type":"uint256"}],"name":"setFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxSteps","type":"uint8"}],"name":"setMaxStrategySteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"skimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"strategyInfo","outputs":[{"components":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool[]","name":"token0Out","type":"bool[]"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"internalType":"struct FlashArbitrageController.Strategy","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"name":"strategyProfitInReturnToken","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506136c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063bfe1092811610097578063d92f599911610071578063d92f599914610371578063dfe3647814610384578063f2fde38b14610397578063fc8f3656146103aa576101c4565b8063bfe109281461033f578063c34c08e514610347578063d574ea3d1461034f576101c4565b80639e252f00116100d35780639e252f00146102e6578063b4748585146102f9578063bb91c3391461030c578063bee990671461032c576101c4565b80638da5cb5b146102ce578063950fcfbe146102d65780639b452931146102de576101c4565b80635737619811610166578063715018a611610140578063715018a61461028d57806375619ab5146102955780637e6335c7146102a8578063887a2f72146102bb576101c4565b8063573761981461025f5780636b6c0774146102725780636d651e2a1461027a576101c4565b80631888153d116101a25780631888153d1461021c5780631c3c0ea81461022457806320d6c58014610239578063485cc9551461024c576101c4565b80630956e5a6146101c95780630ae8c4dc146101e75780631780ab98146101fc575b600080fd5b6101d16103bd565b6040516101de91906135f3565b60405180910390f35b6101ef6103c3565b6040516101de919061303b565b61020f61020a366004612bf1565b6103d2565b6040516101de919061311c565b6101d16103e5565b610237610232366004612bf1565b6103eb565b005b610237610247366004612bf1565b61044b565b61023761025a366004612c29565b610587565b61023761026d366004612c61565b6106db565b6101ef610797565b6101d1610288366004612cc4565b6107a6565b610237610802565b6102376102a3366004612bf1565b610881565b6102376102b6366004612e8f565b6108d8565b6102376102c9366004612e77565b61095f565b6101ef610e5d565b6101d1610e6c565b6101ef610e72565b6102376102f4366004612e77565b610e81565b610237610307366004612c8c565b610ea2565b61031f61031a366004612e77565b610ef5565b6040516101de9190613559565b6101d161033a366004612d12565b61110f565b6101ef611a4f565b6101ef611a5e565b61036261035d366004612e77565b611a6d565b6040516101de9392919061312f565b6101d161037f366004612e77565b611b2f565b610237610392366004612eb0565b611dde565b6102376103a5366004612bf1565b611e33565b6101d16103b8366004612e77565b611eea565b609e5490565b609b546001600160a01b031681565b60606103dd82612142565b90505b919050565b60985481565b6103f3612173565b6065546001600160a01b039081169116146104295760405162461bcd60e51b81526004016104209061344c565b60405180910390fd5b609a80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061047c90309060040161303b565b60206040518083038186803b15801561049457600080fd5b505afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190612ddc565b90506104f983336104f46103e86104ee6097548761217790919063ffffffff16565b906121ba565b6121fc565b6099546040516370a0823160e01b81526105829185916001600160a01b03918216918616906370a082319061053290309060040161303b565b60206040518083038186803b15801561054a57600080fd5b505afa15801561055e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f49190612ddc565b505050565b600054610100900460ff16806105a057506105a06122ea565b806105ae575060005460ff16155b6105ca5760405162461bcd60e51b815260040161042090613481565b600054610100900460ff161580156105f5576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd54361461061557600080fd5b61061d6122f0565b609b8054737b5982dcab054c377517759d0d2a3a5d02615ab86001600160a01b031991821617909155609c80547362359ed7505efc61ff1d56fef82158ccaffa23d7908316179055609d80546099805484166001600160a01b0387811691909117909155609a80548516918816919091179055606460975561028a609855732260fac5e5542a773aa44fbcfedf7c193bc2c59992169190911760ff60a81b1916600560aa1b1790558015610582576000805461ff0019169055505050565b6106e3612173565b6065546001600160a01b039081169116146107105760405162461bcd60e51b81526004016104209061344c565b816001600160a01b031663a9059cbb610727610e5d565b836040518363ffffffff1660e01b815260040161074592919061304f565b602060405180830381600087803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105829190612ca8565b609c546001600160a01b031681565b60006060825167ffffffffffffffff811180156107c257600080fd5b506040519080825280602002602001820160405280156107ec578160200160208202803683370190505b5090506107fa84848361110f565b949350505050565b61080a612173565b6065546001600160a01b039081169116146108375760405162461bcd60e51b81526004016104209061344c565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b610889612173565b6065546001600160a01b039081169116146108b65760405162461bcd60e51b81526004016104209061344c565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6108e0612173565b6065546001600160a01b0390811691161461090d5760405162461bcd60e51b81526004016104209061344c565b60c860975411156109305760405162461bcd60e51b815260040161042090613398565b6103b660985411156109545760405162461bcd60e51b8152600401610420906131fc565b609791909155609855565b609d54600160a01b900460ff16156109895760405162461bcd60e51b8152600401610420906132e9565b610991612939565b609e828154811061099e57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ab957602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610a885790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610b1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610afd575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610b7357602002820191906000526020600020905b815481526020019060010190808311610b5f575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610be5959294939291016130ab565b600060405180830381600087803b158015610bff57600080fd5b505af1158015610c13573d6000803e3d6000fd5b5050505060008160200151600081518110610c2a57fe5b6020026020010151610cc4578160400151600081518110610c4757fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8757600080fd5b505afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf9190612c0d565b610d4d565b8160400151600081518110610cd557fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612c0d565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610d7d919061303b565b60206040518083038186803b158015610d9557600080fd5b505afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190612ddc565b90508260a0015115610dfe57610df982336104f46103e86104ee6097548761217790919063ffffffff16565b610e1e565b610e1e82336104f46103e86104ee6098548761217790919063ffffffff16565b6099546040516370a0823160e01b8152610e579184916001600160a01b03918216918316906370a082319061053290309060040161303b565b50505050565b6065546001600160a01b031690565b60975481565b609d546001600160a01b031681565b610e9f73d5b47b80668840e7164c1d1d81af8a9d9727b42182612382565b50565b610eaa612173565b6065546001600160a01b03908116911614610ed75760405162461bcd60e51b81526004016104209061344c565b609d8054911515600160a01b0260ff60a01b19909216919091179055565b610efd612939565b609e8281548110610f0a57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610fad5780601f10610f8257610100808354040283529160200191610fad565b820191906000526020600020905b815481529060010190602001808311610f9057829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561102557602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610ff45790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561108757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611069575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156110df57602002820191906000526020600020905b8154815260200190600101908083116110cb575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b609d54600090600160a01b900460ff161561113c5760405162461bcd60e51b8152600401610420906132e9565b609d548351600160a81b90910460ff16101561116a5760405162461bcd60e51b8152600401610420906132b2565b600183511161118b5760405162461bcd60e51b8152600401610420906134cf565b81518351146111ac5760405162461bcd60e51b815260040161042090613245565b6060835167ffffffffffffffff811180156111c657600080fd5b506040519080825280602002602001820160405280156111f0578160200160208202803683370190505b509050848160008151811061120157fe5b60200260200101901515908115158152505060008460008151811061122257fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561126257600080fd5b505afa158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190612c0d565b90506000856000815181106112ab57fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112eb57600080fd5b505afa1580156112ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113239190612c0d565b905061132d610e5d565b6001600160a01b0316336001600160a01b03161461138d57609c546001600160a01b038381169116148015906113715750609c546001600160a01b03828116911614155b61138d5760405162461bcd60e51b815260040161042090613159565b609b546000906001600160a01b03848116911614806113b95750609b546001600160a01b038381169116145b156113c2575060015b6000886113cf57826113d1565b835b9050606061145c6113e183612142565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b81525061141688612142565b604051806040016040528060018152602001602f60f81b81525061143989612142565b60405180604001604052806005815260200164103830b4b960d91b8152506123b8565b905060015b86518110156118d75760008a828151811061147857fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b857600080fd5b505afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f09190612c0d565b905060008b838151811061150057fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612c0d565b9050611582610e5d565b6001600160a01b0316336001600160a01b0316146115e257609c546001600160a01b038381169116148015906115c65750609c546001600160a01b03828116911614155b6115e25760405162461bcd60e51b815260040161042090613159565b609b546001600160a01b038681169116148061160b5750609d546001600160a01b038681169116145b1561168a57609b546001600160a01b03838116911614806116395750609b546001600160a01b038281169116145b806116515750609d546001600160a01b038381169116145b806116695750609d546001600160a01b038281169116145b6116855760405162461bcd60e51b8152600401610420906133e1565b6116d7565b846001600160a01b0316826001600160a01b031614806116bb5750846001600160a01b0316816001600160a01b0316145b6116d75760405162461bcd60e51b8152600401610420906133e1565b609b546001600160a01b03868116911614156117aa57609d54600196506001600160a01b038381169116148061174d5750609d546001600160a01b0382811691161480156117335750609b546001600160a01b03838116911614155b801561174d5750609b546001600160a01b03828116911614155b156117a557609d5489516001600160a01b03838116921691909114908a908590811061177557fe5b91151560209283029190910190910152609d546001600160a01b038281169116146117a057806117a2565b815b94505b6118cd565b609d546001600160a01b0386811691161480156117d45750609b546001600160a01b038381169116145b8061181f5750609b546001600160a01b0382811691161480156118055750609d546001600160a01b03838116911614155b801561181f5750609d546001600160a01b03828116911614155b1561187657609b548951600197506001600160a01b03838116921691909114908a908590811061184b57fe5b91151560209283029190910190910152609b546001600160a01b038281169116146117a057806117a2565b846001600160a01b0316816001600160a01b03161489848151811061189757fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b0316146118c857816118ca565b805b94505b5050600101611461565b50609e6040518060c001604052808381526020018881526020018b81526020018a8152602001851515815260200161190d610e5d565b6001600160a01b031633149052815460018101835560009283526020928390208251805193946005909302909101926119499284920190612973565b50602082810151805161196292600185019201906129f1565b506040820151805161197e916002840191602090910190612a92565b506060820151805161199a916003840191602090910190612af3565b5060808201516004909101805460a09093015115156101000261ff001992151560ff199094169390931791909116919091179055609e54604051909750339088906119e6908490612fa0565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c611a18610e5d565b6001600160a01b0316336001600160a01b031614604051611a3a9291906130f8565b60405180910390a45050505050509392505050565b6099546001600160a01b031681565b609a546001600160a01b031681565b609e8181548110611a7a57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f810185900485028301850190915280825291935091839190830182828015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b6000611b39612939565b609e8381548110611b4657fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611be95780601f10611bbe57610100808354040283529160200191611be9565b820191906000526020600020905b815481529060010190602001808311611bcc57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611c6157602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611c305790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611cc357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ca5575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611d1b57602002820191906000526020600020905b815481526020019060010190808311611d07575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611d87949293929101613068565b60206040518083038186803b158015611d9f57600080fd5b505afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd79190612ddc565b9392505050565b611de6612173565b6065546001600160a01b03908116911614611e135760405162461bcd60e51b81526004016104209061344c565b609d805460ff909216600160a81b0260ff60a81b19909216919091179055565b611e3b612173565b6065546001600160a01b03908116911614611e685760405162461bcd60e51b81526004016104209061344c565b6001600160a01b038116611e8e5760405162461bcd60e51b8152600401610420906131b6565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611ef4612939565b609e8381548110611f0157fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611fa45780601f10611f7957610100808354040283529160200191611fa4565b820191906000526020600020905b815481529060010190602001808311611f8757829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561201c57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611feb5790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561207e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612060575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156120d657602002820191906000526020600020905b8154815260200190600101908083116120c2575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611d87949293929101613068565b606080612156836395d89b4160e01b6123f0565b90508051600014156103dd5761216b8361251d565b9150506103e0565b3390565b600082612186575060006121b4565b8282028284828161219357fe5b04146121b15760405162461bcd60e51b815260040161042090613357565b90505b92915050565b60006121b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061252a565b60006060846001600160a01b031663a9059cbb858560405160240161222292919061304f565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161225b9190612fa0565b6000604051808303816000865af19150503d8060008114612298576040519150601f19603f3d011682016040523d82523d6000602084013e61229d565b606091505b50915091508180156122c75750805115806122c75750808060200190518101906122c79190612ca8565b6122e35760405162461bcd60e51b815260040161042090613320565b5050505050565b303b1590565b600054610100900460ff168061230957506123096122ea565b80612317575060005460ff16155b6123335760405162461bcd60e51b815260040161042090613481565b600054610100900460ff1615801561235e576000805460ff1961ff0019909116610100171660011790555b612366612561565b61236e6125e2565b8015610e9f576000805461ff001916905550565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610582573d6000803e3d6000fd5b60608686868686866040516020016123d596959493929190612fbc565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b0387169161243a9190612fa0565b600060405180830381855afa9150503d8060008114612475576040519150601f19603f3d011682016040523d82523d6000602084013e61247a565b606091505b509150915081158061248b57508051155b156124a95760405180602001604052806000815250925050506121b4565b8051602014156124de576000818060200190518101906124c99190612ddc565b90506124d4816126bc565b93505050506121b4565b60408151111561250557808060200190518101906124fc9190612df4565b925050506121b4565b50506040805160208101909152600081529392505050565b60606103dd8260066127e3565b6000818361254b5760405162461bcd60e51b8152600401610420919061311c565b50600083858161255757fe5b0495945050505050565b600054610100900460ff168061257a575061257a6122ea565b80612588575060005460ff16155b6125a45760405162461bcd60e51b815260040161042090613481565b600054610100900460ff1615801561236e576000805460ff1961ff0019909116610100171660011790558015610e9f576000805461ff001916905550565b600054610100900460ff16806125fb57506125fb6122ea565b80612609575060005460ff16155b6126255760405162461bcd60e51b815260040161042090613481565b600054610100900460ff16158015612650576000805460ff1961ff0019909116610100171660011790555b600061265a612173565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610e9f576000805461ff001916905550565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b60208110156127455760008582602081106126fb57fe5b1a60f81b90506001600160f81b031981161561273c578084848151811061271e57fe5b60200101906001600160f81b031916908160001a9053506001909201915b506001016126e4565b5060608167ffffffffffffffff8111801561275f57600080fd5b506040519080825280601f01601f19166020018201604052801561278a576020820181803683370190505b50905060005b828110156127da578381815181106127a457fe5b602001015160f81c60f81b8282815181106127bb57fe5b60200101906001600160f81b031916908160001a905350600101612790565b50949350505050565b6060600282061580156127f65750600082115b8015612803575060288211155b61281f5760405162461bcd60e51b815260040161042090613522565b60608267ffffffffffffffff8111801561283857600080fd5b506040519080825280601f01601f191660200182016040528015612863576020820181803683370190505b5090506001600160a01b03841660005b6002850481101561290757600860138290030282901c600f600482901c1660f0821682036128a082612911565b8685600202815181106128af57fe5b60200101906001600160f81b031916908160001a9053506128cf81612911565b8685600202600101815181106128e157fe5b60200101906001600160f81b031916908160001a90535050600190920191506128739050565b5090949350505050565b6000600a8260ff16101561292c57506030810160f81b6103e0565b506037810160f81b6103e0565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129b457805160ff19168380011785556129e1565b828001600101855582156129e1579182015b828111156129e15782518255916020019190600101906129c6565b506129ed929150612b2d565b5090565b82805482825590600052602060002090601f01602090048101928215612a865791602002820160005b83821115612a5757835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612a1a565b8015612a845782816101000a81549060ff0219169055600101602081600001049283019260010302612a57565b505b506129ed929150612b42565b828054828255906000526020600020908101928215612ae7579160200282015b82811115612ae757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ab2565b506129ed929150612b5b565b8280548282559060005260206000209081019282156129e157916020028201828111156129e15782518255916020019190600101906129c6565b5b808211156129ed5760008155600101612b2e565b5b808211156129ed57805460ff19168155600101612b43565b5b808211156129ed5780546001600160a01b0319168155600101612b5c565b600082601f830112612b8a578081fd5b8135612b9d612b9882613623565b6135fc565b818152915060208083019084810181840286018201871015612bbe57600080fd5b60005b84811015612be6578135612bd48161366f565b84529282019290820190600101612bc1565b505050505092915050565b600060208284031215612c02578081fd5b81356121b18161366f565b600060208284031215612c1e578081fd5b81516121b18161366f565b60008060408385031215612c3b578081fd5b8235612c468161366f565b91506020830135612c568161366f565b809150509250929050565b60008060408385031215612c73578182fd5b8235612c7e8161366f565b946020939093013593505050565b600060208284031215612c9d578081fd5b81356121b181613684565b600060208284031215612cb9578081fd5b81516121b181613684565b60008060408385031215612cd6578182fd5b8235612ce181613684565b9150602083013567ffffffffffffffff811115612cfc578182fd5b612d0885828601612b7a565b9150509250929050565b600080600060608486031215612d26578081fd5b8335612d3181613684565b925060208481013567ffffffffffffffff80821115612d4e578384fd5b612d5a88838901612b7a565b94506040870135915080821115612d6f578384fd5b508501601f81018713612d80578283fd5b8035612d8e612b9882613623565b81815283810190838501858402850186018b1015612daa578687fd5b8694505b83851015612dcc578035835260019490940193918501918501612dae565b5080955050505050509250925092565b600060208284031215612ded578081fd5b5051919050565b600060208284031215612e05578081fd5b815167ffffffffffffffff80821115612e1c578283fd5b818401915084601f830112612e2f578283fd5b815181811115612e3d578384fd5b612e50601f8201601f19166020016135fc565b9150808252856020828501011115612e66578384fd5b6127da816020840160208601613643565b600060208284031215612e88578081fd5b5035919050565b60008060408385031215612ea1578182fd5b50508035926020909101359150565b600060208284031215612ec1578081fd5b813560ff811681146121b1578182fd5b6000815180845260208085019450808401835b83811015612f095781516001600160a01b031687529582019590820190600101612ee4565b509495945050505050565b6000815180845260208085019450808401835b83811015612f09578151151587529582019590820190600101612f27565b6000815180845260208085019450808401835b83811015612f0957815187529582019590820190600101612f58565b60008151808452612f8c816020860160208601613643565b601f01601f19169290920160200192915050565b60008251612fb2818460208701613643565b9190910192915050565b600087516020612fcf8285838d01613643565b885191840191612fe28184848d01613643565b8851920191612ff48184848c01613643565b87519201916130068184848b01613643565b86519201916130188184848a01613643565b855192019161302a8184848901613643565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60006060825261307b6060830186612ed1565b828103602084015261308d8186612f45565b905082810360408401526130a18185612f14565b9695505050505050565b6000608082526130be6080830187612ed1565b82810360208401526130d08187612f45565b905082810360408401526130e48186612f14565b915050821515606083015295945050505050565b60006040825261310b6040830185612ed1565b905082151560208301529392505050565b6000602082526121b16020830184612f74565b6000606082526131426060830186612f74565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526033908201527f464120436f6e74726f6c6c6572202d2053706563696679696e67206f6e652070604082015272616972206973206e6f7420617262697461676560681b606082015260800190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261357560e0840182612f74565b90506020840151601f19808584030160408601526135938383612f14565b925060408601519150808584030160608601526135b08383612ed1565b92506060860151915080858403016080860152506135ce8282612f45565b9150506080840151151560a084015260a0840151151560c08401528091505092915050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561361b57600080fd5b604052919050565b600067ffffffffffffffff821115613639578081fd5b5060209081020190565b60005b8381101561365e578181015183820152602001613646565b83811115610e575750506000910152565b6001600160a01b0381168114610e9f57600080fd5b8015158114610e9f57600080fdfea264697066735822122013fc32639059c3c3a28024be40125c0f079c0ac4db7970d0d28204558eb1868e64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063bfe1092811610097578063d92f599911610071578063d92f599914610371578063dfe3647814610384578063f2fde38b14610397578063fc8f3656146103aa576101c4565b8063bfe109281461033f578063c34c08e514610347578063d574ea3d1461034f576101c4565b80639e252f00116100d35780639e252f00146102e6578063b4748585146102f9578063bb91c3391461030c578063bee990671461032c576101c4565b80638da5cb5b146102ce578063950fcfbe146102d65780639b452931146102de576101c4565b80635737619811610166578063715018a611610140578063715018a61461028d57806375619ab5146102955780637e6335c7146102a8578063887a2f72146102bb576101c4565b8063573761981461025f5780636b6c0774146102725780636d651e2a1461027a576101c4565b80631888153d116101a25780631888153d1461021c5780631c3c0ea81461022457806320d6c58014610239578063485cc9551461024c576101c4565b80630956e5a6146101c95780630ae8c4dc146101e75780631780ab98146101fc575b600080fd5b6101d16103bd565b6040516101de91906135f3565b60405180910390f35b6101ef6103c3565b6040516101de919061303b565b61020f61020a366004612bf1565b6103d2565b6040516101de919061311c565b6101d16103e5565b610237610232366004612bf1565b6103eb565b005b610237610247366004612bf1565b61044b565b61023761025a366004612c29565b610587565b61023761026d366004612c61565b6106db565b6101ef610797565b6101d1610288366004612cc4565b6107a6565b610237610802565b6102376102a3366004612bf1565b610881565b6102376102b6366004612e8f565b6108d8565b6102376102c9366004612e77565b61095f565b6101ef610e5d565b6101d1610e6c565b6101ef610e72565b6102376102f4366004612e77565b610e81565b610237610307366004612c8c565b610ea2565b61031f61031a366004612e77565b610ef5565b6040516101de9190613559565b6101d161033a366004612d12565b61110f565b6101ef611a4f565b6101ef611a5e565b61036261035d366004612e77565b611a6d565b6040516101de9392919061312f565b6101d161037f366004612e77565b611b2f565b610237610392366004612eb0565b611dde565b6102376103a5366004612bf1565b611e33565b6101d16103b8366004612e77565b611eea565b609e5490565b609b546001600160a01b031681565b60606103dd82612142565b90505b919050565b60985481565b6103f3612173565b6065546001600160a01b039081169116146104295760405162461bcd60e51b81526004016104209061344c565b60405180910390fd5b609a80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061047c90309060040161303b565b60206040518083038186803b15801561049457600080fd5b505afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190612ddc565b90506104f983336104f46103e86104ee6097548761217790919063ffffffff16565b906121ba565b6121fc565b6099546040516370a0823160e01b81526105829185916001600160a01b03918216918616906370a082319061053290309060040161303b565b60206040518083038186803b15801561054a57600080fd5b505afa15801561055e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f49190612ddc565b505050565b600054610100900460ff16806105a057506105a06122ea565b806105ae575060005460ff16155b6105ca5760405162461bcd60e51b815260040161042090613481565b600054610100900460ff161580156105f5576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd54361461061557600080fd5b61061d6122f0565b609b8054737b5982dcab054c377517759d0d2a3a5d02615ab86001600160a01b031991821617909155609c80547362359ed7505efc61ff1d56fef82158ccaffa23d7908316179055609d80546099805484166001600160a01b0387811691909117909155609a80548516918816919091179055606460975561028a609855732260fac5e5542a773aa44fbcfedf7c193bc2c59992169190911760ff60a81b1916600560aa1b1790558015610582576000805461ff0019169055505050565b6106e3612173565b6065546001600160a01b039081169116146107105760405162461bcd60e51b81526004016104209061344c565b816001600160a01b031663a9059cbb610727610e5d565b836040518363ffffffff1660e01b815260040161074592919061304f565b602060405180830381600087803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105829190612ca8565b609c546001600160a01b031681565b60006060825167ffffffffffffffff811180156107c257600080fd5b506040519080825280602002602001820160405280156107ec578160200160208202803683370190505b5090506107fa84848361110f565b949350505050565b61080a612173565b6065546001600160a01b039081169116146108375760405162461bcd60e51b81526004016104209061344c565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b610889612173565b6065546001600160a01b039081169116146108b65760405162461bcd60e51b81526004016104209061344c565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6108e0612173565b6065546001600160a01b0390811691161461090d5760405162461bcd60e51b81526004016104209061344c565b60c860975411156109305760405162461bcd60e51b815260040161042090613398565b6103b660985411156109545760405162461bcd60e51b8152600401610420906131fc565b609791909155609855565b609d54600160a01b900460ff16156109895760405162461bcd60e51b8152600401610420906132e9565b610991612939565b609e828154811061099e57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ab957602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610a885790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610b1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610afd575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610b7357602002820191906000526020600020905b815481526020019060010190808311610b5f575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610be5959294939291016130ab565b600060405180830381600087803b158015610bff57600080fd5b505af1158015610c13573d6000803e3d6000fd5b5050505060008160200151600081518110610c2a57fe5b6020026020010151610cc4578160400151600081518110610c4757fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8757600080fd5b505afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf9190612c0d565b610d4d565b8160400151600081518110610cd557fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612c0d565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610d7d919061303b565b60206040518083038186803b158015610d9557600080fd5b505afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190612ddc565b90508260a0015115610dfe57610df982336104f46103e86104ee6097548761217790919063ffffffff16565b610e1e565b610e1e82336104f46103e86104ee6098548761217790919063ffffffff16565b6099546040516370a0823160e01b8152610e579184916001600160a01b03918216918316906370a082319061053290309060040161303b565b50505050565b6065546001600160a01b031690565b60975481565b609d546001600160a01b031681565b610e9f73d5b47b80668840e7164c1d1d81af8a9d9727b42182612382565b50565b610eaa612173565b6065546001600160a01b03908116911614610ed75760405162461bcd60e51b81526004016104209061344c565b609d8054911515600160a01b0260ff60a01b19909216919091179055565b610efd612939565b609e8281548110610f0a57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610fad5780601f10610f8257610100808354040283529160200191610fad565b820191906000526020600020905b815481529060010190602001808311610f9057829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561102557602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610ff45790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561108757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611069575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156110df57602002820191906000526020600020905b8154815260200190600101908083116110cb575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b609d54600090600160a01b900460ff161561113c5760405162461bcd60e51b8152600401610420906132e9565b609d548351600160a81b90910460ff16101561116a5760405162461bcd60e51b8152600401610420906132b2565b600183511161118b5760405162461bcd60e51b8152600401610420906134cf565b81518351146111ac5760405162461bcd60e51b815260040161042090613245565b6060835167ffffffffffffffff811180156111c657600080fd5b506040519080825280602002602001820160405280156111f0578160200160208202803683370190505b509050848160008151811061120157fe5b60200260200101901515908115158152505060008460008151811061122257fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561126257600080fd5b505afa158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190612c0d565b90506000856000815181106112ab57fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112eb57600080fd5b505afa1580156112ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113239190612c0d565b905061132d610e5d565b6001600160a01b0316336001600160a01b03161461138d57609c546001600160a01b038381169116148015906113715750609c546001600160a01b03828116911614155b61138d5760405162461bcd60e51b815260040161042090613159565b609b546000906001600160a01b03848116911614806113b95750609b546001600160a01b038381169116145b156113c2575060015b6000886113cf57826113d1565b835b9050606061145c6113e183612142565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b81525061141688612142565b604051806040016040528060018152602001602f60f81b81525061143989612142565b60405180604001604052806005815260200164103830b4b960d91b8152506123b8565b905060015b86518110156118d75760008a828151811061147857fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b857600080fd5b505afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f09190612c0d565b905060008b838151811061150057fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612c0d565b9050611582610e5d565b6001600160a01b0316336001600160a01b0316146115e257609c546001600160a01b038381169116148015906115c65750609c546001600160a01b03828116911614155b6115e25760405162461bcd60e51b815260040161042090613159565b609b546001600160a01b038681169116148061160b5750609d546001600160a01b038681169116145b1561168a57609b546001600160a01b03838116911614806116395750609b546001600160a01b038281169116145b806116515750609d546001600160a01b038381169116145b806116695750609d546001600160a01b038281169116145b6116855760405162461bcd60e51b8152600401610420906133e1565b6116d7565b846001600160a01b0316826001600160a01b031614806116bb5750846001600160a01b0316816001600160a01b0316145b6116d75760405162461bcd60e51b8152600401610420906133e1565b609b546001600160a01b03868116911614156117aa57609d54600196506001600160a01b038381169116148061174d5750609d546001600160a01b0382811691161480156117335750609b546001600160a01b03838116911614155b801561174d5750609b546001600160a01b03828116911614155b156117a557609d5489516001600160a01b03838116921691909114908a908590811061177557fe5b91151560209283029190910190910152609d546001600160a01b038281169116146117a057806117a2565b815b94505b6118cd565b609d546001600160a01b0386811691161480156117d45750609b546001600160a01b038381169116145b8061181f5750609b546001600160a01b0382811691161480156118055750609d546001600160a01b03838116911614155b801561181f5750609d546001600160a01b03828116911614155b1561187657609b548951600197506001600160a01b03838116921691909114908a908590811061184b57fe5b91151560209283029190910190910152609b546001600160a01b038281169116146117a057806117a2565b846001600160a01b0316816001600160a01b03161489848151811061189757fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b0316146118c857816118ca565b805b94505b5050600101611461565b50609e6040518060c001604052808381526020018881526020018b81526020018a8152602001851515815260200161190d610e5d565b6001600160a01b031633149052815460018101835560009283526020928390208251805193946005909302909101926119499284920190612973565b50602082810151805161196292600185019201906129f1565b506040820151805161197e916002840191602090910190612a92565b506060820151805161199a916003840191602090910190612af3565b5060808201516004909101805460a09093015115156101000261ff001992151560ff199094169390931791909116919091179055609e54604051909750339088906119e6908490612fa0565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c611a18610e5d565b6001600160a01b0316336001600160a01b031614604051611a3a9291906130f8565b60405180910390a45050505050509392505050565b6099546001600160a01b031681565b609a546001600160a01b031681565b609e8181548110611a7a57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f810185900485028301850190915280825291935091839190830182828015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b6000611b39612939565b609e8381548110611b4657fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611be95780601f10611bbe57610100808354040283529160200191611be9565b820191906000526020600020905b815481529060010190602001808311611bcc57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611c6157602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611c305790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611cc357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ca5575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611d1b57602002820191906000526020600020905b815481526020019060010190808311611d07575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611d87949293929101613068565b60206040518083038186803b158015611d9f57600080fd5b505afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd79190612ddc565b9392505050565b611de6612173565b6065546001600160a01b03908116911614611e135760405162461bcd60e51b81526004016104209061344c565b609d805460ff909216600160a81b0260ff60a81b19909216919091179055565b611e3b612173565b6065546001600160a01b03908116911614611e685760405162461bcd60e51b81526004016104209061344c565b6001600160a01b038116611e8e5760405162461bcd60e51b8152600401610420906131b6565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611ef4612939565b609e8381548110611f0157fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611fa45780601f10611f7957610100808354040283529160200191611fa4565b820191906000526020600020905b815481529060010190602001808311611f8757829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561201c57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611feb5790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561207e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612060575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156120d657602002820191906000526020600020905b8154815260200190600101908083116120c2575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611d87949293929101613068565b606080612156836395d89b4160e01b6123f0565b90508051600014156103dd5761216b8361251d565b9150506103e0565b3390565b600082612186575060006121b4565b8282028284828161219357fe5b04146121b15760405162461bcd60e51b815260040161042090613357565b90505b92915050565b60006121b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061252a565b60006060846001600160a01b031663a9059cbb858560405160240161222292919061304f565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161225b9190612fa0565b6000604051808303816000865af19150503d8060008114612298576040519150601f19603f3d011682016040523d82523d6000602084013e61229d565b606091505b50915091508180156122c75750805115806122c75750808060200190518101906122c79190612ca8565b6122e35760405162461bcd60e51b815260040161042090613320565b5050505050565b303b1590565b600054610100900460ff168061230957506123096122ea565b80612317575060005460ff16155b6123335760405162461bcd60e51b815260040161042090613481565b600054610100900460ff1615801561235e576000805460ff1961ff0019909116610100171660011790555b612366612561565b61236e6125e2565b8015610e9f576000805461ff001916905550565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610582573d6000803e3d6000fd5b60608686868686866040516020016123d596959493929190612fbc565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b0387169161243a9190612fa0565b600060405180830381855afa9150503d8060008114612475576040519150601f19603f3d011682016040523d82523d6000602084013e61247a565b606091505b509150915081158061248b57508051155b156124a95760405180602001604052806000815250925050506121b4565b8051602014156124de576000818060200190518101906124c99190612ddc565b90506124d4816126bc565b93505050506121b4565b60408151111561250557808060200190518101906124fc9190612df4565b925050506121b4565b50506040805160208101909152600081529392505050565b60606103dd8260066127e3565b6000818361254b5760405162461bcd60e51b8152600401610420919061311c565b50600083858161255757fe5b0495945050505050565b600054610100900460ff168061257a575061257a6122ea565b80612588575060005460ff16155b6125a45760405162461bcd60e51b815260040161042090613481565b600054610100900460ff1615801561236e576000805460ff1961ff0019909116610100171660011790558015610e9f576000805461ff001916905550565b600054610100900460ff16806125fb57506125fb6122ea565b80612609575060005460ff16155b6126255760405162461bcd60e51b815260040161042090613481565b600054610100900460ff16158015612650576000805460ff1961ff0019909116610100171660011790555b600061265a612173565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610e9f576000805461ff001916905550565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b60208110156127455760008582602081106126fb57fe5b1a60f81b90506001600160f81b031981161561273c578084848151811061271e57fe5b60200101906001600160f81b031916908160001a9053506001909201915b506001016126e4565b5060608167ffffffffffffffff8111801561275f57600080fd5b506040519080825280601f01601f19166020018201604052801561278a576020820181803683370190505b50905060005b828110156127da578381815181106127a457fe5b602001015160f81c60f81b8282815181106127bb57fe5b60200101906001600160f81b031916908160001a905350600101612790565b50949350505050565b6060600282061580156127f65750600082115b8015612803575060288211155b61281f5760405162461bcd60e51b815260040161042090613522565b60608267ffffffffffffffff8111801561283857600080fd5b506040519080825280601f01601f191660200182016040528015612863576020820181803683370190505b5090506001600160a01b03841660005b6002850481101561290757600860138290030282901c600f600482901c1660f0821682036128a082612911565b8685600202815181106128af57fe5b60200101906001600160f81b031916908160001a9053506128cf81612911565b8685600202600101815181106128e157fe5b60200101906001600160f81b031916908160001a90535050600190920191506128739050565b5090949350505050565b6000600a8260ff16101561292c57506030810160f81b6103e0565b506037810160f81b6103e0565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129b457805160ff19168380011785556129e1565b828001600101855582156129e1579182015b828111156129e15782518255916020019190600101906129c6565b506129ed929150612b2d565b5090565b82805482825590600052602060002090601f01602090048101928215612a865791602002820160005b83821115612a5757835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612a1a565b8015612a845782816101000a81549060ff0219169055600101602081600001049283019260010302612a57565b505b506129ed929150612b42565b828054828255906000526020600020908101928215612ae7579160200282015b82811115612ae757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ab2565b506129ed929150612b5b565b8280548282559060005260206000209081019282156129e157916020028201828111156129e15782518255916020019190600101906129c6565b5b808211156129ed5760008155600101612b2e565b5b808211156129ed57805460ff19168155600101612b43565b5b808211156129ed5780546001600160a01b0319168155600101612b5c565b600082601f830112612b8a578081fd5b8135612b9d612b9882613623565b6135fc565b818152915060208083019084810181840286018201871015612bbe57600080fd5b60005b84811015612be6578135612bd48161366f565b84529282019290820190600101612bc1565b505050505092915050565b600060208284031215612c02578081fd5b81356121b18161366f565b600060208284031215612c1e578081fd5b81516121b18161366f565b60008060408385031215612c3b578081fd5b8235612c468161366f565b91506020830135612c568161366f565b809150509250929050565b60008060408385031215612c73578182fd5b8235612c7e8161366f565b946020939093013593505050565b600060208284031215612c9d578081fd5b81356121b181613684565b600060208284031215612cb9578081fd5b81516121b181613684565b60008060408385031215612cd6578182fd5b8235612ce181613684565b9150602083013567ffffffffffffffff811115612cfc578182fd5b612d0885828601612b7a565b9150509250929050565b600080600060608486031215612d26578081fd5b8335612d3181613684565b925060208481013567ffffffffffffffff80821115612d4e578384fd5b612d5a88838901612b7a565b94506040870135915080821115612d6f578384fd5b508501601f81018713612d80578283fd5b8035612d8e612b9882613623565b81815283810190838501858402850186018b1015612daa578687fd5b8694505b83851015612dcc578035835260019490940193918501918501612dae565b5080955050505050509250925092565b600060208284031215612ded578081fd5b5051919050565b600060208284031215612e05578081fd5b815167ffffffffffffffff80821115612e1c578283fd5b818401915084601f830112612e2f578283fd5b815181811115612e3d578384fd5b612e50601f8201601f19166020016135fc565b9150808252856020828501011115612e66578384fd5b6127da816020840160208601613643565b600060208284031215612e88578081fd5b5035919050565b60008060408385031215612ea1578182fd5b50508035926020909101359150565b600060208284031215612ec1578081fd5b813560ff811681146121b1578182fd5b6000815180845260208085019450808401835b83811015612f095781516001600160a01b031687529582019590820190600101612ee4565b509495945050505050565b6000815180845260208085019450808401835b83811015612f09578151151587529582019590820190600101612f27565b6000815180845260208085019450808401835b83811015612f0957815187529582019590820190600101612f58565b60008151808452612f8c816020860160208601613643565b601f01601f19169290920160200192915050565b60008251612fb2818460208701613643565b9190910192915050565b600087516020612fcf8285838d01613643565b885191840191612fe28184848d01613643565b8851920191612ff48184848c01613643565b87519201916130068184848b01613643565b86519201916130188184848a01613643565b855192019161302a8184848901613643565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60006060825261307b6060830186612ed1565b828103602084015261308d8186612f45565b905082810360408401526130a18185612f14565b9695505050505050565b6000608082526130be6080830187612ed1565b82810360208401526130d08187612f45565b905082810360408401526130e48186612f14565b915050821515606083015295945050505050565b60006040825261310b6040830185612ed1565b905082151560208301529392505050565b6000602082526121b16020830184612f74565b6000606082526131426060830186612f74565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526033908201527f464120436f6e74726f6c6c6572202d2053706563696679696e67206f6e652070604082015272616972206973206e6f7420617262697461676560681b606082015260800190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261357560e0840182612f74565b90506020840151601f19808584030160408601526135938383612f14565b925060408601519150808584030160608601526135b08383612ed1565b92506060860151915080858403016080860152506135ce8282612f45565b9150506080840151151560a084015260a0840151151560c08401528091505092915050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561361b57600080fd5b604052919050565b600067ffffffffffffffff821115613639578081fd5b5060209081020190565b60005b8381101561365e578181015183820152602001613646565b83811115610e575750506000910152565b6001600160a01b0381168114610e9f57600080fd5b8015158114610e9f57600080fdfea264697066735822122013fc32639059c3c3a28024be40125c0f079c0ac4db7970d0d28204558eb1868e64736f6c634300060c0033
Deployed Bytecode Sourcemap
27515:15068:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32054:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28427:19;;;:::i;:::-;;;;;;;:::i;41091:136::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28298:40::-;;;:::i;29788:121::-;;;;;;:::i;:::-;;:::i;:::-;;42255:321;;;;;;:::i;:::-;;:::i;28914:743::-;;;;;;:::i;:::-;;:::i;41455:122::-;;;;;;:::i;:::-;;:::i;28453:19::-;;;:::i;34357:285::-;;;;;;:::i;:::-;;:::i;21806:148::-;;;:::i;29961:108::-;;;;;;:::i;:::-;;:::i;30305:640::-;;;;;;:::i;:::-;;:::i;32688:1520::-;;;;;;:::i;:::-;;:::i;21164:79::-;;;:::i;28250:41::-;;;:::i;28479:19::-;;;:::i;41585:114::-;;;;;;:::i;:::-;;:::i;30192:105::-;;;;;;:::i;:::-;;:::i;31917:129::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34702:5715::-;;;;;;:::i;:::-;;:::i;28347:27::-;;;:::i;28381:39::-;;;:::i;28875:28::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;31552:308::-;;;;;;:::i;:::-;;:::i;30077:107::-;;;;;;:::i;:::-;;:::i;22109:244::-;;;;;;:::i;:::-;;:::i;31033:276::-;;;;;;:::i;:::-;;:::i;32054:103::-;32132:10;:17;32054:103;:::o;28427:19::-;;;-1:-1:-1;;;;;28427:19:0;;:::o;41091:136::-;41153:13;41186:33;41213:5;41186:26;:33::i;:::-;41179:40;;41091:136;;;;:::o;28298:40::-;;;;:::o;29788:121::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;;;;;;;;;29856:8:::1;:45:::0;;-1:-1:-1;;;;;;29856:45:0::1;-1:-1:-1::0;;;;;29856:45:0;;;::::1;::::0;;;::::1;::::0;;29788:121::o;42255:321::-;42367:30;;-1:-1:-1;;;42367:30:0;;42330:6;;42308:12;;-1:-1:-1;;;;;42367:15:0;;;;;:30;;42391:4;;42367:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42348:49;;42408:84;42421:6;42429:10;42441:50;42486:4;42441:40;42454:26;;42441:8;:12;;:40;;;;:::i;:::-;:44;;:50::i;:::-;42408:12;:84::i;:::-;42524:11;;42537:30;;-1:-1:-1;;;42537:30:0;;42503:65;;42516:6;;-1:-1:-1;;;;;42524:11:0;;;;42537:15;;;;;:30;;42561:4;;42537:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42503:65::-;42255:321;;;:::o;28914:743::-;17395:12;;;;;;;;:31;;;17411:15;:13;:15::i;:::-;17395:47;;;-1:-1:-1;17431:11:0;;;;17430:12;17395:47;17387:106;;;;-1:-1:-1;;;17387:106:0;;;;;;;:::i;:::-;17502:19;17525:12;;;;;;17524:13;17544:83;;;;17573:12;:19;;-1:-1:-1;;;;17573:19:0;;;;;17601:18;17588:4;17601:18;;;17544:83;29014:9:::1;29035:42;29014:64;29006:73;;;::::0;::::1;;29090:35;:33;:35::i;:::-;29138:4;:49:::0;;29145:42:::1;-1:-1:-1::0;;;;;;29138:49:0;;::::1;;::::0;;;29198:4:::1;:49:::0;;29205:42:::1;29198:49:::0;;::::1;;::::0;;29258:4:::1;:49:::0;;29318:11:::1;:26:::0;;;::::1;-1:-1:-1::0;;;;;29318:26:0;;::::1;::::0;;;::::1;::::0;;;29476:8:::1;:45:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;29561:3:::1;29532:26;:32:::0;29610:3:::1;29582:25;:31:::0;29265:42:::1;29258:49:::0;::::1;::::0;;;::::1;-1:-1:-1::0;;;;29631:18:0::1;-1:-1:-1::0;;;29631:18:0::1;::::0;;17645:57;;;;17689:5;17674:20;;-1:-1:-1;;17674:20:0;;;28914:743;;;:::o;41455:122::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;41540:5:::1;-1:-1:-1::0;;;;;41533:22:0::1;;41556:7;:5;:7::i;:::-;41565:3;41533:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28453:19::-:0;;;-1:-1:-1;;;;;28453:19:0;;:::o;34357:285::-;34440:18;34473:31;34521:5;:12;34507:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34507:27:0;;34473:61;;34558:74;34596:12;34610:5;34617:14;34558:37;:74::i;:::-;34545:87;34357:285;-1:-1:-1;;;;34357:285:0:o;21806:148::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;21897:6:::1;::::0;21876:40:::1;::::0;21913:1:::1;::::0;-1:-1:-1;;;;;21897:6:0::1;::::0;21876:40:::1;::::0;21913:1;;21876:40:::1;21927:6;:19:::0;;-1:-1:-1;;;;;;21927:19:0::1;::::0;;21806:148::o;29961:108::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;30035:11:::1;:26:::0;;-1:-1:-1;;;;;;30035:26:0::1;-1:-1:-1::0;;;;;30035:26:0;;;::::1;::::0;;;::::1;::::0;;29961:108::o;30305:640::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;30659:3:::1;30629:26;;:33;;30621:87;;;;-1:-1:-1::0;;;30621:87:0::1;;;;;;;:::i;:::-;30756:3;30727:25;;:32;;30719:86;;;;-1:-1:-1::0;;;30719:86:0::1;;;;;;;:::i;:::-;30816:26;:56:::0;;;;30883:25:::1;:54:::0;30305:640::o;32688:1520::-;32908:11;;-1:-1:-1;;;32908:11:0;;;;32907:12;32899:53;;;;-1:-1:-1;;;32899:53:0;;;;;;;:::i;:::-;32963:31;;:::i;:::-;32997:10;33008:11;32997:23;;;;;;;;;;;;;;;;;32963:57;;;32997:23;;;;;;;;32963:57;;;;;;;;;-1:-1:-1;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32997:23;;32963:57;;;;32997:23;;32963:57;;32997:23;32963:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32963:57:0;;;-1:-1:-1;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33033:8;;33058:21;;;;33081:30;;;;33113:25;;;;33140:27;;;;33033:135;;-1:-1:-1;;;33033:135:0;;32963:57;;-1:-1:-1;;;;;;33033:8:0;;;;:24;;:135;;33058:21;;33081:30;33113:25;33140:27;33033:135;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33288:19;33310:15;:25;;;33336:1;33310:28;;;;;;;;;;;;;;:178;;33454:15;:21;;;33476:1;33454:24;;;;;;;;;;;;;;-1:-1:-1;;;;;33439:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33310:178;;;33370:15;:21;;;33392:1;33370:24;;;;;;;;;;;;;;-1:-1:-1;;;;;33355:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33288:200;;33557:14;33581:11;-1:-1:-1;;;;;33574:29:0;;33612:4;33574:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33557:61;;33732:15;:22;;;33729:269;;;33771:87;33784:11;33797:10;33809:48;33852:4;33809:38;33820:26;;33809:6;:10;;:38;;;;:::i;33771:87::-;33729:269;;;33900:86;33913:11;33926:10;33938:47;33980:4;33938:37;33949:25;;33938:6;:10;;:37;;;;:::i;33900:86::-;34140:11;;34153:44;;-1:-1:-1;;;34153:44:0;;34114:84;;34127:11;;-1:-1:-1;;;;;34140:11:0;;;;34153:29;;;;;:44;;34191:4;;34153:44;;;:::i;34114:84::-;32688:1520;;;;:::o;21164:79::-;21229:6;;-1:-1:-1;;;;;21229:6:0;21164:79;:::o;28250:41::-;;;;:::o;28479:19::-;;;-1:-1:-1;;;;;28479:19:0;;:::o;41585:114::-;41635:56;41643:42;41687:3;41635:7;:56::i;:::-;41585:114;:::o;30192:105::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;30263:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;30263:26:0::1;-1:-1:-1::0;;;;30263:26:0;;::::1;::::0;;;::::1;::::0;;30192:105::o;31917:129::-;31981:15;;:::i;:::-;32015:10;32026:11;32015:23;;;;;;;;;;;;;;;;;32008:30;;;32015:23;;;;;;;;32008:30;;;;;;;;;-1:-1:-1;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32015:23;;32008:30;;;;32015:23;;32008:30;;32015:23;32008:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32008:30:0;;;-1:-1:-1;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31917:129;-1:-1:-1;;31917:129:0:o;34702:5715::-;34881:11;;34841:18;;-1:-1:-1;;;34881:11:0;;;;34880:12;34872:53;;;;-1:-1:-1;;;34872:53:0;;;;;;;:::i;:::-;34960:13;;34944:12;;-1:-1:-1;;;34960:13:0;;;;;-1:-1:-1;34944:29:0;34936:72;;;;-1:-1:-1;;;34936:72:0;;;;;;;:::i;:::-;35042:1;35027:5;:12;:16;35019:80;;;;-1:-1:-1;;;35019:80:0;;;;;;;:::i;:::-;35134:14;:21;35118:5;:12;:37;35110:121;;;;-1:-1:-1;;;35110:121:0;;;;;;;:::i;:::-;35242:23;35279:5;:12;35268:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35268:24:0;;35242:50;;35376:12;35361:9;35371:1;35361:12;;;;;;;;;;;;;:27;;;;;;;;;;;35401:14;35433:5;35439:1;35433:8;;;;;;;;;;;;;;-1:-1:-1;;;;;35418:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35401:50;;35462:14;35494:5;35500:1;35494:8;;;;;;;;;;;;;;-1:-1:-1;;;;;35479:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35462:50;;35540:7;:5;:7::i;:::-;-1:-1:-1;;;;;35526:21:0;:10;-1:-1:-1;;;;;35526:21:0;;35523:158;;35582:4;;-1:-1:-1;;;;;35572:14:0;;;35582:4;;35572:14;;;;:32;;-1:-1:-1;35600:4:0;;-1:-1:-1;;;;;35590:14:0;;;35600:4;;35590:14;;35572:32;35564:105;;;;-1:-1:-1;;;35564:105:0;;;;;;;:::i;:::-;35826:4;;35709:16;;-1:-1:-1;;;;;35816:14:0;;;35826:4;;35816:14;;:32;;-1:-1:-1;35844:4:0;;-1:-1:-1;;;;;35834:14:0;;;35844:4;;35834:14;35816:32;35813:55;;;-1:-1:-1;35864:4:0;35813:55;35923:17;35943:12;:30;;35967:6;35943:30;;;35958:6;35943:30;35923:50;;36050:26;36079:209;36100:37;36127:9;36100:26;:37::i;:::-;36079:209;;;;;;;;;;;;;-1:-1:-1;;;36079:209:0;;;36189:34;36216:6;36189:26;:34::i;:::-;36079:209;;;;;;;;;;;;;-1:-1:-1;;;36079:209:0;;;36244:34;36271:6;36244:26;:34::i;:::-;36079:209;;;;;;;;;;;;;-1:-1:-1;;;36079:209:0;;;:6;:209::i;:::-;36050:238;-1:-1:-1;36397:1:0;36380:3429;36404:9;:16;36400:1;:20;36380:3429;;;36444:14;36476:5;36482:1;36476:8;;;;;;;;;;;;;;-1:-1:-1;;;;;36461:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36444:50;;36509:14;36541:5;36547:1;36541:8;;;;;;;;;;;;;;-1:-1:-1;;;;;36526:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36509:50;;36593:7;:5;:7::i;:::-;-1:-1:-1;;;;;36579:21:0;:10;-1:-1:-1;;;;;36579:21:0;;36576:166;;36639:4;;-1:-1:-1;;;;;36629:14:0;;;36639:4;;36629:14;;;;:32;;-1:-1:-1;36657:4:0;;-1:-1:-1;;;;;36647:14:0;;;36657:4;;36647:14;;36629:32;36621:105;;;;-1:-1:-1;;;36621:105:0;;;;;;;:::i;:::-;36968:4;;-1:-1:-1;;;;;36955:17:0;;;36968:4;;36955:17;;:38;;-1:-1:-1;36989:4:0;;-1:-1:-1;;;;;36976:17:0;;;36989:4;;36976:17;36955:38;36952:597;;;37038:4;;-1:-1:-1;;;;;37028:14:0;;;37038:4;;37028:14;;:32;;-1:-1:-1;37056:4:0;;-1:-1:-1;;;;;37046:14:0;;;37056:4;;37046:14;37028:32;:50;;;-1:-1:-1;37074:4:0;;-1:-1:-1;;;;;37064:14:0;;;37074:4;;37064:14;37028:50;:68;;;-1:-1:-1;37092:4:0;;-1:-1:-1;;;;;37082:14:0;;;37092:4;;37082:14;37028:68;37020:171;;;;-1:-1:-1;;;37020:171:0;;;;;;;:::i;:::-;36952:597;;;37425:9;-1:-1:-1;;;;;37415:19:0;:6;-1:-1:-1;;;;;37415:19:0;;:42;;;;37448:9;-1:-1:-1;;;;;37438:19:0;:6;-1:-1:-1;;;;;37438:19:0;;37415:42;37407:124;;;;-1:-1:-1;;;37407:124:0;;;;;;;:::i;:::-;37733:4;;-1:-1:-1;;;;;37720:17:0;;;37733:4;;37720:17;37717:1999;;;38000:4;;37822;;-1:-1:-1;;;;;;37990:14:0;;;38000:4;;37990:14;;:68;;-1:-1:-1;38018:4:0;;-1:-1:-1;;;;;38008:14:0;;;38018:4;;38008:14;:32;;;;-1:-1:-1;38036:4:0;;-1:-1:-1;;;;;38026:14:0;;;38036:4;;38026:14;;38008:32;:50;;;;-1:-1:-1;38054:4:0;;-1:-1:-1;;;;;38044:14:0;;;38054:4;;38044:14;;38008:50;37987:422;;;38306:4;;38291:12;;-1:-1:-1;;;;;38306:14:0;;;:4;;:14;;;;;38291:12;;38301:1;;38291:12;;;;;;:29;;;:12;;;;;;;;;;;:29;38356:4;;-1:-1:-1;;;;;38356:14:0;;;:4;;:14;:32;;38382:6;38356:32;;;38373:6;38356:32;38344:44;;37987:422;37717:1999;;;38622:4;;-1:-1:-1;;;;;38609:17:0;;;38622:4;;38609:17;:35;;;;-1:-1:-1;38640:4:0;;-1:-1:-1;;;;;38630:14:0;;;38640:4;;38630:14;38609:35;:89;;;-1:-1:-1;38658:4:0;;-1:-1:-1;;;;;38648:14:0;;;38658:4;;38648:14;:32;;;;-1:-1:-1;38676:4:0;;-1:-1:-1;;;;;38666:14:0;;;38676:4;;38666:14;;38648:32;:50;;;;-1:-1:-1;38694:4:0;;-1:-1:-1;;;;;38684:14:0;;;38694:4;;38684:14;;38648:50;38606:1110;;;38816:4;;38801:12;;38778:4;;-1:-1:-1;;;;;;38816:14:0;;;:4;;:14;;;;;38801:12;;38811:1;;38801:12;;;;;;:29;;;:12;;;;;;;;;;;:29;38861:4;;-1:-1:-1;;;;;38861:14:0;;;:4;;:14;:32;;38887:6;38861:32;;38606:1110;39209:9;-1:-1:-1;;;;;39199:19:0;:6;-1:-1:-1;;;;;39199:19:0;;39184:9;39194:1;39184:12;;;;;;;;;;;;;:34;;;;;;;;;;;39383:9;-1:-1:-1;;;;;39373:19:0;:6;-1:-1:-1;;;;;39373:19:0;;:37;;39404:6;39373:37;;;39395:6;39373:37;39361:49;;38606:1110;-1:-1:-1;;36422:3:0;;36380:3429;;;;39940:10;39970:286;;;;;;;;40013:12;39970:286;;;;40056:9;39970:286;;;;40092:5;39970:286;;;;40133:14;39970:286;;;;40180:11;39970:286;;;;;;40233:7;:5;:7::i;:::-;-1:-1:-1;;;;;40219:21:0;:10;:21;39970:286;;39940:327;;;;;;;-1:-1:-1;39940:327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39940:327:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39940:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39940:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39940:327:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39940:327:0;;;-1:-1:-1;;39940:327:0;;;;;;;;;;;;;;;;;40293:10;:17;40328:81;;40293:17;;-1:-1:-1;40398:10:0;;40293:17;;40328:81;;40342:12;;40328:81;:::i;:::-;;;;;;;;;40368:5;40389:7;:5;:7::i;:::-;-1:-1:-1;;;;;40375:21:0;:10;-1:-1:-1;;;;;40375:21:0;;40328:81;;;;;;;:::i;:::-;;;;;;;;34702:5715;;;;;;;;;;;:::o;28347:27::-;;;-1:-1:-1;;;;;28347:27:0;;:::o;28381:39::-;;;-1:-1:-1;;;;;28381:39:0;;:::o;28875:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28875:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28875:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28875:28:0;;;;;;;-1:-1:-1;;28875:28:0;;;;;;;;;;:::o;31552:308::-;31630:14;31657:31;;:::i;:::-;31691:10;31702;31691:22;;;;;;;;;;;;;;;;;31657:56;;;31691:22;;;;;;;;31657:56;;;;;;;;;-1:-1:-1;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31691:22;;31657:56;;;;31691:22;;31657:56;;31691:22;31657:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31657:56:0;;;-1:-1:-1;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31731:8;;31771:21;;;;31794:30;;;;31826:25;;;;31731:121;;-1:-1:-1;;;31731:121:0;;31657:56;;-1:-1:-1;;;;;;31731:8:0;;;;:39;;:121;;31771:21;;31794:30;31826:25;31731:121;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31724:128;31552:308;-1:-1:-1;;;31552:308:0:o;30077:107::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;30151:13:::1;:25:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;30151:25:0::1;-1:-1:-1::0;;;;30151:25:0;;::::1;::::0;;;::::1;::::0;;30077:107::o;22109:244::-;21386:12;:10;:12::i;:::-;21376:6;;-1:-1:-1;;;;;21376:6:0;;;:22;;;21368:67;;;;-1:-1:-1;;;21368:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22198:22:0;::::1;22190:73;;;;-1:-1:-1::0;;;22190:73:0::1;;;;;;;:::i;:::-;22300:6;::::0;22279:38:::1;::::0;-1:-1:-1;;;;;22279:38:0;;::::1;::::0;22300:6:::1;::::0;22279:38:::1;::::0;22300:6:::1;::::0;22279:38:::1;22328:6;:17:::0;;-1:-1:-1;;;;;;22328:17:0::1;-1:-1:-1::0;;;;;22328:17:0;;;::::1;::::0;;;::::1;::::0;;22109:244::o;31033:276::-;31100:7;31120:31;;:::i;:::-;31154:10;31165:11;31154:23;;;;;;;;;;;;;;;;;31120:57;;;31154:23;;;;;;;;31120:57;;;;;;;;;-1:-1:-1;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31154:23;;31120:57;;;;31154:23;;31120:57;;31154:23;31120:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31120:57:0;;;-1:-1:-1;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31195:8;;31220:21;;;;31243:30;;;;31275:25;;;;31195:106;;-1:-1:-1;;;31195:106:0;;31120:57;;-1:-1:-1;;;;;;31195:8:0;;;;:24;;:106;;31220:21;;31243:30;31275:25;31195:106;;:::i;7107:390::-;7166:13;;7270:43;7295:5;-1:-1:-1;;;7270:24:0;:43::i;:::-;7247:66;;7334:6;7328:20;7352:1;7328:25;7324:142;;;7432:22;7448:5;7432:15;:22::i;:::-;7425:29;;;;;19432:106;19520:10;19432:106;:::o;13110:471::-;13168:7;13413:6;13409:47;;-1:-1:-1;13443:1:0;13436:8;;13409:47;13480:5;;;13484:1;13480;:5;:1;13504:5;;;;;:10;13496:56;;;;-1:-1:-1;;;13496:56:0;;;;;;;:::i;:::-;13572:1;-1:-1:-1;13110:471:0;;;;;:::o;14049:132::-;14107:7;14134:39;14138:1;14141;14134:39;;;;;;;;;;;;;;;;;:3;:39::i;40708:375::-;40868:12;40882:17;40903:5;-1:-1:-1;;;;;40903:10:0;40937;40949:2;40953:5;40914:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40914:45:0;;;;;;;;;;;40903:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40867:93;;;;40983:7;:57;;;;-1:-1:-1;40995:11:0;;:16;;:44;;;41026:4;41015:24;;;;;;;;;;;;:::i;:::-;40975:100;;;;-1:-1:-1;;;40975:100:0;;;;;;;:::i;:::-;40708:375;;;;;:::o;17796:508::-;18213:4;18259:17;18291:7;17796:508;:::o;20742:129::-;17395:12;;;;;;;;:31;;;17411:15;:13;:15::i;:::-;17395:47;;;-1:-1:-1;17431:11:0;;;;17430:12;17395:47;17387:106;;;;-1:-1:-1;;;17387:106:0;;;;;;;:::i;:::-;17502:19;17525:12;;;;;;17524:13;17544:83;;;;17573:12;:19;;-1:-1:-1;;;;17573:19:0;;;;;17601:18;17588:4;17601:18;;;17544:83;20800:26:::1;:24;:26::i;:::-;20837;:24;:26::i;:::-;17649:14:::0;17645:57;;;17689:5;17674:20;;-1:-1:-1;;17674:20:0;;;20742:129;:::o;40505:195::-;40676:16;;-1:-1:-1;;;;;40676:11:0;;;:16;;;;;40688:3;;40676:16;;;;40688:3;40676:11;:16;;;;;;;;;;;;;;;;;;;41744:220;41885:13;41942:1;41945;41947;41949;41951;41953;41925:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41911:45;;41744:220;;;;;;;;:::o;6310:668::-;6477:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6477:32:0;-1:-1:-1;;;;;;6477:32:0;;;;;6460:50;;6398:13;;6425:12;;6398:13;;-1:-1:-1;;;;;6460:16:0;;;:50;;6477:32;6460:50;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6424:86;;;;6601:7;6600:8;:28;;;-1:-1:-1;6612:11:0;;:16;6600:28;6596:70;;;6645:9;;;;;;;;;;;;;;;;;;6596:70;6726:4;:11;6741:2;6726:17;6722:229;;;6760:15;6789:4;6778:27;;;;;;;;;;;;:::i;:::-;6760:45;;6827:24;6843:7;6827:15;:24::i;:::-;6820:31;;;;;;;6722:229;6887:2;6873:4;:11;:16;6869:82;;;6924:4;6913:26;;;;;;;;;;;;:::i;:::-;6906:33;;;;;;6869:82;-1:-1:-1;;6961:9:0;;;;;;;;;-1:-1:-1;6961:9:0;;;6310:668;-1:-1:-1;;;6310:668:0:o;6038:144::-;6100:13;6133:41;6165:5;6172:1;6133:31;:41::i;14669:345::-;14755:7;14857:12;14850:5;14842:28;;;;-1:-1:-1;;;14842:28:0;;;;;;;;:::i;:::-;;14881:9;14897:1;14893;:5;;;;;;;14669:345;-1:-1:-1;;;;;14669:345:0:o;19353:69::-;17395:12;;;;;;;;:31;;;17411:15;:13;:15::i;:::-;17395:47;;;-1:-1:-1;17431:11:0;;;;17430:12;17395:47;17387:106;;;;-1:-1:-1;;;17387:106:0;;;;;;;:::i;:::-;17502:19;17525:12;;;;;;17524:13;17544:83;;;;17573:12;:19;;-1:-1:-1;;;;17573:19:0;;;;;17601:18;17588:4;17601:18;;;17649:14;17645:57;;;17689:5;17674:20;;-1:-1:-1;;17674:20:0;;;19353:69;:::o;20879:202::-;17395:12;;;;;;;;:31;;;17411:15;:13;:15::i;:::-;17395:47;;;-1:-1:-1;17431:11:0;;;;17430:12;17395:47;17387:106;;;;-1:-1:-1;;;17387:106:0;;;;;;;:::i;:::-;17502:19;17525:12;;;;;;17524:13;17544:83;;;;17573:12;:19;;-1:-1:-1;;;;17573:19:0;;;;;17601:18;17588:4;17601:18;;;17544:83;20951:17:::1;20971:12;:10;:12::i;:::-;20994:6;:18:::0;;-1:-1:-1;;;;;;20994:18:0::1;-1:-1:-1::0;;;;;20994:18:0;::::1;::::0;;::::1;::::0;;;21028:43:::1;::::0;20994:18;;-1:-1:-1;20994:18:0;-1:-1:-1;;21028:43:0::1;::::0;-1:-1:-1;;21028:43:0::1;17635:1;17649:14:::0;17645:57;;;17689:5;17674:20;;-1:-1:-1;;17674:20:0;;;20879:202;:::o;4435:588::-;4546:13;;;4556:2;4546:13;;;;;;;;;4493;;;;4546;;;;;;;;;;;-1:-1:-1;4546:13:0;4519:40;;4570:14;4604:6;4599:196;4620:2;4616:1;:6;4599:196;;;4644:9;4656:1;4658;4656:4;;;;;;;;;;;-1:-1:-1;;;;;;;4679:9:0;;;4675:109;;4734:4;4709:11;4721:9;4709:22;;;;;;;;;;;:29;-1:-1:-1;;;;;4709:29:0;;;;;;;;-1:-1:-1;4757:11:0;;;;;4675:109;-1:-1:-1;4624:3:0;;4599:196;;;;4805:31;4849:9;4839:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4839:20:0;;4805:54;;4875:6;4870:102;4891:9;4887:1;:13;4870:102;;;4946:11;4958:1;4946:14;;;;;;;;;;;;;;;;4922:18;4941:1;4922:21;;;;;;;;;;;:38;-1:-1:-1;;;;;4922:38:0;;;;;;;;-1:-1:-1;4902:3:0;;4870:102;;;-1:-1:-1;4996:18:0;4435:588;-1:-1:-1;;;;4435:588:0:o;2910:796::-;2980:13;3020:1;3014:3;:7;:12;:23;;;;;3036:1;3030:3;:7;3014:23;:36;;;;;3048:2;3041:3;:9;;3014:36;3006:79;;;;-1:-1:-1;;;3006:79:0;;;;;;;:::i;:::-;3098:14;3125:3;3115:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3115:14:0;-1:-1:-1;3098:31:0;-1:-1:-1;;;;;;3155:10:0;;3140:12;3176:496;3203:1;3197:3;:7;3193:1;:11;3176:496;;;3367:1;3372:2;:6;;;3367:12;3355:25;;;3474:6;3479:1;3474:6;;;;3580:7;;;3575:13;;3614:8;3474:6;3614:4;:8::i;:::-;3603:1;3609;3605;:5;3603:8;;;;;;;;;;;:19;-1:-1:-1;;;;;3603:19:0;;;;;;;;;3652:8;3657:2;3652:4;:8::i;:::-;3637:1;3643;3639;:5;3647:1;3639:9;3637:12;;;;;;;;;;;:23;-1:-1:-1;;;;;3637:23:0;;;;;;;;-1:-1:-1;;3206:3:0;;;;;-1:-1:-1;3176:496:0;;-1:-1:-1;3176:496:0;;-1:-1:-1;3696:1:0;;2910:796;-1:-1:-1;;;;2910:796:0:o;3913:185::-;3958:6;3985:2;3981:1;:6;;;3977:114;;;-1:-1:-1;4020:4:0;4016:8;;4011:14;;4004:21;;3977:114;-1:-1:-1;4074:4:0;4070:8;;4065:14;;4058:21;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;301:707;;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;:::-;495:80;:::i;:::-;603:21;;;486:89;-1:-1;647:4;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;786:1;;776:12;734:2;811:1;796:206;821:6;818:1;815:13;796:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;889:50;;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;;;;378:630;;;;:::o;3020:241::-;;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;-1:-1;;3130:12;3092:2;85:6;72:20;97:33;124:5;97:33;:::i;3268:263::-;;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;-1:-1;;3389:12;3351:2;226:6;220:13;238:33;265:5;238:33;:::i;3538:366::-;;;3659:2;3647:9;3638:7;3634:23;3630:32;3627:2;;;-1:-1;;3665:12;3627:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3717:63;-1:-1;3817:2;3856:22;;72:20;97:33;72:20;97:33;:::i;:::-;3825:63;;;;3621:283;;;;;:::o;3911:366::-;;;4032:2;4020:9;4011:7;4007:23;4003:32;4000:2;;;-1:-1;;4038:12;4000:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4090:63;4190:2;4229:22;;;;2676:20;;-1:-1;;;3994:283::o;4284:235::-;;4385:2;4373:9;4364:7;4360:23;4356:32;4353:2;;;-1:-1;;4391:12;4353:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;4526:257::-;;4638:2;4626:9;4617:7;4613:23;4609:32;4606:2;;;-1:-1;;4644:12;4606:2;1961:6;1955:13;1973:30;1997:5;1973:30;:::i;4790:496::-;;;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;-1:-1;;4939:12;4901:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;4991:60;-1:-1;5116:2;5101:18;;5088:32;5140:18;5129:30;;5126:2;;;-1:-1;;5162:12;5126:2;5192:78;5262:7;5253:6;5242:9;5238:22;5192:78;:::i;:::-;5182:88;;;4895:391;;;;;:::o;5293:757::-;;;;5478:2;5466:9;5457:7;5453:23;5449:32;5446:2;;;-1:-1;;5484:12;5446:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;5536:60;-1:-1;5661:2;5646:18;;;5633:32;5685:18;5674:30;;;5671:2;;;-1:-1;;5707:12;5671:2;5737:78;5807:7;5798:6;5787:9;5783:22;5737:78;:::i;:::-;5727:88;;5880:2;5869:9;5865:18;5852:32;5838:46;;5685:18;5896:6;5893:30;5890:2;;;-1:-1;;5926:12;5890:2;-1:-1;6002:22;;1144:4;1132:17;;1128:27;-1:-1;1118:2;;-1:-1;;1159:12;1118:2;1206:6;1193:20;1228:80;1243:64;1300:6;1243:64;:::i;1228:80::-;1336:21;;;1393:14;;;;1368:17;;;1482;;;1473:27;;;;1470:36;-1:-1;1467:2;;;-1:-1;;1509:12;1467:2;-1:-1;1535:10;;1529:206;1554:6;1551:1;1548:13;1529:206;;;2676:20;;1622:50;;1576:1;1569:9;;;;;1686:14;;;;1714;;1529:206;;;1533:14;5946:88;;;;;;;;5440:610;;;;;:::o;6057:263::-;;6172:2;6160:9;6151:7;6147:23;6143:32;6140:2;;;-1:-1;;6178:12;6140:2;-1:-1;2093:13;;6134:186;-1:-1;6134:186::o;6327:362::-;;6452:2;6440:9;6431:7;6427:23;6423:32;6420:2;;;-1:-1;;6458:12;6420:2;6509:17;6503:24;6547:18;;6539:6;6536:30;6533:2;;;-1:-1;;6569:12;6533:2;6656:6;6645:9;6641:22;;;2270:3;2263:4;2255:6;2251:17;2247:27;2237:2;;-1:-1;;2278:12;2237:2;2318:6;2312:13;6547:18;35095:6;35092:30;35089:2;;;-1:-1;;35125:12;35089:2;2340:65;35198:9;35179:17;;-1:-1;;35175:33;6452:2;35256:15;2340:65;:::i;:::-;2331:74;;2425:6;2418:5;2411:21;2529:3;6452:2;2520:6;2453;2511:16;;2508:25;2505:2;;;-1:-1;;2536:12;2505:2;2556:39;2588:6;6452:2;2487:5;2483:16;6452:2;2453:6;2449:17;2556:39;:::i;6696:241::-;;6800:2;6788:9;6779:7;6775:23;6771:32;6768:2;;;-1:-1;;6806:12;6768:2;-1:-1;2676:20;;6762:175;-1:-1;6762:175::o;7214:366::-;;;7335:2;7323:9;7314:7;7310:23;7306:32;7303:2;;;-1:-1;;7341:12;7303:2;-1:-1;;2676:20;;;7493:2;7532:22;;;2676:20;;-1:-1;7297:283::o;7587:237::-;;7689:2;7677:9;7668:7;7664:23;7660:32;7657:2;;;-1:-1;;7695:12;7657:2;2965:6;2952:20;39061:4;40372:5;39050:16;40349:5;40346:33;40336:2;;-1:-1;;40383:12;8626:670;;8809:5;35862:12;36908:6;36903:3;36896:19;36945:4;;36940:3;36936:14;8821:83;;36945:4;8975:5;35403:14;-1:-1;9014:260;9039:6;9036:1;9033:13;9014:260;;;9100:13;;-1:-1;;;;;38845:54;8426:37;;7985:14;;;;36534;;;;5140:18;9054:9;9014:260;;;-1:-1;9280:10;;8740:556;-1:-1;;;;;8740:556::o;10058:646::-;;10232:5;35862:12;36908:6;36903:3;36896:19;36945:4;;36940:3;36936:14;10244:80;;36945:4;10392:5;35403:14;-1:-1;10431:251;10456:6;10453:1;10450:13;10431:251;;;10517:13;;38678;38671:21;12904:34;;8155:14;;;;36534;;;;10478:1;10471:9;10431:251;;11442:670;;11625:5;35862:12;36908:6;36903:3;36896:19;36945:4;;36940:3;36936:14;11637:83;;36945:4;11791:5;35403:14;-1:-1;11830:260;11855:6;11852:1;11849:13;11830:260;;;11916:13;;21690:37;;8337:14;;;;36534;;;;11877:1;11870:9;11830:260;;13621:327;;13756:5;35862:12;36908:6;36903:3;36896:19;13840:52;13885:6;36945:4;36940:3;36936:14;36945:4;13866:5;13862:16;13840:52;:::i;:::-;35198:9;39762:14;-1:-1;;39758:28;13904:39;;;;36945:4;13904:39;;13703:245;-1:-1;;13703:245::o;21859:271::-;;13221:5;35862:12;13332:52;13377:6;13372:3;13365:4;13358:5;13354:16;13332:52;:::i;:::-;13396:16;;;;;21993:137;-1:-1;;21993:137::o;22419:1080::-;;13221:5;35862:12;13365:4;13332:52;13377:6;13372:3;13365:4;13358:5;13354:16;13332:52;:::i;:::-;35862:12;;13396:16;;;;13332:52;35862:12;13396:16;13354;;;13332:52;:::i;:::-;35862:12;;13396:16;;;13332:52;35862:12;13396:16;13354;;;13332:52;:::i;:::-;35862:12;;13396:16;;;13332:52;35862:12;13396:16;13354;;;13332:52;:::i;:::-;35862:12;;13396:16;;;13332:52;35862:12;13396:16;13354;;;13332:52;:::i;:::-;35862:12;;13396:16;;;13332:52;35862:12;13396:16;13354;;;13332:52;:::i;:::-;13396:16;;;;;22795:704;-1:-1;;;;;;;;;22795:704::o;23506:222::-;-1:-1;;;;;38845:54;;;;8426:37;;23633:2;23618:18;;23604:124::o;23735:333::-;-1:-1;;;;;38845:54;;;;8426:37;;24054:2;24039:18;;21690:37;23890:2;23875:18;;23861:207::o;24075:876::-;;24402:2;24423:17;24416:47;24477:108;24402:2;24391:9;24387:18;24571:6;24477:108;:::i;:::-;24633:9;24627:4;24623:20;24618:2;24607:9;24603:18;24596:48;24658:108;24761:4;24752:6;24658:108;:::i;:::-;24650:116;;24814:9;24808:4;24804:20;24799:2;24788:9;24784:18;24777:48;24839:102;24936:4;24927:6;24839:102;:::i;:::-;24831:110;24373:578;-1:-1;;;;;;24373:578::o;24958:976::-;;25307:3;25329:17;25322:47;25383:108;25307:3;25296:9;25292:19;25477:6;25383:108;:::i;:::-;25539:9;25533:4;25529:20;25524:2;25513:9;25509:18;25502:48;25564:108;25667:4;25658:6;25564:108;:::i;:::-;25556:116;;25720:9;25714:4;25710:20;25705:2;25694:9;25690:18;25683:48;25745:102;25842:4;25833:6;25745:102;:::i;:::-;25737:110;;;12931:5;38678:13;38671:21;25920:2;25909:9;25905:18;12904:34;25278:656;;;;;;;:::o;25941:469::-;;26140:2;26161:17;26154:47;26215:108;26140:2;26129:9;26125:18;26309:6;26215:108;:::i;:::-;26207:116;;12931:5;38678:13;38671:21;26396:2;26385:9;26381:18;12904:34;26111:299;;;;;:::o;26710:310::-;;26857:2;26878:17;26871:47;26932:78;26857:2;26846:9;26842:18;26996:6;26932:78;:::i;27027:508::-;;27218:2;27239:17;27232:47;27293:78;27218:2;27207:9;27203:18;27357:6;27293:78;:::i;:::-;38678:13;;38671:21;27444:2;27429:18;;12904:34;-1:-1;38678:13;;38671:21;27521:2;27506:18;;;12904:34;27285:86;27189:346;-1:-1;27189:346::o;27542:416::-;27742:2;27756:47;;;14901:2;27727:18;;;36896:19;14937:34;36936:14;;;14917:55;15006:30;14992:12;;;14985:52;15056:12;;;27713:245::o;27965:416::-;28165:2;28179:47;;;15307:2;28150:18;;;36896:19;15343:34;36936:14;;;15323:55;-1:-1;;;15398:12;;;15391:30;15440:12;;;28136:245::o;28388:416::-;28588:2;28602:47;;;15691:2;28573:18;;;36896:19;15727:34;36936:14;;;15707:55;-1:-1;;;15782:12;;;15775:33;15827:12;;;28559:245::o;28811:416::-;29011:2;29025:47;;;16078:2;28996:18;;;36896:19;16114:34;36936:14;;;16094:55;16183:34;16169:12;;;16162:56;-1:-1;;;16238:12;;;16231:31;16281:12;;;28982:245::o;29234:416::-;29434:2;29448:47;;;16532:2;29419:18;;;36896:19;16568:32;36936:14;;;16548:53;16620:12;;;29405:245::o;29657:416::-;29857:2;29871:47;;;16871:2;29842:18;;;36896:19;16907:30;36936:14;;;16887:51;16957:12;;;29828:245::o;30080:416::-;30280:2;30294:47;;;17208:2;30265:18;;;36896:19;17244:32;36936:14;;;17224:53;17296:12;;;30251:245::o;30503:416::-;30703:2;30717:47;;;17547:2;30688:18;;;36896:19;17583:34;36936:14;;;17563:55;-1:-1;;;17638:12;;;17631:25;17675:12;;;30674:245::o;30926:416::-;31126:2;31140:47;;;17926:2;31111:18;;;36896:19;17962:34;36936:14;;;17942:55;-1:-1;;;18017:12;;;18010:33;18062:12;;;31097:245::o;31349:416::-;31549:2;31563:47;;;18313:2;31534:18;;;36896:19;18349:34;36936:14;;;18329:55;18418:34;18404:12;;;18397:56;-1:-1;;;18473:12;;;18466:29;18514:12;;;31520:245::o;31772:416::-;31972:2;31986:47;;;31957:18;;;36896:19;18801:34;36936:14;;;18781:55;18855:12;;;31943:245::o;32195:416::-;32395:2;32409:47;;;19106:2;32380:18;;;36896:19;19142:34;36936:14;;;19122:55;-1:-1;;;19197:12;;;19190:38;19247:12;;;32366:245::o;32618:416::-;32818:2;32832:47;;;19498:2;32803:18;;;36896:19;19534:34;36936:14;;;19514:55;-1:-1;;;19589:12;;;19582:43;19644:12;;;32789:245::o;33041:416::-;33241:2;33255:47;;;19895:2;33226:18;;;36896:19;19931:32;36936:14;;;19911:53;19983:12;;;33212:245::o;33464:374::-;;33643:2;33664:17;33657:47;20333:16;20327:23;20253:4;33643:2;33632:9;33628:18;20363:38;20416:73;20244:14;33632:9;20244:14;20470:12;20416:73;:::i;:::-;20408:81;;33643:2;20572:5;20568:16;20562:23;35198:9;;20621:14;33632:9;20625:4;20621:14;;20605;33632:9;20605:14;20598:38;20651:97;20743:4;20729:12;20651:97;:::i;:::-;20643:105;;20605:14;20827:5;20823:16;20817:23;20797:43;;20621:14;33632:9;20880:4;20876:14;;20860;33632:9;20860:14;20853:38;20906:103;21004:4;20990:12;20906:103;:::i;:::-;20898:111;;20860:14;21097:5;21093:16;21087:23;21067:43;;20621:14;33632:9;21150:4;21146:14;;21130;33632:9;21130:14;21123:38;;21176:103;21274:4;21260:12;21176:103;:::i;:::-;21168:111;;;21130:14;21364:5;21360:16;21354:23;38678:13;38671:21;21425:14;33632:9;21425:14;12904:34;21425:14;21514:5;21510:16;21504:23;38678:13;38671:21;20253:4;33632:9;21575:14;12904:34;33710:118;;;;33614:224;;;;:::o;33845:222::-;21690:37;;;33972:2;33957:18;;33943:124::o;34074:256::-;34136:2;34130:9;34162:17;;;34237:18;34222:34;;34258:22;;;34219:62;34216:2;;;34294:1;;34284:12;34216:2;34136;34303:22;34114:216;;-1:-1;34114:216::o;34337:304::-;;34496:18;34488:6;34485:30;34482:2;;;-1:-1;;34518:12;34482:2;-1:-1;34563:4;34551:17;;;34616:15;;34419:222::o;39418:268::-;39483:1;39490:101;39504:6;39501:1;39498:13;39490:101;;;39571:11;;;39565:18;39552:11;;;39545:39;39526:2;39519:10;39490:101;;;39606:6;39603:1;39600:13;39597:2;;;-1:-1;;39483:1;39653:16;;39646:27;39467:219::o;39799:117::-;-1:-1;;;;;38845:54;;39858:35;;39848:2;;39907:1;;39897:12;39923:111;40004:5;38678:13;38671:21;39982:5;39979:32;39969:2;;40025:1;;40015:12
Swarm Source
ipfs://13fc32639059c3c3a28024be40125c0f079c0ac4db7970d0d28204558eb1868e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.