Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Borrow Colla... | 12512516 | 1160 days ago | IN | 0 ETH | 0.00083192 | ||||
Set Borrow Colla... | 12494269 | 1163 days ago | IN | 0 ETH | 0.00103273 | ||||
Set Borrow Colla... | 12478720 | 1165 days ago | IN | 0 ETH | 0.00742993 | ||||
Set Keeper | 12472627 | 1166 days ago | IN | 0 ETH | 0.00281027 | ||||
0x60806040 | 12472523 | 1166 days ago | IN | 0 ETH | 0.5693066 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Strategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-20 */ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: DssAutoLine interface DssAutoLine { function exec(bytes32 _ilk) external returns (uint256); } // Part: EACAggregatorProxy interface EACAggregatorProxy { function decimals() external view returns (uint8); function latestAnswer() external view returns (int256); } // Part: GemLike interface GemLike { function approve(address, uint256) external; function transfer(address, uint256) external; function transferFrom( address, address, uint256 ) external; function deposit() external payable; function withdraw(uint256) external; } // Part: JugLike interface JugLike { function drip(bytes32) external returns (uint256); } // Part: ManagerLike interface ManagerLike { function cdpCan( address, uint256, address ) external view returns (uint256); function ilks(uint256) external view returns (bytes32); function owns(uint256) external view returns (address); function urns(uint256) external view returns (address); function vat() external view returns (address); function open(bytes32, address) external returns (uint256); function give(uint256, address) external; function cdpAllow( uint256, address, uint256 ) external; function urnAllow(address, uint256) external; function frob( uint256, int256, int256 ) external; function flux( uint256, address, uint256 ) external; function move( uint256, address, uint256 ) external; function exit( address, uint256, address, uint256 ) external; function quit(uint256, address) external; function enter(address, uint256) external; function shift(uint256, uint256) external; } // Part: OSMedianizer interface OSMedianizer { function read() external view returns (uint256, bool); function foresight() external view returns (uint256, bool); } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @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); } // Part: OpenZeppelin/[email protected]/SafeMath /** * @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) { 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; } } // Part: SpotLike interface SpotLike { struct Ilk { address pip; uint256 mat; } function ilks(bytes32) external view returns (Ilk memory); } // Part: Uni interface Uni { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } // Part: VatLike interface VatLike { struct Ilk { uint256 Art; // Total Normalised Debt [wad] uint256 rate; // Accumulated Rates [ray] uint256 spot; // Price with Safety Margin [ray] uint256 line; // Debt Ceiling [rad] uint256 dust; // Urn Debt Floor [rad] } struct Urn { uint256 ink; // Locked Collateral [wad] uint256 art; // Normalised Debt [wad] } function can(address, address) external view returns (uint256); function ilks(bytes32) external view returns (Ilk memory); function dai(address) external view returns (uint256); function urns(bytes32, address) external view returns (Urn memory); function frob( bytes32, address, address, address, int256, int256 ) external; function hope(address) external; function move( address, address, uint256 ) external; } // Part: yVault interface yVault { function deposit() external; function deposit(uint256) external; function withdraw() external; function withdraw(uint256) external; function withdraw(uint256, address, uint256) external; function pricePerShare() external view returns (uint256); } // Part: DaiJoinLike interface DaiJoinLike { function vat() external returns (VatLike); function dai() external returns (GemLike); function join(address, uint256) external payable; function exit(address, uint256) external; } // Part: GemJoinLike interface GemJoinLike { function dec() external returns (uint256); function gem() external returns (GemLike); function join(address, uint256) external payable; function exit(address, uint256) external; } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: iearn-finance/[email protected]/VaultAPI interface VaultAPI is IERC20 { function apiVersion() external pure returns (string memory); function withdraw(uint256 shares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: iearn-finance/[email protected]/BaseStrategy /** * @title Yearn Base Strategy * @author yearn.finance * @notice * BaseStrategy implements all of the required functionality to interoperate * closely with the Vault contract. This contract should be inherited and the * abstract methods implemented to adapt the Strategy to the particular needs * it has to create a return. * * Of special interest is the relationship between `harvest()` and * `vault.report()'. `harvest()` may be called simply because enough time has * elapsed since the last report, and not because any funds need to be moved * or positions adjusted. This is critical so that the Vault may maintain an * accurate picture of the Strategy's performance. See `vault.report()`, * `harvest()`, and `harvestTrigger()` for further details. */ abstract contract BaseStrategy { using SafeMath for uint256; using SafeERC20 for IERC20; string public metadataURI; /** * @notice * Used to track which version of `StrategyAPI` this Strategy * implements. * @dev The Strategy's version must match the Vault's `API_VERSION`. * @return A string which holds the current API version of this contract. */ function apiVersion() public pure returns (string memory) { return "0.3.2"; } /** * @notice This Strategy's name. * @dev * You can use this field to manage the "version" of this Strategy, e.g. * `StrategySomethingOrOtherV1`. However, "API Version" is managed by * `apiVersion()` function above. * @return This Strategy's name. */ function name() external virtual view returns (string memory); /** * @notice * The amount (priced in want) of the total assets managed by this strategy should not count * towards Yearn's TVL calculations. * @dev * You can override this field to set it to a non-zero value if some of the assets of this * Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault. * Note that this value must be strictly less than or equal to the amount provided by * `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets. * @return * The amount of assets this strategy manages that should not be included in Yearn's Total Value * Locked (TVL) calculation across it's ecosystem. */ function delegatedAssets() external virtual view returns (uint256) { return 0; } VaultAPI public vault; address public strategist; address public rewards; address public keeper; IERC20 public want; // So indexers can keep track of this event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding); event UpdatedStrategist(address newStrategist); event UpdatedKeeper(address newKeeper); event UpdatedRewards(address rewards); event UpdatedMinReportDelay(uint256 delay); event UpdatedMaxReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); event UpdatedMetadataURI(string metadataURI); // The minimum number of seconds between harvest calls. See // `setMinReportDelay()` for more details. uint256 public minReportDelay = 0; // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay = 86400; // ~ once a day // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor = 100; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold = 0; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyStrategist() { require(msg.sender == strategist, "!strategist"); _; } modifier onlyGovernance() { require(msg.sender == governance(), "!authorized"); _; } modifier onlyKeepers() { require( msg.sender == keeper || msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } constructor(address _vault) public { _initialize(_vault, msg.sender, msg.sender, msg.sender); } /** * @notice * Initializes the Strategy, this is called only once, when the * contract is deployed. * @dev `_vault` should implement `VaultAPI`. * @param _vault The address of the Vault responsible for this Strategy. */ function _initialize( address _vault, address _strategist, address _rewards, address _keeper ) internal { require(address(want) == address(0), "Strategy already initialized"); vault = VaultAPI(_vault); want = IERC20(vault.token()); want.safeApprove(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = _strategist; rewards = _rewards; keeper = _keeper; vault.approve(rewards, uint256(-1)); // Allow rewards to be pulled } /** * @notice * Used to change `strategist`. * * This may only be called by governance or the existing strategist. * @param _strategist The new address to assign as `strategist`. */ function setStrategist(address _strategist) external onlyAuthorized { require(_strategist != address(0)); strategist = _strategist; emit UpdatedStrategist(_strategist); } /** * @notice * Used to change `keeper`. * * `keeper` is the only address that may call `tend()` or `harvest()`, * other than `governance()` or `strategist`. However, unlike * `governance()` or `strategist`, `keeper` may *only* call `tend()` * and `harvest()`, and no other authorized functions, following the * principle of least privilege. * * This may only be called by governance or the strategist. * @param _keeper The new address to assign as `keeper`. */ function setKeeper(address _keeper) external onlyAuthorized { require(_keeper != address(0)); keeper = _keeper; emit UpdatedKeeper(_keeper); } /** * @notice * Used to change `rewards`. EOA or smart contract which has the permission * to pull rewards from the vault. * * This may only be called by the strategist. * @param _rewards The address to use for pulling rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); vault.approve(rewards, 0); rewards = _rewards; vault.approve(rewards, uint256(-1)); emit UpdatedRewards(_rewards); } /** * @notice * Used to change `minReportDelay`. `minReportDelay` is the minimum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the minimum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The minimum number of seconds to wait between harvests. */ function setMinReportDelay(uint256 _delay) external onlyAuthorized { minReportDelay = _delay; emit UpdatedMinReportDelay(_delay); } /** * @notice * Used to change `maxReportDelay`. `maxReportDelay` is the maximum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the maximum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The maximum number of seconds to wait between harvests. */ function setMaxReportDelay(uint256 _delay) external onlyAuthorized { maxReportDelay = _delay; emit UpdatedMaxReportDelay(_delay); } /** * @notice * Used to change `profitFactor`. `profitFactor` is used to determine * if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _profitFactor A ratio to multiply anticipated * `harvest()` gas cost against. */ function setProfitFactor(uint256 _profitFactor) external onlyAuthorized { profitFactor = _profitFactor; emit UpdatedProfitFactor(_profitFactor); } /** * @notice * Sets how far the Strategy can go into loss without a harvest and report * being required. * * By default this is 0, meaning any losses would cause a harvest which * will subsequently report the loss to the Vault for tracking. (See * `harvestTrigger()` for more details.) * * This may only be called by governance or the strategist. * @param _debtThreshold How big of a loss this Strategy may carry without * being required to report to the Vault. */ function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized { debtThreshold = _debtThreshold; emit UpdatedDebtThreshold(_debtThreshold); } /** * @notice * Used to change `metadataURI`. `metadataURI` is used to store the URI * of the file describing the strategy. * * This may only be called by governance or the strategist. * @param _metadataURI The URI that describe the strategy. */ function setMetadataURI(string calldata _metadataURI) external onlyAuthorized { metadataURI = _metadataURI; emit UpdatedMetadataURI(_metadataURI); } /** * Resolve governance address from Vault contract, used to make assertions * on protected functions in the Strategy. */ function governance() internal view returns (address) { return vault.governance(); } /** * @notice * Provide an accurate estimate for the total amount of assets * (principle + return) that this Strategy is currently managing, * denominated in terms of `want` tokens. * * This total should be "realizable" e.g. the total value that could * *actually* be obtained from this Strategy if it were to divest its * entire position based on current on-chain conditions. * @dev * Care must be taken in using this function, since it relies on external * systems, which could be manipulated by the attacker to give an inflated * (or reduced) value produced by this function, based on current on-chain * conditions (e.g. this function is possible to influence through * flashloan attacks, oracle manipulations, or other DeFi attack * mechanisms). * * It is up to governance to use this function to correctly order this * Strategy relative to its peers in the withdrawal queue to minimize * losses for the Vault based on sudden withdrawals. This value should be * higher than the total debt of the Strategy and higher than its expected * value to be "safe". * @return The estimated total assets in this Strategy. */ function estimatedTotalAssets() public virtual view returns (uint256); /* * @notice * Provide an indication of whether this strategy is currently "active" * in that it is managing an active position, or will manage a position in * the future. This should correlate to `harvest()` activity, so that Harvest * events can be tracked externally by indexing agents. * @return True if the strategy is actively managing a position. */ function isActive() public view returns (bool) { return vault.strategies(address(this)).debtRatio > 0 || estimatedTotalAssets() > 0; } /** * Perform any Strategy unwinding or other calls necessary to capture the * "free return" this Strategy has generated since the last time its core * position(s) were adjusted. Examples include unwrapping extra rewards. * This call is only used during "normal operation" of a Strategy, and * should be optimized to minimize losses as much as possible. * * This method returns any realized profits and/or realized losses * incurred, and should return the total amounts of profits/losses/debt * payments (in `want` tokens) for the Vault's accounting (e.g. * `want.balanceOf(this) >= _debtPayment + _profit - _loss`). * * `_debtOutstanding` will be 0 if the Strategy is not past the configured * debt limit, otherwise its value will be how far past the debt limit * the Strategy is. The Strategy's debt limit is configured in the Vault. * * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`. * It is okay for it to be less than `_debtOutstanding`, as that * should only used as a guide for how much is left to pay back. * Payments should be made to minimize loss from slippage, debt, * withdrawal fees, etc. * * See `vault.debtOutstanding()`. */ function prepareReturn(uint256 _debtOutstanding) internal virtual returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ); /** * Perform any adjustments to the core position(s) of this Strategy given * what change the Vault made in the "investable capital" available to the * Strategy. Note that all "free capital" in the Strategy after the report * was made is available for reinvestment. Also note that this number * could be 0, and you should handle that scenario accordingly. * * See comments regarding `_debtOutstanding` on `prepareReturn()`. */ function adjustPosition(uint256 _debtOutstanding) internal virtual; /** * Liquidate up to `_amountNeeded` of `want` of this strategy's positions, * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`. * This function should return the amount of `want` tokens made available by the * liquidation. If there is a difference between them, `_loss` indicates whether the * difference is due to a realized loss, or if there is some other sitution at play * (e.g. locked funds) where the amount made available is less than what is needed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * @notice * Provide a signal to the keeper that `tend()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `tend()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `tend()` is not called * shortly, then this can return `true` even if the keeper might be * "at a loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCost The keeper's estimated cast cost to call `tend()`. * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCost) public virtual view returns (bool) { // We usually don't need tend, but if there are positions that need // active maintainence, overriding this function is how you would // signal for that. return false; } /** * @notice * Adjust the Strategy's position. The purpose of tending isn't to * realize gains, but to maximize yield by reinvesting any returns. * * See comments on `adjustPosition()`. * * This may only be called by governance, the strategist, or the keeper. */ function tend() external onlyKeepers { // Don't take profits with this call, but adjust for better gains adjustPosition(vault.debtOutstanding()); } /** * @notice * Provide a signal to the keeper that `harvest()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `harvest()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `harvest()` is not called * shortly, then this can return `true` even if the keeper might be "at a * loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `tendTrigger` should never return `true` at the * same time. * * See `min/maxReportDelay`, `profitFactor`, `debtThreshold` to adjust the * strategist-controlled parameters that will influence whether this call * returns `true` or not. These parameters will be used in conjunction * with the parameters reported to the Vault (see `params`) to determine * if calling `harvest()` is merited. * * It is expected that an external system will check `harvestTrigger()`. * This could be a script run off a desktop or cloud bot (e.g. * https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py), * or via an integration with the Keep3r network (e.g. * https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol). * @param callCost The keeper's estimated cast cost to call `harvest()`. * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCost) public virtual view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should not trigger if we haven't waited long enough since previous harvest if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; // Should trigger if hasn't been called in a while if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; // If some amount is owed, pay it back // NOTE: Since debt is based on deposits, it makes sense to guard against large // changes to the value from triggering a harvest directly through user // behavior. This should ensure reasonable resistance to manipulation // from user-initiated withdrawals as the outstanding debt fluctuates. uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; // Check for profits and losses uint256 total = estimatedTotalAssets(); // Trigger if we have a loss to report if (total.add(debtThreshold) < params.totalDebt) return true; uint256 profit = 0; if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit! // Otherwise, only trigger if it "makes sense" economically (gas cost // is <N% of value moved) uint256 credit = vault.creditAvailable(); return (profitFactor.mul(callCost) < credit.add(profit)); } /** * @notice * Harvests the Strategy, recognizing any profits or losses and adjusting * the Strategy's position. * * In the rare case the Strategy is in emergency shutdown, this will exit * the Strategy's position. * * This may only be called by governance, the strategist, or the keeper. * @dev * When `harvest()` is called, the Strategy reports to the Vault (via * `vault.report()`), so in some cases `harvest()` must be called in order * to take in profits, to borrow newly available funds from the Vault, or * otherwise adjust its position. In other cases `harvest()` must be * called to report to the Vault on the Strategy's position, especially if * any losses have occurred. */ function harvest() external onlyKeepers { uint256 profit = 0; uint256 loss = 0; uint256 debtOutstanding = vault.debtOutstanding(); uint256 debtPayment = 0; if (emergencyExit) { // Free up as much capital as possible uint256 totalAssets = estimatedTotalAssets(); // NOTE: use the larger of total assets or debt outstanding to book losses properly (debtPayment, loss) = liquidatePosition(totalAssets > debtOutstanding ? totalAssets : debtOutstanding); // NOTE: take up any remainder here as profit if (debtPayment > debtOutstanding) { profit = debtPayment.sub(debtOutstanding); debtPayment = debtOutstanding; } } else { // Free up returns for Vault to pull (profit, loss, debtPayment) = prepareReturn(debtOutstanding); } // Allow Vault to take up to the "harvested" balance of this contract, // which is the amount it has earned since the last time it reported to // the Vault. debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); emit Harvested(profit, loss, debtPayment, debtOutstanding); } /** * @notice * Withdraws `_amountNeeded` to `vault`. * * This may only be called by the Vault. * @param _amountNeeded How much `want` to withdraw. * @return _loss Any realized losses */ function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) { require(msg.sender == address(vault), "!vault"); // Liquidate as much as possible to `want`, up to `_amountNeeded` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.safeTransfer(msg.sender, amountFreed); // NOTE: Reinvest anything leftover on next `tend`/`harvest` } /** * Do anything necessary to prepare this Strategy for migration, such as * transferring any reserve or LP tokens, CDPs, or other tokens or stores of * value. */ function prepareMigration(address _newStrategy) internal virtual; /** * @notice * Transfers all `want` from this Strategy to `_newStrategy`. * * This may only be called by governance or the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault) || msg.sender == governance()); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.safeTransfer(_newStrategy, want.balanceOf(address(this))); } /** * @notice * Activates emergency exit. Once activated, the Strategy will exit its * position upon the next harvest, depositing all funds into the Vault as * quickly as is reasonable given on-chain conditions. * * This may only be called by governance or the strategist. * @dev * See `vault.setEmergencyShutdown()` and `harvest()` for further details. */ function setEmergencyExit() external onlyAuthorized { emergencyExit = true; vault.revokeStrategy(); emit EmergencyExitEnabled(); } /** * Override this to add all tokens/tokenized positions this contract * manages on a *persistent* basis (e.g. not just for swapping back to * want ephemerally). * * NOTE: Do *not* include `want`, already included in `sweep` below. * * Example: * * function protectedTokens() internal override view returns (address[] memory) { * address[] memory protected = new address[](3); * protected[0] = tokenA; * protected[1] = tokenB; * protected[2] = tokenC; * return protected; * } */ function protectedTokens() internal virtual view returns (address[] memory); /** * @notice * Removes tokens from this Strategy that are not the type of tokens * managed by this Strategy. This may be used in case of accidentally * sending the wrong kind of token to this Strategy. * * Tokens will be sent to `governance()`. * * This will fail if an attempt is made to sweep `want`, or any tokens * that are protected by this Strategy. * * This may only be called by governance. * @dev * Implement `protectedTokens()` to specify any additional tokens that * should be protected from sweeping in addition to `want`. * @param _token The token to transfer out of this vault. */ function sweep(address _token) external onlyGovernance { require(_token != address(want), "!want"); require(_token != address(vault), "!shares"); address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).safeTransfer(governance(), IERC20(_token).balanceOf(address(this))); } } // File: eth-c.sol contract Strategy is BaseStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; // want = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) address public constant weth = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address public constant dai = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); address public constant cdp_manager = address(0x5ef30b9986345249bc32d8928B7ee64DE9435E39); address public constant vat = address(0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B); address public constant mcd_join_eth_c = address(0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E); address public constant mcd_join_dai = address(0x9759A6Ac90977b93B58547b4A71c78317f391A28); address public constant mcd_spot = address(0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3); address public constant jug = address(0x19c0976f590D67707E62397C87829d896Dc0f1F1); address public constant auto_line = address(0xC7Bdd1F2B16447dcf3dE045C4a039A60EC2f0ba3); address public constant eth_price_oracle = address(0xCF63089A8aD2a9D8BD6Bb8022f3190EB7e1eD0f1); address public constant eth_usd_chainlink = address(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); // eth-usd.data.eth address public constant yvdai = address(0x19D3364A399d251E894aC732651be8B0E4e85001); address public constant uniswap = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public constant sushiswap = address(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); uint public constant DENOMINATOR = 10000; bytes32 public constant ilk = "ETH-C"; uint public c; uint public buffer; uint public slip; uint public cdpId; address public dex; constructor(address _vault) public BaseStrategy(_vault) { minReportDelay = 12 hours; maxReportDelay = 2 days; profitFactor = 1000; debtThreshold = 1e20; c = 21000; buffer = 2000; slip = 10000; dex = sushiswap; cdpId = ManagerLike(cdp_manager).open(ilk, address(this)); _approveAll(); } function _approveAll() internal { want.approve(mcd_join_eth_c, 0); want.approve(mcd_join_eth_c, uint(-1)); IERC20(dai).approve(mcd_join_dai, 0); IERC20(dai).approve(mcd_join_dai, uint(-1)); VatLike(vat).hope(mcd_join_dai); IERC20(dai).approve(yvdai, 0); IERC20(dai).approve(yvdai, uint(-1)); IERC20(dai).approve(uniswap, 0); IERC20(dai).approve(uniswap, uint(-1)); IERC20(dai).approve(sushiswap, 0); IERC20(dai).approve(sushiswap, uint(-1)); } function approveAll() external onlyAuthorized { _approveAll(); } function name() external view override returns (string memory) { return "StrategyMakerETHDAIDelegate"; } function setBorrowCollateralizationRatio(uint _c) external onlyAuthorized { c = _c; } function setBuffer(uint _buffer) external onlyAuthorized { buffer = _buffer; } function setSlip(uint _slip) external onlyAuthorized { slip = _slip; } function switchDex(bool isUniswap) external onlyAuthorized { if (isUniswap) dex = uniswap; else dex = sushiswap; } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(balanceOfmVault()); } function balanceOfWant() public view returns (uint) { return want.balanceOf(address(this)); } function balanceOfmVault() public view returns (uint) { address urnHandler = ManagerLike(cdp_manager).urns(cdpId); return VatLike(vat).urns(ilk, urnHandler).ink; } function delegatedAssets() external view override returns (uint256) { return estimatedTotalAssets().mul(DENOMINATOR).mul(1e2).div(getmVaultRatio(0)); } function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { uint before = want.balanceOf(address(this)); uint v = getUnderlyingDai(); uint d = getTotalDebtAmount(); if (v > d) { _withdrawDai(v.sub(d)); _swap(IERC20(dai).balanceOf(address(this))); } uint nowBal = want.balanceOf(address(this)); _profit = nowBal.sub(before); uint _total = estimatedTotalAssets(); uint _debt = vault.strategies(address(this)).totalDebt; if(_total < _debt) { _loss = _debt - _total; _profit = 0; } if (_debt < _total) { uint256 tempProfit = _total.sub(_debt); if (tempProfit > _profit) { _profit = tempProfit; } if (_profit > nowBal) { liquidatePosition(_profit.sub(nowBal)); nowBal = want.balanceOf(address(this)); if (_profit > nowBal) { _profit = nowBal; } } } uint _losss; if (_debtOutstanding > 0) { (_debtPayment, _losss) = liquidatePosition(_debtOutstanding); } _loss = _loss.add(_losss); if (_profit > _loss) { _profit = _profit - _loss; _loss = 0; } else { _loss = _loss - _profit; _profit = 0; } } function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit || _debtOutstanding > estimatedTotalAssets()) return; JugLike(jug).drip(ilk); // update stability fee rate accumulator DssAutoLine(auto_line).exec(ilk); // bump available debt ceiling _deposit(); if (shouldDraw()) draw(); else if (shouldRepay()) repay(); } function _deposit() internal { uint _token = want.balanceOf(address(this)); if (_token == 0) return; uint p = _getPrice(); uint _draw = _token.mul(p).mul(DENOMINATOR).div(c).div(1e18); _draw = _adjustDrawAmount(_draw); _lockWETHAndDrawDAI(_token, _draw); if (_draw == 0) return; yVault(yvdai).deposit(); } function _getPrice() internal view returns (uint p) { (uint _read,) = OSMedianizer(eth_price_oracle).read(); (uint _foresight,) = OSMedianizer(eth_price_oracle).foresight(); p = _foresight < _read ? _foresight : _read; if (p == 0) return uint(EACAggregatorProxy(eth_usd_chainlink).latestAnswer()).mul(1e10); } function _adjustDrawAmount(uint amount) internal view returns (uint _available) { // adjust max amount of dai available to draw VatLike.Ilk memory _ilk = VatLike(vat).ilks(ilk); uint _debt = _ilk.Art.mul(_ilk.rate).add(1e27); // [rad] if (_debt > _ilk.line) return 0; // avoid Vat/ceiling-exceeded _available = _ilk.line.sub(_debt).div(1e27); if (_available.mul(1e27) < _ilk.dust) return 0; // avoid Vat/dust return _available < amount ? _available : amount; } function _lockWETHAndDrawDAI(uint wad, uint wadD) internal { address urn = ManagerLike(cdp_manager).urns(cdpId); if (wad > 0) { GemJoinLike(mcd_join_eth_c).join(urn, wad); } ManagerLike(cdp_manager).frob(cdpId, toInt(wad), _getDrawDart(urn, wadD)); ManagerLike(cdp_manager).move(cdpId, address(this), wadD.mul(1e27)); if (wadD > 0) { DaiJoinLike(mcd_join_dai).exit(address(this), wadD); } } function _getDrawDart(address urn, uint wad) internal view returns (int dart) { uint rate = VatLike(vat).ilks(ilk).rate; uint _dai = VatLike(vat).dai(urn); // If there was already enough DAI in the vat balance, just exits it without adding more debt if (_dai < wad.mul(1e27)) { dart = toInt(wad.mul(1e27).sub(_dai).div(rate)); dart = uint(dart).mul(rate) < wad.mul(1e27) ? dart + 1 : dart; } } function toInt(uint x) internal pure returns (int y) { y = int(x); require(y >= 0, "int-overflow"); } function shouldDraw() public view returns (bool) { // buffer to avoid deposit/rebalance loops return (getmVaultRatio(0) > (c.add(buffer)).mul(1e2)); } function drawAmount() public view returns (uint) { // amount to draw to reach target ratio not accounting for debt ceiling uint _safe = c.mul(1e2); uint _current = getmVaultRatio(0); if (_current > DENOMINATOR.mul(c).mul(1e2)) { _current = DENOMINATOR.mul(c).mul(1e2); } if (_current > _safe) { uint d = getTotalDebtAmount(); uint diff = _current.sub(_safe); return d.mul(diff).div(_safe); } return 0; } function draw() internal { uint _drawD = _adjustDrawAmount(drawAmount()); if (_drawD > 0) { _lockWETHAndDrawDAI(0, _drawD); yVault(yvdai).deposit(); } } function shouldRepay() public view returns (bool) { // buffer to avoid deposit/rebalance loops return (getmVaultRatio(0) < (c.sub(buffer/2)).mul(1e2)); } function repayAmount() public view returns (uint) { uint _safe = c.mul(1e2); uint _current = getmVaultRatio(0); if (_current < _safe) { uint d = getTotalDebtAmount(); uint diff = _safe.sub(_current); return d.mul(diff).div(_safe); } return 0; } function repay() internal { uint _free = repayAmount(); if (_free > 0) { _withdrawDai(_free); _freeWETHandWipeDAI(0, IERC20(dai).balanceOf(address(this))); } } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { if (getTotalDebtAmount() != 0 && getmVaultRatio(_amountNeeded) < c.mul(1e2)) { uint p = _getPrice(); _withdrawDai(_amountNeeded.mul(p).mul(DENOMINATOR).mul(1e2).div(getmVaultRatio(0)).div(1e18)); _freeWETHandWipeDAI(0, IERC20(dai).balanceOf(address(this))); } if (getmVaultRatio(_amountNeeded) <= SpotLike(mcd_spot).ilks(ilk).mat.div(1e21)) { return (0, _amountNeeded); } else { _freeWETHandWipeDAI(_amountNeeded, 0); _liquidatedAmount = _amountNeeded; } } function _freeWETHandWipeDAI(uint wad, uint wadD) internal { address urn = ManagerLike(cdp_manager).urns(cdpId); if (wadD > 0) { DaiJoinLike(mcd_join_dai).join(urn, wadD); } ManagerLike(cdp_manager).frob(cdpId, -toInt(wad), _getWipeDart(VatLike(vat).dai(urn), urn)); ManagerLike(cdp_manager).flux(cdpId, address(this), wad); if (wad > 0) { GemJoinLike(mcd_join_eth_c).exit(address(this), wad); } } function _getWipeDart( uint _dai, address urn ) internal view returns (int dart) { uint rate = VatLike(vat).ilks(ilk).rate; uint art = VatLike(vat).urns(ilk, urn).art; dart = toInt(_dai / rate); dart = uint(dart) <= art ? - dart : - toInt(art); } // NOTE: Can override `tendTrigger` and `harvestTrigger` if necessary function tendTrigger(uint256 callCost) public view override returns (bool) { if (balanceOfmVault() == 0) return false; else return shouldRepay() || (shouldDraw() && _adjustDrawAmount(drawAmount()) > callCost.mul(_getPrice()).mul(profitFactor).div(1e18)); } function prepareMigration(address _newStrategy) internal override { ManagerLike(cdp_manager).cdpAllow(cdpId, _newStrategy, 1); IERC20(yvdai).safeTransfer(_newStrategy, IERC20(yvdai).balanceOf(address(this))); } function allow(address dst) external onlyGovernance { ManagerLike(cdp_manager).cdpAllow(cdpId, dst, 1); } function gulp(uint srcCdp) external onlyGovernance { ManagerLike(cdp_manager).shift(srcCdp, cdpId); } function protectedTokens() internal view override returns (address[] memory) { address[] memory protected = new address[](2); protected[0] = yvdai; protected[1] = dai; return protected; } function forceRebalance(uint _amount) external onlyAuthorized { if (_amount > 0) _withdrawDai(_amount); _freeWETHandWipeDAI(0, IERC20(dai).balanceOf(address(this))); } function getTotalDebtAmount() public view returns (uint) { address urnHandler = ManagerLike(cdp_manager).urns(cdpId); uint art = VatLike(vat).urns(ilk, urnHandler).art; uint rate = VatLike(vat).ilks(ilk).rate; return art.mul(rate).div(1e27); } function getmVaultRatio(uint amount) public view returns (uint) { uint spot; // ray uint liquidationRatio; // ray uint denominator = getTotalDebtAmount(); if (denominator == 0) { return uint(-1); } spot = VatLike(vat).ilks(ilk).spot; liquidationRatio = SpotLike(mcd_spot).ilks(ilk).mat; uint delayedCPrice = spot.mul(liquidationRatio).div(1e27); // ray uint _balance = balanceOfmVault(); if (_balance < amount) { _balance = 0; } else { _balance = _balance.sub(amount); } uint numerator = _balance.mul(delayedCPrice).div(1e18); // ray return numerator.div(denominator).div(1e3); } function getUnderlyingDai() public view returns (uint) { return IERC20(yvdai).balanceOf(address(this)) .mul(yVault(yvdai).pricePerShare()) .div(1e18); } function _withdrawDai(uint _amount) internal returns (uint) { uint _shares = _amount .mul(1e18) .div(yVault(yvdai).pricePerShare()); if (_shares > IERC20(yvdai).balanceOf(address(this))) { _shares = IERC20(yvdai).balanceOf(address(this)); } uint _before = IERC20(dai).balanceOf(address(this)); yVault(yvdai).withdraw(_shares, address(this), slip); uint _after = IERC20(dai).balanceOf(address(this)); return _after.sub(_before); } function _swap(uint _amountIn) internal { address[] memory path = new address[](2); path[0] = dai; path[1] = address(want); // approve dex to use dai Uni(dex).swapExactTokensForTokens(_amountIn, 0, path, address(this), now); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"}],"name":"allow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auto_line","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfmVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdpId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdp_manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimatedTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth_price_oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth_usd_chainlink","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"forceRebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTotalDebtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getmVaultRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"srcCdp","type":"uint256"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jug","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcd_join_dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcd_join_eth_c","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcd_spot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repayAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setBorrowCollateralizationRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMinReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFactor","type":"uint256"}],"name":"setProfitFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slip","type":"uint256"}],"name":"setSlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldDraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shouldRepay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isUniswap","type":"bool"}],"name":"switchDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yvdai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600060065562015180600755606460085560006009553480156200002757600080fd5b506040516200665b3803806200665b8339810160408190526200004a9162000cd5565b8062000059813380806200015f565b5061a8c06006556202a3006007556103e860085568056bc75e2d63100000600955615208600b556107d0600c55612710600d55600f80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f179055604051636090dec560e01b8152735ef30b9986345249bc32d8928b7ee64de9435e3990636090dec590620000f590644554482d4360d81b90309060040162000da5565b602060405180830381600087803b1580156200011057600080fd5b505af115801562000125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014b919062000d27565b600e55620001586200032e565b5062000f39565b6005546001600160a01b031615620001945760405162461bcd60e51b81526004016200018b9062000df1565b60405180910390fd5b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015620001f157600080fd5b505afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c919062000cd5565b600580546001600160a01b0319166001600160a01b0392831617908190556200026691168560001962000a06602090811b6200293b17901c565b600280546001600160a01b038086166001600160a01b03199283161790925560038054858416908316179081905560048054858516931692909217825560015460405163095ea7b360e01b81529084169363095ea7b393620002d19390911691600019910162000d8c565b602060405180830381600087803b158015620002ec57600080fd5b505af115801562000301573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000327919062000d05565b5050505050565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620003779073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e9060009060040162000d8c565b602060405180830381600087803b1580156200039257600080fd5b505af1158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000d05565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620004189073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e906000199060040162000d8c565b602060405180830381600087803b1580156200043357600080fd5b505af115801562000448573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046e919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b390620004ba90739759a6ac90977b93b58547b4a71c78317f391a289060009060040162000d8c565b602060405180830381600087803b158015620004d557600080fd5b505af1158015620004ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000510919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b3906200055d90739759a6ac90977b93b58547b4a71c78317f391a28906000199060040162000d8c565b602060405180830381600087803b1580156200057857600080fd5b505af11580156200058d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005b3919062000d05565b506040516328ec8bf160e21b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063a3b22fc4906200060190739759a6ac90977b93b58547b4a71c78317f391a289060040162000d5e565b600060405180830381600087803b1580156200061c57600080fd5b505af115801562000631573d6000803e3d6000fd5b505060405163095ea7b360e01b81526000805160206200663b833981519152925063095ea7b3915062000680907319d3364a399d251e894ac732651be8b0e4e850019060009060040162000d8c565b602060405180830381600087803b1580156200069b57600080fd5b505af1158015620006b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006d6919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b39062000723907319d3364a399d251e894ac732651be8b0e4e85001906000199060040162000d8c565b602060405180830381600087803b1580156200073e57600080fd5b505af115801562000753573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000779919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b390620007c590737a250d5630b4cf539739df2c5dacb4c659f2488d9060009060040162000d8c565b602060405180830381600087803b158015620007e057600080fd5b505af1158015620007f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200081b919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b3906200086890737a250d5630b4cf539739df2c5dacb4c659f2488d906000199060040162000d8c565b602060405180830381600087803b1580156200088357600080fd5b505af115801562000898573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008be919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b3906200090a9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060009060040162000d8c565b602060405180830381600087803b1580156200092557600080fd5b505af11580156200093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000960919062000d05565b5060405163095ea7b360e01b81526000805160206200663b8339815191529063095ea7b390620009ad9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000199060040162000d8c565b602060405180830381600087803b158015620009c857600080fd5b505af1158015620009dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a03919062000d05565b50565b80158062000a955750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000a3f903090869060040162000d72565b60206040518083038186803b15801562000a5857600080fd5b505afa15801562000a6d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a93919062000d27565b155b62000ab45760405162461bcd60e51b81526004016200018b9062000ea9565b62000b0f8363095ea7b360e01b848460405160240162000ad692919062000d8c565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000b1416565b505050565b606062000b70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000bb060201b62002a3a179092919060201c565b80519091501562000b0f578080602001905181019062000b91919062000d05565b62000b0f5760405162461bcd60e51b81526004016200018b9062000e5f565b606062000bc1848460008562000bc9565b949350505050565b606062000bd68562000c9b565b62000bf55760405162461bcd60e51b81526004016200018b9062000e28565b60006060866001600160a01b0316858760405162000c14919062000d40565b60006040518083038185875af1925050503d806000811462000c53576040519150601f19603f3d011682016040523d82523d6000602084013e62000c58565b606091505b5091509150811562000c6e57915062000bc19050565b80511562000c7f5780518082602001fd5b8360405162461bcd60e51b81526004016200018b919062000dbc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000bc1575050151592915050565b60006020828403121562000ce7578081fd5b81516001600160a01b038116811462000cfe578182fd5b9392505050565b60006020828403121562000d17578081fd5b8151801515811462000cfe578182fd5b60006020828403121562000d39578081fd5b5051919050565b6000825162000d5481846020870162000f06565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b600060208252825180602084015262000ddd81604085016020870162000f06565b601f01601f19169190910160400192915050565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b8381101562000f2357818101518382015260200162000f09565b8381111562000f33576000848401525b50505050565b6156f28062000f496000396000f3fe608060405234801561001057600080fd5b50600436106104115760003560e01c8063781eff1211610220578063c5ce281e11610130578063edaafe20116100b8578063f4b9fa7511610087578063f4b9fa751461072e578063f9f42b4f14610736578063fbfa77cf14610749578063fcf2d0ad14610751578063ff9913e81461075957610411565b8063edaafe2014610703578063efbb5cb01461070b578063f017c92f14610713578063f21444841461072657610411565b8063ce5494bb116100ff578063ce5494bb146106ba578063d0efe753146106cd578063ebf661b6146106d5578063ec38a862146106dd578063ed882c2b146106f057610411565b8063c5ce281e1461068f578063c732140114610697578063c7b9d5301461069f578063c7c57c1f146106b257610411565b80639ec5a894116101b3578063aced166111610182578063aced166114610651578063adc7ea3714610659578063c1a3d44c1461066c578063c392c6f714610674578063c3da42b81461068757610411565b80639ec5a89414610631578063a280062014610639578063a318215214610641578063a83adfbf1461064957610411565b806391397ab4116101ef57806391397ab414610606578063918f86741461061957806395e80c50146106215780639be287851461062957610411565b8063781eff12146105e657806384718d89146105ee5780638cdfe166146105f65780638e6350e2146105fe57610411565b806336569e77116103265780634a1a066b116102ae578063669c62d41161027d578063669c62d41461059d578063692058c2146105a55780636bc55876146105ad578063748747e6146105c0578063750521f5146105d357610411565b80634a1a066b146105725780635641ec031461057a57806361880a9214610582578063650d18801461058a57610411565b80633fc8cef3116102f55780633fc8cef31461054a5780634368264814610552578063440368a31461055a5780634641257d146105625780634905d9381461056a57610411565b806336569e771461051f578063380d0c0814610527578063392c731f1461052f57806339a172a81461053757610411565b80631f1fcd51116103a957806325cdbaff1161037857806325cdbaff146104d65780632641e5cd146104e95780632681f7e4146104fc57806328b7ccf7146105045780632e1a7d4d1461050c57610411565b80631f1fcd51146104b65780631fe4a686146104be57806322f3e2d4146104c657806325829410146104ce57610411565b80630f969b87116103e55780630f969b8714610466578063121c1a651461047957806313b857b41461048e5780631d12f28b146104a157610411565b8062beada41461041657806301681a621461043457806303ee438c1461044957806306fdde031461045e575b600080fd5b61041e61076c565b60405161042b9190615244565b60405180910390f35b610447610442366004614ed3565b6107a1565b005b610451610940565b60405161042b919061529e565b6104516109ce565b61044761047436600461519a565b610a05565b610481610a92565b60405161042b91906151fd565b61044761049c36600461519a565b610aaa565b6104a9610afc565b60405161042b919061524f565b610481610b02565b610481610b11565b61041e610b20565b610451610bc0565b6104476104e436600461519a565b610bdf565b6104476104f736600461519a565b610c86565b610481610cd8565b6104a9610cf0565b6104a961051a36600461519a565b610cf6565b610481610d51565b610447610d69565b6104a9610dc0565b61044761054536600461519a565b610dc6565b610481610e48565b610481610e60565b610447610e72565b610447611099565b610481611403565b6104a961141b565b61041e611421565b6104a961142a565b61041e61059836600461519a565b6114df565b610481611550565b610481611568565b6104476105bb366004614fa0565b611577565b6104476105ce366004614ed3565b61161f565b6104476105e1366004614ff0565b6116ca565b6104a9611761565b610481611945565b6104a961195d565b6104a9611963565b61044761061436600461519a565b611985565b6104a9611a07565b6104a9611a0d565b610481611a13565b610481611a2b565b610481611a3a565b610481611a52565b610481611a6a565b610481611a82565b61044761066736600461519a565b611a91565b6104a9611ae3565b6104a961068236600461519a565b611b64565b6104a9611d2d565b6104a9611d33565b6104a9611d3f565b6104476106ad366004614ed3565b611e67565b610481611f12565b6104476106c8366004614ed3565b611f2a565b6104a9612098565b61041e6120e1565b6104476106eb366004614ed3565b612112565b61041e6106fe36600461519a565b6122a9565b6104a9612521565b6104a9612527565b61044761072136600461519a565b612542565b6104a96125c4565b6104816126d5565b61044761074436600461519a565b6126e7565b6104816127d2565b6104476127e1565b610447610767366004614ed3565b6128c5565b6000610790606461078a600c54600b54612a5190919063ffffffff16565b90612a7f565b61079a6000611b64565b1190505b90565b6107a9612ab9565b6001600160a01b0316336001600160a01b0316146107e25760405162461bcd60e51b81526004016107d990615405565b60405180910390fd5b6005546001600160a01b03828116911614156108105760405162461bcd60e51b81526004016107d9906152f6565b6001546001600160a01b038281169116141561083e5760405162461bcd60e51b81526004016107d9906153ad565b6060610848612b36565b905060005b81518110156108a35781818151811061086257fe5b60200260200101516001600160a01b0316836001600160a01b0316141561089b5760405162461bcd60e51b81526004016107d990615474565b60010161084d565b5061093c6108af612ab9565b6040516370a0823160e01b81526001600160a01b038516906370a08231906108db9030906004016151fd565b60206040518083038186803b1580156108f357600080fd5b505afa158015610907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190614fd8565b6001600160a01b0385169190612bcf565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b60408051808201909152601b81527f53747261746567794d616b657245544844414944656c65676174650000000000602082015290565b6002546001600160a01b0316331480610a365750610a21612ab9565b6001600160a01b0316336001600160a01b0316145b610a525760405162461bcd60e51b81526004016107d990615405565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a8790839061524f565b60405180910390a150565b73cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f181565b6002546001600160a01b0316331480610adb5750610ac6612ab9565b6001600160a01b0316336001600160a01b0316145b610af75760405162461bcd60e51b81526004016107d990615405565b600d55565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b559030906004016151fd565b6101206040518083038186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba691906150e9565b604001511180610bbb5750600061079a612527565b905090565b604080518082019091526005815264181719971960d91b602082015290565b610be7612ab9565b6001600160a01b0316336001600160a01b031614610c175760405162461bcd60e51b81526004016107d990615405565b600e54604051637281915160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e399163e50322a291610c519185916004016155b9565b600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b5050505050565b6002546001600160a01b0316331480610cb75750610ca2612ab9565b6001600160a01b0316336001600160a01b0316145b610cd35760405162461bcd60e51b81526004016107d990615405565b600b55565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610d235760405162461bcd60e51b81526004016107d99061538d565b6000610d2e83612bee565b600554909350909150610d4b906001600160a01b03163383612bcf565b50919050565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b0316331480610d9a5750610d85612ab9565b6001600160a01b0316336001600160a01b0316145b610db65760405162461bcd60e51b81526004016107d990615405565b610dbe612d6f565b565b600d5481565b6002546001600160a01b0316331480610df75750610de2612ab9565b6001600160a01b0316336001600160a01b0316145b610e135760405162461bcd60e51b81526004016107d990615405565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a8790839061524f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008051602061567d83398151915281565b6004546001600160a01b0316331480610e9557506002546001600160a01b031633145b80610eb85750610ea3612ab9565b6001600160a01b0316336001600160a01b0316145b80610f595750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f449190614eef565b6001600160a01b0316336001600160a01b0316145b80610ffa5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190614eef565b6001600160a01b0316336001600160a01b0316145b6110165760405162461bcd60e51b81526004016107d990615405565b6001546040805163bf3759b560e01b81529051610dbe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561105c57600080fd5b505afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190614fd8565b6133f0565b6004546001600160a01b03163314806110bc57506002546001600160a01b031633145b806110df57506110ca612ab9565b6001600160a01b0316336001600160a01b0316145b806111805750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190614eef565b6001600160a01b0316336001600160a01b0316145b806112215750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614eef565b6001600160a01b0316336001600160a01b0316145b61123d5760405162461bcd60e51b81526004016107d990615405565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614fd8565b600a5490915060009060ff161561131e5760006112e3612527565b90506112fc8382116112f557836112f7565b815b612bee565b945091508282111561131857611312828461356c565b94508291505b5061132f565b611327826135ae565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061136390879087908690600401615533565b602060405180830381600087803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b59190614fd8565b91506113c0826133f0565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516113f594939291906155c7565b60405180910390a150505050565b73f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e81565b600e5481565b600a5460ff1681565b6000806114436064600b54612a7f90919063ffffffff16565b905060006114516000611b64565b905061146f606461078a600b54612710612a7f90919063ffffffff16565b81111561149557611492606461078a600b54612710612a7f90919063ffffffff16565b90505b818111156114d65760006114a7611761565b905060006114b5838561356c565b90506114cb846114c58484612a7f565b90613940565b94505050505061079e565b60009250505090565b60006114e9611d3f565b6114f55750600061154b565b6114fd6120e1565b80611548575061150b61076c565b80156115485750611536670de0b6b3a76400006114c560085461078a61152f613982565b8790612a7f565b61154661154161142a565b613b0f565b115b90505b919050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b600f546001600160a01b031681565b6002546001600160a01b03163314806115a85750611593612ab9565b6001600160a01b0316336001600160a01b0316145b6115c45760405162461bcd60e51b81526004016107d990615405565b80156115f557600f80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561161c565b600f80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b50565b6002546001600160a01b0316331480611650575061163b612ab9565b6001600160a01b0316336001600160a01b0316145b61166c5760405162461bcd60e51b81526004016107d990615405565b6001600160a01b03811661167f57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a879083906151fd565b6002546001600160a01b03163314806116fb57506116e6612ab9565b6001600160a01b0316336001600160a01b0316145b6117175760405162461bcd60e51b81526004016107d990615405565b61172360008383614dc5565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda6828260405161175592919061526f565b60405180910390a15050565b600e54604051632726b07360e01b81526000918291735ef30b9986345249bc32d8928b7ee64de9435e3991632726b0739161179f919060040161524f565b60206040518083038186803b1580156117b757600080fd5b505afa1580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190614eef565b6040516309092f9760e21b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c9061183690644554482d4360d81b908690600401615258565b604080518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190615167565b60200151604051636cb1c69b60e11b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d36906118ce90644554482d4360d81b9060040161524f565b60a06040518083038186803b1580156118e657600080fd5b505afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e9190615098565b60200151905061193d676765c793fa10079d601b1b6114c58484612a7f565b935050505090565b7319c0976f590d67707e62397c87829d896dc0f1f181565b60085481565b6000610bbb6119726000611b64565b6114c5606461078a61271061078a612527565b6002546001600160a01b03163314806119b657506119a1612ab9565b6001600160a01b0316336001600160a01b0316145b6119d25760405162461bcd60e51b81526004016107d990615405565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a8790839061524f565b61271081565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b73c7bdd1f2b16447dcf3de045c4a039a60ec2f0ba381565b6004546001600160a01b031681565b6002546001600160a01b0316331480611ac25750611aad612ab9565b6001600160a01b0316336001600160a01b0316145b611ade5760405162461bcd60e51b81526004016107d990615405565b600c55565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611b149030906004016151fd565b60206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190614fd8565b600080600080611b72611761565b905080611b8657600019935050505061154b565b604051636cb1c69b60e11b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690611bc590644554482d4360d81b9060040161524f565b60a06040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190615098565b6040908101519051636cb1c69b60e11b81529093507365c79fcb50ca1594b025960e539ed7a9a6d434a39063d9638d3690611c5c90644554482d4360d81b9060040161524f565b604080518083038186803b158015611c7357600080fd5b505afa158015611c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cab919061505d565b6020015191506000611ccc676765c793fa10079d601b1b6114c58686612a7f565b90506000611cd8611d3f565b905086811015611cea57506000611cf7565b611cf4818861356c565b90505b6000611d0f670de0b6b3a76400006114c58486612a7f565b9050611d216103e86114c58387613940565b98975050505050505050565b600b5481565b644554482d4360d81b81565b600e54604051632726b07360e01b81526000918291735ef30b9986345249bc32d8928b7ee64de9435e3991632726b07391611d7d919060040161524f565b60206040518083038186803b158015611d9557600080fd5b505afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd9190614eef565b6040516309092f9760e21b81529091507335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c90611e1190644554482d4360d81b908590600401615258565b604080518083038186803b158015611e2857600080fd5b505afa158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e609190615167565b5191505090565b6002546001600160a01b0316331480611e985750611e83612ab9565b6001600160a01b0316336001600160a01b0316145b611eb45760405162461bcd60e51b81526004016107d990615405565b6001600160a01b038116611ec757600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a879083906151fd565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b6001546001600160a01b0316331480611f5b5750611f46612ab9565b6001600160a01b0316336001600160a01b0316145b611f6457600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611fab57600080fd5b505afa158015611fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe39190614eef565b6001600160a01b031614611ff657600080fd5b611fff81613c58565b6005546040516370a0823160e01b815261161c9183916001600160a01b03909116906370a08231906120359030906004016151fd565b60206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120859190614fd8565b6005546001600160a01b03169190612bcf565b6000806120b16064600b54612a7f90919063ffffffff16565b905060006120bf6000611b64565b9050818110156114d65760006120d3611761565b905060006114b5848461356c565b6000612102606461078a6002600c54816120f757fe5b600b5491900461356c565b61210c6000611b64565b10905090565b6002546001600160a01b0316331461213c5760405162461bcd60e51b81526004016107d9906152d1565b6001600160a01b03811661214f57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121869291169060009060040161522b565b602060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d89190614fbc565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392612227929116906000199060040161522b565b602060405180830381600087803b15801561224157600080fd5b505af1158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190614fbc565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a8791906151fd565b60006122b3614e43565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf823906122e39030906004016151fd565b6101206040518083038186803b1580156122fc57600080fd5b505afa158015612310573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233491906150e9565b905080602001516000141561234d57600091505061154b565b60065460a082015161236090429061356c565b101561237057600091505061154b565b60075460a082015161238390429061356c565b1061239257600191505061154b565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156123d757600080fd5b505afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614fd8565b90506009548111156124265760019250505061154b565b6000612430612527565b90508260c0015161244c60095483612a5190919063ffffffff16565b101561245e576001935050505061154b565b60008360c0015182111561247f5760c084015161247c90839061356c565b90505b6001546040805163112c1f9b60e01b815290516000926001600160a01b03169163112c1f9b916004808301926020929190829003018186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc9190614fd8565b90506125088183612a51565b6008546125159089612a7f565b10979650505050505050565b600c5481565b6000610bbb612534611d3f565b61253c611ae3565b90612a51565b6002546001600160a01b0316331480612573575061255e612ab9565b6001600160a01b0316336001600160a01b0316145b61258f5760405162461bcd60e51b81526004016107d990615405565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a8790839061524f565b6000610bbb670de0b6b3a76400006114c560008051602061567d8339815191526001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b15801561261c57600080fd5b505afa158015612630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126549190614fd8565b6040516370a0823160e01b815260008051602061567d833981519152906370a08231906126859030906004016151fd565b60206040518083038186803b15801561269d57600080fd5b505afa1580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078a9190614fd8565b60008051602061569d83398151915281565b6002546001600160a01b03163314806127185750612703612ab9565b6001600160a01b0316336001600160a01b0316145b6127345760405162461bcd60e51b81526004016107d990615405565b80156127455761274381613d65565b505b6040516370a0823160e01b815261161c9060009060008051602061569d833981519152906370a082319061277d9030906004016151fd565b60206040518083038186803b15801561279557600080fd5b505afa1580156127a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cd9190614fd8565b614093565b6001546001600160a01b031681565b6002546001600160a01b031633148061281257506127fd612ab9565b6001600160a01b0316336001600160a01b0316145b61282e5760405162461bcd60e51b81526004016107d990615405565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561288257600080fd5b505af1158015612896573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b6128cd612ab9565b6001600160a01b0316336001600160a01b0316146128fd5760405162461bcd60e51b81526004016107d990615405565b600e546040516305b1fdb160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e3991630b63fb6291610c5191908590600190600401615514565b8015806129c35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906129719030908690600401615211565b60206040518083038186803b15801561298957600080fd5b505afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c19190614fd8565b155b6129df5760405162461bcd60e51b81526004016107d990615498565b612a358363095ea7b360e01b84846040516024016129fe92919061522b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614395565b505050565b6060612a498484600085614424565b949350505050565b600082820183811015612a765760405162461bcd60e51b81526004016107d990615315565b90505b92915050565b600082612a8e57506000612a79565b82820282848281612a9b57fe5b0414612a765760405162461bcd60e51b81526004016107d99061534c565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b158015612afe57600080fd5b505afa158015612b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190614eef565b60408051600280825260608083018452928392919060208301908036833701905050905060008051602061567d83398151915281600081518110612b7657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061569d83398151915281600181518110612bb257fe5b6001600160a01b0390921660209283029190910190910152905090565b612a358363a9059cbb60e01b84846040516024016129fe92919061522b565b600080612bf9611761565b15801590612c1b5750600b54612c10906064612a7f565b612c1984611b64565b105b15612c9b576000612c2a613982565b9050612c60612c5b670de0b6b3a76400006114c5612c486000611b64565b6114c5606461078a612710818d8b612a7f565b613d65565b506040516370a0823160e01b8152612c999060009060008051602061569d833981519152906370a082319061277d9030906004016151fd565b505b604051636cb1c69b60e11b8152612d4290683635c9adc5dea00000907365c79fcb50ca1594b025960e539ed7a9a6d434a39063d9638d3690612ce990644554482d4360d81b9060040161524f565b604080518083038186803b158015612d0057600080fd5b505afa158015612d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d38919061505d565b6020015190613940565b612d4b84611b64565b11612d5b57506000905081612d6a565b612d66836000614093565b8291505b915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612db69073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e9060009060040161522b565b602060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e089190614fbc565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612e519073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e906000199060040161522b565b602060405180830381600087803b158015612e6b57600080fd5b505af1158015612e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea39190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b390612eec90739759a6ac90977b93b58547b4a71c78317f391a289060009060040161522b565b602060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3e9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b390612f8890739759a6ac90977b93b58547b4a71c78317f391a28906000199060040161522b565b602060405180830381600087803b158015612fa257600080fd5b505af1158015612fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fda9190614fbc565b506040516328ec8bf160e21b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063a3b22fc49061302690739759a6ac90977b93b58547b4a71c78317f391a28906004016151fd565b600060405180830381600087803b15801561304057600080fd5b505af1158015613054573d6000803e3d6000fd5b505060405163095ea7b360e01b815260008051602061569d833981519152925063095ea7b3915061309a9060008051602061567d8339815191529060009060040161522b565b602060405180830381600087803b1580156130b457600080fd5b505af11580156130c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ec9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906131309060008051602061567d833981519152906000199060040161522b565b602060405180830381600087803b15801561314a57600080fd5b505af115801561315e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131829190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906131cb90737a250d5630b4cf539739df2c5dacb4c659f2488d9060009060040161522b565b602060405180830381600087803b1580156131e557600080fd5b505af11580156131f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321d9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b39061326790737a250d5630b4cf539739df2c5dacb4c659f2488d906000199060040161522b565b602060405180830381600087803b15801561328157600080fd5b505af1158015613295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b99190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906133029073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060009060040161522b565b602060405180830381600087803b15801561331c57600080fd5b505af1158015613330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133549190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b39061339e9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000199060040161522b565b602060405180830381600087803b1580156133b857600080fd5b505af11580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c9190614fbc565b600a5460ff16806134075750613404612527565b81115b156134115761161c565b60405163089c54b560e31b81527319c0976f590d67707e62397c87829d896dc0f1f1906344e2a5a89061345090644554482d4360d81b9060040161524f565b602060405180830381600087803b15801561346a57600080fd5b505af115801561347e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a29190614fd8565b5060405163b5e98b3b60e01b815273c7bdd1f2b16447dcf3de045c4a039a60ec2f0ba39063b5e98b3b906134e290644554482d4360d81b9060040161524f565b602060405180830381600087803b1580156134fc57600080fd5b505af1158015613510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135349190614fd8565b5061353d6144e8565b61354561076c565b156135575761355261461c565b61161c565b61355f6120e1565b1561161c5761161c614685565b6000612a7683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506146a0565b6005546040516370a0823160e01b81526000918291829182916001600160a01b03909116906370a08231906135e79030906004016151fd565b60206040518083038186803b1580156135ff57600080fd5b505afa158015613613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136379190614fd8565b905060006136436125c4565b9050600061364f611761565b9050808211156136f157613666612c5b838361356c565b506040516370a0823160e01b81526136f19060008051602061569d833981519152906370a082319061369c9030906004016151fd565b60206040518083038186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190614fd8565b6146cc565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906137229030906004016151fd565b60206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137729190614fd8565b905061377e818561356c565b9650600061378a612527565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf823906137c09030906004016151fd565b6101206040518083038186803b1580156137d957600080fd5b505afa1580156137ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381191906150e9565b60c00151905080821015613829578181039750600098505b818110156138f257600061383d838361356c565b90508981111561384b578099505b838a11156138f0576138606112f78b8661356c565b50506005546040516370a0823160e01b81526001600160a01b03909116906370a08231906138929030906004016151fd565b60206040518083038186803b1580156138aa57600080fd5b505afa1580156138be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e29190614fd8565b9350838a11156138f0578399505b505b60008a15613909576139038b612bee565b90985090505b6139138982612a51565b9850888a111561392a579790980397600097613932565b600099909803975b505050505050509193909250565b6000612a7683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506147cf565b60008073cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f16001600160a01b03166357de26a46040518163ffffffff1660e01b8152600401604080518083038186803b1580156139d157600080fd5b505afa1580156139e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0991906151b2565b509050600073cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f16001600160a01b031663cfad9c8c6040518163ffffffff1660e01b8152600401604080518083038186803b158015613a5a57600080fd5b505afa158015613a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9291906151b2565b509050818110613aa25781613aa4565b805b925082613b0a57613b016402540be400735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269d57600080fd5b9250505061079e565b505090565b6000613b19614e8f565b604051636cb1c69b60e11b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690613b5890644554482d4360d81b9060040161524f565b60a06040518083038186803b158015613b7057600080fd5b505afa158015613b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba89190615098565b90506000613bd6676765c793fa10079d601b1b61253c84602001518560000151612a7f90919063ffffffff16565b90508160600151811115613bef5760009250505061154b565b613c15676765c793fa10079d601b1b6114c583856060015161356c90919063ffffffff16565b6080830151909350613c3284676765c793fa10079d601b1b612a7f565b1015613c435760009250505061154b565b838310613c505783612a49565b509092915050565b600e546040516305b1fdb160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e3991630b63fb6291613c9691908590600190600401615514565b600060405180830381600087803b158015613cb057600080fd5b505af1158015613cc4573d6000803e3d6000fd5b50506040516370a0823160e01b815261161c925083915060008051602061567d833981519152906370a0823190613cff9030906004016151fd565b60206040518083038186803b158015613d1757600080fd5b505afa158015613d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4f9190614fd8565b60008051602061567d8339815191529190612bcf565b600080613dfc60008051602061567d8339815191526001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015613db257600080fd5b505afa158015613dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dea9190614fd8565b6114c585670de0b6b3a7640000612a7f565b6040516370a0823160e01b815290915060008051602061567d833981519152906370a0823190613e309030906004016151fd565b60206040518083038186803b158015613e4857600080fd5b505afa158015613e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e809190614fd8565b811115613f0b576040516370a0823160e01b815260008051602061567d833981519152906370a0823190613eb89030906004016151fd565b60206040518083038186803b158015613ed057600080fd5b505afa158015613ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f089190614fd8565b90505b6040516370a0823160e01b815260009060008051602061569d833981519152906370a0823190613f3f9030906004016151fd565b60206040518083038186803b158015613f5757600080fd5b505afa158015613f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f8f9190614fd8565b600d54604051631cc6d2f960e31b815291925060008051602061567d8339815191529163e63697c891613fc89186913091600401615514565b600060405180830381600087803b158015613fe257600080fd5b505af1158015613ff6573d6000803e3d6000fd5b50506040516370a0823160e01b81526000925060008051602061569d83398151915291506370a082319061402e9030906004016151fd565b60206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e9190614fd8565b905061408a818361356c565b95945050505050565b600e54604051632726b07360e01b8152600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916140ce9160040161524f565b60206040518083038186803b1580156140e657600080fd5b505afa1580156140fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411e9190614eef565b9050811561419257604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f9061415f908490869060040161522b565b600060405180830381600087803b15801561417957600080fd5b505af115801561418d573d6000803e3d6000fd5b505050505b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd600e546141c186614806565b60000361425d7335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316636c25b346876040518263ffffffff1660e01b815260040161420791906151fd565b60206040518083038186803b15801561421f57600080fd5b505afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190614fd8565b86614828565b6040518463ffffffff1660e01b815260040161427b93929190615533565b600060405180830381600087803b15801561429557600080fd5b505af11580156142a9573d6000803e3d6000fd5b5050600e546040516313771f0760e31b8152735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f83892506142ea919030908890600401615514565b600060405180830381600087803b15801561430457600080fd5b505af1158015614318573d6000803e3d6000fd5b505050506000831115612a355760405163ef693bed60e01b815273f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e9063ef693bed9061435e903090879060040161522b565b600060405180830381600087803b15801561437857600080fd5b505af115801561438c573d6000803e3d6000fd5b50505050505050565b60606143ea826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a3a9092919063ffffffff16565b805190915015612a3557808060200190518101906144089190614fbc565b612a355760405162461bcd60e51b81526004016107d99061542a565b606061442f85614994565b61444b5760405162461bcd60e51b81526004016107d9906153ce565b60006060866001600160a01b0316858760405161446891906151e1565b60006040518083038185875af1925050503d80600081146144a5576040519150601f19603f3d011682016040523d82523d6000602084013e6144aa565b606091505b509150915081156144be579150612a499050565b8051156144ce5780518082602001fd5b8360405162461bcd60e51b81526004016107d9919061529e565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906145199030906004016151fd565b60206040518083038186803b15801561453157600080fd5b505afa158015614545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145699190614fd8565b9050806145765750610dbe565b6000614580613982565b905060006145af670de0b6b3a76400006114c5600b546114c561271061078a888a612a7f90919063ffffffff16565b90506145ba81613b0f565b90506145c683826149cd565b806145d357505050610dbe565b60008051602061567d8339815191526001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561437857600080fd5b600061462961154161142a565b9050801561161c5761463c6000826149cd565b60008051602061567d8339815191526001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6b57600080fd5b600061468f612098565b9050801561161c5761274381613d65565b600081848411156146c45760405162461bcd60e51b81526004016107d9919061529e565b505050900390565b604080516002808252606080830184529260208301908036833701905050905060008051602061569d8339815191528160008151811061470857fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061473357fe5b6001600160a01b039283166020918202929092010152600f546040516338ed173960e01b81529116906338ed173990614779908590600090869030904290600401615549565b600060405180830381600087803b15801561479357600080fd5b505af11580156147a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a359190810190614f0b565b600081836147f05760405162461bcd60e51b81526004016107d9919061529e565b5060008385816147fc57fe5b0495945050505050565b80600081121561154b5760405162461bcd60e51b81526004016107d9906154ee565b604051636cb1c69b60e11b815260009081907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d369061486c90644554482d4360d81b9060040161524f565b60a06040518083038186803b15801561488457600080fd5b505afa158015614898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bc9190615098565b602001516040516309092f9760e21b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c9061490790644554482d4360d81b908890600401615258565b604080518083038186803b15801561491e57600080fd5b505afa158015614932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149569190615167565b60200151905061496e82868161496857fe5b04614806565b9250808311156149895761498181614806565b60000361408a565b505060000392915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a49575050151592915050565b600e54604051632726b07360e01b8152600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b07391614a089160040161524f565b60206040518083038186803b158015614a2057600080fd5b505afa158015614a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a589190614eef565b90508215614acc57604051633b4da69f60e01b815273f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e90633b4da69f90614a99908490879060040161522b565b600060405180830381600087803b158015614ab357600080fd5b505af1158015614ac7573d6000803e3d6000fd5b505050505b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd600e54614afb86614806565b614b058587614c1c565b6040518463ffffffff1660e01b8152600401614b2393929190615533565b600060405180830381600087803b158015614b3d57600080fd5b505af1158015614b51573d6000803e3d6000fd5b5050600e54735ef30b9986345249bc32d8928b7ee64de9435e39925063f9f30db6915030614b8a86676765c793fa10079d601b1b612a7f565b6040518463ffffffff1660e01b8152600401614ba893929190615514565b600060405180830381600087803b158015614bc257600080fd5b505af1158015614bd6573d6000803e3d6000fd5b505050506000821115612a355760405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a289063ef693bed9061435e903090869060040161522b565b604051636cb1c69b60e11b815260009081907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690614c6090644554482d4360d81b9060040161524f565b60a06040518083038186803b158015614c7857600080fd5b505afa158015614c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cb09190615098565b60200151604051633612d9a360e11b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90636c25b34690614cf19088906004016151fd565b60206040518083038186803b158015614d0957600080fd5b505afa158015614d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d419190614fd8565b9050614d5884676765c793fa10079d601b1b612a7f565b811015614dbd57614d8a614d85836114c584614d7f89676765c793fa10079d601b1b612a7f565b9061356c565b614806565b9250614da184676765c793fa10079d601b1b612a7f565b614dab8484612a7f565b10614db6578261408a565b8260010192505b505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e065782800160ff19823516178555614e33565b82800160010185558215614e33579182015b82811115614e33578235825591602001919060010190614e18565b50614e3f929150614ebe565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b5b80821115614e3f5760008155600101614ebf565b600060208284031215614ee4578081fd5b8135612a7681615659565b600060208284031215614f00578081fd5b8151612a7681615659565b60006020808385031215614f1d578182fd5b825167ffffffffffffffff811115614f33578283fd5b8301601f81018513614f43578283fd5b8051614f56614f5182615609565b6155e2565b8181528381019083850185840285018601891015614f72578687fd5b8694505b83851015614f94578051835260019490940193918501918501614f76565b50979650505050505050565b600060208284031215614fb1578081fd5b8135612a768161566e565b600060208284031215614fcd578081fd5b8151612a768161566e565b600060208284031215614fe9578081fd5b5051919050565b60008060208385031215615002578081fd5b823567ffffffffffffffff80821115615019578283fd5b818501915085601f83011261502c578283fd5b81358181111561503a578384fd5b86602082850101111561504b578384fd5b60209290920196919550909350505050565b60006040828403121561506e578081fd5b61507860406155e2565b825161508381615659565b81526020928301519281019290925250919050565b600060a082840312156150a9578081fd5b6150b360a06155e2565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b60006101208083850312156150fc578182fd5b615105816155e2565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060408284031215615178578081fd5b61518260406155e2565b82518152602083015160208201528091505092915050565b6000602082840312156151ab578081fd5b5035919050565b600080604083850312156151c4578182fd5b8251915060208301516151d68161566e565b809150509250929050565b600082516151f3818460208701615629565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526152bd816040850160208701615629565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252600c908201526b696e742d6f766572666c6f7760a01b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156155985784516001600160a01b031683529383019391830191600101615573565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561560157600080fd5b604052919050565b600067ffffffffffffffff82111561561f578081fd5b5060209081020190565b60005b8381101561564457818101518382015260200161562c565b83811115615653576000848401525b50505050565b6001600160a01b038116811461161c57600080fd5b801515811461161c57600080fdfe00000000000000000000000019d3364a399d251e894ac732651be8b0e4e850010000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa2646970667358221220527e47e03bf59e936d3043c36fbe1c22d0fd92276d61071ec257465628b1e30764736f6c634300060c00330000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a9fe4601811213c340e850ea305481aff02f5b28
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104115760003560e01c8063781eff1211610220578063c5ce281e11610130578063edaafe20116100b8578063f4b9fa7511610087578063f4b9fa751461072e578063f9f42b4f14610736578063fbfa77cf14610749578063fcf2d0ad14610751578063ff9913e81461075957610411565b8063edaafe2014610703578063efbb5cb01461070b578063f017c92f14610713578063f21444841461072657610411565b8063ce5494bb116100ff578063ce5494bb146106ba578063d0efe753146106cd578063ebf661b6146106d5578063ec38a862146106dd578063ed882c2b146106f057610411565b8063c5ce281e1461068f578063c732140114610697578063c7b9d5301461069f578063c7c57c1f146106b257610411565b80639ec5a894116101b3578063aced166111610182578063aced166114610651578063adc7ea3714610659578063c1a3d44c1461066c578063c392c6f714610674578063c3da42b81461068757610411565b80639ec5a89414610631578063a280062014610639578063a318215214610641578063a83adfbf1461064957610411565b806391397ab4116101ef57806391397ab414610606578063918f86741461061957806395e80c50146106215780639be287851461062957610411565b8063781eff12146105e657806384718d89146105ee5780638cdfe166146105f65780638e6350e2146105fe57610411565b806336569e77116103265780634a1a066b116102ae578063669c62d41161027d578063669c62d41461059d578063692058c2146105a55780636bc55876146105ad578063748747e6146105c0578063750521f5146105d357610411565b80634a1a066b146105725780635641ec031461057a57806361880a9214610582578063650d18801461058a57610411565b80633fc8cef3116102f55780633fc8cef31461054a5780634368264814610552578063440368a31461055a5780634641257d146105625780634905d9381461056a57610411565b806336569e771461051f578063380d0c0814610527578063392c731f1461052f57806339a172a81461053757610411565b80631f1fcd51116103a957806325cdbaff1161037857806325cdbaff146104d65780632641e5cd146104e95780632681f7e4146104fc57806328b7ccf7146105045780632e1a7d4d1461050c57610411565b80631f1fcd51146104b65780631fe4a686146104be57806322f3e2d4146104c657806325829410146104ce57610411565b80630f969b87116103e55780630f969b8714610466578063121c1a651461047957806313b857b41461048e5780631d12f28b146104a157610411565b8062beada41461041657806301681a621461043457806303ee438c1461044957806306fdde031461045e575b600080fd5b61041e61076c565b60405161042b9190615244565b60405180910390f35b610447610442366004614ed3565b6107a1565b005b610451610940565b60405161042b919061529e565b6104516109ce565b61044761047436600461519a565b610a05565b610481610a92565b60405161042b91906151fd565b61044761049c36600461519a565b610aaa565b6104a9610afc565b60405161042b919061524f565b610481610b02565b610481610b11565b61041e610b20565b610451610bc0565b6104476104e436600461519a565b610bdf565b6104476104f736600461519a565b610c86565b610481610cd8565b6104a9610cf0565b6104a961051a36600461519a565b610cf6565b610481610d51565b610447610d69565b6104a9610dc0565b61044761054536600461519a565b610dc6565b610481610e48565b610481610e60565b610447610e72565b610447611099565b610481611403565b6104a961141b565b61041e611421565b6104a961142a565b61041e61059836600461519a565b6114df565b610481611550565b610481611568565b6104476105bb366004614fa0565b611577565b6104476105ce366004614ed3565b61161f565b6104476105e1366004614ff0565b6116ca565b6104a9611761565b610481611945565b6104a961195d565b6104a9611963565b61044761061436600461519a565b611985565b6104a9611a07565b6104a9611a0d565b610481611a13565b610481611a2b565b610481611a3a565b610481611a52565b610481611a6a565b610481611a82565b61044761066736600461519a565b611a91565b6104a9611ae3565b6104a961068236600461519a565b611b64565b6104a9611d2d565b6104a9611d33565b6104a9611d3f565b6104476106ad366004614ed3565b611e67565b610481611f12565b6104476106c8366004614ed3565b611f2a565b6104a9612098565b61041e6120e1565b6104476106eb366004614ed3565b612112565b61041e6106fe36600461519a565b6122a9565b6104a9612521565b6104a9612527565b61044761072136600461519a565b612542565b6104a96125c4565b6104816126d5565b61044761074436600461519a565b6126e7565b6104816127d2565b6104476127e1565b610447610767366004614ed3565b6128c5565b6000610790606461078a600c54600b54612a5190919063ffffffff16565b90612a7f565b61079a6000611b64565b1190505b90565b6107a9612ab9565b6001600160a01b0316336001600160a01b0316146107e25760405162461bcd60e51b81526004016107d990615405565b60405180910390fd5b6005546001600160a01b03828116911614156108105760405162461bcd60e51b81526004016107d9906152f6565b6001546001600160a01b038281169116141561083e5760405162461bcd60e51b81526004016107d9906153ad565b6060610848612b36565b905060005b81518110156108a35781818151811061086257fe5b60200260200101516001600160a01b0316836001600160a01b0316141561089b5760405162461bcd60e51b81526004016107d990615474565b60010161084d565b5061093c6108af612ab9565b6040516370a0823160e01b81526001600160a01b038516906370a08231906108db9030906004016151fd565b60206040518083038186803b1580156108f357600080fd5b505afa158015610907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190614fd8565b6001600160a01b0385169190612bcf565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b60408051808201909152601b81527f53747261746567794d616b657245544844414944656c65676174650000000000602082015290565b6002546001600160a01b0316331480610a365750610a21612ab9565b6001600160a01b0316336001600160a01b0316145b610a525760405162461bcd60e51b81526004016107d990615405565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a8790839061524f565b60405180910390a150565b73cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f181565b6002546001600160a01b0316331480610adb5750610ac6612ab9565b6001600160a01b0316336001600160a01b0316145b610af75760405162461bcd60e51b81526004016107d990615405565b600d55565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b559030906004016151fd565b6101206040518083038186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba691906150e9565b604001511180610bbb5750600061079a612527565b905090565b604080518082019091526005815264181719971960d91b602082015290565b610be7612ab9565b6001600160a01b0316336001600160a01b031614610c175760405162461bcd60e51b81526004016107d990615405565b600e54604051637281915160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e399163e50322a291610c519185916004016155b9565b600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b5050505050565b6002546001600160a01b0316331480610cb75750610ca2612ab9565b6001600160a01b0316336001600160a01b0316145b610cd35760405162461bcd60e51b81526004016107d990615405565b600b55565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610d235760405162461bcd60e51b81526004016107d99061538d565b6000610d2e83612bee565b600554909350909150610d4b906001600160a01b03163383612bcf565b50919050565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b0316331480610d9a5750610d85612ab9565b6001600160a01b0316336001600160a01b0316145b610db65760405162461bcd60e51b81526004016107d990615405565b610dbe612d6f565b565b600d5481565b6002546001600160a01b0316331480610df75750610de2612ab9565b6001600160a01b0316336001600160a01b0316145b610e135760405162461bcd60e51b81526004016107d990615405565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a8790839061524f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008051602061567d83398151915281565b6004546001600160a01b0316331480610e9557506002546001600160a01b031633145b80610eb85750610ea3612ab9565b6001600160a01b0316336001600160a01b0316145b80610f595750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f449190614eef565b6001600160a01b0316336001600160a01b0316145b80610ffa5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190614eef565b6001600160a01b0316336001600160a01b0316145b6110165760405162461bcd60e51b81526004016107d990615405565b6001546040805163bf3759b560e01b81529051610dbe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561105c57600080fd5b505afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190614fd8565b6133f0565b6004546001600160a01b03163314806110bc57506002546001600160a01b031633145b806110df57506110ca612ab9565b6001600160a01b0316336001600160a01b0316145b806111805750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190614eef565b6001600160a01b0316336001600160a01b0316145b806112215750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614eef565b6001600160a01b0316336001600160a01b0316145b61123d5760405162461bcd60e51b81526004016107d990615405565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614fd8565b600a5490915060009060ff161561131e5760006112e3612527565b90506112fc8382116112f557836112f7565b815b612bee565b945091508282111561131857611312828461356c565b94508291505b5061132f565b611327826135ae565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061136390879087908690600401615533565b602060405180830381600087803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b59190614fd8565b91506113c0826133f0565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516113f594939291906155c7565b60405180910390a150505050565b73f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e81565b600e5481565b600a5460ff1681565b6000806114436064600b54612a7f90919063ffffffff16565b905060006114516000611b64565b905061146f606461078a600b54612710612a7f90919063ffffffff16565b81111561149557611492606461078a600b54612710612a7f90919063ffffffff16565b90505b818111156114d65760006114a7611761565b905060006114b5838561356c565b90506114cb846114c58484612a7f565b90613940565b94505050505061079e565b60009250505090565b60006114e9611d3f565b6114f55750600061154b565b6114fd6120e1565b80611548575061150b61076c565b80156115485750611536670de0b6b3a76400006114c560085461078a61152f613982565b8790612a7f565b61154661154161142a565b613b0f565b115b90505b919050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b600f546001600160a01b031681565b6002546001600160a01b03163314806115a85750611593612ab9565b6001600160a01b0316336001600160a01b0316145b6115c45760405162461bcd60e51b81526004016107d990615405565b80156115f557600f80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561161c565b600f80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b50565b6002546001600160a01b0316331480611650575061163b612ab9565b6001600160a01b0316336001600160a01b0316145b61166c5760405162461bcd60e51b81526004016107d990615405565b6001600160a01b03811661167f57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a879083906151fd565b6002546001600160a01b03163314806116fb57506116e6612ab9565b6001600160a01b0316336001600160a01b0316145b6117175760405162461bcd60e51b81526004016107d990615405565b61172360008383614dc5565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda6828260405161175592919061526f565b60405180910390a15050565b600e54604051632726b07360e01b81526000918291735ef30b9986345249bc32d8928b7ee64de9435e3991632726b0739161179f919060040161524f565b60206040518083038186803b1580156117b757600080fd5b505afa1580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190614eef565b6040516309092f9760e21b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c9061183690644554482d4360d81b908690600401615258565b604080518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190615167565b60200151604051636cb1c69b60e11b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d36906118ce90644554482d4360d81b9060040161524f565b60a06040518083038186803b1580156118e657600080fd5b505afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e9190615098565b60200151905061193d676765c793fa10079d601b1b6114c58484612a7f565b935050505090565b7319c0976f590d67707e62397c87829d896dc0f1f181565b60085481565b6000610bbb6119726000611b64565b6114c5606461078a61271061078a612527565b6002546001600160a01b03163314806119b657506119a1612ab9565b6001600160a01b0316336001600160a01b0316145b6119d25760405162461bcd60e51b81526004016107d990615405565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a8790839061524f565b61271081565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b73c7bdd1f2b16447dcf3de045c4a039a60ec2f0ba381565b6004546001600160a01b031681565b6002546001600160a01b0316331480611ac25750611aad612ab9565b6001600160a01b0316336001600160a01b0316145b611ade5760405162461bcd60e51b81526004016107d990615405565b600c55565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611b149030906004016151fd565b60206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190614fd8565b600080600080611b72611761565b905080611b8657600019935050505061154b565b604051636cb1c69b60e11b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690611bc590644554482d4360d81b9060040161524f565b60a06040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190615098565b6040908101519051636cb1c69b60e11b81529093507365c79fcb50ca1594b025960e539ed7a9a6d434a39063d9638d3690611c5c90644554482d4360d81b9060040161524f565b604080518083038186803b158015611c7357600080fd5b505afa158015611c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cab919061505d565b6020015191506000611ccc676765c793fa10079d601b1b6114c58686612a7f565b90506000611cd8611d3f565b905086811015611cea57506000611cf7565b611cf4818861356c565b90505b6000611d0f670de0b6b3a76400006114c58486612a7f565b9050611d216103e86114c58387613940565b98975050505050505050565b600b5481565b644554482d4360d81b81565b600e54604051632726b07360e01b81526000918291735ef30b9986345249bc32d8928b7ee64de9435e3991632726b07391611d7d919060040161524f565b60206040518083038186803b158015611d9557600080fd5b505afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd9190614eef565b6040516309092f9760e21b81529091507335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c90611e1190644554482d4360d81b908590600401615258565b604080518083038186803b158015611e2857600080fd5b505afa158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e609190615167565b5191505090565b6002546001600160a01b0316331480611e985750611e83612ab9565b6001600160a01b0316336001600160a01b0316145b611eb45760405162461bcd60e51b81526004016107d990615405565b6001600160a01b038116611ec757600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a879083906151fd565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b6001546001600160a01b0316331480611f5b5750611f46612ab9565b6001600160a01b0316336001600160a01b0316145b611f6457600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611fab57600080fd5b505afa158015611fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe39190614eef565b6001600160a01b031614611ff657600080fd5b611fff81613c58565b6005546040516370a0823160e01b815261161c9183916001600160a01b03909116906370a08231906120359030906004016151fd565b60206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120859190614fd8565b6005546001600160a01b03169190612bcf565b6000806120b16064600b54612a7f90919063ffffffff16565b905060006120bf6000611b64565b9050818110156114d65760006120d3611761565b905060006114b5848461356c565b6000612102606461078a6002600c54816120f757fe5b600b5491900461356c565b61210c6000611b64565b10905090565b6002546001600160a01b0316331461213c5760405162461bcd60e51b81526004016107d9906152d1565b6001600160a01b03811661214f57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121869291169060009060040161522b565b602060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d89190614fbc565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392612227929116906000199060040161522b565b602060405180830381600087803b15801561224157600080fd5b505af1158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190614fbc565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a8791906151fd565b60006122b3614e43565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf823906122e39030906004016151fd565b6101206040518083038186803b1580156122fc57600080fd5b505afa158015612310573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233491906150e9565b905080602001516000141561234d57600091505061154b565b60065460a082015161236090429061356c565b101561237057600091505061154b565b60075460a082015161238390429061356c565b1061239257600191505061154b565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156123d757600080fd5b505afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614fd8565b90506009548111156124265760019250505061154b565b6000612430612527565b90508260c0015161244c60095483612a5190919063ffffffff16565b101561245e576001935050505061154b565b60008360c0015182111561247f5760c084015161247c90839061356c565b90505b6001546040805163112c1f9b60e01b815290516000926001600160a01b03169163112c1f9b916004808301926020929190829003018186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc9190614fd8565b90506125088183612a51565b6008546125159089612a7f565b10979650505050505050565b600c5481565b6000610bbb612534611d3f565b61253c611ae3565b90612a51565b6002546001600160a01b0316331480612573575061255e612ab9565b6001600160a01b0316336001600160a01b0316145b61258f5760405162461bcd60e51b81526004016107d990615405565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a8790839061524f565b6000610bbb670de0b6b3a76400006114c560008051602061567d8339815191526001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b15801561261c57600080fd5b505afa158015612630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126549190614fd8565b6040516370a0823160e01b815260008051602061567d833981519152906370a08231906126859030906004016151fd565b60206040518083038186803b15801561269d57600080fd5b505afa1580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078a9190614fd8565b60008051602061569d83398151915281565b6002546001600160a01b03163314806127185750612703612ab9565b6001600160a01b0316336001600160a01b0316145b6127345760405162461bcd60e51b81526004016107d990615405565b80156127455761274381613d65565b505b6040516370a0823160e01b815261161c9060009060008051602061569d833981519152906370a082319061277d9030906004016151fd565b60206040518083038186803b15801561279557600080fd5b505afa1580156127a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cd9190614fd8565b614093565b6001546001600160a01b031681565b6002546001600160a01b031633148061281257506127fd612ab9565b6001600160a01b0316336001600160a01b0316145b61282e5760405162461bcd60e51b81526004016107d990615405565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561288257600080fd5b505af1158015612896573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b6128cd612ab9565b6001600160a01b0316336001600160a01b0316146128fd5760405162461bcd60e51b81526004016107d990615405565b600e546040516305b1fdb160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e3991630b63fb6291610c5191908590600190600401615514565b8015806129c35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906129719030908690600401615211565b60206040518083038186803b15801561298957600080fd5b505afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c19190614fd8565b155b6129df5760405162461bcd60e51b81526004016107d990615498565b612a358363095ea7b360e01b84846040516024016129fe92919061522b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614395565b505050565b6060612a498484600085614424565b949350505050565b600082820183811015612a765760405162461bcd60e51b81526004016107d990615315565b90505b92915050565b600082612a8e57506000612a79565b82820282848281612a9b57fe5b0414612a765760405162461bcd60e51b81526004016107d99061534c565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b158015612afe57600080fd5b505afa158015612b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190614eef565b60408051600280825260608083018452928392919060208301908036833701905050905060008051602061567d83398151915281600081518110612b7657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061569d83398151915281600181518110612bb257fe5b6001600160a01b0390921660209283029190910190910152905090565b612a358363a9059cbb60e01b84846040516024016129fe92919061522b565b600080612bf9611761565b15801590612c1b5750600b54612c10906064612a7f565b612c1984611b64565b105b15612c9b576000612c2a613982565b9050612c60612c5b670de0b6b3a76400006114c5612c486000611b64565b6114c5606461078a612710818d8b612a7f565b613d65565b506040516370a0823160e01b8152612c999060009060008051602061569d833981519152906370a082319061277d9030906004016151fd565b505b604051636cb1c69b60e11b8152612d4290683635c9adc5dea00000907365c79fcb50ca1594b025960e539ed7a9a6d434a39063d9638d3690612ce990644554482d4360d81b9060040161524f565b604080518083038186803b158015612d0057600080fd5b505afa158015612d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d38919061505d565b6020015190613940565b612d4b84611b64565b11612d5b57506000905081612d6a565b612d66836000614093565b8291505b915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612db69073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e9060009060040161522b565b602060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e089190614fbc565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612e519073f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e906000199060040161522b565b602060405180830381600087803b158015612e6b57600080fd5b505af1158015612e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea39190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b390612eec90739759a6ac90977b93b58547b4a71c78317f391a289060009060040161522b565b602060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3e9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b390612f8890739759a6ac90977b93b58547b4a71c78317f391a28906000199060040161522b565b602060405180830381600087803b158015612fa257600080fd5b505af1158015612fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fda9190614fbc565b506040516328ec8bf160e21b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063a3b22fc49061302690739759a6ac90977b93b58547b4a71c78317f391a28906004016151fd565b600060405180830381600087803b15801561304057600080fd5b505af1158015613054573d6000803e3d6000fd5b505060405163095ea7b360e01b815260008051602061569d833981519152925063095ea7b3915061309a9060008051602061567d8339815191529060009060040161522b565b602060405180830381600087803b1580156130b457600080fd5b505af11580156130c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ec9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906131309060008051602061567d833981519152906000199060040161522b565b602060405180830381600087803b15801561314a57600080fd5b505af115801561315e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131829190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906131cb90737a250d5630b4cf539739df2c5dacb4c659f2488d9060009060040161522b565b602060405180830381600087803b1580156131e557600080fd5b505af11580156131f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321d9190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b39061326790737a250d5630b4cf539739df2c5dacb4c659f2488d906000199060040161522b565b602060405180830381600087803b15801561328157600080fd5b505af1158015613295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b99190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b3906133029073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060009060040161522b565b602060405180830381600087803b15801561331c57600080fd5b505af1158015613330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133549190614fbc565b5060405163095ea7b360e01b815260008051602061569d8339815191529063095ea7b39061339e9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000199060040161522b565b602060405180830381600087803b1580156133b857600080fd5b505af11580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c9190614fbc565b600a5460ff16806134075750613404612527565b81115b156134115761161c565b60405163089c54b560e31b81527319c0976f590d67707e62397c87829d896dc0f1f1906344e2a5a89061345090644554482d4360d81b9060040161524f565b602060405180830381600087803b15801561346a57600080fd5b505af115801561347e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a29190614fd8565b5060405163b5e98b3b60e01b815273c7bdd1f2b16447dcf3de045c4a039a60ec2f0ba39063b5e98b3b906134e290644554482d4360d81b9060040161524f565b602060405180830381600087803b1580156134fc57600080fd5b505af1158015613510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135349190614fd8565b5061353d6144e8565b61354561076c565b156135575761355261461c565b61161c565b61355f6120e1565b1561161c5761161c614685565b6000612a7683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506146a0565b6005546040516370a0823160e01b81526000918291829182916001600160a01b03909116906370a08231906135e79030906004016151fd565b60206040518083038186803b1580156135ff57600080fd5b505afa158015613613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136379190614fd8565b905060006136436125c4565b9050600061364f611761565b9050808211156136f157613666612c5b838361356c565b506040516370a0823160e01b81526136f19060008051602061569d833981519152906370a082319061369c9030906004016151fd565b60206040518083038186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190614fd8565b6146cc565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906137229030906004016151fd565b60206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137729190614fd8565b905061377e818561356c565b9650600061378a612527565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf823906137c09030906004016151fd565b6101206040518083038186803b1580156137d957600080fd5b505afa1580156137ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381191906150e9565b60c00151905080821015613829578181039750600098505b818110156138f257600061383d838361356c565b90508981111561384b578099505b838a11156138f0576138606112f78b8661356c565b50506005546040516370a0823160e01b81526001600160a01b03909116906370a08231906138929030906004016151fd565b60206040518083038186803b1580156138aa57600080fd5b505afa1580156138be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e29190614fd8565b9350838a11156138f0578399505b505b60008a15613909576139038b612bee565b90985090505b6139138982612a51565b9850888a111561392a579790980397600097613932565b600099909803975b505050505050509193909250565b6000612a7683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506147cf565b60008073cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f16001600160a01b03166357de26a46040518163ffffffff1660e01b8152600401604080518083038186803b1580156139d157600080fd5b505afa1580156139e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0991906151b2565b509050600073cf63089a8ad2a9d8bd6bb8022f3190eb7e1ed0f16001600160a01b031663cfad9c8c6040518163ffffffff1660e01b8152600401604080518083038186803b158015613a5a57600080fd5b505afa158015613a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9291906151b2565b509050818110613aa25781613aa4565b805b925082613b0a57613b016402540be400735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269d57600080fd5b9250505061079e565b505090565b6000613b19614e8f565b604051636cb1c69b60e11b81527335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690613b5890644554482d4360d81b9060040161524f565b60a06040518083038186803b158015613b7057600080fd5b505afa158015613b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba89190615098565b90506000613bd6676765c793fa10079d601b1b61253c84602001518560000151612a7f90919063ffffffff16565b90508160600151811115613bef5760009250505061154b565b613c15676765c793fa10079d601b1b6114c583856060015161356c90919063ffffffff16565b6080830151909350613c3284676765c793fa10079d601b1b612a7f565b1015613c435760009250505061154b565b838310613c505783612a49565b509092915050565b600e546040516305b1fdb160e11b8152735ef30b9986345249bc32d8928b7ee64de9435e3991630b63fb6291613c9691908590600190600401615514565b600060405180830381600087803b158015613cb057600080fd5b505af1158015613cc4573d6000803e3d6000fd5b50506040516370a0823160e01b815261161c925083915060008051602061567d833981519152906370a0823190613cff9030906004016151fd565b60206040518083038186803b158015613d1757600080fd5b505afa158015613d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4f9190614fd8565b60008051602061567d8339815191529190612bcf565b600080613dfc60008051602061567d8339815191526001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015613db257600080fd5b505afa158015613dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dea9190614fd8565b6114c585670de0b6b3a7640000612a7f565b6040516370a0823160e01b815290915060008051602061567d833981519152906370a0823190613e309030906004016151fd565b60206040518083038186803b158015613e4857600080fd5b505afa158015613e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e809190614fd8565b811115613f0b576040516370a0823160e01b815260008051602061567d833981519152906370a0823190613eb89030906004016151fd565b60206040518083038186803b158015613ed057600080fd5b505afa158015613ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f089190614fd8565b90505b6040516370a0823160e01b815260009060008051602061569d833981519152906370a0823190613f3f9030906004016151fd565b60206040518083038186803b158015613f5757600080fd5b505afa158015613f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f8f9190614fd8565b600d54604051631cc6d2f960e31b815291925060008051602061567d8339815191529163e63697c891613fc89186913091600401615514565b600060405180830381600087803b158015613fe257600080fd5b505af1158015613ff6573d6000803e3d6000fd5b50506040516370a0823160e01b81526000925060008051602061569d83398151915291506370a082319061402e9030906004016151fd565b60206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e9190614fd8565b905061408a818361356c565b95945050505050565b600e54604051632726b07360e01b8152600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916140ce9160040161524f565b60206040518083038186803b1580156140e657600080fd5b505afa1580156140fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411e9190614eef565b9050811561419257604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f9061415f908490869060040161522b565b600060405180830381600087803b15801561417957600080fd5b505af115801561418d573d6000803e3d6000fd5b505050505b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd600e546141c186614806565b60000361425d7335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316636c25b346876040518263ffffffff1660e01b815260040161420791906151fd565b60206040518083038186803b15801561421f57600080fd5b505afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190614fd8565b86614828565b6040518463ffffffff1660e01b815260040161427b93929190615533565b600060405180830381600087803b15801561429557600080fd5b505af11580156142a9573d6000803e3d6000fd5b5050600e546040516313771f0760e31b8152735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f83892506142ea919030908890600401615514565b600060405180830381600087803b15801561430457600080fd5b505af1158015614318573d6000803e3d6000fd5b505050506000831115612a355760405163ef693bed60e01b815273f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e9063ef693bed9061435e903090879060040161522b565b600060405180830381600087803b15801561437857600080fd5b505af115801561438c573d6000803e3d6000fd5b50505050505050565b60606143ea826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a3a9092919063ffffffff16565b805190915015612a3557808060200190518101906144089190614fbc565b612a355760405162461bcd60e51b81526004016107d99061542a565b606061442f85614994565b61444b5760405162461bcd60e51b81526004016107d9906153ce565b60006060866001600160a01b0316858760405161446891906151e1565b60006040518083038185875af1925050503d80600081146144a5576040519150601f19603f3d011682016040523d82523d6000602084013e6144aa565b606091505b509150915081156144be579150612a499050565b8051156144ce5780518082602001fd5b8360405162461bcd60e51b81526004016107d9919061529e565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906145199030906004016151fd565b60206040518083038186803b15801561453157600080fd5b505afa158015614545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145699190614fd8565b9050806145765750610dbe565b6000614580613982565b905060006145af670de0b6b3a76400006114c5600b546114c561271061078a888a612a7f90919063ffffffff16565b90506145ba81613b0f565b90506145c683826149cd565b806145d357505050610dbe565b60008051602061567d8339815191526001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561437857600080fd5b600061462961154161142a565b9050801561161c5761463c6000826149cd565b60008051602061567d8339815191526001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6b57600080fd5b600061468f612098565b9050801561161c5761274381613d65565b600081848411156146c45760405162461bcd60e51b81526004016107d9919061529e565b505050900390565b604080516002808252606080830184529260208301908036833701905050905060008051602061569d8339815191528160008151811061470857fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061473357fe5b6001600160a01b039283166020918202929092010152600f546040516338ed173960e01b81529116906338ed173990614779908590600090869030904290600401615549565b600060405180830381600087803b15801561479357600080fd5b505af11580156147a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a359190810190614f0b565b600081836147f05760405162461bcd60e51b81526004016107d9919061529e565b5060008385816147fc57fe5b0495945050505050565b80600081121561154b5760405162461bcd60e51b81526004016107d9906154ee565b604051636cb1c69b60e11b815260009081907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d369061486c90644554482d4360d81b9060040161524f565b60a06040518083038186803b15801561488457600080fd5b505afa158015614898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bc9190615098565b602001516040516309092f9760e21b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90632424be5c9061490790644554482d4360d81b908890600401615258565b604080518083038186803b15801561491e57600080fd5b505afa158015614932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149569190615167565b60200151905061496e82868161496857fe5b04614806565b9250808311156149895761498181614806565b60000361408a565b505060000392915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a49575050151592915050565b600e54604051632726b07360e01b8152600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b07391614a089160040161524f565b60206040518083038186803b158015614a2057600080fd5b505afa158015614a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a589190614eef565b90508215614acc57604051633b4da69f60e01b815273f04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e90633b4da69f90614a99908490879060040161522b565b600060405180830381600087803b158015614ab357600080fd5b505af1158015614ac7573d6000803e3d6000fd5b505050505b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd600e54614afb86614806565b614b058587614c1c565b6040518463ffffffff1660e01b8152600401614b2393929190615533565b600060405180830381600087803b158015614b3d57600080fd5b505af1158015614b51573d6000803e3d6000fd5b5050600e54735ef30b9986345249bc32d8928b7ee64de9435e39925063f9f30db6915030614b8a86676765c793fa10079d601b1b612a7f565b6040518463ffffffff1660e01b8152600401614ba893929190615514565b600060405180830381600087803b158015614bc257600080fd5b505af1158015614bd6573d6000803e3d6000fd5b505050506000821115612a355760405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a289063ef693bed9061435e903090869060040161522b565b604051636cb1c69b60e11b815260009081907335d1b3f3d7966a1dfe207aa4514c12a259a0492b9063d9638d3690614c6090644554482d4360d81b9060040161524f565b60a06040518083038186803b158015614c7857600080fd5b505afa158015614c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cb09190615098565b60200151604051633612d9a360e11b81529091506000907335d1b3f3d7966a1dfe207aa4514c12a259a0492b90636c25b34690614cf19088906004016151fd565b60206040518083038186803b158015614d0957600080fd5b505afa158015614d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d419190614fd8565b9050614d5884676765c793fa10079d601b1b612a7f565b811015614dbd57614d8a614d85836114c584614d7f89676765c793fa10079d601b1b612a7f565b9061356c565b614806565b9250614da184676765c793fa10079d601b1b612a7f565b614dab8484612a7f565b10614db6578261408a565b8260010192505b505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e065782800160ff19823516178555614e33565b82800160010185558215614e33579182015b82811115614e33578235825591602001919060010190614e18565b50614e3f929150614ebe565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b5b80821115614e3f5760008155600101614ebf565b600060208284031215614ee4578081fd5b8135612a7681615659565b600060208284031215614f00578081fd5b8151612a7681615659565b60006020808385031215614f1d578182fd5b825167ffffffffffffffff811115614f33578283fd5b8301601f81018513614f43578283fd5b8051614f56614f5182615609565b6155e2565b8181528381019083850185840285018601891015614f72578687fd5b8694505b83851015614f94578051835260019490940193918501918501614f76565b50979650505050505050565b600060208284031215614fb1578081fd5b8135612a768161566e565b600060208284031215614fcd578081fd5b8151612a768161566e565b600060208284031215614fe9578081fd5b5051919050565b60008060208385031215615002578081fd5b823567ffffffffffffffff80821115615019578283fd5b818501915085601f83011261502c578283fd5b81358181111561503a578384fd5b86602082850101111561504b578384fd5b60209290920196919550909350505050565b60006040828403121561506e578081fd5b61507860406155e2565b825161508381615659565b81526020928301519281019290925250919050565b600060a082840312156150a9578081fd5b6150b360a06155e2565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b60006101208083850312156150fc578182fd5b615105816155e2565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060408284031215615178578081fd5b61518260406155e2565b82518152602083015160208201528091505092915050565b6000602082840312156151ab578081fd5b5035919050565b600080604083850312156151c4578182fd5b8251915060208301516151d68161566e565b809150509250929050565b600082516151f3818460208701615629565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526152bd816040850160208701615629565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252600c908201526b696e742d6f766572666c6f7760a01b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156155985784516001600160a01b031683529383019391830191600101615573565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561560157600080fd5b604052919050565b600067ffffffffffffffff82111561561f578081fd5b5060209081020190565b60005b8381101561564457818101518382015260200161562c565b83811115615653576000848401525b50505050565b6001600160a01b038116811461161c57600080fd5b801515811461161c57600080fdfe00000000000000000000000019d3364a399d251e894ac732651be8b0e4e850010000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa2646970667358221220527e47e03bf59e936d3043c36fbe1c22d0fd92276d61071ec257465628b1e30764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a9fe4601811213c340e850ea305481aff02f5b28
-----Decoded View---------------
Arg [0] : _vault (address): 0xa9fE4601811213c340e850ea305481afF02f5b28
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a9fe4601811213c340e850ea305481aff02f5b28
Deployed Bytecode Sourcemap
53510:15083:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61897:173;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53037:444;;;;;;:::i;:::-;;:::i;:::-;;27156:25;;;:::i;:::-;;;;;;;:::i;56298:118::-;;;:::i;36183:175::-;;;;;;:::i;:::-;;:::i;54554:94::-;;;:::i;:::-;;;;;;;:::i;56631:84::-;;;;;;:::i;:::-;;:::i;30203:32::-;;;:::i;:::-;;;;;;;:::i;28917:18::-;;;:::i;28826:25::-;;;:::i;38856:148::-;;;:::i;27466:91::-;;;:::i;65877:115::-;;;;;;:::i;:::-;;:::i;56424:99::-;;;;;;:::i;:::-;;:::i;54869:85::-;;;:::i;29809:37::-;;;:::i;49617:515::-;;;;;;:::i;:::-;;:::i;53993:81::-;;;:::i;56212:78::-;;;:::i;55195:16::-;;;:::i;34232:154::-;;;;;;:::i;:::-;;:::i;53718:82::-;;;:::i;54777:83::-;;;:::i;43609:170::-;;;:::i;48002:1371::-;;;:::i;54081:92::-;;;:::i;55218:17::-;;;:::i;30286:25::-;;;:::i;62078:532::-;;;:::i;65222:279::-;;;;;;:::i;:::-;;:::i;53897:89::-;;;:::i;55242:18::-;;;:::i;56723:137::-;;;;;;:::i;:::-;;:::i;32989:174::-;;;;;;:::i;:::-;;:::i;36661:171::-;;;;;;:::i;:::-;;:::i;66475:284::-;;;:::i;54370:81::-;;;:::i;30019:33::-;;;:::i;57320:165::-;;;:::i;35457:169::-;;;;;;:::i;:::-;;:::i;55057:40::-;;;:::i;29654:33::-;;;:::i;54961:87::-;;;:::i;28858:22::-;;;:::i;54180:90::-;;;:::i;54655:95::-;;;:::i;54458:87::-;;;:::i;28887:21::-;;;:::i;56531:92::-;;;;;;:::i;:::-;;:::i;57011:107::-;;;:::i;66767:757::-;;;;;;:::i;:::-;;:::i;55150:13::-;;;:::i;55104:37::-;;;:::i;57126:186::-;;;:::i;32233:202::-;;;;;;:::i;:::-;;:::i;54277:86::-;;;:::i;50723:311::-;;;;;;:::i;:::-;;:::i;63024:333::-;;;:::i;62836:176::-;;;:::i;33452:263::-;;;;;;:::i;:::-;;:::i;45519:1677::-;;;;;;:::i;:::-;;:::i;55170:18::-;;;:::i;56868:135::-;;;:::i;34903:154::-;;;;;;:::i;:::-;;:::i;67532:200::-;;;:::i;53807:81::-;;;:::i;66277:190::-;;;;;;:::i;:::-;;:::i;28798:21::-;;;:::i;51463:164::-;;;:::i;65750:119::-;;;;;;:::i;:::-;;:::i;61897:173::-;61940:4;62037:24;62057:3;62038:13;62044:6;;62038:1;;:5;;:13;;;;:::i;:::-;62037:19;;:24::i;:::-;62017:17;62032:1;62017:14;:17::i;:::-;:44;62009:53;;61897:173;;:::o;53037:444::-;30653:12;:10;:12::i;:::-;-1:-1:-1;;;;;30639:26:0;:10;-1:-1:-1;;;;;30639:26:0;;30631:50;;;;-1:-1:-1;;;30631:50:0;;;;;;;:::i;:::-;;;;;;;;;53129:4:::1;::::0;-1:-1:-1;;;;;53111:23:0;;::::1;53129:4:::0;::::1;53111:23;;53103:41;;;;-1:-1:-1::0;;;53103:41:0::1;;;;;;;:::i;:::-;53181:5;::::0;-1:-1:-1;;;;;53163:24:0;;::::1;53181:5:::0;::::1;53163:24;;53155:44;;;;-1:-1:-1::0;;;53155:44:0::1;;;;;;;:::i;:::-;53212:33;53248:17;:15;:17::i;:::-;53212:53;;53281:9;53276:102;53296:16;:23;53292:1;:27;53276:102;;;53344:16;53361:1;53344:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53334:29:0::1;:6;-1:-1:-1::0;;;;;53334:29:0::1;;;53326:52;;;;-1:-1:-1::0;;;53326:52:0::1;;;;;;;:::i;:::-;53321:3;;53276:102;;;;53391:82;53419:12;:10;:12::i;:::-;53433:39;::::0;-1:-1:-1;;;53433:39:0;;-1:-1:-1;;;;;53433:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;53466:4:::1;::::0;53433:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53391:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;30692:1;53037:444:::0;:::o;27156:25::-;;;;;;;;;;;;;;;-1:-1:-1;;27156:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56298:118::-;56372:36;;;;;;;;;;;;;;;;;56298:118;:::o;36183:175::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;36268:13:::1;:30:::0;;;36314:36:::1;::::0;::::1;::::0;::::1;::::0;36284:14;;36314:36:::1;:::i;:::-;;;;;;;;36183:175:::0;:::o;54554:94::-;54605:42;54554:94;:::o;56631:84::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;56695:4:::1;:12:::0;56631:84::o;30203:32::-;;;;:::o;28917:18::-;;;-1:-1:-1;;;;;28917:18:0;;:::o;28826:25::-;;;-1:-1:-1;;;;;28826:25:0;;:::o;38856:148::-;38921:5;;:31;;-1:-1:-1;;;38921:31:0;;38897:4;;;;-1:-1:-1;;;;;38921:5:0;;;;:16;;:31;;38946:4;;38921:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;38995:1;38970:22;:20;:22::i;38921:75::-;38914:82;;38856:148;:::o;27466:91::-;27535:14;;;;;;;;;;;;-1:-1:-1;;;27535:14:0;;;;27466:91;:::o;65877:115::-;30653:12;:10;:12::i;:::-;-1:-1:-1;;;;;30639:26:0;:10;-1:-1:-1;;;;;30639:26:0;;30631:50;;;;-1:-1:-1;;;30631:50:0;;;;;;;:::i;:::-;65978:5:::1;::::0;65939:45:::1;::::0;-1:-1:-1;;;65939:45:0;;53943:42:::1;::::0;65939:30:::1;::::0;:45:::1;::::0;65970:6;;65939:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65877:115:::0;:::o;56424:99::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;56509:1:::1;:6:::0;56424:99::o;54869:85::-;54911:42;54869:85;:::o;29809:37::-;;;;:::o;49617:515::-;49732:5;;49676:13;;-1:-1:-1;;;;;49732:5:0;49710:10;:28;49702:47;;;;-1:-1:-1;;;49702:47:0;;;;;;;:::i;:::-;49835:19;49888:32;49906:13;49888:17;:32::i;:::-;50012:4;;49865:55;;-1:-1:-1;49865:55:0;;-1:-1:-1;50012:42:0;;-1:-1:-1;;;;;50012:4:0;50030:10;49865:55;50012:17;:42::i;:::-;49617:515;;;;:::o;53993:81::-;54031:42;53993:81;:::o;56212:78::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;56269:13:::1;:11;:13::i;:::-;56212:78::o:0;55195:16::-;;;;:::o;34232:154::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;34310:14:::1;:23:::0;;;34349:29:::1;::::0;::::1;::::0;::::1;::::0;34327:6;;34349:29:::1;:::i;53718:82::-:0;53757:42;53718:82;:::o;54777:83::-;-1:-1:-1;;;;;;;;;;;54777:83:0;:::o;43609:170::-;30779:6;;-1:-1:-1;;;;;30779:6:0;30765:10;:20;;:65;;-1:-1:-1;30820:10:0;;-1:-1:-1;;;;;30820:10:0;30806;:24;30765:65;:112;;;;30865:12;:10;:12::i;:::-;-1:-1:-1;;;;;30851:26:0;:10;-1:-1:-1;;;;;30851:26:0;;30765:112;:163;;;;30912:5;;;;;;;;;-1:-1:-1;;;;;30912:5:0;-1:-1:-1;;;;;30912:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30898:30:0;:10;-1:-1:-1;;;;;30898:30:0;;30765:163;:216;;;;30963:5;;;;;;;;;-1:-1:-1;;;;;30963:5:0;-1:-1:-1;;;;;30963:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30949:32:0;:10;-1:-1:-1;;;;;30949:32:0;;30765:216;30743:277;;;;-1:-1:-1;;;30743:277:0;;;;;;;:::i;:::-;43747:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;43747:23:0;;;;43732:39:::1;::::0;-1:-1:-1;;;;;43747:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43732:14;:39::i;48002:1371::-:0;30779:6;;-1:-1:-1;;;;;30779:6:0;30765:10;:20;;:65;;-1:-1:-1;30820:10:0;;-1:-1:-1;;;;;30820:10:0;30806;:24;30765:65;:112;;;;30865:12;:10;:12::i;:::-;-1:-1:-1;;;;;30851:26:0;:10;-1:-1:-1;;;;;30851:26:0;;30765:112;:163;;;;30912:5;;;;;;;;;-1:-1:-1;;;;;30912:5:0;-1:-1:-1;;;;;30912:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30898:30:0;:10;-1:-1:-1;;;;;30898:30:0;;30765:163;:216;;;;30963:5;;;;;;;;;-1:-1:-1;;;;;30963:5:0;-1:-1:-1;;;;;30963:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30949:32:0;:10;-1:-1:-1;;;;;30949:32:0;;30765:216;30743:277;;;;-1:-1:-1;;;30743:277:0;;;;;;;:::i;:::-;48053:14:::1;48082:12:::0;48109:23:::1;48135:5;;;;;;;;;-1:-1:-1::0;;;;;48135:5:0::1;-1:-1:-1::0;;;;;48135:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48207:13;::::0;48109:49;;-1:-1:-1;48169:19:0::1;::::0;48207:13:::1;;48203:731;;;48289:19;48311:22;:20;:22::i;:::-;48289:44;;48467:80;48499:15;48485:11;:29;:61;;48531:15;48485:61;;;48517:11;48485:61;48467:17;:80::i;:::-;48445:102:::0;-1:-1:-1;48445:102:0;-1:-1:-1;48625:29:0;;::::1;48621:159;;;48684:32;:11:::0;48700:15;48684::::1;:32::i;:::-;48675:41;;48749:15;48735:29;;48621:159;48203:731;;;;48892:30;48906:15;48892:13;:30::i;:::-;48862:60:::0;;-1:-1:-1;48862:60:0;-1:-1:-1;48862:60:0;-1:-1:-1;48203:731:0::1;49148:5;::::0;:39:::1;::::0;-1:-1:-1;;;49148:39:0;;-1:-1:-1;;;;;49148:5:0;;::::1;::::0;:12:::1;::::0;:39:::1;::::0;49161:6;;49169:4;;49175:11;;49148:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49130:57;;49263:31;49278:15;49263:14;:31::i;:::-;49312:53;49322:6;49330:4;49336:11;49349:15;49312:53;;;;;;;;;:::i;:::-;;;;;;;;31031:1;;;;48002:1371::o:0;54081:92::-;54130:42;54081:92;:::o;55218:17::-;;;;:::o;30286:25::-;;;;;;:::o;62078:532::-;62121:4;62219:10;62232;62238:3;62232:1;;:5;;:10;;;;:::i;:::-;62219:23;;62253:13;62269:17;62284:1;62269:14;:17::i;:::-;62253:33;;62312:27;62335:3;62312:18;62328:1;;55092:5;62312:15;;:18;;;;:::i;:27::-;62301:8;:38;62297:109;;;62367:27;62390:3;62367:18;62383:1;;55092:5;62367:15;;:18;;;;:::i;:27::-;62356:38;;62297:109;62431:5;62420:8;:16;62416:168;;;62453:6;62462:20;:18;:20::i;:::-;62453:29;-1:-1:-1;62497:9:0;62509:19;:8;62522:5;62509:12;:19::i;:::-;62497:31;-1:-1:-1;62550:22:0;62566:5;62550:11;:1;62497:31;62550:5;:11::i;:::-;:15;;:22::i;:::-;62543:29;;;;;;;;62416:168;62601:1;62594:8;;;;62078:532;:::o;65222:279::-;65291:4;65312:17;:15;:17::i;:::-;65308:185;;-1:-1:-1;65343:5:0;65336:12;;65308:185;65371:13;:11;:13::i;:::-;:122;;;;65389:12;:10;:12::i;:::-;:103;;;;;65439:53;65487:4;65439:43;65469:12;;65439:25;65452:11;:9;:11::i;:::-;65439:8;;:12;:25::i;:53::-;65405:31;65423:12;:10;:12::i;:::-;65405:17;:31::i;:::-;:87;65389:103;65364:129;;65308:185;65222:279;;;:::o;53897:89::-;53943:42;53897:89;:::o;55242:18::-;;;-1:-1:-1;;;;;55242:18:0;;:::o;56723:137::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;56797:9:::1;56793:59;;;56808:3;:13:::0;;-1:-1:-1;;;;;;56808:13:0::1;54911:42;56808:13;::::0;;56793:59:::1;;;56837:3;:15:::0;;-1:-1:-1;;;;;;56837:15:0::1;55005:42;56837:15;::::0;;56793:59:::1;56723:137:::0;:::o;32989:174::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33068:21:0;::::1;33060:30;;;::::0;::::1;;33101:6;:16:::0;;-1:-1:-1;;;;;;33101:16:0::1;-1:-1:-1::0;;;;;33101:16:0;::::1;;::::0;;33133:22:::1;::::0;::::1;::::0;::::1;::::0;33101:16;;33133:22:::1;:::i;36661:171::-:0;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;36750:26:::1;:11;36764:12:::0;;36750:26:::1;:::i;:::-;;36792:32;36811:12;;36792:32;;;;;;;:::i;:::-;;;;;;;;36661:171:::0;;:::o;66475:284::-;66594:5;;66564:36;;-1:-1:-1;;;66564:36:0;;66526:4;;;;53943:42;;66564:29;;:36;;66594:5;66564:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66622:34;;-1:-1:-1;;;66622:34:0;;66543:57;;-1:-1:-1;66611:8:0;;54031:42;;66622:17;;:34;;-1:-1:-1;;;66640:3:0;66543:57;;66622:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;66683:22;;-1:-1:-1;;;66683:22:0;;66622:38;;-1:-1:-1;66671:9:0;;54031:42;;66683:17;;:22;;-1:-1:-1;;;66701:3:0;66683:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;;-1:-1:-1;66728:23:0;-1:-1:-1;;;66728:13:0;:3;66683:27;66728:7;:13::i;:23::-;66721:30;;;;;66475:284;:::o;54370:81::-;54408:42;54370:81;:::o;30019:33::-;;;;:::o;57320:165::-;57379:7;57406:71;57459:17;57474:1;57459:14;:17::i;:::-;57406:48;57450:3;57406:39;55092:5;57406:22;:20;:22::i;35457:169::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;35540:12:::1;:28:::0;;;35584:34:::1;::::0;::::1;::::0;::::1;::::0;35555:13;;35584:34:::1;:::i;55057:40::-:0;55092:5;55057:40;:::o;29654:33::-;;;;:::o;54961:87::-;55005:42;54961:87;:::o;28858:22::-;;;-1:-1:-1;;;;;28858:22:0;;:::o;54180:90::-;54227:42;54180:90;:::o;54655:95::-;54707:42;54655:95;:::o;54458:87::-;54502:42;54458:87;:::o;28887:21::-;;;-1:-1:-1;;;;;28887:21:0;;:::o;56531:92::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;56599:6:::1;:16:::0;56531:92::o;57011:107::-;57081:4;;:29;;-1:-1:-1;;;57081:29:0;;57057:4;;-1:-1:-1;;;;;57081:4:0;;:14;;:29;;57104:4;;57081:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;66767:757::-;66825:4;66842:9;66869:21;66908:16;66927:20;:18;:20::i;:::-;66908:39;-1:-1:-1;66964:16:0;66960:64;;-1:-1:-1;;66997:15:0;;;;;;;66960:64;67043:22;;-1:-1:-1;;;67043:22:0;;54031:42;;67043:17;;:22;;-1:-1:-1;;;67061:3:0;67043:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;;;67100:28;;-1:-1:-1;;;67100:28:0;;67043:27;;-1:-1:-1;54320:42:0;;67100:23;;:28;;-1:-1:-1;;;67124:3:0;67100:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;;-1:-1:-1;67143:18:0;67164:36;-1:-1:-1;;;67164:26:0;:4;67100:32;67164:8;:26::i;:36::-;67143:57;;67220:13;67236:17;:15;:17::i;:::-;67220:33;;67279:6;67268:8;:17;67264:126;;;-1:-1:-1;67313:1:0;67264:126;;;67358:20;:8;67371:6;67358:12;:20::i;:::-;67347:31;;67264:126;67402:14;67419:37;67451:4;67419:27;:8;67432:13;67419:12;:27::i;:37::-;67402:54;-1:-1:-1;67481:35:0;67512:3;67481:26;67402:54;67495:11;67481:13;:26::i;:35::-;67474:42;66767:757;-1:-1:-1;;;;;;;;66767:757:0:o;55150:13::-;;;;:::o;55104:37::-;-1:-1:-1;;;55104:37:0;:::o;57126:186::-;57242:5;;57212:36;;-1:-1:-1;;;57212:36:0;;57174:4;;;;53943:42;;57212:29;;:36;;57242:5;57212:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57266:34;;-1:-1:-1;;;57266:34:0;;57191:57;;-1:-1:-1;54031:42:0;;57266:17;;:34;;-1:-1:-1;;;57284:3:0;57191:57;;57266:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;-1:-1:-1;;57126:186:0;:::o;32233:202::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32320:25:0;::::1;32312:34;;;::::0;::::1;;32357:10;:24:::0;;-1:-1:-1;;;;;;32357:24:0::1;-1:-1:-1::0;;;;;32357:24:0;::::1;;::::0;;32397:30:::1;::::0;::::1;::::0;::::1;::::0;32357:24;;32397:30:::1;:::i;54277:86::-:0;54320:42;54277:86;:::o;50723:311::-;50812:5;;-1:-1:-1;;;;;50812:5:0;50790:10;:28;;:58;;;50836:12;:10;:12::i;:::-;-1:-1:-1;;;;;50822:26:0;:10;-1:-1:-1;;;;;50822:26:0;;50790:58;50782:67;;;;;;50906:5;;50868:34;;;-1:-1:-1;;;50868:34:0;;;;-1:-1:-1;;;;;50906:5:0;;;;50868:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50868:43:0;;50860:52;;;;;;50923:30;50940:12;50923:16;:30::i;:::-;50996:4;;:29;;-1:-1:-1;;;50996:29:0;;50964:62;;50982:12;;-1:-1:-1;;;;;50996:4:0;;;;:14;;:29;;51019:4;;50996:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50964:4;;-1:-1:-1;;;;;50964:4:0;;:62;:17;:62::i;63024:333::-;63068:4;63085:10;63098;63104:3;63098:1;;:5;;:10;;;;:::i;:::-;63085:23;;63119:13;63135:17;63150:1;63135:14;:17::i;:::-;63119:33;;63178:5;63167:8;:16;63163:168;;;63200:6;63209:20;:18;:20::i;:::-;63200:29;-1:-1:-1;63244:9:0;63256:19;:5;63266:8;63256:9;:19::i;62836:176::-;62880:4;62977:26;62999:3;62978:15;62991:1;62984:6;;:8;;;;;62978:1;;;62984:8;;62978:5;:15::i;62977:26::-;62957:17;62972:1;62957:14;:17::i;:::-;:46;62949:55;;62836:176;:::o;33452:263::-;30540:10;;-1:-1:-1;;;;;30540:10:0;30526;:24;30518:48;;;;-1:-1:-1;;;30518:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33533:22:0;::::1;33525:31;;;::::0;::::1;;33567:5;::::0;33581:7:::1;::::0;33567:25:::1;::::0;-1:-1:-1;;;33567:25:0;;-1:-1:-1;;;;;33567:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;33581:7;::::1;::::0;33567:5:::1;::::0;:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;33603:7:0::1;:18:::0;;-1:-1:-1;;;;;;33603:18:0::1;-1:-1:-1::0;;;;;33603:18:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;33632:5:0;:35:::1;::::0;-1:-1:-1;;;33632:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;33646:7;::::1;::::0;-1:-1:-1;;33663:2:0;33632:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33683:24;33698:8;33683:24;;;;;;:::i;45519:1677::-:0;45590:4;45607:28;;:::i;:::-;45638:5;;:31;;-1:-1:-1;;;45638:31:0;;-1:-1:-1;;;;;45638:5:0;;;;:16;;:31;;45663:4;;45638:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45607:62;;45746:6;:17;;;45767:1;45746:22;45742:40;;;45777:5;45770:12;;;;;45742:40;45927:14;;45906:17;;;;45886:38;;:15;;:19;:38::i;:::-;:55;45882:73;;;45950:5;45943:12;;;;;45882:73;46074:14;;46052:17;;;;46032:38;;:15;;:19;:38::i;:::-;:56;46028:73;;46097:4;46090:11;;;;;46028:73;46531:5;;:23;;;-1:-1:-1;;;46531:23:0;;;;46509:19;;-1:-1:-1;;;;;46531:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46509:45;;46583:13;;46569:11;:27;46565:44;;;46605:4;46598:11;;;;;;46565:44;46663:13;46679:22;:20;:22::i;:::-;46663:38;;46791:6;:16;;;46764:24;46774:13;;46764:5;:9;;:24;;;;:::i;:::-;:43;46760:60;;;46816:4;46809:11;;;;;;;46760:60;46833:14;46874:6;:16;;;46866:5;:24;46862:66;;;46911:16;;;;46901:27;;:5;;:9;:27::i;:::-;46892:36;;46862:66;47098:5;;:23;;;-1:-1:-1;;;47098:23:0;;;;47081:14;;-1:-1:-1;;;;;47098:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47081:40;-1:-1:-1;47169:18:0;47081:40;47180:6;47169:10;:18::i;:::-;47140:12;;:26;;47157:8;47140:16;:26::i;:::-;:47;;45519:1677;-1:-1:-1;;;;;;;45519:1677:0:o;55170:18::-;;;;:::o;56868:135::-;56930:7;56957:38;56977:17;:15;:17::i;:::-;56957:15;:13;:15::i;:::-;:19;;:38::i;34903:154::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;34981:14:::1;:23:::0;;;35020:29:::1;::::0;::::1;::::0;::::1;::::0;34998:6;;35020:29:::1;:::i;67532:200::-:0;67581:4;67605:119;67719:4;67605:91;-1:-1:-1;;;;;;;;;;;;;;;;67666:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67605:38;;-1:-1:-1;;;67605:38:0;;-1:-1:-1;;;;;;;;;;;54817:42:0;67605:23;;:38;;67637:4;;67605:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53807:81::-;-1:-1:-1;;;;;;;;;;;53807:81:0;:::o;66277:190::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;66354:11;;66350:38:::1;;66367:21;66380:7;66367:12;:21::i;:::-;;66350:38;66422:36;::::0;-1:-1:-1;;;66422:36:0;;66399:60:::1;::::0;66419:1:::1;::::0;-1:-1:-1;;;;;;;;;;;53845:42:0;66422:21:::1;::::0;:36:::1;::::0;66452:4:::1;::::0;66422:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66399:19;:60::i;28798:21::-:0;;;-1:-1:-1;;;;;28798:21:0;;:::o;51463:164::-;30397:10;;-1:-1:-1;;;;;30397:10:0;30383;:24;;:54;;;30425:12;:10;:12::i;:::-;-1:-1:-1;;;;;30411:26:0;:10;-1:-1:-1;;;;;30411:26:0;;30383:54;30375:78;;;;-1:-1:-1;;;30375:78:0;;;;;;;:::i;:::-;51526:13:::1;:20:::0;;-1:-1:-1;;51526:20:0::1;51542:4;51526:20:::0;;::::1;::::0;;;51557:5;:22:::1;::::0;;-1:-1:-1;;;51557:22:0;;;;-1:-1:-1;;;;;51557:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;51526:13:::1;::::0;51557:22;;;;;;;;51526:13;51557:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51597:22:0::1;::::0;::::1;::::0;-1:-1:-1;51597:22:0;;-1:-1:-1;51597:22:0::1;51463:164::o:0;65750:119::-;30653:12;:10;:12::i;:::-;-1:-1:-1;;;;;30639:26:0;:10;-1:-1:-1;;;;;30639:26:0;;30631:50;;;;-1:-1:-1;;;30631:50:0;;;;;;;:::i;:::-;65847:5:::1;::::0;65813:48:::1;::::0;-1:-1:-1;;;65813:48:0;;53943:42:::1;::::0;65813:33:::1;::::0;:48:::1;::::0;65847:5;65854:3;;65859:1:::1;::::0;65813:48:::1;;;:::i;20554:622::-:0;20924:10;;;20923:62;;-1:-1:-1;20940:39:0;;-1:-1:-1;;;20940:39:0;;-1:-1:-1;;;;;20940:15:0;;;;;:39;;20964:4;;20971:7;;20940:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;20923:62;20915:152;;;;-1:-1:-1;;;20915:152:0;;;;;;;:::i;:::-;21078:90;21098:5;21128:22;;;21152:7;21161:5;21105:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21105:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21105:62:0;-1:-1:-1;;;;;;21105:62:0;;;;;;;;;;21078:19;:90::i;:::-;20554:622;;;:::o;6399:196::-;6502:12;6534:53;6557:6;6565:4;6571:1;6574:12;6534:22;:53::i;:::-;6527:60;6399:196;-1:-1:-1;;;;6399:196:0:o;12439:181::-;12497:7;12529:5;;;12553:6;;;;12545:46;;;;-1:-1:-1;;;12545:46:0;;;;;;;:::i;:::-;12611:1;-1:-1:-1;12439:181:0;;;;;:::o;13793:471::-;13851:7;14096:6;14092:47;;-1:-1:-1;14126:1:0;14119:8;;14092:47;14163:5;;;14167:1;14163;:5;:1;14187:5;;;;;:10;14179:56;;;;-1:-1:-1;;;14179:56:0;;;;;;;:::i;36986:98::-;37058:5;;:18;;;-1:-1:-1;;;37058:18:0;;;;37031:7;;-1:-1:-1;;;;;37058:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;66000:269::-;66158:16;;;66172:1;66158:16;;;66095;66158;;;;;66095;;;66158;66172:1;66158:16;;;;;;;;;;-1:-1:-1;66158:16:0;66129:45;;-1:-1:-1;;;;;;;;;;;66185:9:0;66195:1;66185:12;;;;;;;;;;;;;:20;-1:-1:-1;;;;;66185:20:0;;;-1:-1:-1;;;;;66185:20:0;;;;;-1:-1:-1;;;;;;;;;;;66216:9:0;66226:1;66216:12;;;;;;;;-1:-1:-1;;;;;66216:18:0;;;:12;;;;;;;;;;;:18;66252:9;-1:-1:-1;66000:269:0;:::o;19895:177::-;19978:86;19998:5;20028:23;;;20053:2;20057:5;20005:58;;;;;;;;;:::i;63594:770::-;63698:25;63725:13;63760:20;:18;:20::i;:::-;:25;;;;:85;;-1:-1:-1;63835:1:0;;:10;;63841:3;63835:5;:10::i;:::-;63803:29;63818:13;63803:14;:29::i;:::-;:42;63760:85;63756:321;;;63862:6;63871:11;:9;:11::i;:::-;63862:20;;63897:93;63910:79;63984:4;63910:69;63961:17;63976:1;63961:14;:17::i;:::-;63910:46;63952:3;63910:37;55092:5;63910:37;:13;63928:1;63910:17;:20::i;:79::-;63897:12;:93::i;:::-;-1:-1:-1;64028:36:0;;-1:-1:-1;;;64028:36:0;;64005:60;;64025:1;;-1:-1:-1;;;;;;;;;;;53845:42:0;64028:21;;:36;;64058:4;;64028:36;;;:::i;64005:60::-;63756:321;;64134:28;;-1:-1:-1;;;64134:28:0;;:42;;64171:4;;54320:42;;64134:23;;:28;;-1:-1:-1;;;64158:3:0;64134:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;;:36;:42::i;:::-;64101:29;64116:13;64101:14;:29::i;:::-;:75;64097:260;;-1:-1:-1;64201:1:0;;-1:-1:-1;64204:13:0;64193:25;;64097:260;64260:37;64280:13;64295:1;64260:19;:37::i;:::-;64332:13;64312:33;;64097:260;63594:770;;;:::o;55657:547::-;55700:4;;:31;;-1:-1:-1;;;55700:31:0;;-1:-1:-1;;;;;55700:4:0;;;;:12;;:31;;54130:42;;55700:4;;:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55742:4:0;;:38;;-1:-1:-1;;;55742:38:0;;-1:-1:-1;;;;;55742:4:0;;;;:12;;:38;;54130:42;;-1:-1:-1;;55776:2:0;55742:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55791:36:0;;-1:-1:-1;;;55791:36:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;55791:19;;:36;;54227:42;;55825:1;;55791:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55838:43:0;;-1:-1:-1;;;55838:43:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;55838:19;;:43;;54227:42;;-1:-1:-1;;55877:2:0;55838:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55892:31:0;;-1:-1:-1;;;55892:31:0;;54031:42;;55892:17;;:31;;54227:42;;55892:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55934:29:0;;-1:-1:-1;;;55934:29:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;-1:-1:-1;55934:19:0;;-1:-1:-1;55934:29:0;;-1:-1:-1;;;;;;;;;;;54817:42:0;55961:1;;55934:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55974:36:0;;-1:-1:-1;;;55974:36:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;55974:19;;:36;;-1:-1:-1;;;;;;;;;;;54817:42:0;-1:-1:-1;;56006:2:0;55974:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56021:31:0;;-1:-1:-1;;;56021:31:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;56021:19;;:31;;54911:42;;56050:1;;56021:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56063:38:0;;-1:-1:-1;;;56063:38:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;56063:19;;:38;;54911:42;;-1:-1:-1;;56097:2:0;56063:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56112:33:0;;-1:-1:-1;;;56112:33:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;56112:19;;:33;;55005:42;;56143:1;;56112:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56156:40:0;;-1:-1:-1;;;56156:40:0;;-1:-1:-1;;;;;;;;;;;53845:42:0;56156:19;;:40;;55005:42;;-1:-1:-1;;56192:2:0;56156:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59132:407::-;59215:13;;;;;:58;;;59251:22;:20;:22::i;:::-;59232:16;:41;59215:58;59211:71;;;59275:7;;59211:71;59292:22;;-1:-1:-1;;;59292:22:0;;54408:42;;59292:17;;:22;;-1:-1:-1;;;59310:3:0;59292:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59367:32:0;;-1:-1:-1;;;59367:32:0;;54502:42;;59367:27;;:32;;-1:-1:-1;;;59395:3:0;59367:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59444:10;:8;:10::i;:::-;59469:12;:10;:12::i;:::-;59465:66;;;59483:6;:4;:6::i;:::-;59465:66;;;59509:13;:11;:13::i;:::-;59505:26;;;59524:7;:5;:7::i;12903:136::-;12961:7;12988:43;12992:1;12995;12988:43;;;;;;;;;;;;;;;;;:3;:43::i;57493:1631::-;57730:4;;:29;;-1:-1:-1;;;57730:29:0;;57610:15;;;;;;;;-1:-1:-1;;;;;57730:4:0;;;;:14;;:29;;57753:4;;57730:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57716:43;;57770:6;57779:18;:16;:18::i;:::-;57770:27;;57808:6;57817:20;:18;:20::i;:::-;57808:29;;57856:1;57852;:5;57848:118;;;57874:22;57887:8;:1;57893;57887:5;:8::i;57874:22::-;-1:-1:-1;57917:36:0;;-1:-1:-1;;;57917:36:0;;57911:43;;-1:-1:-1;;;;;;;;;;;53845:42:0;57917:21;;:36;;57947:4;;57917:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57911:5;:43::i;:::-;57990:4;;:29;;-1:-1:-1;;;57990:29:0;;57976:11;;-1:-1:-1;;;;;57990:4:0;;:14;;:29;;58013:4;;57990:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57976:43;-1:-1:-1;58040:18:0;57976:43;58051:6;58040:10;:18::i;:::-;58030:28;;58071:11;58085:22;:20;:22::i;:::-;58131:5;;:31;;-1:-1:-1;;;58131:31:0;;58071:36;;-1:-1:-1;58118:10:0;;-1:-1:-1;;;;;58131:5:0;;;;:16;;:31;;58156:4;;58131:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;58118:54;;58195:5;58186:6;:14;58183:94;;;58233:6;58225:5;:14;58217:22;;58264:1;58254:11;;58183:94;58301:6;58293:5;:14;58289:445;;;58324:18;58345:17;:6;58356:5;58345:10;:17::i;:::-;58324:38;;58394:7;58381:10;:20;58377:81;;;58432:10;58422:20;;58377:81;58486:6;58476:7;:16;58472:251;;;58513:38;58531:19;:7;58543:6;58531:11;:19::i;58513:38::-;-1:-1:-1;;58579:4:0;;:29;;-1:-1:-1;;;58579:29:0;;-1:-1:-1;;;;;58579:4:0;;;;:14;;:29;;58602:4;;58579:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58570:38;;58641:6;58631:7;:16;58627:81;;;58682:6;58672:16;;58627:81;58289:445;;58746:11;58772:20;;58768:113;;58834:35;58852:16;58834:17;:35::i;:::-;58809:60;;-1:-1:-1;58809:60:0;-1:-1:-1;58768:113:0;58899:17;:5;58909:6;58899:9;:17::i;:::-;58891:25;;58943:5;58933:7;:15;58929:188;;;58975:15;;;;;59013:1;;58929:188;;;59104:1;;59064:15;;;;58929:188;57493:1631;;;;;;;;;;;;:::o;14740:132::-;14798:7;14825:39;14829:1;14832;14825:39;;;;;;;;;;;;;;;;;:3;:39::i;59941:350::-;59985:6;60005:10;54605:42;-1:-1:-1;;;;;60020:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60004:53;;;60069:15;54605:42;-1:-1:-1;;;;;60089:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60068:63;;;60159:5;60146:10;:18;:39;;60180:5;60146:39;;;60167:10;60146:39;60142:43;-1:-1:-1;60200:6:0;60196:87;;60215:68;60278:4;54707:42;-1:-1:-1;;;;;60220:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60215:68;60208:75;;;;;;60196:87;59941:350;;;:::o;60299:531::-;60362:15;60445:23;;:::i;:::-;60471:22;;-1:-1:-1;;;60471:22:0;;54031:42;;60471:17;;:22;;-1:-1:-1;;;60489:3:0;60471:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60445:48;;60504:10;60517:33;-1:-1:-1;;;60517:23:0;60530:4;:9;;;60517:4;:8;;;:12;;:23;;;;:::i;:33::-;60504:46;;60583:4;:9;;;60575:5;:17;60571:31;;;60601:1;60594:8;;;;;;60571:31;60657:30;-1:-1:-1;;;60657:20:0;60671:5;60657:4;:9;;;:13;;:20;;;;:::i;:30::-;60725:9;;;;60644:43;;-1:-1:-1;60702:20:0;60644:43;-1:-1:-1;;;60702:14:0;:20::i;:::-;:32;60698:46;;;60743:1;60736:8;;;;;;60698:46;60794:6;60781:10;:19;:41;;60816:6;60781:41;;;-1:-1:-1;60803:10:0;;60774:48;-1:-1:-1;;60299:531:0:o;65509:233::-;65620:5;;65586:57;;-1:-1:-1;;;65586:57:0;;53943:42;;65586:33;;:57;;65620:5;65627:12;;65641:1;;65586:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65695:38:0;;-1:-1:-1;;;65695:38:0;;65654:80;;-1:-1:-1;65681:12:0;;-1:-1:-1;;;;;;;;;;;;54817:42:0;65695:23;;:38;;65727:4;;65695:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;54817:42:0;65654:80;:26;:80::i;67740:564::-;67794:4;67811:12;67826:104;-1:-1:-1;;;;;;;;;;;;;;;;67900:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67826:43;:7;67864:4;67826:37;:43::i;:104::-;67957:38;;-1:-1:-1;;;67957:38:0;;67811:119;;-1:-1:-1;;;;;;;;;;;;54817:42:0;67957:23;;:38;;67989:4;;67957:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67947:7;:48;67943:129;;;68022:38;;-1:-1:-1;;;68022:38:0;;-1:-1:-1;;;;;;;;;;;54817:42:0;68022:23;;:38;;68054:4;;68022:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68012:48;;67943:129;68099:36;;-1:-1:-1;;;68099:36:0;;68084:12;;-1:-1:-1;;;;;;;;;;;53845:42:0;68099:21;;:36;;68129:4;;68099:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68193:4;;68146:52;;-1:-1:-1;;;68146:52:0;;68084:51;;-1:-1:-1;;;;;;;;;;;;54817:42:0;68146:22;;:52;;68169:7;;68186:4;;68146:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68223:36:0;;-1:-1:-1;;;68223:36:0;;68209:11;;-1:-1:-1;;;;;;;;;;;;53845:42:0;-1:-1:-1;68223:21:0;;:36;;68253:4;;68223:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68209:50;-1:-1:-1;68277:19:0;68209:50;68288:7;68277:10;:19::i;:::-;68270:26;67740:564;-1:-1:-1;;;;;67740:564:0:o;64372:447::-;64486:5;;64456:36;;-1:-1:-1;;;64456:36:0;;64442:11;;53943:42;;64456:29;;:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64442:50;-1:-1:-1;64507:8:0;;64503:60;;64519:41;;-1:-1:-1;;;64519:41:0;;54227:42;;64519:30;;:41;;64550:3;;64555:4;;64519:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64503:60;53943:42;-1:-1:-1;;;;;64573:29:0;;64603:5;;64611:10;64617:3;64611:5;:10::i;:::-;64610:11;;64623:40;54031:42;-1:-1:-1;;;;;64636:16:0;;64653:3;64636:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64659:3;64623:12;:40::i;:::-;64573:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64705:5:0;;64675:56;;-1:-1:-1;;;64675:56:0;;53943:42;;-1:-1:-1;64675:29:0;;-1:-1:-1;64675:56:0;;64705:5;64720:4;;64727:3;;64675:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64752:1;64746:3;:7;64742:70;;;64757:52;;-1:-1:-1;;;64757:52:0;;54130:42;;64757:32;;:52;;64798:4;;64805:3;;64757:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64372:447;;;:::o;22200:761::-;22624:23;22650:69;22678:4;22650:69;;;;;;;;;;;;;;;;;22658:5;-1:-1:-1;;;;;22650:27:0;;;:69;;;;;:::i;:::-;22734:17;;22624:95;;-1:-1:-1;22734:21:0;22730:224;;22876:10;22865:30;;;;;;;;;;;;:::i;:::-;22857:85;;;;-1:-1:-1;;;22857:85:0;;;;;;;:::i;7776:979::-;7906:12;7939:18;7950:6;7939:10;:18::i;:::-;7931:60;;;;-1:-1:-1;;;7931:60:0;;;;;;;:::i;:::-;8065:12;8079:23;8106:6;-1:-1:-1;;;;;8106:11:0;8126:8;8137:4;8106:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8064:78;;;;8157:7;8153:595;;;8188:10;-1:-1:-1;8181:17:0;;-1:-1:-1;8181:17:0;8153:595;8302:17;;:21;8298:439;;8565:10;8559:17;8626:15;8613:10;8609:2;8605:19;8598:44;8513:148;8708:12;8701:20;;-1:-1:-1;;;8701:20:0;;;;;;;;:::i;59547:386::-;59601:4;;:29;;-1:-1:-1;;;59601:29:0;;59587:11;;-1:-1:-1;;;;;59601:4:0;;:14;;:29;;59624:4;;59601:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59587:43;-1:-1:-1;59645:11:0;59641:24;;59658:7;;;59641:24;59677:6;59686:11;:9;:11::i;:::-;59677:20;;59708:10;59721:47;59763:4;59721:37;59756:1;;59721:30;55092:5;59721:13;59732:1;59721:6;:10;;:13;;;;:::i;:47::-;59708:60;;59787:24;59805:5;59787:17;:24::i;:::-;59779:32;;59822:34;59842:6;59850:5;59822:19;:34::i;:::-;59873:10;59869:23;;59885:7;;;;;59869:23;-1:-1:-1;;;;;;;;;;;;;;;;59902:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62618:210;62654:11;62668:31;62686:12;:10;:12::i;62668:31::-;62654:45;-1:-1:-1;62714:10:0;;62710:111;;62741:30;62761:1;62764:6;62741:19;:30::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;62786:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63369:217;63406:10;63419:13;:11;:13::i;:::-;63406:26;-1:-1:-1;63447:9:0;;63443:136;;63473:19;63486:5;63473:12;:19::i;13342:192::-;13428:7;13464:12;13456:6;;;;13448:29;;;;-1:-1:-1;;;13448:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;13500:5:0;;;13342:192::o;68312:278::-;68387:16;;;68401:1;68387:16;;;68363:21;68387:16;;;;;68363:21;68387:16;;;;;;;;;;-1:-1:-1;68387:16:0;68363:40;;-1:-1:-1;;;;;;;;;;;68414:4:0;68419:1;68414:7;;;;;;;;-1:-1:-1;;;;;68414:13:0;;;:7;;;;;;;;;:13;68456:4;;68438:7;;68456:4;;;68438;;68456;;68438:7;;;;;;-1:-1:-1;;;;;68438:23:0;;;:7;;;;;;;;;:23;68513:3;;68509:73;;-1:-1:-1;;;68509:73:0;;68513:3;;;68509:33;;:73;;68543:9;;68513:3;;68557:4;;68571;;68578:3;;68509:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68509:73:0;;;;;;;;;;;;:::i;15368:278::-;15454:7;15489:12;15482:5;15474:28;;;;-1:-1:-1;;;15474:28:0;;;;;;;;:::i;:::-;;15513:9;15529:1;15525;:5;;;;;;;15368:278;-1:-1:-1;;;;;15368:278:0:o;61765:124::-;61837:1;61811:5;61858:6;;;61850:31;;;;-1:-1:-1;;;61850:31:0;;;;;;;:::i;64827:312::-;64954:22;;-1:-1:-1;;;64954:22:0;;64921:8;;;;54031:42;;64954:17;;:22;;-1:-1:-1;;;64972:3:0;64954:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;65003;;-1:-1:-1;;;65003:27:0;;64954;;-1:-1:-1;64992:8:0;;54031:42;;65003:17;;:27;;-1:-1:-1;;;65021:3:0;65026;;65003:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;64992:42;;65054:18;65067:4;65060;:11;;;;;;65054:5;:18::i;:::-;65047:25;;65104:3;65095:4;65090:17;;:41;;65121:10;65127:3;65121:5;:10::i;:::-;65119:12;;65090:41;;;-1:-1:-1;;65110:6:0;;;65083:48;-1:-1:-1;;64827:312:0:o;3284:619::-;3344:4;3812:20;;3655:66;3852:23;;;;;;:42;;-1:-1:-1;;3879:15:0;;;3284:619;-1:-1:-1;;3284:619:0:o;60838:440::-;60952:5;;60922:36;;-1:-1:-1;;;60922:36:0;;60908:11;;53943:42;;60922:29;;:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60908:50;-1:-1:-1;60973:7:0;;60969:60;;60984:42;;-1:-1:-1;;;60984:42:0;;54130;;60984:32;;:42;;61017:3;;61022;;60984:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60969:60;53943:42;-1:-1:-1;;;;;61039:29:0;;61069:5;;61076:10;61082:3;61076:5;:10::i;:::-;61088:23;61101:3;61106:4;61088:12;:23::i;:::-;61039:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61153:5:0;;53943:42;;-1:-1:-1;61123:29:0;;-1:-1:-1;61168:4:0;61175:14;:4;-1:-1:-1;;;61175:8:0;:14::i;:::-;61123:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61212:1;61205:4;:8;61201:70;;;61217:51;;-1:-1:-1;;;61217:51:0;;54227:42;;61217:30;;:51;;61256:4;;61263;;61217:51;;;:::i;61286:471::-;61387:22;;-1:-1:-1;;;61387:22:0;;61354:8;;;;54031:42;;61387:17;;:22;;-1:-1:-1;;;61405:3:0;61387:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;;61437:21;;-1:-1:-1;;;61437:21:0;;61387:27;;-1:-1:-1;61425:9:0;;54031:42;;61437:16;;:21;;61454:3;;61437:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61425:33;-1:-1:-1;61585:13:0;:3;-1:-1:-1;;;61585:7:0;:13::i;:::-;61578:4;:20;61574:176;;;61622:40;61628:33;61656:4;61628:23;61646:4;61628:13;:3;-1:-1:-1;;;61628:7:0;:13::i;:::-;:17;;:23::i;:33::-;61622:5;:40::i;:::-;61615:47;-1:-1:-1;61707:13:0;:3;-1:-1:-1;;;61707:7:0;:13::i;:::-;61684:20;61689:4;61699;61684:14;:20::i;:::-;:36;:54;;61734:4;61684:54;;;61723:4;61730:1;61723:8;61677:61;;61574:176;61286:471;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;5996:241;;6100:2;6088:9;6079:7;6075:23;6071:32;6068:2;;;-1:-1;;6106:12;6068:2;85:6;72:20;97:33;124:5;97:33;:::i;6244:263::-;;6359:2;6347:9;6338:7;6334:23;6330:32;6327:2;;;-1:-1;;6365:12;6327:2;226:6;220:13;238:33;265:5;238:33;:::i;6514:392::-;;6654:2;;6642:9;6633:7;6629:23;6625:32;6622:2;;;-1:-1;;6660:12;6622:2;6711:17;6705:24;6749:18;6741:6;6738:30;6735:2;;;-1:-1;;6771:12;6735:2;6858:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;5933:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;6791:99;6616:290;-1:-1;;;;;;;6616:290::o;6913:235::-;;7014:2;7002:9;6993:7;6989:23;6985:32;6982:2;;;-1:-1;;7020:12;6982:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;7155:257::-;;7267:2;7255:9;7246:7;7242:23;7238:32;7235:2;;;-1:-1;;7273:12;7235:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;7723:261::-;;7837:2;7825:9;7816:7;7812:23;7808:32;7805:2;;;-1:-1;;7843:12;7805:2;-1:-1;1549:13;;7799:185;-1:-1;7799:185::o;7991:367::-;;;8115:2;8103:9;8094:7;8090:23;8086:32;8083:2;;;-1:-1;;8121:12;8083:2;8179:17;8166:31;8217:18;;8209:6;8206:30;8203:2;;;-1:-1;;8239:12;8203:2;8325:6;8314:9;8310:22;;;1741:3;1734:4;1726:6;1722:17;1718:27;1708:2;;-1:-1;;1749:12;1708:2;1792:6;1779:20;8217:18;1811:6;1808:30;1805:2;;;-1:-1;;1841:12;1805:2;1936:3;8115:2;1916:17;1877:6;1902:32;;1899:41;1896:2;;;-1:-1;;1943:12;1896:2;8115;1873:17;;;;;8259:83;;-1:-1;8077:281;;-1:-1;;;;8077:281::o;8365:303::-;;8500:2;8488:9;8479:7;8475:23;8471:32;8468:2;;;-1:-1;;8506:12;8468:2;2153:20;8500:2;2153:20;:::i;:::-;226:6;220:13;238:33;265:5;238:33;:::i;:::-;2229:86;;2375:2;2440:22;;;5933:13;2390:16;;;2383:86;;;;-1:-1;2236:16;8462:206;-1:-1;8462:206::o;8675:304::-;;8810:3;8798:9;8789:7;8785:23;8781:33;8778:2;;;-1:-1;;8817:12;8778:2;2678:20;8810:3;2678:20;:::i;:::-;5939:6;5933:13;2761:16;2754:86;2901:2;2970:9;2966:22;5933:13;2901:2;2920:5;2916:16;2909:86;3056:2;3125:9;3121:22;5933:13;3056:2;3075:5;3071:16;3064:86;3211:2;3280:9;3276:22;5933:13;3211:2;3230:5;3226:16;3219:86;3366:3;3436:9;3432:22;5933:13;3366:3;3386:5;3382:16;3375:86;8869:94;;;;8772:207;;;;:::o;8986:324::-;;9131:3;;9119:9;9110:7;9106:23;9102:33;9099:2;;;-1:-1;;9138:12;9099:2;3685:22;9131:3;3685:22;:::i;:::-;3676:31;;3831:22;5933:13;3781:16;3774:86;3927:2;3996:9;3992:22;5933:13;3927:2;3946:5;3942:16;3935:86;4087:2;4156:9;4152:22;5933:13;4087:2;4106:5;4102:16;4095:86;4255:2;4324:9;4320:22;5933:13;4255:2;4274:5;4270:16;4263:86;4423:3;4493:9;4489:22;5933:13;4423:3;4443:5;4439:16;4432:86;4585:3;4655:9;4651:22;5933:13;4585:3;4605:5;4601:16;4594:86;4746:3;4816:9;4812:22;5933:13;4746:3;4766:5;4762:16;4755:86;4907:3;4977:9;4973:22;5933:13;4907:3;4927:5;4923:16;4916:86;5068:3;;5140:9;5136:22;5933:13;5068:3;5088:5;5084:18;5077:88;;9190:104;;;;9093:217;;;;:::o;9317:303::-;;9452:2;9440:9;9431:7;9427:23;9423:32;9420:2;;;-1:-1;;9458:12;9420:2;5374:20;9452:2;5374:20;:::i;:::-;5939:6;5933:13;5457:16;5450:86;5596:2;5665:9;5661:22;5933:13;5596:2;5615:5;5611:16;5604:86;9510:94;;;;9414:206;;;;:::o;9627:241::-;;9731:2;9719:9;9710:7;9706:23;9702:32;9699:2;;;-1:-1;;9737:12;9699:2;-1:-1;5785:20;;9693:175;-1:-1;9693:175::o;10145:393::-;;;10274:2;10262:9;10253:7;10249:23;10245:32;10242:2;;;-1:-1;;10280:12;10242:2;5939:6;5933:13;10332:74;;10443:2;10494:9;10490:22;1237:13;1255:30;1279:5;1255:30;:::i;:::-;10451:71;;;;10236:302;;;;;:::o;17893:271::-;;12077:5;31090:12;12188:52;12233:6;12228:3;12221:4;12214:5;12210:16;12188:52;:::i;:::-;12252:16;;;;;18027:137;-1:-1;;18027:137::o;18171:222::-;-1:-1;;;;;32539:54;;;;10788:37;;18298:2;18283:18;;18269:124::o;18400:333::-;-1:-1;;;;;32539:54;;;10788:37;;32539:54;;18719:2;18704:18;;10788:37;18555:2;18540:18;;18526:207::o;18740:349::-;-1:-1;;;;;32539:54;;;;10788:37;;19075:2;19060:18;;12804:58;18903:2;18888:18;;18874:215::o;19436:210::-;32179:13;;32172:21;11751:34;;19557:2;19542:18;;19528:118::o;19653:222::-;11868:37;;;19780:2;19765:18;;19751:124::o;19882:333::-;11868:37;;;-1:-1;;;;;32539:54;20201:2;20186:18;;10788:37;20037:2;20022:18;;20008:207::o;20742:330::-;;20899:2;20920:17;20913:47;31634:6;20899:2;20888:9;20884:18;31622:19;33591:6;33586:3;31662:14;20888:9;31662:14;33568:30;33629:16;;;31662:14;33629:16;;;33622:27;;;;34024:7;34008:14;;;-1:-1;;34004:28;13303:39;;;20870:202;-1:-1;20870:202::o;21079:310::-;;21226:2;21247:17;21240:47;13501:5;31090:12;31634:6;21226:2;21215:9;21211:18;31622:19;13595:52;13640:6;31662:14;21215:9;31662:14;21226:2;13621:5;13617:16;13595:52;:::i;:::-;34024:7;34008:14;-1:-1;;34004:28;13659:39;;;;31662:14;13659:39;;21197:192;-1:-1;;21197:192::o;21396:416::-;21596:2;21610:47;;;13935:2;21581:18;;;31622:19;-1:-1;;;31662:14;;;13951:34;14004:12;;;21567:245::o;21819:416::-;22019:2;22033:47;;;14255:1;22004:18;;;31622:19;-1:-1;;;31662:14;;;14270:28;14317:12;;;21990:245::o;22242:416::-;22442:2;22456:47;;;14568:2;22427:18;;;31622:19;14604:29;31662:14;;;14584:50;14653:12;;;22413:245::o;22665:416::-;22865:2;22879:47;;;14904:2;22850:18;;;31622:19;14940:34;31662:14;;;14920:55;-1:-1;;;14995:12;;;14988:25;15032:12;;;22836:245::o;23088:416::-;23288:2;23302:47;;;15283:1;23273:18;;;31622:19;-1:-1;;;31662:14;;;15298:29;15346:12;;;23259:245::o;23511:416::-;23711:2;23725:47;;;15597:1;23696:18;;;31622:19;-1:-1;;;31662:14;;;15612:30;15661:12;;;23682:245::o;23934:416::-;24134:2;24148:47;;;15912:2;24119:18;;;31622:19;15948:31;31662:14;;;15928:52;15999:12;;;24105:245::o;24357:416::-;24557:2;24571:47;;;16250:2;24542:18;;;31622:19;-1:-1;;;31662:14;;;16266:34;16319:12;;;24528:245::o;24780:416::-;24980:2;24994:47;;;16570:2;24965:18;;;31622:19;16606:34;31662:14;;;16586:55;-1:-1;;;16661:12;;;16654:34;16707:12;;;24951:245::o;25203:416::-;25403:2;25417:47;;;16958:2;25388:18;;;31622:19;-1:-1;;;31662:14;;;16974:33;17026:12;;;25374:245::o;25626:416::-;25826:2;25840:47;;;17277:2;25811:18;;;31622:19;17313:34;31662:14;;;17293:55;-1:-1;;;17368:12;;;17361:46;17426:12;;;25797:245::o;26049:416::-;26249:2;26263:47;;;17677:2;26234:18;;;31622:19;-1:-1;;;31662:14;;;17693:35;17747:12;;;26220:245::o;26701:460::-;11868:37;;;-1:-1;;;;;32539:54;;;;27056:2;27041:18;;10788:37;27147:2;27132:18;;12804:58;26892:2;26877:18;;26863:298::o;27619:436::-;11868:37;;;27960:2;27945:18;;11868:37;;;;28041:2;28026:18;;11868:37;27798:2;27783:18;;27769:286::o;28062:832::-;;28359:3;28348:9;28344:19;11898:5;11875:3;11868:37;28532:2;33350:24;28532:2;28521:9;28517:18;12804:58;28359:3;28569:2;28558:9;28554:18;28547:48;28609:108;11181:5;31090:12;31634:6;31629:3;31622:19;31662:14;28348:9;31662:14;11193:93;;28532:2;11357:5;30944:14;11369:21;;-1:-1;11396:260;11421:6;11418:1;11415:13;11396:260;;;11482:13;;-1:-1;;;;;32539:54;10788:37;;31477:14;;;;10699;;;;6749:18;11436:9;11396:260;;;-1:-1;;;;;;;32539:54;;;;28796:2;28781:18;;10788:37;-1:-1;;;28879:3;28864:19;11868:37;28601:116;28330:564;-1:-1;;;28330:564::o;28901:333::-;11868:37;;;29220:2;29205:18;;11868:37;29056:2;29041:18;;29027:207::o;29692:556::-;11868:37;;;30068:2;30053:18;;11868:37;;;;30151:2;30136:18;;11868:37;30234:2;30219:18;;11868:37;29903:3;29888:19;;29874:374::o;30255:256::-;30317:2;30311:9;30343:17;;;30418:18;30403:34;;30439:22;;;30400:62;30397:2;;;30475:1;;30465:12;30397:2;30317;30484:22;30295:216;;-1:-1;30295:216::o;30518:304::-;;30677:18;30669:6;30666:30;30663:2;;;-1:-1;;30699:12;30663:2;-1:-1;30744:4;30732:17;;;30797:15;;30600:222::o;33664:268::-;33729:1;33736:101;33750:6;33747:1;33744:13;33736:101;;;33817:11;;;33811:18;33798:11;;;33791:39;33772:2;33765:10;33736:101;;;33852:6;33849:1;33846:13;33843:2;;;33729:1;33908:6;33903:3;33899:16;33892:27;33843:2;;33713:219;;;:::o;34045:117::-;-1:-1;;;;;32539:54;;34104:35;;34094:2;;34153:1;;34143:12;34169:111;34250:5;32179:13;32172:21;34228:5;34225:32;34215:2;;34271:1;;34261:12
Swarm Source
ipfs://527e47e03bf59e936d3043c36fbe1c22d0fd92276d61071ec257465628b1e307
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.