Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 77 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Multihop Batch S... | 11419740 | 1931 days ago | IN | 0 ETH | 0.00342994 | ||||
| Multihop Batch S... | 11412744 | 1932 days ago | IN | 0 ETH | 0.0074484 | ||||
| Multihop Batch S... | 11412585 | 1932 days ago | IN | 0 ETH | 0.02802915 | ||||
| Multihop Batch S... | 11412541 | 1932 days ago | IN | 0 ETH | 0.02187534 | ||||
| Multihop Batch S... | 11412394 | 1932 days ago | IN | 0 ETH | 0.01191833 | ||||
| Multihop Batch S... | 11412370 | 1932 days ago | IN | 0.37 ETH | 0.00975902 | ||||
| Multihop Batch S... | 11412334 | 1932 days ago | IN | 0 ETH | 0.00646447 | ||||
| Multihop Batch S... | 11412331 | 1932 days ago | IN | 0 ETH | 0.00588887 | ||||
| Multihop Batch S... | 11412231 | 1932 days ago | IN | 0 ETH | 0.00728805 | ||||
| Multihop Batch S... | 11412214 | 1932 days ago | IN | 0 ETH | 0.01879985 | ||||
| Multihop Batch S... | 11412196 | 1932 days ago | IN | 0 ETH | 0.00556959 | ||||
| Multihop Batch S... | 11412170 | 1932 days ago | IN | 0 ETH | 0.00742977 | ||||
| Multihop Batch S... | 11412167 | 1932 days ago | IN | 0 ETH | 0.00937099 | ||||
| Join Pool | 11412165 | 1932 days ago | IN | 0 ETH | 0.0063846 | ||||
| Multihop Batch S... | 11412157 | 1932 days ago | IN | 0 ETH | 0.00543411 | ||||
| Multihop Batch S... | 11412149 | 1932 days ago | IN | 0 ETH | 0.00919744 | ||||
| Multihop Batch S... | 11412078 | 1932 days ago | IN | 0 ETH | 0.01591031 | ||||
| Multihop Batch S... | 11412068 | 1932 days ago | IN | 0 ETH | 0.00575857 | ||||
| Multihop Batch S... | 11412062 | 1932 days ago | IN | 0 ETH | 0.02891729 | ||||
| Multihop Batch S... | 11412053 | 1932 days ago | IN | 0 ETH | 0.00661353 | ||||
| Join Pool | 11411993 | 1932 days ago | IN | 0 ETH | 0.0071711 | ||||
| Join Pool | 11411984 | 1932 days ago | IN | 0 ETH | 0.00650646 | ||||
| Join Pool | 11411972 | 1932 days ago | IN | 0 ETH | 0.00703118 | ||||
| Join Pool | 11411948 | 1932 days ago | IN | 0 ETH | 0.01224496 | ||||
| Multihop Batch S... | 11411936 | 1932 days ago | IN | 0 ETH | 0.01255579 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 11412370 | 1932 days ago | 0.37 ETH | ||||
| - | 11412196 | 1932 days ago | 0.90416514 ETH | ||||
| - | 11412196 | 1932 days ago | 0.90416514 ETH | ||||
| - | 11411910 | 1932 days ago | 0.00401093 ETH | ||||
| - | 11411910 | 1932 days ago | 0.00401093 ETH | ||||
| - | 11411910 | 1932 days ago | 0.83881389 ETH | ||||
| - | 11411823 | 1932 days ago | 0.15654827 ETH | ||||
| - | 11411647 | 1932 days ago | 0.82 ETH | ||||
| - | 11411639 | 1932 days ago | 0.04046797 ETH | ||||
| - | 11411639 | 1932 days ago | 0.04046797 ETH | ||||
| - | 11411609 | 1932 days ago | 0.26240234 ETH | ||||
| - | 11411609 | 1932 days ago | 0.26240234 ETH | ||||
| - | 11411466 | 1932 days ago | 1.07052177 ETH | ||||
| - | 11411466 | 1932 days ago | 1.07052177 ETH | ||||
| - | 11411354 | 1932 days ago | 1 ETH | ||||
| - | 11411354 | 1932 days ago | 0.27837468 ETH | ||||
| - | 11411354 | 1932 days ago | 0.27837468 ETH | ||||
| - | 11411299 | 1932 days ago | 0.02443645 ETH | ||||
| - | 11411299 | 1932 days ago | 0.02443645 ETH | ||||
| - | 11411299 | 1932 days ago | 1.28881197 ETH | ||||
| - | 11410933 | 1933 days ago | 0.19925206 ETH | ||||
| - | 11410933 | 1933 days ago | 0.19925206 ETH | ||||
| - | 11410849 | 1933 days ago | 1 ETH | ||||
| - | 11410820 | 1933 days ago | 0.41203598 ETH | ||||
| - | 11410820 | 1933 days ago | 0.41203598 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ExchangeProxy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-12-08
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
/**
* @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);
}
/**
* @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;
}
}
/**
* @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) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @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);
}
}
}
}
/**
* @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");
}
}
}
interface IBPool is IERC20 {
function version() external view returns (uint256);
function swapExactAmountIn(
address,
uint256,
address,
uint256,
uint256
) external returns (uint256, uint256);
function swapExactAmountOut(
address,
uint256,
address,
uint256,
uint256
) external returns (uint256, uint256);
function calcInGivenOut(
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
) external pure returns (uint256);
function calcOutGivenIn(
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
) external pure returns (uint256);
function getDenormalizedWeight(address) external view returns (uint256);
function swapFee() external view returns (uint256);
function setSwapFee(uint256 _swapFee) external;
function bind(
address token,
uint256 balance,
uint256 denorm
) external;
function rebind(
address token,
uint256 balance,
uint256 denorm
) external;
function finalize(
uint256 _swapFee,
uint256 _initPoolSupply,
address[] calldata _bindTokens,
uint256[] calldata _bindDenorms
) external;
function setPublicSwap(bool _publicSwap) external;
function setController(address _controller) external;
function setExchangeProxy(address _exchangeProxy) external;
function getFinalTokens() external view returns (address[] memory tokens);
function getTotalDenormalizedWeight() external view returns (uint256);
function getBalance(address token) external view returns (uint256);
function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn) external;
function joinPoolFor(
address account,
uint256 rewardAmountOut,
uint256[] calldata maxAmountsIn
) external;
function joinswapPoolAmountOut(
address tokenIn,
uint256 poolAmountOut,
uint256 maxAmountIn
) external returns (uint256 tokenAmountIn);
function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut) external;
function exitswapPoolAmountIn(
address tokenOut,
uint256 poolAmountIn,
uint256 minAmountOut
) external returns (uint256 tokenAmountOut);
function exitswapExternAmountOut(
address tokenOut,
uint256 tokenAmountOut,
uint256 maxPoolAmountIn
) external returns (uint256 poolAmountIn);
function joinswapExternAmountIn(
address tokenIn,
uint256 tokenAmountIn,
uint256 minPoolAmountOut
) external returns (uint256 poolAmountOut);
function finalizeRewardFundInfo(address _rewardFund, uint256 _unstakingFrozenTime) external;
function addRewardPool(
IERC20 _rewardToken,
uint256 _startBlock,
uint256 _endRewardBlock,
uint256 _rewardPerBlock,
uint256 _lockRewardPercent,
uint256 _startVestingBlock,
uint256 _endVestingBlock
) external;
}
interface IFreeFromUpTo {
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}
interface IBFactory {
function newBPool() external returns (IBPool);
function collect(address _token) external;
}
interface IValueLiquidRegistry {
function getBestPoolsWithLimit(
address,
address,
uint256
) external view returns (address[] memory);
}
interface IWETH {
function deposit() external payable;
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
function balanceOf(address account) external view returns (uint256);
}
contract ExchangeProxy {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);
modifier discountCHI(uint8 flag) {
if ((flag & 0x1) == 0) {
_;
} else {
uint256 gasStart = gasleft();
_;
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41130);
}
}
struct Pool {
address pool;
uint256 tokenBalanceIn;
uint256 tokenWeightIn;
uint256 tokenBalanceOut;
uint256 tokenWeightOut;
uint256 swapFee;
uint256 effectiveLiquidity;
}
struct Swap {
address pool;
address tokenIn;
address tokenOut;
uint256 swapAmount; // tokenInAmount / tokenOutAmount
uint256 limitReturnAmount; // minAmountOut / maxAmountIn
uint256 maxPrice;
}
IWETH weth;
IValueLiquidRegistry registry;
address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
uint256 private constant BONE = 10**18;
address public governance;
constructor(address _weth) public {
weth = IWETH(_weth);
governance = tx.origin;
}
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");
}
function setGovernance(address _governance) external {
require(msg.sender == governance, "!governance");
governance = _governance;
}
function setRegistry(address _registry) external {
require(msg.sender == governance, "!governance");
registry = IValueLiquidRegistry(_registry);
}
function batchSwapExactIn(
Swap[] memory swaps,
IERC20 tokenIn,
IERC20 tokenOut,
uint256 totalAmountIn,
uint256 minTotalAmountOut,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountOut) {
transferFromAll(tokenIn, totalAmountIn);
for (uint256 i = 0; i < swaps.length; i++) {
Swap memory swap = swaps[i];
IERC20 SwapTokenIn = IERC20(swap.tokenIn);
IBPool pool = IBPool(swap.pool);
safeApprove(address(SwapTokenIn), swap.pool, swap.swapAmount);
(uint256 tokenAmountOut, ) = pool.swapExactAmountIn(swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice);
totalAmountOut = tokenAmountOut.add(totalAmountOut);
}
require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT");
transferAll(tokenOut, totalAmountOut);
transferAll(tokenIn, getBalance(tokenIn));
}
function batchSwapExactOut(
Swap[] memory swaps,
IERC20 tokenIn,
IERC20 tokenOut,
uint256 maxTotalAmountIn,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountIn) {
transferFromAll(tokenIn, maxTotalAmountIn);
for (uint256 i = 0; i < swaps.length; i++) {
Swap memory swap = swaps[i];
IERC20 SwapTokenIn = IERC20(swap.tokenIn);
IBPool pool = IBPool(swap.pool);
safeApprove(address(SwapTokenIn), swap.pool, swap.limitReturnAmount);
(uint256 tokenAmountIn, ) = pool.swapExactAmountOut(swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice);
totalAmountIn = tokenAmountIn.add(totalAmountIn);
}
require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN");
transferAll(tokenOut, getBalance(tokenOut));
transferAll(tokenIn, getBalance(tokenIn));
}
function multihopBatchSwapExactIn(
Swap[][] memory swapSequences,
IERC20 tokenIn,
IERC20 tokenOut,
uint256 totalAmountIn,
uint256 minTotalAmountOut,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountOut) {
transferFromAll(tokenIn, totalAmountIn);
for (uint256 i = 0; i < swapSequences.length; i++) {
uint256 tokenAmountOut;
for (uint256 k = 0; k < swapSequences[i].length; k++) {
Swap memory swap = swapSequences[i][k];
IERC20 SwapTokenIn = IERC20(swap.tokenIn);
if (k == 1) {
// Makes sure that on the second swap the output of the first was used
// so there is not intermediate token leftover
swap.swapAmount = tokenAmountOut;
}
IBPool pool = IBPool(swap.pool);
safeApprove(address(SwapTokenIn), swap.pool, swap.swapAmount);
(tokenAmountOut, ) = pool.swapExactAmountIn(swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice);
}
// This takes the amountOut of the last swap
totalAmountOut = tokenAmountOut.add(totalAmountOut);
}
require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT");
transferAll(tokenOut, totalAmountOut);
transferAll(tokenIn, getBalance(tokenIn));
}
function multihopBatchSwapExactOut(
Swap[][] memory swapSequences,
IERC20 tokenIn,
IERC20 tokenOut,
uint256 maxTotalAmountIn,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountIn) {
transferFromAll(tokenIn, maxTotalAmountIn);
for (uint256 i = 0; i < swapSequences.length; i++) {
uint256 tokenAmountInFirstSwap;
// Specific code for a simple swap and a multihop (2 swaps in sequence)
if (swapSequences[i].length == 1) {
Swap memory swap = swapSequences[i][0];
IERC20 SwapTokenIn = IERC20(swap.tokenIn);
IBPool pool = IBPool(swap.pool);
safeApprove(address(SwapTokenIn), swap.pool, swap.limitReturnAmount);
(tokenAmountInFirstSwap, ) = pool.swapExactAmountOut(swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice);
} else {
// Consider we are swapping A -> B and B -> C. The goal is to buy a given amount
// of token C. But first we need to buy B with A so we can then buy C with B
// To get the exact amount of C we then first need to calculate how much B we'll need:
uint256 intermediateTokenAmount;
// This would be token B as described above
Swap memory secondSwap = swapSequences[i][1];
IBPool poolSecondSwap = IBPool(secondSwap.pool);
intermediateTokenAmount = poolSecondSwap.calcInGivenOut(
poolSecondSwap.getBalance(secondSwap.tokenIn),
poolSecondSwap.getDenormalizedWeight(secondSwap.tokenIn),
poolSecondSwap.getBalance(secondSwap.tokenOut),
poolSecondSwap.getDenormalizedWeight(secondSwap.tokenOut),
secondSwap.swapAmount,
poolSecondSwap.swapFee()
);
//// Buy intermediateTokenAmount of token B with A in the first pool
Swap memory firstSwap = swapSequences[i][0];
IERC20 FirstSwapTokenIn = IERC20(firstSwap.tokenIn);
IBPool poolFirstSwap = IBPool(firstSwap.pool);
if (FirstSwapTokenIn.allowance(address(this), firstSwap.pool) < uint256(-1)) {
safeApprove(address(FirstSwapTokenIn), firstSwap.pool, uint256(-1));
}
(tokenAmountInFirstSwap, ) = poolFirstSwap.swapExactAmountOut(
firstSwap.tokenIn,
firstSwap.limitReturnAmount,
firstSwap.tokenOut,
intermediateTokenAmount, // This is the amount of token B we need
firstSwap.maxPrice
);
//// Buy the final amount of token C desired
IERC20 SecondSwapTokenIn = IERC20(secondSwap.tokenIn);
if (SecondSwapTokenIn.allowance(address(this), secondSwap.pool) < uint256(-1)) {
safeApprove(address(SecondSwapTokenIn), secondSwap.pool, uint256(-1));
}
poolSecondSwap.swapExactAmountOut(
secondSwap.tokenIn,
secondSwap.limitReturnAmount,
secondSwap.tokenOut,
secondSwap.swapAmount,
secondSwap.maxPrice
);
}
totalAmountIn = tokenAmountInFirstSwap.add(totalAmountIn);
}
require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN");
transferAll(tokenOut, getBalance(tokenOut));
transferAll(tokenIn, getBalance(tokenIn));
}
function smartSwapExactIn(
IERC20 tokenIn,
IERC20 tokenOut,
uint256 totalAmountIn,
uint256 minTotalAmountOut,
uint256 nPools,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountOut) {
Swap[] memory swaps;
if (isETH(tokenIn)) {
(swaps, ) = viewSplitExactIn(address(weth), address(tokenOut), totalAmountIn, nPools);
} else if (isETH(tokenOut)) {
(swaps, ) = viewSplitExactIn(address(tokenIn), address(weth), totalAmountIn, nPools);
} else {
(swaps, ) = viewSplitExactIn(address(tokenIn), address(tokenOut), totalAmountIn, nPools);
}
totalAmountOut = batchSwapExactIn(swaps, tokenIn, tokenOut, totalAmountIn, minTotalAmountOut, 0x0);
}
function smartSwapExactOut(
IERC20 tokenIn,
IERC20 tokenOut,
uint256 totalAmountOut,
uint256 maxTotalAmountIn,
uint256 nPools,
uint8 flag
) public payable discountCHI(flag) returns (uint256 totalAmountIn) {
Swap[] memory swaps;
if (isETH(tokenIn)) {
(swaps, ) = viewSplitExactOut(address(weth), address(tokenOut), totalAmountOut, nPools);
} else if (isETH(tokenOut)) {
(swaps, ) = viewSplitExactOut(address(tokenIn), address(weth), totalAmountOut, nPools);
} else {
(swaps, ) = viewSplitExactOut(address(tokenIn), address(tokenOut), totalAmountOut, nPools);
}
totalAmountIn = batchSwapExactOut(swaps, tokenIn, tokenOut, maxTotalAmountIn, 0x0);
}
function viewSplitExactIn(
address tokenIn,
address tokenOut,
uint256 swapAmount,
uint256 nPools
) public view returns (Swap[] memory swaps, uint256 totalOutput) {
address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools);
Pool[] memory pools = new Pool[](poolAddresses.length);
uint256 sumEffectiveLiquidity;
for (uint256 i = 0; i < poolAddresses.length; i++) {
pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]);
sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity);
}
uint256[] memory bestInputAmounts = new uint256[](pools.length);
uint256 totalInputAmount;
for (uint256 i = 0; i < pools.length; i++) {
bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity);
totalInputAmount = totalInputAmount.add(bestInputAmounts[i]);
}
if (totalInputAmount < swapAmount) {
bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount));
} else {
bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount));
}
swaps = new Swap[](pools.length);
for (uint256 i = 0; i < pools.length; i++) {
swaps[i] = Swap({
pool: pools[i].pool,
tokenIn: tokenIn,
tokenOut: tokenOut,
swapAmount: bestInputAmounts[i],
limitReturnAmount: 0,
maxPrice: uint256(-1)
});
}
totalOutput = calcTotalOutExactIn(bestInputAmounts, pools);
return (swaps, totalOutput);
}
function viewSplitExactOut(
address tokenIn,
address tokenOut,
uint256 swapAmount,
uint256 nPools
) public view returns (Swap[] memory swaps, uint256 totalOutput) {
address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools);
Pool[] memory pools = new Pool[](poolAddresses.length);
uint256 sumEffectiveLiquidity;
for (uint256 i = 0; i < poolAddresses.length; i++) {
pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]);
sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity);
}
uint256[] memory bestInputAmounts = new uint256[](pools.length);
uint256 totalInputAmount;
for (uint256 i = 0; i < pools.length; i++) {
bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity);
totalInputAmount = totalInputAmount.add(bestInputAmounts[i]);
}
if (totalInputAmount < swapAmount) {
bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount));
} else {
bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount));
}
swaps = new Swap[](pools.length);
for (uint256 i = 0; i < pools.length; i++) {
swaps[i] = Swap({
pool: pools[i].pool,
tokenIn: tokenIn,
tokenOut: tokenOut,
swapAmount: bestInputAmounts[i],
limitReturnAmount: uint256(-1),
maxPrice: uint256(-1)
});
}
totalOutput = calcTotalOutExactOut(bestInputAmounts, pools);
return (swaps, totalOutput);
}
function getPoolData(
address tokenIn,
address tokenOut,
address poolAddress
) internal view returns (Pool memory) {
IBPool pool = IBPool(poolAddress);
uint256 tokenBalanceIn = pool.getBalance(tokenIn);
uint256 tokenBalanceOut = pool.getBalance(tokenOut);
uint256 tokenWeightIn = pool.getDenormalizedWeight(tokenIn);
uint256 tokenWeightOut = pool.getDenormalizedWeight(tokenOut);
uint256 swapFee = pool.swapFee();
uint256 effectiveLiquidity = calcEffectiveLiquidity(tokenWeightIn, tokenBalanceOut, tokenWeightOut);
Pool memory returnPool =
Pool({
pool: poolAddress,
tokenBalanceIn: tokenBalanceIn,
tokenWeightIn: tokenWeightIn,
tokenBalanceOut: tokenBalanceOut,
tokenWeightOut: tokenWeightOut,
swapFee: swapFee,
effectiveLiquidity: effectiveLiquidity
});
return returnPool;
}
function calcEffectiveLiquidity(
uint256 tokenWeightIn,
uint256 tokenBalanceOut,
uint256 tokenWeightOut
) internal pure returns (uint256 effectiveLiquidity) {
// Bo * wi/(wi+wo)
effectiveLiquidity = tokenWeightIn.mul(BONE).div(tokenWeightOut.add(tokenWeightIn)).mul(tokenBalanceOut).div(BONE);
return effectiveLiquidity;
}
function calcTotalOutExactIn(uint256[] memory bestInputAmounts, Pool[] memory bestPools) internal pure returns (uint256 totalOutput) {
totalOutput = 0;
for (uint256 i = 0; i < bestInputAmounts.length; i++) {
uint256 output =
IBPool(bestPools[i].pool).calcOutGivenIn(
bestPools[i].tokenBalanceIn,
bestPools[i].tokenWeightIn,
bestPools[i].tokenBalanceOut,
bestPools[i].tokenWeightOut,
bestInputAmounts[i],
bestPools[i].swapFee
);
totalOutput = totalOutput.add(output);
}
return totalOutput;
}
function calcTotalOutExactOut(uint256[] memory bestInputAmounts, Pool[] memory bestPools) internal pure returns (uint256 totalOutput) {
totalOutput = 0;
for (uint256 i = 0; i < bestInputAmounts.length; i++) {
uint256 output =
IBPool(bestPools[i].pool).calcInGivenOut(
bestPools[i].tokenBalanceIn,
bestPools[i].tokenWeightIn,
bestPools[i].tokenBalanceOut,
bestPools[i].tokenWeightOut,
bestInputAmounts[i],
bestPools[i].swapFee
);
totalOutput = totalOutput.add(output);
}
return totalOutput;
}
function transferFromAll(IERC20 token, uint256 amount) internal returns (bool) {
if (isETH(token)) {
weth.deposit{value: msg.value}();
} else {
token.safeTransferFrom(msg.sender, address(this), amount);
}
return true;
}
function getBalance(IERC20 token) internal view returns (uint256) {
if (isETH(token)) {
return weth.balanceOf(address(this));
} else {
return token.balanceOf(address(this));
}
}
function transferAll(IERC20 token, uint256 amount) internal returns (bool) {
if (amount == 0) {
return true;
}
if (isETH(token)) {
weth.withdraw(amount);
(bool xfer, ) = msg.sender.call{value: amount}("");
require(xfer, "ERR_ETH_FAILED");
} else {
token.safeTransfer(msg.sender, amount);
}
return true;
}
function isETH(IERC20 token) internal pure returns (bool) {
return (address(token) == ETH_ADDRESS);
}
/**
* This function allows governance to take unsupported tokens out of the contract.
* This is in an effort to make someone whole, should they seriously mess up.
* There is no guarantee governance will vote to return these.
* It also allows for removal of airdropped tokens.
*/
function governanceRecoverUnsupported(
IERC20 _token,
uint256 _amount,
address _to
) external {
require(msg.sender == governance, "!governance");
if (isETH(_token)) {
(bool xfer, ) = _to.call{value: _amount}("");
require(xfer, "ERR_ETH_FAILED");
} else {
_token.safeTransfer(_to, _amount);
}
}
receive() external payable {}
function create(
IBFactory factory,
address[] memory tokens,
uint256[] calldata balances,
uint256[] calldata denorms,
uint256 swapFee,
uint256 initPoolSupply,
uint8 flag
) external payable discountCHI(flag) returns (IBPool pool) {
require(tokens.length == balances.length, "ERR_LENGTH_MISMATCH");
require(tokens.length == denorms.length, "ERR_LENGTH_MISMATCH");
pool = factory.newBPool();
bool containsETH = false;
for (uint256 i = 0; i < tokens.length; i++) {
if (transferFromAllTo(tokens[i], balances[i], address(pool))) {
containsETH = true;
tokens[i] = address(weth);
}
}
require(msg.value == 0 || containsETH, "!invalid payable");
pool.finalize(swapFee, initPoolSupply, tokens, denorms);
pool.setExchangeProxy(address(this));
pool.setController(msg.sender);
uint256 lpAmount = pool.balanceOf(address(this));
if (lpAmount > 0) {
IERC20(pool).safeTransfer(msg.sender, lpAmount);
}
}
function joinPool(
IBPool pool,
uint256 poolAmountOut,
uint256[] calldata maxAmountsIn,
uint8 flag
) external payable discountCHI(flag) {
address[] memory tokens = pool.getFinalTokens();
require(maxAmountsIn.length == tokens.length, "ERR_LENGTH_MISMATCH");
bool containsETH = false;
for (uint256 i = 0; i < tokens.length; i++) {
if (msg.value > 0 && tokens[i] == address(weth)) {
transferFromAllAndApprove(ETH_ADDRESS, maxAmountsIn[i], address(pool));
containsETH = true;
} else {
transferFromAllAndApprove(tokens[i], maxAmountsIn[i], address(pool));
}
}
require(msg.value == 0 || containsETH, "!invalid payable");
if (pool.version() == 1001) {
pool.joinPool(poolAmountOut, maxAmountsIn);
} else {
pool.joinPoolFor(msg.sender, poolAmountOut, maxAmountsIn);
}
for (uint256 i = 0; i < tokens.length; i++) {
if (containsETH && tokens[i] == address(weth)) {
transferAll(IERC20(ETH_ADDRESS), getBalance(IERC20(ETH_ADDRESS)));
} else {
transferAll(IERC20(tokens[i]), getBalance(IERC20(tokens[i])));
}
}
uint256 lpAmount = pool.balanceOf(address(this));
transferAll(pool, lpAmount);
}
function joinswapExternAmountIn(
IBPool pool,
address tokenIn,
uint256 tokenAmountIn,
uint256 minPoolAmountOut,
uint8 flag
) external payable discountCHI(flag) {
bool containsETH = false;
if (transferFromAllAndApprove(tokenIn, tokenAmountIn, address(pool))) {
containsETH = true;
}
require(msg.value == 0 || containsETH, "!invalid payable");
if (containsETH) {
uint256 poolAmountOut = pool.joinswapExternAmountIn(address(weth), tokenAmountIn, minPoolAmountOut);
IERC20(pool).safeTransfer(msg.sender, poolAmountOut);
} else {
uint256 poolAmountOut = pool.joinswapExternAmountIn(tokenIn, tokenAmountIn, minPoolAmountOut);
IERC20(pool).safeTransfer(msg.sender, poolAmountOut);
}
}
function transferFromAllTo(
address token,
uint256 amount,
address to
) internal returns (bool containsETH) {
if (isETH(IERC20(token))) {
require(amount == msg.value, "!invalid amount");
weth.deposit{value: amount}();
weth.transfer(to, amount);
containsETH = true;
} else {
IERC20(token).safeTransferFrom(msg.sender, to, amount);
}
return containsETH;
}
function transferFromAllAndApprove(
address token,
uint256 amount,
address spender
) internal returns (bool containsETH) {
if (isETH(IERC20(token))) {
require(amount == msg.value, "!invalid amount");
weth.deposit{value: amount}();
safeApprove(address(weth), spender, amount);
containsETH = true;
} else {
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
safeApprove(token, spender, amount);
}
return containsETH;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"batchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"batchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBFactory","name":"factory","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256[]","name":"denorms","type":"uint256[]"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"initPoolSupply","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"create","outputs":[{"internalType":"contract IBPool","name":"pool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBPool","name":"pool","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"joinPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IBPool","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"joinswapExternAmountIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"multihopBatchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"multihopBatchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"smartSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"smartSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactIn","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactOut","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162005a9138038062005a91833981016040819052620000349162000063565b600080546001600160a01b039092166001600160a01b0319928316179055600280549091163217905562000093565b60006020828403121562000075578081fd5b81516001600160a01b03811681146200008c578182fd5b9392505050565b6159ee80620000a36000396000f3fe6080604052600436106100f75760003560e01c8063995605901161008a578063b43ae48f11610059578063b43ae48f1461025d578063c92aecc414610270578063d0bd7ca014610285578063fd63afa414610298576100fe565b806399560590146101f7578063a91ee0dc1461020a578063ab033ea91461022a578063ac95ea741461024a576100fe565b80635aa6e675116100c65780635aa6e6751461018f578063606df88b146101b15780638b4a59f5146101c457806396e90390146101d7576100fe565b8063368bb1fc146101035780634b0f93fb1461013a57806354575af41461015a578063599fe7f01461017c576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004614dce565b6102ab565b6040516101319291906154b8565b60405180910390f35b34801561014657600080fd5b50610123610155366004614dce565b6106a4565b34801561016657600080fd5b5061017a6101753660046152dd565b6109e6565b005b61017a61018a3660046151d2565b610ac2565b34801561019b57600080fd5b506101a4610efc565b60405161013191906153c5565b6101a46101bf366004615085565b610f0b565b61017a6101d2366004615222565b6116c5565b6101ea6101e5366004615286565b611fa8565b6040516101319190615858565b6101ea610205366004614fe9565b61216c565b34801561021657600080fd5b5061017a610225366004614db2565b612510565b34801561023657600080fd5b5061017a610245366004614db2565b612574565b6101ea610258366004614eac565b6125d8565b6101ea61026b366004614f30565b61294c565b34801561027c57600080fd5b506101a46138d4565b6101ea610293366004614faf565b6138e6565b6101ea6102a6366004615286565b613b50565b6001546040517fbfdbfc4300000000000000000000000000000000000000000000000000000000815260609160009183916001600160a01b03169063bfdbfc43906102fe908a908a90899060040161543f565b60006040518083038186803b15801561031657600080fd5b505afa15801561032a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103529190810190614e13565b90506060815167ffffffffffffffff8111801561036e57600080fd5b506040519080825280602002602001820160405280156103a857816020015b610395614b87565b81526020019060019003908161038d5790505b5090506000805b8351811015610421576103d68a8a8684815181106103c957fe5b6020026020010151613c4a565b8382815181106103e257fe5b60200260200101819052506104178382815181106103fc57fe5b602002602001015160c0015183613f4490919063ffffffff16565b91506001016103af565b506060825167ffffffffffffffff8111801561043c57600080fd5b50604051908082528060200260200182016040528015610466578160200160208202803683370190505b5090506000805b84518110156104f2576104aa846104a487848151811061048957fe5b602002602001015160c001518d613f7290919063ffffffff16565b90613fac565b8382815181106104b657fe5b6020026020010181815250506104e88382815181106104d157fe5b602002602001015183613f4490919063ffffffff16565b915060010161046d565b50888110156105495761052b6105088a83613fee565b8360008151811061051557fe5b6020026020010151613f4490919063ffffffff16565b8260008151811061053857fe5b602002602001018181525050610593565b610579610556828b613fee565b8360008151811061056357fe5b6020026020010151613fee90919063ffffffff16565b8260008151811061058657fe5b6020026020010181815250505b835167ffffffffffffffff811180156105ab57600080fd5b506040519080825280602002602001820160405280156105e557816020015b6105d2614bcd565b8152602001906001900390816105ca5790505b50965060005b8451811015610689576040518060c0016040528086838151811061060b57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061064f57fe5b60200260200101518152602001600019815260200160001981525088828151811061067657fe5b60209081029190910101526001016105eb565b506106948285614030565b9550505050505094509492505050565b6001546040517fbfdbfc4300000000000000000000000000000000000000000000000000000000815260609160009183916001600160a01b03169063bfdbfc43906106f7908a908a90899060040161543f565b60006040518083038186803b15801561070f57600080fd5b505afa158015610723573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261074b9190810190614e13565b90506060815167ffffffffffffffff8111801561076757600080fd5b506040519080825280602002602001820160405280156107a157816020015b61078e614b87565b8152602001906001900390816107865790505b5090506000805b83518110156107f2576107c28a8a8684815181106103c957fe5b8382815181106107ce57fe5b60200260200101819052506107e88382815181106103fc57fe5b91506001016107a8565b506060825167ffffffffffffffff8111801561080d57600080fd5b50604051908082528060200260200182016040528015610837578160200160208202803683370190505b5090506000805b845181101561088b5761085a846104a487848151811061048957fe5b83828151811061086657fe5b6020026020010181815250506108818382815181106104d157fe5b915060010161083e565b50888110156108bf576108a16105088a83613fee565b826000815181106108ae57fe5b6020026020010181815250506108e6565b6108cc610556828b613fee565b826000815181106108d957fe5b6020026020010181815250505b835167ffffffffffffffff811180156108fe57600080fd5b5060405190808252806020026020018201604052801561093857816020015b610925614bcd565b81526020019060019003908161091d5790505b50965060005b84518110156109db576040518060c0016040528086838151811061095e57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018483815181106109a257fe5b60200260200101518152602001600081526020016000198152508882815181106109c857fe5b602090810291909101015260010161093e565b506106948285614180565b6002546001600160a01b03163314610a195760405162461bcd60e51b8152600401610a1090615578565b60405180910390fd5b610a22836142c9565b15610aa9576000816001600160a01b031683604051610a40906153c2565b60006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b5050905080610aa35760405162461bcd60e51b8152600401610a109061578d565b50610abd565b610abd6001600160a01b03841682846142ef565b505050565b8060018116610c87576000610ad8868689614372565b15610ae1575060015b341580610aeb5750805b610b075760405162461bcd60e51b8152600401610a10906155e6565b8015610bcb57600080546040517f5db342770000000000000000000000000000000000000000000000000000000081526001600160a01b038a811692635db3427792610b5d92909116908a908a90600401615497565b602060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf919061531e565b9050610bc56001600160a01b03891633836142ef565b50610c81565b6040517f5db342770000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690635db3427790610c17908a908a908a90600401615497565b602060405180830381600087803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c69919061531e565b9050610c7f6001600160a01b03891633836142ef565b505b50610ef4565b60005a90506000610c9987878a614372565b15610ca2575060015b341580610cac5750805b610cc85760405162461bcd60e51b8152600401610a10906155e6565b8015610d8c57600080546040517f5db342770000000000000000000000000000000000000000000000000000000081526001600160a01b038b811692635db3427792610d1e92909116908b908b90600401615497565b602060405180830381600087803b158015610d3857600080fd5b505af1158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d70919061531e565b9050610d866001600160a01b038a1633836142ef565b50610e42565b6040517f5db342770000000000000000000000000000000000000000000000000000000081526000906001600160a01b038a1690635db3427790610dd8908b908b908b90600401615497565b602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a919061531e565b9050610e406001600160a01b038a1633836142ef565b505b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e8057fe5b046040518363ffffffff1660e01b8152600401610e9e9291906153f3565b602060405180830381600087803b158015610eb857600080fd5b505af1158015610ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef0919061531e565b5050505b505050505050565b6002546001600160a01b031681565b6000816001811661128d5789518814610f365760405162461bcd60e51b8152600401610a10906155af565b89518614610f565760405162461bcd60e51b8152600401610a10906155af565b8a6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc991906151b6565b91506000805b8b51811015611057576110088c8281518110610fe757fe5b60200260200101518c8c84818110610ffb57fe5b9050602002013586614449565b1561104f576000548c51600193506001600160a01b03909116908d908390811061102e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610fcf565b503415806110625750805b61107e5760405162461bcd60e51b8152600401610a10906155e6565b826001600160a01b031663650e872c87878e8c8c6040518663ffffffff1660e01b81526004016110b2959493929190615884565b600060405180830381600087803b1580156110cc57600080fd5b505af11580156110e0573d6000803e3d6000fd5b50506040517fe653bf3a0000000000000000000000000000000000000000000000000000000081526001600160a01b038616925063e653bf3a91506111299030906004016153c5565b600060405180830381600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b50506040517f92eefe9b0000000000000000000000000000000000000000000000000000000081526001600160a01b03861692506392eefe9b91506111a09033906004016153c5565b600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03861691506370a082319061121a9030906004016153c5565b60206040518083038186803b15801561123257600080fd5b505afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a919061531e565b90508015611286576112866001600160a01b03851633836142ef565b50506116b7565b60005a8b5190915089146112b35760405162461bcd60e51b8152600401610a10906155af565b8a5187146112d35760405162461bcd60e51b8152600401610a10906155af565b8b6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134691906151b6565b92506000805b8c518110156113d4576113858d828151811061136457fe5b60200260200101518d8d8481811061137857fe5b9050602002013587614449565b156113cc576000548d51600193506001600160a01b03909116908e90839081106113ab57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161134c565b503415806113df5750805b6113fb5760405162461bcd60e51b8152600401610a10906155e6565b836001600160a01b031663650e872c88888f8d8d6040518663ffffffff1660e01b815260040161142f959493929190615884565b600060405180830381600087803b15801561144957600080fd5b505af115801561145d573d6000803e3d6000fd5b50506040517fe653bf3a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716925063e653bf3a91506114a69030906004016153c5565b600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b50506040517f92eefe9b0000000000000000000000000000000000000000000000000000000081526001600160a01b03871692506392eefe9b915061151d9033906004016153c5565b600060405180830381600087803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03871691506370a08231906115979030906004016153c5565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e7919061531e565b90508015611603576116036001600160a01b03861633836142ef565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161164357fe5b046040518363ffffffff1660e01b81526004016116619291906153f3565b602060405180830381600087803b15801561167b57600080fd5b505af115801561168f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b3919061531e565b5050505b509998505050505050505050565b8060018116611b30576060866001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b15801561170957600080fd5b505afa15801561171d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117459190810190614e13565b805190915084146117685760405162461bcd60e51b8152600401610a10906155af565b6000805b825181101561181d576000341180156117b0575060005483516001600160a01b039091169084908390811061179d57fe5b60200260200101516001600160a01b0316145b156117f0576117e673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8888848181106117d957fe5b905060200201358b614372565b5060019150611815565b6118138382815181106117ff57fe5b60200260200101518888848181106117d957fe5b505b60010161176c565b503415806118285750805b6118445760405162461bcd60e51b8152600401610a10906155e6565b876001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b5919061531e565b6103e9141561193e576040517f4f69c0d40000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634f69c0d490611907908a908a908a90600401615861565b600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b505050506119bc565b6040517f4d950c740000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634d950c74906119899033908b908b908b9060040161540c565b600060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050505b60005b8251811015611a8257818015611a00575060005483516001600160a01b03909116908490839081106119ed57fe5b60200260200101516001600160a01b0316145b15611a4557611a3f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a3a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61459b565b614690565b50611a7a565b611a78838281518110611a5457fe5b6020026020010151611a3a858481518110611a6b57fe5b602002602001015161459b565b505b6001016119bf565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038a16906370a0823190611acb9030906004016153c5565b60206040518083038186803b158015611ae357600080fd5b505afa158015611af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1b919061531e565b9050611b278982614690565b50505050610ef4565b60005a90506060876001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b158015611b7057600080fd5b505afa158015611b84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bac9190810190614e13565b80519091508514611bcf5760405162461bcd60e51b8152600401610a10906155af565b6000805b8251811015611c8457600034118015611c17575060005483516001600160a01b0390911690849083908110611c0457fe5b60200260200101516001600160a01b0316145b15611c5757611c4d73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee898984818110611c4057fe5b905060200201358c614372565b5060019150611c7c565b611c7a838281518110611c6657fe5b6020026020010151898984818110611c4057fe5b505b600101611bd3565b50341580611c8f5750805b611cab5760405162461bcd60e51b8152600401610a10906155e6565b886001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce457600080fd5b505afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c919061531e565b6103e91415611da5576040517f4f69c0d40000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690634f69c0d490611d6e908b908b908b90600401615861565b600060405180830381600087803b158015611d8857600080fd5b505af1158015611d9c573d6000803e3d6000fd5b50505050611e23565b6040517f4d950c740000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690634d950c7490611df09033908c908c908c9060040161540c565b600060405180830381600087803b158015611e0a57600080fd5b505af1158015611e1e573d6000803e3d6000fd5b505050505b60005b8251811015611ec057818015611e67575060005483516001600160a01b0390911690849083908110611e5457fe5b60200260200101516001600160a01b0316145b15611ea757611ea173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a3a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61459b565b50611eb8565b611eb6838281518110611a5457fe5b505b600101611e26565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038b16906370a0823190611f099030906004016153c5565b60206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f59919061531e565b9050611f658a82614690565b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e8057fe5b60008160018116612031576060611fbe896142c9565b15611fe357600054611fdb906001600160a01b03168989886106a4565b50905061201a565b611fec886142c9565b1561200a57600054611fdb908a906001600160a01b031689886106a4565b612016898989886106a4565b5090505b612029818a8a8a8a60006138e6565b925050612161565b60005a905060606120418a6142c9565b156120665760005461205e906001600160a01b03168a8a896106a4565b50905061209d565b61206f896142c9565b1561208d5760005461205e908b906001600160a01b03168a896106a4565b6120998a8a8a896106a4565b5090505b6120ac818b8b8b8b60006138e6565b935060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120ed57fe5b046040518363ffffffff1660e01b815260040161210b9291906153f3565b602060405180830381600087803b15801561212557600080fd5b505af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d919061531e565b5050505b509695505050505050565b600081600181166122e65761218186856147c7565b5060005b87518110156122a457612196614bcd565b8882815181106121a257fe5b602002602001015190506000816020015190506000826000015190506121d18284600001518560800151614858565b60208301516080840151604080860151606087015160a088015192517f7c5e9ea40000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695637c5e9ea4956122349592949193600401615463565b6040805180830381600087803b15801561224d57600080fd5b505af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190615336565b5090506122928188613f44565b96505060019093019250612185915050565b50838211156122c55760405162461bcd60e51b8152600401610a10906156c2565b6122d285611a3a8761459b565b506122e086611a3a8861459b565b50612506565b60005a90506122f587866147c7565b5060005b88518110156124185761230a614bcd565b89828151811061231657fe5b602002602001015190506000816020015190506000826000015190506123458284600001518560800151614858565b60208301516080840151604080860151606087015160a088015192517f7c5e9ea40000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695637c5e9ea4956123a89592949193600401615463565b6040805180830381600087803b1580156123c157600080fd5b505af11580156123d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f99190615336565b5090506124068189613f44565b975050600190930192506122f9915050565b50848311156124395760405162461bcd60e51b8152600401610a10906156c2565b61244686611a3a8861459b565b5061245487611a3a8961459b565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161249257fe5b046040518363ffffffff1660e01b81526004016124b09291906153f3565b602060405180830381600087803b1580156124ca57600080fd5b505af11580156124de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612502919061531e565b5050505b5095945050505050565b6002546001600160a01b0316331461253a5760405162461bcd60e51b8152600401610a1090615578565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461259e5760405162461bcd60e51b8152600401610a1090615578565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60008160018116612779576125ed87866147c7565b5060005b885181101561273a576000805b8a838151811061260a57fe5b60200260200101515181101561272457612622614bcd565b8b848151811061262e57fe5b6020026020010151828151811061264157fe5b60200260200101519050600081602001519050826001141561266557606082018490525b815160608301516126799083908390614858565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b81526004016126c1959493929190615463565b6040805180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190615336565b50945050600190920191506125fe9050565b5061272f8185613f44565b9350506001016125f1565b508382101561275b5760405162461bcd60e51b8152600401610a109061568b565b6127658683614690565b5061277387611a3a8961459b565b50612161565b60005a905061278888876147c7565b5060005b89518110156128d5576000805b8b83815181106127a557fe5b6020026020010151518110156128bf576127bd614bcd565b8c84815181106127c957fe5b602002602001015182815181106127dc57fe5b60200260200101519050600081602001519050826001141561280057606082018490525b815160608301516128149083908390614858565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b815260040161285c959493929190615463565b6040805180830381600087803b15801561287557600080fd5b505af1158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190615336565b50945050600190920191506127999050565b506128ca8186613f44565b94505060010161278c565b50848310156128f65760405162461bcd60e51b8152600401610a109061568b565b6129008784614690565b5061290e88611a3a8a61459b565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120ed57fe5b600081600181166131135761296186856147c7565b5060005b87518110156122a457600088828151811061297c57fe5b60200260200101515160011415612a8957612995614bcd565b8983815181106129a157fe5b60200260200101516000815181106129b557fe5b602002602001015190506000816020015190506000826000015190506129e48284600001518560800151614858565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401612a2c959493929190615463565b6040805180830381600087803b158015612a4557600080fd5b505af1158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190615336565b5093506130fe92505050565b6000612a93614bcd565b8a8481518110612a9f57fe5b6020026020010151600181518110612ab357fe5b6020908102919091018101518051918101516040517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f91612b13916004016153c5565b60206040518083038186803b158015612b2b57600080fd5b505afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b63919061531e565b60208501516040517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169163948d8ce691612bac91906004016153c5565b60206040518083038186803b158015612bc457600080fd5b505afa158015612bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bfc919061531e565b60408087015190517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169163f8b2cb4f91612c4591906004016153c5565b60206040518083038186803b158015612c5d57600080fd5b505afa158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c95919061531e565b60408088015190517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0388169163948d8ce691612cde91906004016153c5565b60206040518083038186803b158015612cf657600080fd5b505afa158015612d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2e919061531e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d6c57600080fd5b505afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da4919061531e565b6040518763ffffffff1660e01b8152600401612dc5969594939291906158f6565b60206040518083038186803b158015612ddd57600080fd5b505afa158015612df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e15919061531e565b9250612e1f614bcd565b8c8681518110612e2b57fe5b6020026020010151600081518110612e3f57fe5b6020908102919091018101519081015181516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529293509091600019906001600160a01b0384169063dd62ed3e90612ea190309086906004016153d9565b60206040518083038186803b158015612eb957600080fd5b505afa158015612ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef1919061531e565b1015612f0857612f08828460000151600019614858565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b8152600401612f4c959493929190615463565b6040805180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d9190615336565b50602086015186516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529299509091600019916001600160a01b0384169163dd62ed3e91612ff4913091906004016153d9565b60206040518083038186803b15801561300c57600080fd5b505afa158015613020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613044919061531e565b101561305b5761305b818760000151600019614858565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016130a3959493929190615463565b6040805180830381600087803b1580156130bc57600080fd5b505af11580156130d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f49190615336565b5050505050505050505b6131088185613f44565b935050600101612965565b60005a905061312287866147c7565b5060005b885181101561241857600089828151811061313d57fe5b6020026020010151516001141561324a57613156614bcd565b8a838151811061316257fe5b602002602001015160008151811061317657fe5b602002602001015190506000816020015190506000826000015190506131a58284600001518560800151614858565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b81526004016131ed959493929190615463565b6040805180830381600087803b15801561320657600080fd5b505af115801561321a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323e9190615336565b5093506138bf92505050565b6000613254614bcd565b8b848151811061326057fe5b602002602001015160018151811061327457fe5b6020908102919091018101518051918101516040517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916132d4916004016153c5565b60206040518083038186803b1580156132ec57600080fd5b505afa158015613300573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613324919061531e565b60208501516040517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169163948d8ce69161336d91906004016153c5565b60206040518083038186803b15801561338557600080fd5b505afa158015613399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bd919061531e565b60408087015190517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169163f8b2cb4f9161340691906004016153c5565b60206040518083038186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613456919061531e565b60408088015190517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0388169163948d8ce69161349f91906004016153c5565b60206040518083038186803b1580156134b757600080fd5b505afa1580156134cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ef919061531e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561352d57600080fd5b505afa158015613541573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613565919061531e565b6040518763ffffffff1660e01b8152600401613586969594939291906158f6565b60206040518083038186803b15801561359e57600080fd5b505afa1580156135b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d6919061531e565b92506135e0614bcd565b8d86815181106135ec57fe5b602002602001015160008151811061360057fe5b6020908102919091018101519081015181516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529293509091600019906001600160a01b0384169063dd62ed3e9061366290309086906004016153d9565b60206040518083038186803b15801561367a57600080fd5b505afa15801561368e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b2919061531e565b10156136c9576136c9828460000151600019614858565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b815260040161370d959493929190615463565b6040805180830381600087803b15801561372657600080fd5b505af115801561373a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375e9190615336565b50602086015186516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529299509091600019916001600160a01b0384169163dd62ed3e916137b5913091906004016153d9565b60206040518083038186803b1580156137cd57600080fd5b505afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613805919061531e565b101561381c5761381c818760000151600019614858565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b8152600401613864959493929190615463565b6040805180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b59190615336565b5050505050505050505b6138c98186613f44565b945050600101613126565b6d4946c0e9f43f4dee607b0ef1fa1c81565b60008160018116613a1e576138fb87866147c7565b5060005b885181101561273a57613910614bcd565b89828151811061391c57fe5b6020026020010151905060008160200151905060008260000151905061394b8284600001518560600151614858565b60208301516060840151604080860151608087015160a088015192517f8201aa3f0000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695638201aa3f956139ae9592949193600401615463565b6040805180830381600087803b1580156139c757600080fd5b505af11580156139db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ff9190615336565b509050613a0c8188613f44565b965050600190930192506138ff915050565b60005a9050613a2d88876147c7565b5060005b89518110156128d557613a42614bcd565b8a8281518110613a4e57fe5b60200260200101519050600081602001519050600082600001519050613a7d8284600001518560600151614858565b60208301516060840151604080860151608087015160a088015192517f8201aa3f0000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695638201aa3f95613ae09592949193600401615463565b6040805180830381600087803b158015613af957600080fd5b505af1158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b319190615336565b509050613b3e8189613f44565b97505060019093019250613a31915050565b60008160018116613bd0576060613b66896142c9565b15613b8b57600054613b83906001600160a01b03168989886102ab565b509050613bc2565b613b94886142c9565b15613bb257600054613b83908a906001600160a01b031689886102ab565b613bbe898989886102ab565b5090505b612029818a8a89600061216c565b60005a90506060613be08a6142c9565b15613c0557600054613bfd906001600160a01b03168a8a896102ab565b509050613c3c565b613c0e896142c9565b15613c2c57600054613bfd908b906001600160a01b03168a896102ab565b613c388a8a8a896102ab565b5090505b6120ac818b8b8a600061216c565b613c52614b87565b6040517ff8b2cb4f00000000000000000000000000000000000000000000000000000000815282906000906001600160a01b0383169063f8b2cb4f90613c9c9089906004016153c5565b60206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cec919061531e565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b8152600401613d1c91906153c5565b60206040518083038186803b158015613d3457600080fd5b505afa158015613d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6c919061531e565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613d9c91906153c5565b60206040518083038186803b158015613db457600080fd5b505afa158015613dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dec919061531e565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613e1c91906153c5565b60206040518083038186803b158015613e3457600080fd5b505afa158015613e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6c919061531e565b90506000856001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ea957600080fd5b505afa158015613ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee1919061531e565b90506000613ef084868561495b565b9050613efa614b87565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150505b9392505050565b600082820183811015613f695760405162461bcd60e51b8152600401610a109061561d565b90505b92915050565b600082613f8157506000613f6c565b82820282848281613f8e57fe5b0414613f695760405162461bcd60e51b8152600401610a10906156f9565b6000613f6983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061499a565b6000613f6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149d1565b6000805b835181101561417957600083828151811061404b57fe5b6020026020010151600001516001600160a01b031663f8d6aed485848151811061407157fe5b60200260200101516020015186858151811061408957fe5b6020026020010151604001518786815181106140a157fe5b6020026020010151606001518887815181106140b957fe5b6020026020010151608001518a88815181106140d157fe5b60200260200101518a89815181106140e557fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401614112969594939291906158f6565b60206040518083038186803b15801561412a57600080fd5b505afa15801561413e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614162919061531e565b905061416e8382613f44565b925050600101614034565b5092915050565b6000805b835181101561417957600083828151811061419b57fe5b6020026020010151600001516001600160a01b031663ba9530a68584815181106141c157fe5b6020026020010151602001518685815181106141d957fe5b6020026020010151604001518786815181106141f157fe5b60200260200101516060015188878151811061420957fe5b6020026020010151608001518a888151811061422157fe5b60200260200101518a898151811061423557fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401614262969594939291906158f6565b60206040518083038186803b15801561427a57600080fd5b505afa15801561428e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b2919061531e565b90506142be8382613f44565b925050600101614184565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b610abd8363a9059cbb60e01b848460405160240161430e9291906153f3565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526149fd565b600061437d846142c9565b15614429573483146143a15760405162461bcd60e51b8152600401610a1090615756565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156143ef57600080fd5b505af1158015614403573d6000803e3d6000fd5b505060005461442193506001600160a01b0316915084905085614858565b506001613f3d565b61443e6001600160a01b038516333086614a8c565b613f3d848385614858565b6000614454846142c9565b15614586573483146144785760405162461bcd60e51b8152600401610a1090615756565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156144c657600080fd5b505af11580156144da573d6000803e3d6000fd5b50506000546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116935063a9059cbb925061452a9150859087906004016153f3565b602060405180830381600087803b15801561454457600080fd5b505af1158015614558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061457c9190615065565b5060019050613f3d565b613f3d6001600160a01b038516338486614a8c565b60006145a6826142c9565b1561464b576000546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906370a08231906145f49030906004016153c5565b60206040518083038186803b15801561460c57600080fd5b505afa158015614620573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614644919061531e565b90506142ea565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906145f49030906004016153c5565b60008161469f57506001613f6c565b6146a8836142c9565b156147aa576000546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d906146f6908590600401615858565b600060405180830381600087803b15801561471057600080fd5b505af1158015614724573d6000803e3d6000fd5b505050506000336001600160a01b031683604051614741906153c2565b60006040518083038185875af1925050503d806000811461477e576040519150601f19603f3d011682016040523d82523d6000602084013e614783565b606091505b50509050806147a45760405162461bcd60e51b8152600401610a109061578d565b506147be565b6147be6001600160a01b03841633846142ef565b50600192915050565b60006147d2836142c9565b156148435760008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561482557600080fd5b505af1158015614839573d6000803e3d6000fd5b50505050506147be565b6147be6001600160a01b038416333085614a8c565b60006060846001600160a01b031663095ea7b3858560405160240161487e9291906153f3565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516148cc91906153a6565b6000604051808303816000865af19150503d8060008114614909576040519150601f19603f3d011682016040523d82523d6000602084013e61490e565b606091505b50915091508180156149385750805115806149385750808060200190518101906149389190615065565b6149545760405162461bcd60e51b8152600401610a1090615654565b5050505050565b6000614992670de0b6b3a76400006104a48561498c61497a878a613f44565b6104a48a670de0b6b3a7640000613f72565b90613f72565b949350505050565b600081836149bb5760405162461bcd60e51b8152600401610a109190615545565b5060008385816149c757fe5b0495945050505050565b600081848411156149f55760405162461bcd60e51b8152600401610a109190615545565b505050900390565b6060614a52826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614ab39092919063ffffffff16565b805190915015610abd5780806020019051810190614a709190615065565b610abd5760405162461bcd60e51b8152600401610a10906157fb565b614aad846323b872dd60e01b85858560405160240161430e9392919061543f565b50505050565b606061499284846000856060614ac885614b81565b614ae45760405162461bcd60e51b8152600401610a10906157c4565b60006060866001600160a01b03168587604051614b0191906153a6565b60006040518083038185875af1925050503d8060008114614b3e576040519150601f19603f3d011682016040523d82523d6000602084013e614b43565b606091505b50915091508115614b575791506149929050565b805115614b675780518082602001fd5b8360405162461bcd60e51b8152600401610a109190615545565b3b151590565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b600082601f830112614c2e578081fd5b8135614c41614c3c82615945565b61591e565b818152915060208083019084810160005b84811015614c7b57614c69888484358a0101614c86565b84529282019290820190600101614c52565b505050505092915050565b600082601f830112614c96578081fd5b8135614ca4614c3c82615945565b818152915060208083019084810160c080850287018301881015614cc757600080fd5b6000805b86811015614d4b5782848b031215614ce1578182fd5b614cea8361591e565b8435614cf581615991565b815284860135614d0481615991565b81870152604085810135614d1781615991565b90820152606085810135908201526080808601359082015260a0808601359082015286529484019492820192600101614ccb565b5050505050505092915050565b60008083601f840112614d69578182fd5b50813567ffffffffffffffff811115614d80578182fd5b6020830191508360208083028501011115614d9a57600080fd5b9250929050565b803560ff81168114613f6c57600080fd5b600060208284031215614dc3578081fd5b8135613f6981615991565b60008060008060808587031215614de3578283fd5b8435614dee81615991565b93506020850135614dfe81615991565b93969395505050506040820135916060013590565b60006020808385031215614e25578182fd5b825167ffffffffffffffff811115614e3b578283fd5b8301601f81018513614e4b578283fd5b8051614e59614c3c82615945565b8181528381019083850185840285018601891015614e75578687fd5b8694505b83851015614ea0578051614e8c81615991565b835260019490940193918501918501614e79565b50979650505050505050565b60008060008060008060c08789031215614ec4578182fd5b863567ffffffffffffffff811115614eda578283fd5b614ee689828a01614c1e565b9650506020870135614ef781615991565b94506040870135614f0781615991565b93506060870135925060808701359150614f248860a08901614da1565b90509295509295509295565b600080600080600060a08688031215614f47578081fd5b853567ffffffffffffffff811115614f5d578182fd5b614f6988828901614c1e565b9550506020860135614f7a81615991565b93506040860135614f8a81615991565b9250606086013591506080860135614fa1816159a9565b809150509295509295909350565b60008060008060008060c08789031215614fc7578384fd5b863567ffffffffffffffff811115614fdd578485fd5b614ee689828a01614c86565b600080600080600060a08688031215615000578283fd5b853567ffffffffffffffff811115615016578384fd5b61502288828901614c86565b955050602086013561503381615991565b9350604086013561504381615991565b9250606086013591506150598760808801614da1565b90509295509295909350565b600060208284031215615076578081fd5b81518015158114613f69578182fd5b600080600080600080600080600060e08a8c0312156150a2578687fd5b6150ac8a35615991565b8935985067ffffffffffffffff8060208c013511156150c9578788fd5b60208b01358b018c601f8201126150de578889fd5b6150eb614c3c8235615945565b8082358252602082019150602083018f602080863502860101111561510e578b8cfd5b8b5b8435811015615139576151238235615991565b8135845260209384019390910190600101615110565b5050809b505050508060408c01351115615151578788fd5b6151618c60408d01358d01614d58565b909850965060608b0135811015615176578384fd5b506151878b60608c01358c01614d58565b909550935060808a0135925060a08a013591506151a78b60c08c01614da1565b90509295985092959850929598565b6000602082840312156151c7578081fd5b8151613f6981615991565b600080600080600060a086880312156151e9578283fd5b85356151f481615991565b9450602086013561520481615991565b935060408601359250606086013591506080860135614fa1816159a9565b600080600080600060808688031215615239578283fd5b853561524481615991565b945060208601359350604086013567ffffffffffffffff811115615266578384fd5b61527288828901614d58565b909450925061505990508760608801614da1565b60008060008060008060c0878903121561529e578384fd5b86356152a981615991565b955060208701356152b981615991565b9450604087013593506060870135925060808701359150614f248860a08901614da1565b6000806000606084860312156152f1578081fd5b83356152fc81615991565b925060208401359150604084013561531381615991565b809150509250925092565b60006020828403121561532f578081fd5b5051919050565b60008060408385031215615348578182fd5b505080516020909101519092909150565b60008284527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561538a578081fd5b6020830280836020870137939093016020019283525090919050565b600082516153b8818460208701615965565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b038616825284602083015260606040830152615435606083018486615359565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6040808252835182820181905260009190606090818501906020808901865b8381101561553157815180516001600160a01b0390811687528482015181168588015288820151168887015286810151878701526080808201519087015260a0908101519086015260c090940193908201906001016154d7565b505095909501959095525092949350505050565b6000602082528251806020840152615564816040850160208701615965565b601f01601f19169190910160400192915050565b6020808252600b908201527f21676f7665726e616e6365000000000000000000000000000000000000000000604082015260600190565b60208082526013908201527f4552525f4c454e4754485f4d49534d4154434800000000000000000000000000604082015260600190565b60208082526010908201527f21696e76616c69642070617961626c6500000000000000000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b6020808252600d908201527f4552525f4c494d49545f4f555400000000000000000000000000000000000000604082015260600190565b6020808252600c908201527f4552525f4c494d49545f494e0000000000000000000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f21696e76616c696420616d6f756e740000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4552525f4554485f4641494c4544000000000000000000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b90815260200190565b60008482526040602083015261587b604083018486615359565b95945050505050565b600060808201878352602087818501526080604085015281875180845260a0860191508289019350845b818110156158d35784516001600160a01b0316835293830193918301916001016158ae565b505084810360608601526158e8818789615359565b9a9950505050505050505050565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405181810167ffffffffffffffff8111828210171561593d57600080fd5b604052919050565b600067ffffffffffffffff82111561595b578081fd5b5060209081020190565b60005b83811015615980578181015183820152602001615968565b83811115614aad5750506000910152565b6001600160a01b03811681146159a657600080fd5b50565b60ff811681146159a657600080fdfea2646970667358221220ac7c5697aa39e7fcb329127909c91b5c406622e90b3f824585f82055e27cacf164736f6c634300060c0033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063995605901161008a578063b43ae48f11610059578063b43ae48f1461025d578063c92aecc414610270578063d0bd7ca014610285578063fd63afa414610298576100fe565b806399560590146101f7578063a91ee0dc1461020a578063ab033ea91461022a578063ac95ea741461024a576100fe565b80635aa6e675116100c65780635aa6e6751461018f578063606df88b146101b15780638b4a59f5146101c457806396e90390146101d7576100fe565b8063368bb1fc146101035780634b0f93fb1461013a57806354575af41461015a578063599fe7f01461017c576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004614dce565b6102ab565b6040516101319291906154b8565b60405180910390f35b34801561014657600080fd5b50610123610155366004614dce565b6106a4565b34801561016657600080fd5b5061017a6101753660046152dd565b6109e6565b005b61017a61018a3660046151d2565b610ac2565b34801561019b57600080fd5b506101a4610efc565b60405161013191906153c5565b6101a46101bf366004615085565b610f0b565b61017a6101d2366004615222565b6116c5565b6101ea6101e5366004615286565b611fa8565b6040516101319190615858565b6101ea610205366004614fe9565b61216c565b34801561021657600080fd5b5061017a610225366004614db2565b612510565b34801561023657600080fd5b5061017a610245366004614db2565b612574565b6101ea610258366004614eac565b6125d8565b6101ea61026b366004614f30565b61294c565b34801561027c57600080fd5b506101a46138d4565b6101ea610293366004614faf565b6138e6565b6101ea6102a6366004615286565b613b50565b6001546040517fbfdbfc4300000000000000000000000000000000000000000000000000000000815260609160009183916001600160a01b03169063bfdbfc43906102fe908a908a90899060040161543f565b60006040518083038186803b15801561031657600080fd5b505afa15801561032a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103529190810190614e13565b90506060815167ffffffffffffffff8111801561036e57600080fd5b506040519080825280602002602001820160405280156103a857816020015b610395614b87565b81526020019060019003908161038d5790505b5090506000805b8351811015610421576103d68a8a8684815181106103c957fe5b6020026020010151613c4a565b8382815181106103e257fe5b60200260200101819052506104178382815181106103fc57fe5b602002602001015160c0015183613f4490919063ffffffff16565b91506001016103af565b506060825167ffffffffffffffff8111801561043c57600080fd5b50604051908082528060200260200182016040528015610466578160200160208202803683370190505b5090506000805b84518110156104f2576104aa846104a487848151811061048957fe5b602002602001015160c001518d613f7290919063ffffffff16565b90613fac565b8382815181106104b657fe5b6020026020010181815250506104e88382815181106104d157fe5b602002602001015183613f4490919063ffffffff16565b915060010161046d565b50888110156105495761052b6105088a83613fee565b8360008151811061051557fe5b6020026020010151613f4490919063ffffffff16565b8260008151811061053857fe5b602002602001018181525050610593565b610579610556828b613fee565b8360008151811061056357fe5b6020026020010151613fee90919063ffffffff16565b8260008151811061058657fe5b6020026020010181815250505b835167ffffffffffffffff811180156105ab57600080fd5b506040519080825280602002602001820160405280156105e557816020015b6105d2614bcd565b8152602001906001900390816105ca5790505b50965060005b8451811015610689576040518060c0016040528086838151811061060b57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061064f57fe5b60200260200101518152602001600019815260200160001981525088828151811061067657fe5b60209081029190910101526001016105eb565b506106948285614030565b9550505050505094509492505050565b6001546040517fbfdbfc4300000000000000000000000000000000000000000000000000000000815260609160009183916001600160a01b03169063bfdbfc43906106f7908a908a90899060040161543f565b60006040518083038186803b15801561070f57600080fd5b505afa158015610723573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261074b9190810190614e13565b90506060815167ffffffffffffffff8111801561076757600080fd5b506040519080825280602002602001820160405280156107a157816020015b61078e614b87565b8152602001906001900390816107865790505b5090506000805b83518110156107f2576107c28a8a8684815181106103c957fe5b8382815181106107ce57fe5b60200260200101819052506107e88382815181106103fc57fe5b91506001016107a8565b506060825167ffffffffffffffff8111801561080d57600080fd5b50604051908082528060200260200182016040528015610837578160200160208202803683370190505b5090506000805b845181101561088b5761085a846104a487848151811061048957fe5b83828151811061086657fe5b6020026020010181815250506108818382815181106104d157fe5b915060010161083e565b50888110156108bf576108a16105088a83613fee565b826000815181106108ae57fe5b6020026020010181815250506108e6565b6108cc610556828b613fee565b826000815181106108d957fe5b6020026020010181815250505b835167ffffffffffffffff811180156108fe57600080fd5b5060405190808252806020026020018201604052801561093857816020015b610925614bcd565b81526020019060019003908161091d5790505b50965060005b84518110156109db576040518060c0016040528086838151811061095e57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018483815181106109a257fe5b60200260200101518152602001600081526020016000198152508882815181106109c857fe5b602090810291909101015260010161093e565b506106948285614180565b6002546001600160a01b03163314610a195760405162461bcd60e51b8152600401610a1090615578565b60405180910390fd5b610a22836142c9565b15610aa9576000816001600160a01b031683604051610a40906153c2565b60006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b5050905080610aa35760405162461bcd60e51b8152600401610a109061578d565b50610abd565b610abd6001600160a01b03841682846142ef565b505050565b8060018116610c87576000610ad8868689614372565b15610ae1575060015b341580610aeb5750805b610b075760405162461bcd60e51b8152600401610a10906155e6565b8015610bcb57600080546040517f5db342770000000000000000000000000000000000000000000000000000000081526001600160a01b038a811692635db3427792610b5d92909116908a908a90600401615497565b602060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf919061531e565b9050610bc56001600160a01b03891633836142ef565b50610c81565b6040517f5db342770000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690635db3427790610c17908a908a908a90600401615497565b602060405180830381600087803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c69919061531e565b9050610c7f6001600160a01b03891633836142ef565b505b50610ef4565b60005a90506000610c9987878a614372565b15610ca2575060015b341580610cac5750805b610cc85760405162461bcd60e51b8152600401610a10906155e6565b8015610d8c57600080546040517f5db342770000000000000000000000000000000000000000000000000000000081526001600160a01b038b811692635db3427792610d1e92909116908b908b90600401615497565b602060405180830381600087803b158015610d3857600080fd5b505af1158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d70919061531e565b9050610d866001600160a01b038a1633836142ef565b50610e42565b6040517f5db342770000000000000000000000000000000000000000000000000000000081526000906001600160a01b038a1690635db3427790610dd8908b908b908b90600401615497565b602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a919061531e565b9050610e406001600160a01b038a1633836142ef565b505b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e8057fe5b046040518363ffffffff1660e01b8152600401610e9e9291906153f3565b602060405180830381600087803b158015610eb857600080fd5b505af1158015610ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef0919061531e565b5050505b505050505050565b6002546001600160a01b031681565b6000816001811661128d5789518814610f365760405162461bcd60e51b8152600401610a10906155af565b89518614610f565760405162461bcd60e51b8152600401610a10906155af565b8a6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc991906151b6565b91506000805b8b51811015611057576110088c8281518110610fe757fe5b60200260200101518c8c84818110610ffb57fe5b9050602002013586614449565b1561104f576000548c51600193506001600160a01b03909116908d908390811061102e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610fcf565b503415806110625750805b61107e5760405162461bcd60e51b8152600401610a10906155e6565b826001600160a01b031663650e872c87878e8c8c6040518663ffffffff1660e01b81526004016110b2959493929190615884565b600060405180830381600087803b1580156110cc57600080fd5b505af11580156110e0573d6000803e3d6000fd5b50506040517fe653bf3a0000000000000000000000000000000000000000000000000000000081526001600160a01b038616925063e653bf3a91506111299030906004016153c5565b600060405180830381600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b50506040517f92eefe9b0000000000000000000000000000000000000000000000000000000081526001600160a01b03861692506392eefe9b91506111a09033906004016153c5565b600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03861691506370a082319061121a9030906004016153c5565b60206040518083038186803b15801561123257600080fd5b505afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a919061531e565b90508015611286576112866001600160a01b03851633836142ef565b50506116b7565b60005a8b5190915089146112b35760405162461bcd60e51b8152600401610a10906155af565b8a5187146112d35760405162461bcd60e51b8152600401610a10906155af565b8b6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134691906151b6565b92506000805b8c518110156113d4576113858d828151811061136457fe5b60200260200101518d8d8481811061137857fe5b9050602002013587614449565b156113cc576000548d51600193506001600160a01b03909116908e90839081106113ab57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161134c565b503415806113df5750805b6113fb5760405162461bcd60e51b8152600401610a10906155e6565b836001600160a01b031663650e872c88888f8d8d6040518663ffffffff1660e01b815260040161142f959493929190615884565b600060405180830381600087803b15801561144957600080fd5b505af115801561145d573d6000803e3d6000fd5b50506040517fe653bf3a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716925063e653bf3a91506114a69030906004016153c5565b600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b50506040517f92eefe9b0000000000000000000000000000000000000000000000000000000081526001600160a01b03871692506392eefe9b915061151d9033906004016153c5565b600060405180830381600087803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03871691506370a08231906115979030906004016153c5565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e7919061531e565b90508015611603576116036001600160a01b03861633836142ef565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161164357fe5b046040518363ffffffff1660e01b81526004016116619291906153f3565b602060405180830381600087803b15801561167b57600080fd5b505af115801561168f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b3919061531e565b5050505b509998505050505050505050565b8060018116611b30576060866001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b15801561170957600080fd5b505afa15801561171d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117459190810190614e13565b805190915084146117685760405162461bcd60e51b8152600401610a10906155af565b6000805b825181101561181d576000341180156117b0575060005483516001600160a01b039091169084908390811061179d57fe5b60200260200101516001600160a01b0316145b156117f0576117e673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8888848181106117d957fe5b905060200201358b614372565b5060019150611815565b6118138382815181106117ff57fe5b60200260200101518888848181106117d957fe5b505b60010161176c565b503415806118285750805b6118445760405162461bcd60e51b8152600401610a10906155e6565b876001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b5919061531e565b6103e9141561193e576040517f4f69c0d40000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634f69c0d490611907908a908a908a90600401615861565b600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b505050506119bc565b6040517f4d950c740000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634d950c74906119899033908b908b908b9060040161540c565b600060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050505b60005b8251811015611a8257818015611a00575060005483516001600160a01b03909116908490839081106119ed57fe5b60200260200101516001600160a01b0316145b15611a4557611a3f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a3a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61459b565b614690565b50611a7a565b611a78838281518110611a5457fe5b6020026020010151611a3a858481518110611a6b57fe5b602002602001015161459b565b505b6001016119bf565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038a16906370a0823190611acb9030906004016153c5565b60206040518083038186803b158015611ae357600080fd5b505afa158015611af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1b919061531e565b9050611b278982614690565b50505050610ef4565b60005a90506060876001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b158015611b7057600080fd5b505afa158015611b84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bac9190810190614e13565b80519091508514611bcf5760405162461bcd60e51b8152600401610a10906155af565b6000805b8251811015611c8457600034118015611c17575060005483516001600160a01b0390911690849083908110611c0457fe5b60200260200101516001600160a01b0316145b15611c5757611c4d73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee898984818110611c4057fe5b905060200201358c614372565b5060019150611c7c565b611c7a838281518110611c6657fe5b6020026020010151898984818110611c4057fe5b505b600101611bd3565b50341580611c8f5750805b611cab5760405162461bcd60e51b8152600401610a10906155e6565b886001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce457600080fd5b505afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c919061531e565b6103e91415611da5576040517f4f69c0d40000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690634f69c0d490611d6e908b908b908b90600401615861565b600060405180830381600087803b158015611d8857600080fd5b505af1158015611d9c573d6000803e3d6000fd5b50505050611e23565b6040517f4d950c740000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690634d950c7490611df09033908c908c908c9060040161540c565b600060405180830381600087803b158015611e0a57600080fd5b505af1158015611e1e573d6000803e3d6000fd5b505050505b60005b8251811015611ec057818015611e67575060005483516001600160a01b0390911690849083908110611e5457fe5b60200260200101516001600160a01b0316145b15611ea757611ea173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a3a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61459b565b50611eb8565b611eb6838281518110611a5457fe5b505b600101611e26565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038b16906370a0823190611f099030906004016153c5565b60206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f59919061531e565b9050611f658a82614690565b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e8057fe5b60008160018116612031576060611fbe896142c9565b15611fe357600054611fdb906001600160a01b03168989886106a4565b50905061201a565b611fec886142c9565b1561200a57600054611fdb908a906001600160a01b031689886106a4565b612016898989886106a4565b5090505b612029818a8a8a8a60006138e6565b925050612161565b60005a905060606120418a6142c9565b156120665760005461205e906001600160a01b03168a8a896106a4565b50905061209d565b61206f896142c9565b1561208d5760005461205e908b906001600160a01b03168a896106a4565b6120998a8a8a896106a4565b5090505b6120ac818b8b8b8b60006138e6565b935060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120ed57fe5b046040518363ffffffff1660e01b815260040161210b9291906153f3565b602060405180830381600087803b15801561212557600080fd5b505af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d919061531e565b5050505b509695505050505050565b600081600181166122e65761218186856147c7565b5060005b87518110156122a457612196614bcd565b8882815181106121a257fe5b602002602001015190506000816020015190506000826000015190506121d18284600001518560800151614858565b60208301516080840151604080860151606087015160a088015192517f7c5e9ea40000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695637c5e9ea4956122349592949193600401615463565b6040805180830381600087803b15801561224d57600080fd5b505af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190615336565b5090506122928188613f44565b96505060019093019250612185915050565b50838211156122c55760405162461bcd60e51b8152600401610a10906156c2565b6122d285611a3a8761459b565b506122e086611a3a8861459b565b50612506565b60005a90506122f587866147c7565b5060005b88518110156124185761230a614bcd565b89828151811061231657fe5b602002602001015190506000816020015190506000826000015190506123458284600001518560800151614858565b60208301516080840151604080860151606087015160a088015192517f7c5e9ea40000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695637c5e9ea4956123a89592949193600401615463565b6040805180830381600087803b1580156123c157600080fd5b505af11580156123d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f99190615336565b5090506124068189613f44565b975050600190930192506122f9915050565b50848311156124395760405162461bcd60e51b8152600401610a10906156c2565b61244686611a3a8861459b565b5061245487611a3a8961459b565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161249257fe5b046040518363ffffffff1660e01b81526004016124b09291906153f3565b602060405180830381600087803b1580156124ca57600080fd5b505af11580156124de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612502919061531e565b5050505b5095945050505050565b6002546001600160a01b0316331461253a5760405162461bcd60e51b8152600401610a1090615578565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461259e5760405162461bcd60e51b8152600401610a1090615578565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60008160018116612779576125ed87866147c7565b5060005b885181101561273a576000805b8a838151811061260a57fe5b60200260200101515181101561272457612622614bcd565b8b848151811061262e57fe5b6020026020010151828151811061264157fe5b60200260200101519050600081602001519050826001141561266557606082018490525b815160608301516126799083908390614858565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b81526004016126c1959493929190615463565b6040805180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190615336565b50945050600190920191506125fe9050565b5061272f8185613f44565b9350506001016125f1565b508382101561275b5760405162461bcd60e51b8152600401610a109061568b565b6127658683614690565b5061277387611a3a8961459b565b50612161565b60005a905061278888876147c7565b5060005b89518110156128d5576000805b8b83815181106127a557fe5b6020026020010151518110156128bf576127bd614bcd565b8c84815181106127c957fe5b602002602001015182815181106127dc57fe5b60200260200101519050600081602001519050826001141561280057606082018490525b815160608301516128149083908390614858565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b815260040161285c959493929190615463565b6040805180830381600087803b15801561287557600080fd5b505af1158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190615336565b50945050600190920191506127999050565b506128ca8186613f44565b94505060010161278c565b50848310156128f65760405162461bcd60e51b8152600401610a109061568b565b6129008784614690565b5061290e88611a3a8a61459b565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120ed57fe5b600081600181166131135761296186856147c7565b5060005b87518110156122a457600088828151811061297c57fe5b60200260200101515160011415612a8957612995614bcd565b8983815181106129a157fe5b60200260200101516000815181106129b557fe5b602002602001015190506000816020015190506000826000015190506129e48284600001518560800151614858565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401612a2c959493929190615463565b6040805180830381600087803b158015612a4557600080fd5b505af1158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190615336565b5093506130fe92505050565b6000612a93614bcd565b8a8481518110612a9f57fe5b6020026020010151600181518110612ab357fe5b6020908102919091018101518051918101516040517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f91612b13916004016153c5565b60206040518083038186803b158015612b2b57600080fd5b505afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b63919061531e565b60208501516040517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169163948d8ce691612bac91906004016153c5565b60206040518083038186803b158015612bc457600080fd5b505afa158015612bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bfc919061531e565b60408087015190517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169163f8b2cb4f91612c4591906004016153c5565b60206040518083038186803b158015612c5d57600080fd5b505afa158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c95919061531e565b60408088015190517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0388169163948d8ce691612cde91906004016153c5565b60206040518083038186803b158015612cf657600080fd5b505afa158015612d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2e919061531e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d6c57600080fd5b505afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da4919061531e565b6040518763ffffffff1660e01b8152600401612dc5969594939291906158f6565b60206040518083038186803b158015612ddd57600080fd5b505afa158015612df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e15919061531e565b9250612e1f614bcd565b8c8681518110612e2b57fe5b6020026020010151600081518110612e3f57fe5b6020908102919091018101519081015181516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529293509091600019906001600160a01b0384169063dd62ed3e90612ea190309086906004016153d9565b60206040518083038186803b158015612eb957600080fd5b505afa158015612ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef1919061531e565b1015612f0857612f08828460000151600019614858565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b8152600401612f4c959493929190615463565b6040805180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d9190615336565b50602086015186516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529299509091600019916001600160a01b0384169163dd62ed3e91612ff4913091906004016153d9565b60206040518083038186803b15801561300c57600080fd5b505afa158015613020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613044919061531e565b101561305b5761305b818760000151600019614858565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016130a3959493929190615463565b6040805180830381600087803b1580156130bc57600080fd5b505af11580156130d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f49190615336565b5050505050505050505b6131088185613f44565b935050600101612965565b60005a905061312287866147c7565b5060005b885181101561241857600089828151811061313d57fe5b6020026020010151516001141561324a57613156614bcd565b8a838151811061316257fe5b602002602001015160008151811061317657fe5b602002602001015190506000816020015190506000826000015190506131a58284600001518560800151614858565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b81526004016131ed959493929190615463565b6040805180830381600087803b15801561320657600080fd5b505af115801561321a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323e9190615336565b5093506138bf92505050565b6000613254614bcd565b8b848151811061326057fe5b602002602001015160018151811061327457fe5b6020908102919091018101518051918101516040517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916132d4916004016153c5565b60206040518083038186803b1580156132ec57600080fd5b505afa158015613300573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613324919061531e565b60208501516040517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169163948d8ce69161336d91906004016153c5565b60206040518083038186803b15801561338557600080fd5b505afa158015613399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bd919061531e565b60408087015190517ff8b2cb4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169163f8b2cb4f9161340691906004016153c5565b60206040518083038186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613456919061531e565b60408088015190517f948d8ce60000000000000000000000000000000000000000000000000000000081526001600160a01b0388169163948d8ce69161349f91906004016153c5565b60206040518083038186803b1580156134b757600080fd5b505afa1580156134cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ef919061531e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561352d57600080fd5b505afa158015613541573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613565919061531e565b6040518763ffffffff1660e01b8152600401613586969594939291906158f6565b60206040518083038186803b15801561359e57600080fd5b505afa1580156135b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d6919061531e565b92506135e0614bcd565b8d86815181106135ec57fe5b602002602001015160008151811061360057fe5b6020908102919091018101519081015181516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529293509091600019906001600160a01b0384169063dd62ed3e9061366290309086906004016153d9565b60206040518083038186803b15801561367a57600080fd5b505afa15801561368e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b2919061531e565b10156136c9576136c9828460000151600019614858565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b815260040161370d959493929190615463565b6040805180830381600087803b15801561372657600080fd5b505af115801561373a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375e9190615336565b50602086015186516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081529299509091600019916001600160a01b0384169163dd62ed3e916137b5913091906004016153d9565b60206040518083038186803b1580156137cd57600080fd5b505afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613805919061531e565b101561381c5761381c818760000151600019614858565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b8152600401613864959493929190615463565b6040805180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b59190615336565b5050505050505050505b6138c98186613f44565b945050600101613126565b6d4946c0e9f43f4dee607b0ef1fa1c81565b60008160018116613a1e576138fb87866147c7565b5060005b885181101561273a57613910614bcd565b89828151811061391c57fe5b6020026020010151905060008160200151905060008260000151905061394b8284600001518560600151614858565b60208301516060840151604080860151608087015160a088015192517f8201aa3f0000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695638201aa3f956139ae9592949193600401615463565b6040805180830381600087803b1580156139c757600080fd5b505af11580156139db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ff9190615336565b509050613a0c8188613f44565b965050600190930192506138ff915050565b60005a9050613a2d88876147c7565b5060005b89518110156128d557613a42614bcd565b8a8281518110613a4e57fe5b60200260200101519050600081602001519050600082600001519050613a7d8284600001518560600151614858565b60208301516060840151604080860151608087015160a088015192517f8201aa3f0000000000000000000000000000000000000000000000000000000081526000956001600160a01b03881695638201aa3f95613ae09592949193600401615463565b6040805180830381600087803b158015613af957600080fd5b505af1158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b319190615336565b509050613b3e8189613f44565b97505060019093019250613a31915050565b60008160018116613bd0576060613b66896142c9565b15613b8b57600054613b83906001600160a01b03168989886102ab565b509050613bc2565b613b94886142c9565b15613bb257600054613b83908a906001600160a01b031689886102ab565b613bbe898989886102ab565b5090505b612029818a8a89600061216c565b60005a90506060613be08a6142c9565b15613c0557600054613bfd906001600160a01b03168a8a896102ab565b509050613c3c565b613c0e896142c9565b15613c2c57600054613bfd908b906001600160a01b03168a896102ab565b613c388a8a8a896102ab565b5090505b6120ac818b8b8a600061216c565b613c52614b87565b6040517ff8b2cb4f00000000000000000000000000000000000000000000000000000000815282906000906001600160a01b0383169063f8b2cb4f90613c9c9089906004016153c5565b60206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cec919061531e565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b8152600401613d1c91906153c5565b60206040518083038186803b158015613d3457600080fd5b505afa158015613d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6c919061531e565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613d9c91906153c5565b60206040518083038186803b158015613db457600080fd5b505afa158015613dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dec919061531e565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613e1c91906153c5565b60206040518083038186803b158015613e3457600080fd5b505afa158015613e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6c919061531e565b90506000856001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ea957600080fd5b505afa158015613ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee1919061531e565b90506000613ef084868561495b565b9050613efa614b87565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150505b9392505050565b600082820183811015613f695760405162461bcd60e51b8152600401610a109061561d565b90505b92915050565b600082613f8157506000613f6c565b82820282848281613f8e57fe5b0414613f695760405162461bcd60e51b8152600401610a10906156f9565b6000613f6983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061499a565b6000613f6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149d1565b6000805b835181101561417957600083828151811061404b57fe5b6020026020010151600001516001600160a01b031663f8d6aed485848151811061407157fe5b60200260200101516020015186858151811061408957fe5b6020026020010151604001518786815181106140a157fe5b6020026020010151606001518887815181106140b957fe5b6020026020010151608001518a88815181106140d157fe5b60200260200101518a89815181106140e557fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401614112969594939291906158f6565b60206040518083038186803b15801561412a57600080fd5b505afa15801561413e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614162919061531e565b905061416e8382613f44565b925050600101614034565b5092915050565b6000805b835181101561417957600083828151811061419b57fe5b6020026020010151600001516001600160a01b031663ba9530a68584815181106141c157fe5b6020026020010151602001518685815181106141d957fe5b6020026020010151604001518786815181106141f157fe5b60200260200101516060015188878151811061420957fe5b6020026020010151608001518a888151811061422157fe5b60200260200101518a898151811061423557fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401614262969594939291906158f6565b60206040518083038186803b15801561427a57600080fd5b505afa15801561428e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b2919061531e565b90506142be8382613f44565b925050600101614184565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b610abd8363a9059cbb60e01b848460405160240161430e9291906153f3565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526149fd565b600061437d846142c9565b15614429573483146143a15760405162461bcd60e51b8152600401610a1090615756565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156143ef57600080fd5b505af1158015614403573d6000803e3d6000fd5b505060005461442193506001600160a01b0316915084905085614858565b506001613f3d565b61443e6001600160a01b038516333086614a8c565b613f3d848385614858565b6000614454846142c9565b15614586573483146144785760405162461bcd60e51b8152600401610a1090615756565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156144c657600080fd5b505af11580156144da573d6000803e3d6000fd5b50506000546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116935063a9059cbb925061452a9150859087906004016153f3565b602060405180830381600087803b15801561454457600080fd5b505af1158015614558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061457c9190615065565b5060019050613f3d565b613f3d6001600160a01b038516338486614a8c565b60006145a6826142c9565b1561464b576000546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906370a08231906145f49030906004016153c5565b60206040518083038186803b15801561460c57600080fd5b505afa158015614620573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614644919061531e565b90506142ea565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906145f49030906004016153c5565b60008161469f57506001613f6c565b6146a8836142c9565b156147aa576000546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d906146f6908590600401615858565b600060405180830381600087803b15801561471057600080fd5b505af1158015614724573d6000803e3d6000fd5b505050506000336001600160a01b031683604051614741906153c2565b60006040518083038185875af1925050503d806000811461477e576040519150601f19603f3d011682016040523d82523d6000602084013e614783565b606091505b50509050806147a45760405162461bcd60e51b8152600401610a109061578d565b506147be565b6147be6001600160a01b03841633846142ef565b50600192915050565b60006147d2836142c9565b156148435760008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561482557600080fd5b505af1158015614839573d6000803e3d6000fd5b50505050506147be565b6147be6001600160a01b038416333085614a8c565b60006060846001600160a01b031663095ea7b3858560405160240161487e9291906153f3565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516148cc91906153a6565b6000604051808303816000865af19150503d8060008114614909576040519150601f19603f3d011682016040523d82523d6000602084013e61490e565b606091505b50915091508180156149385750805115806149385750808060200190518101906149389190615065565b6149545760405162461bcd60e51b8152600401610a1090615654565b5050505050565b6000614992670de0b6b3a76400006104a48561498c61497a878a613f44565b6104a48a670de0b6b3a7640000613f72565b90613f72565b949350505050565b600081836149bb5760405162461bcd60e51b8152600401610a109190615545565b5060008385816149c757fe5b0495945050505050565b600081848411156149f55760405162461bcd60e51b8152600401610a109190615545565b505050900390565b6060614a52826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614ab39092919063ffffffff16565b805190915015610abd5780806020019051810190614a709190615065565b610abd5760405162461bcd60e51b8152600401610a10906157fb565b614aad846323b872dd60e01b85858560405160240161430e9392919061543f565b50505050565b606061499284846000856060614ac885614b81565b614ae45760405162461bcd60e51b8152600401610a10906157c4565b60006060866001600160a01b03168587604051614b0191906153a6565b60006040518083038185875af1925050503d8060008114614b3e576040519150601f19603f3d011682016040523d82523d6000602084013e614b43565b606091505b50915091508115614b575791506149929050565b805115614b675780518082602001fd5b8360405162461bcd60e51b8152600401610a109190615545565b3b151590565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b600082601f830112614c2e578081fd5b8135614c41614c3c82615945565b61591e565b818152915060208083019084810160005b84811015614c7b57614c69888484358a0101614c86565b84529282019290820190600101614c52565b505050505092915050565b600082601f830112614c96578081fd5b8135614ca4614c3c82615945565b818152915060208083019084810160c080850287018301881015614cc757600080fd5b6000805b86811015614d4b5782848b031215614ce1578182fd5b614cea8361591e565b8435614cf581615991565b815284860135614d0481615991565b81870152604085810135614d1781615991565b90820152606085810135908201526080808601359082015260a0808601359082015286529484019492820192600101614ccb565b5050505050505092915050565b60008083601f840112614d69578182fd5b50813567ffffffffffffffff811115614d80578182fd5b6020830191508360208083028501011115614d9a57600080fd5b9250929050565b803560ff81168114613f6c57600080fd5b600060208284031215614dc3578081fd5b8135613f6981615991565b60008060008060808587031215614de3578283fd5b8435614dee81615991565b93506020850135614dfe81615991565b93969395505050506040820135916060013590565b60006020808385031215614e25578182fd5b825167ffffffffffffffff811115614e3b578283fd5b8301601f81018513614e4b578283fd5b8051614e59614c3c82615945565b8181528381019083850185840285018601891015614e75578687fd5b8694505b83851015614ea0578051614e8c81615991565b835260019490940193918501918501614e79565b50979650505050505050565b60008060008060008060c08789031215614ec4578182fd5b863567ffffffffffffffff811115614eda578283fd5b614ee689828a01614c1e565b9650506020870135614ef781615991565b94506040870135614f0781615991565b93506060870135925060808701359150614f248860a08901614da1565b90509295509295509295565b600080600080600060a08688031215614f47578081fd5b853567ffffffffffffffff811115614f5d578182fd5b614f6988828901614c1e565b9550506020860135614f7a81615991565b93506040860135614f8a81615991565b9250606086013591506080860135614fa1816159a9565b809150509295509295909350565b60008060008060008060c08789031215614fc7578384fd5b863567ffffffffffffffff811115614fdd578485fd5b614ee689828a01614c86565b600080600080600060a08688031215615000578283fd5b853567ffffffffffffffff811115615016578384fd5b61502288828901614c86565b955050602086013561503381615991565b9350604086013561504381615991565b9250606086013591506150598760808801614da1565b90509295509295909350565b600060208284031215615076578081fd5b81518015158114613f69578182fd5b600080600080600080600080600060e08a8c0312156150a2578687fd5b6150ac8a35615991565b8935985067ffffffffffffffff8060208c013511156150c9578788fd5b60208b01358b018c601f8201126150de578889fd5b6150eb614c3c8235615945565b8082358252602082019150602083018f602080863502860101111561510e578b8cfd5b8b5b8435811015615139576151238235615991565b8135845260209384019390910190600101615110565b5050809b505050508060408c01351115615151578788fd5b6151618c60408d01358d01614d58565b909850965060608b0135811015615176578384fd5b506151878b60608c01358c01614d58565b909550935060808a0135925060a08a013591506151a78b60c08c01614da1565b90509295985092959850929598565b6000602082840312156151c7578081fd5b8151613f6981615991565b600080600080600060a086880312156151e9578283fd5b85356151f481615991565b9450602086013561520481615991565b935060408601359250606086013591506080860135614fa1816159a9565b600080600080600060808688031215615239578283fd5b853561524481615991565b945060208601359350604086013567ffffffffffffffff811115615266578384fd5b61527288828901614d58565b909450925061505990508760608801614da1565b60008060008060008060c0878903121561529e578384fd5b86356152a981615991565b955060208701356152b981615991565b9450604087013593506060870135925060808701359150614f248860a08901614da1565b6000806000606084860312156152f1578081fd5b83356152fc81615991565b925060208401359150604084013561531381615991565b809150509250925092565b60006020828403121561532f578081fd5b5051919050565b60008060408385031215615348578182fd5b505080516020909101519092909150565b60008284527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561538a578081fd5b6020830280836020870137939093016020019283525090919050565b600082516153b8818460208701615965565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b038616825284602083015260606040830152615435606083018486615359565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6040808252835182820181905260009190606090818501906020808901865b8381101561553157815180516001600160a01b0390811687528482015181168588015288820151168887015286810151878701526080808201519087015260a0908101519086015260c090940193908201906001016154d7565b505095909501959095525092949350505050565b6000602082528251806020840152615564816040850160208701615965565b601f01601f19169190910160400192915050565b6020808252600b908201527f21676f7665726e616e6365000000000000000000000000000000000000000000604082015260600190565b60208082526013908201527f4552525f4c454e4754485f4d49534d4154434800000000000000000000000000604082015260600190565b60208082526010908201527f21696e76616c69642070617961626c6500000000000000000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b6020808252600d908201527f4552525f4c494d49545f4f555400000000000000000000000000000000000000604082015260600190565b6020808252600c908201527f4552525f4c494d49545f494e0000000000000000000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f21696e76616c696420616d6f756e740000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4552525f4554485f4641494c4544000000000000000000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b90815260200190565b60008482526040602083015261587b604083018486615359565b95945050505050565b600060808201878352602087818501526080604085015281875180845260a0860191508289019350845b818110156158d35784516001600160a01b0316835293830193918301916001016158ae565b505084810360608601526158e8818789615359565b9a9950505050505050505050565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405181810167ffffffffffffffff8111828210171561593d57600080fd5b604052919050565b600067ffffffffffffffff82111561595b578081fd5b5060209081020190565b60005b83811015615980578181015183820152602001615968565b83811115614aad5750506000910152565b6001600160a01b03811681146159a657600080fd5b50565b60ff811681146159a657600080fdfea2646970667358221220ac7c5697aa39e7fcb329127909c91b5c406622e90b3f824585f82055e27cacf164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
22210:24026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35116:1803;;;;;;;;;;-1:-1:-1;35116:1803:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;33317:1791;;;;;;;;;;-1:-1:-1;33317:1791:0;;;;;:::i;:::-;;:::i;41240:405::-;;;;;;;;;;-1:-1:-1;41240:405:0;;;;;:::i;:::-;;:::i;:::-;;44283:860;;;;;;:::i;:::-;;:::i;23488:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41690:1148::-;;;;;;:::i;:::-;;:::i;42846:1429::-;;;;;;:::i;:::-;;:::i;31683:814::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25397:986::-;;;;;;:::i;:::-;;:::i;24201:169::-;;;;;;;;;;-1:-1:-1;24201:169:0;;;;;:::i;:::-;;:::i;24038:155::-;;;;;;;;;;-1:-1:-1;24038:155:0;;;;;:::i;:::-;;:::i;26391:1502::-;;;;;;:::i;:::-;;:::i;27901:3774::-;;;;;;:::i;:::-;;:::i;22340:93::-;;;;;;;;;;;;;:::i;24378:1011::-;;;;;;:::i;:::-;;:::i;32505:804::-;;;;;;:::i;:::-;;:::i;35116:1803::-;35364:8;;:57;;;;;35278:19;;35299;;35278;;-1:-1:-1;;;;;35364:8:0;;:30;;:57;;35395:7;;35404:8;;35414:6;;35364:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35364:57:0;;;;;;;;;;;;:::i;:::-;35331:90;;35434:19;35467:13;:20;35456:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;35434:54:0;-1:-1:-1;35499:29:0;;35539:230;35563:13;:20;35559:1;:24;35539:230;;;35616:48;35628:7;35637:8;35647:13;35661:1;35647:16;;;;;;;;;;;;;;35616:11;:48::i;:::-;35605:5;35611:1;35605:8;;;;;;;;;;;;;:59;;;;35703:54;35729:5;35735:1;35729:8;;;;;;;;;;;;;;:27;;;35703:21;:25;;:54;;;;:::i;:::-;35679:78;-1:-1:-1;35585:3:0;;35539:230;;;;35781:33;35831:5;:12;35817:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35817:27:0;-1:-1:-1;35781:63:0;-1:-1:-1;35855:24:0;;35890:237;35914:5;:12;35910:1;:16;35890:237;;;35970:70;36018:21;35970:43;35985:5;35991:1;35985:8;;;;;;;;;;;;;;:27;;;35970:10;:14;;:43;;;;:::i;:::-;:47;;:70::i;:::-;35948:16;35965:1;35948:19;;;;;;;;;;;;;:92;;;;;36074:41;36095:16;36112:1;36095:19;;;;;;;;;;;;;;36074:16;:20;;:41;;;;:::i;:::-;36055:60;-1:-1:-1;35928:3:0;;35890:237;;;;36162:10;36143:16;:29;36139:253;;;36211:57;36235:32;:10;36250:16;36235:14;:32::i;:::-;36211:16;36228:1;36211:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;36189:16;36206:1;36189:19;;;;;;;;;;;;;:79;;;;;36139:253;;;36323:57;36347:32;:16;36368:10;36347:20;:32::i;:::-;36323:16;36340:1;36323:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;36301:16;36318:1;36301:19;;;;;;;;;;;;;:79;;;;;36139:253;36423:5;:12;36412:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36404:32;;36454:9;36449:351;36473:5;:12;36469:1;:16;36449:351;;;36518:270;;;;;;;;36548:5;36554:1;36548:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;36518:270:0;;;;;36589:7;-1:-1:-1;;;;;36518:270:0;;;;;36625:8;-1:-1:-1;;;;;36518:270:0;;;;;36664:16;36681:1;36664:19;;;;;;;;;;;;;;36518:270;;;;-1:-1:-1;;36518:270:0;;;;-1:-1:-1;;36518:270:0;;;36507:5;36513:1;36507:8;;;;;;;;;;;;;;;;;:281;36487:3;;36449:351;;;;36826:45;36847:16;36865:5;36826:20;:45::i;:::-;36812:59;;36884:27;;;;;35116:1803;;;;;;;:::o;33317:1791::-;33564:8;;:57;;;;;33478:19;;33499;;33478;;-1:-1:-1;;;;;33564:8:0;;:30;;:57;;33595:7;;33604:8;;33614:6;;33564:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33564:57:0;;;;;;;;;;;;:::i;:::-;33531:90;;33634:19;33667:13;:20;33656:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;33634:54:0;-1:-1:-1;33699:29:0;;33739:230;33763:13;:20;33759:1;:24;33739:230;;;33816:48;33828:7;33837:8;33847:13;33861:1;33847:16;;;;;;;33816:48;33805:5;33811:1;33805:8;;;;;;;;;;;;;:59;;;;33903:54;33929:5;33935:1;33929:8;;;;;;;33903:54;33879:78;-1:-1:-1;33785:3:0;;33739:230;;;;33981:33;34031:5;:12;34017:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34017:27:0;-1:-1:-1;33981:63:0;-1:-1:-1;34055:24:0;;34090:237;34114:5;:12;34110:1;:16;34090:237;;;34170:70;34218:21;34170:43;34185:5;34191:1;34185:8;;;;;;;34170:70;34148:16;34165:1;34148:19;;;;;;;;;;;;;:92;;;;;34274:41;34295:16;34312:1;34295:19;;;;;;;34274:41;34255:60;-1:-1:-1;34128:3:0;;34090:237;;;;34362:10;34343:16;:29;34339:253;;;34411:57;34435:32;:10;34450:16;34435:14;:32::i;34411:57::-;34389:16;34406:1;34389:19;;;;;;;;;;;;;:79;;;;;34339:253;;;34523:57;34547:32;:16;34568:10;34547:20;:32::i;34523:57::-;34501:16;34518:1;34501:19;;;;;;;;;;;;;:79;;;;;34339:253;34623:5;:12;34612:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;34604:32;;34654:9;34649:341;34673:5;:12;34669:1;:16;34649:341;;;34718:260;;;;;;;;34748:5;34754:1;34748:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;34718:260:0;;;;;34789:7;-1:-1:-1;;;;;34718:260:0;;;;;34825:8;-1:-1:-1;;;;;34718:260:0;;;;;34864:16;34881:1;34864:19;;;;;;;;;;;;;;34718:260;;;;34921:1;34718:260;;;;-1:-1:-1;;34718:260:0;;;34707:5;34713:1;34707:8;;;;;;;;;;;;;;;;;:271;34687:3;;34649:341;;;;35016:44;35036:16;35054:5;35016:19;:44::i;41240:405::-;41399:10;;-1:-1:-1;;;;;41399:10:0;41385;:24;41377:48;;;;-1:-1:-1;;;41377:48:0;;;;;;;:::i;:::-;;;;;;;;;41440:13;41446:6;41440:5;:13::i;:::-;41436:202;;;41471:9;41486:3;-1:-1:-1;;;;;41486:8:0;41502:7;41486:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41470:44;;;41537:4;41529:31;;;;-1:-1:-1;;;41529:31:0;;;;;;;:::i;:::-;41436:202;;;;41593:33;-1:-1:-1;;;;;41593:19:0;;41613:3;41618:7;41593:19;:33::i;:::-;41240:405;;;:::o;44283:860::-;44487:4;22498:3;22491:10;;22486:284;;44504:16:::1;44543:64;44569:7;44578:13;44601:4;44543:25;:64::i;:::-;44539:115;;;-1:-1:-1::0;44638:4:0::1;44539:115;44672:9;:14:::0;;:29:::1;;;44690:11;44672:29;44664:58;;;;-1:-1:-1::0;;;44664:58:0::1;;;;;;;:::i;:::-;44737:11;44733:403;;;44765:21;44825:4:::0;;44789:75:::1;::::0;;;;-1:-1:-1;;;;;44789:27:0;;::::1;::::0;::::1;::::0;:75:::1;::::0;44825:4;;::::1;::::0;44832:13;;44847:16;;44789:75:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44765:99:::0;-1:-1:-1;44879:52:0::1;-1:-1:-1::0;;;;;44879:25:0;::::1;44905:10;44765:99:::0;44879:25:::1;:52::i;:::-;44733:403;;;;44988:69;::::0;;;;44964:21:::1;::::0;-1:-1:-1;;;;;44988:27:0;::::1;::::0;::::1;::::0;:69:::1;::::0;45016:7;;45025:13;;45040:16;;44988:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44964:93:::0;-1:-1:-1;45072:52:0::1;-1:-1:-1::0;;;;;45072:25:0;::::1;45098:10;44964:93:::0;45072:25:::1;:52::i;:::-;44733:403;;22524:1;22486:284:::0;;;22558:16;22577:9;22558:28;;44504:16:::1;44543:64;44569:7;44578:13;44601:4;44543:25;:64::i;:::-;44539:115;;;-1:-1:-1::0;44638:4:0::1;44539:115;44672:9;:14:::0;;:29:::1;;;44690:11;44672:29;44664:58;;;;-1:-1:-1::0;;;44664:58:0::1;;;;;;;:::i;:::-;44737:11;44733:403;;;44765:21;44825:4:::0;;44789:75:::1;::::0;;;;-1:-1:-1;;;;;44789:27:0;;::::1;::::0;::::1;::::0;:75:::1;::::0;44825:4;;::::1;::::0;44832:13;;44847:16;;44789:75:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44765:99:::0;-1:-1:-1;44879:52:0::1;-1:-1:-1::0;;;;;44879:25:0;::::1;44905:10;44765:99:::0;44879:25:::1;:52::i;:::-;44733:403;;;;44988:69;::::0;;;;44964:21:::1;::::0;-1:-1:-1;;;;;44988:27:0;::::1;::::0;::::1;::::0;:69:::1;::::0;45016:7;;45025:13;;45040:16;;44988:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44964:93:::0;-1:-1:-1;45072:52:0::1;-1:-1:-1::0;;;;;45072:25:0;::::1;45098:10;44964:93:::0;45072:25:::1;:52::i;:::-;44733:403;;-1:-1:-1::0;22617:16:0;22667:2;22672:8;22667:20;22655:9;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;;;22702:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22486:284;;;44283:860;;;;;;:::o;23488:25::-;;;-1:-1:-1;;;;;23488:25:0;;:::o;41690:1148::-;41974:11;41959:4;22498:3;22491:10;;22486:284;;42006:13;;:32;::::1;41998:64;;;;-1:-1:-1::0;;;41998:64:0::1;;;;;;;:::i;:::-;42081:13:::0;;:31;::::1;42073:63;;;;-1:-1:-1::0;;;42073:63:0::1;;;;;;;:::i;:::-;42154:7;-1:-1:-1::0;;;;;42154:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42147:25;;42183:16;42223:9:::0;42218:229:::1;42242:6;:13;42238:1;:17;42218:229;;;42281:56;42299:6;42306:1;42299:9;;;;;;;;;;;;;;42310:8;;42319:1;42310:11;;;;;;;;;;;;;42331:4;42281:17;:56::i;:::-;42277:159;;;42415:4;::::0;42395:9;;42372:4:::1;::::0;-1:-1:-1;;;;;;42415:4:0;;::::1;::::0;42395:6;;42402:1;;42395:9;::::1;;;;;;;;;;:25;-1:-1:-1::0;;;;;42395:25:0::1;;;-1:-1:-1::0;;;;;42395:25:0::1;;;::::0;::::1;42277:159;42257:3;;42218:229;;;-1:-1:-1::0;42465:9:0::1;:14:::0;;:29:::1;;;42483:11;42465:29;42457:58;;;;-1:-1:-1::0;;;42457:58:0::1;;;;;;;:::i;:::-;42526:4;-1:-1:-1::0;;;;;42526:13:0::1;;42540:7;42549:14;42565:6;42573:7;;42526:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42592:36:0::1;::::0;;;;-1:-1:-1;;;;;42592:21:0;::::1;::::0;-1:-1:-1;42592:21:0::1;::::0;-1:-1:-1;42592:36:0::1;::::0;42622:4:::1;::::0;42592:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42639:30:0::1;::::0;;;;-1:-1:-1;;;;;42639:18:0;::::1;::::0;-1:-1:-1;42639:18:0::1;::::0;-1:-1:-1;42639:30:0::1;::::0;42658:10:::1;::::0;42639:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42699:29:0::1;::::0;;;;42680:16:::1;::::0;-1:-1:-1;;;;;;42699:14:0;::::1;::::0;-1:-1:-1;42699:14:0::1;::::0;:29:::1;::::0;42722:4:::1;::::0;42699:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42680:48:::0;-1:-1:-1;42743:12:0;;42739:92:::1;;42772:47;-1:-1:-1::0;;;;;42772:25:0;::::1;42798:10;42810:8:::0;42772:25:::1;:47::i;:::-;22524:1;;22486:284:::0;;;22558:16;22577:9;42006:13;;22558:28;;-1:-1:-1;42006:32:0;::::1;41998:64;;;;-1:-1:-1::0;;;41998:64:0::1;;;;;;;:::i;:::-;42081:13:::0;;:31;::::1;42073:63;;;;-1:-1:-1::0;;;42073:63:0::1;;;;;;;:::i;:::-;42154:7;-1:-1:-1::0;;;;;42154:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42147:25;;42183:16;42223:9:::0;42218:229:::1;42242:6;:13;42238:1;:17;42218:229;;;42281:56;42299:6;42306:1;42299:9;;;;;;;;;;;;;;42310:8;;42319:1;42310:11;;;;;;;;;;;;;42331:4;42281:17;:56::i;:::-;42277:159;;;42415:4;::::0;42395:9;;42372:4:::1;::::0;-1:-1:-1;;;;;;42415:4:0;;::::1;::::0;42395:6;;42402:1;;42395:9;::::1;;;;;;;;;;:25;-1:-1:-1::0;;;;;42395:25:0::1;;;-1:-1:-1::0;;;;;42395:25:0::1;;;::::0;::::1;42277:159;42257:3;;42218:229;;;-1:-1:-1::0;42465:9:0::1;:14:::0;;:29:::1;;;42483:11;42465:29;42457:58;;;;-1:-1:-1::0;;;42457:58:0::1;;;;;;;:::i;:::-;42526:4;-1:-1:-1::0;;;;;42526:13:0::1;;42540:7;42549:14;42565:6;42573:7;;42526:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42592:36:0::1;::::0;;;;-1:-1:-1;;;;;42592:21:0;::::1;::::0;-1:-1:-1;42592:21:0::1;::::0;-1:-1:-1;42592:36:0::1;::::0;42622:4:::1;::::0;42592:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42639:30:0::1;::::0;;;;-1:-1:-1;;;;;42639:18:0;::::1;::::0;-1:-1:-1;42639:18:0::1;::::0;-1:-1:-1;42639:30:0::1;::::0;42658:10:::1;::::0;42639:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42699:29:0::1;::::0;;;;42680:16:::1;::::0;-1:-1:-1;;;;;;42699:14:0;::::1;::::0;-1:-1:-1;42699:14:0::1;::::0;:29:::1;::::0;42722:4:::1;::::0;42699:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42680:48:::0;-1:-1:-1;42743:12:0;;42739:92:::1;;42772:47;-1:-1:-1::0;;;;;42772:25:0;::::1;42798:10;42810:8:::0;42772:25:::1;:47::i;:::-;-1:-1:-1::0;22617:16:0;;-1:-1:-1;22667:2:0;22672:8;22667:20;22655:9;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;;;22702:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22486:284;;;41690:1148;;;;;;;;;;;;:::o;42846:1429::-;43017:4;22498:3;22491:10;;22486:284;;43034:23:::1;43060:4;-1:-1:-1::0;;;;;43060:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43060:21:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43123:13:::0;;43034:47;;-1:-1:-1;43100:36:0;::::1;43092:68;;;;-1:-1:-1::0;;;43092:68:0::1;;;;;;;:::i;:::-;43171:16;43211:9:::0;43206:370:::1;43230:6;:13;43226:1;:17;43206:370;;;43281:1;43269:9;:13;:43;;;;-1:-1:-1::0;43307:4:0::1;::::0;43286:9;;-1:-1:-1;;;;;43307:4:0;;::::1;::::0;43286:6;;43293:1;;43286:9;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;43286:26:0::1;;43269:43;43265:300;;;43333:70;23391:42;43372:12;;43385:1;43372:15;;;;;;;;;;;;;43397:4;43333:25;:70::i;:::-;;43436:4;43422:18;;43265:300;;;43481:68;43507:6;43514:1;43507:9;;;;;;;;;;;;;;43518:12;;43531:1;43518:15;;;;;;43481:68;;43265:300;43245:3;;43206:370;;;-1:-1:-1::0;43594:9:0::1;:14:::0;;:29:::1;;;43612:11;43594:29;43586:58;;;;-1:-1:-1::0;;;43586:58:0::1;;;;;;;:::i;:::-;43659:4;-1:-1:-1::0;;;;;43659:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43677:4;43659:22;43655:187;;;43698:42;::::0;;;;-1:-1:-1;;;;;43698:13:0;::::1;::::0;::::1;::::0;:42:::1;::::0;43712:13;;43727:12;;;;43698:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43655:187;;;43773:57;::::0;;;;-1:-1:-1;;;;;43773:16:0;::::1;::::0;::::1;::::0;:57:::1;::::0;43790:10:::1;::::0;43802:13;;43817:12;;;;43773:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43655:187;43857:9;43852:319;43876:6;:13;43872:1;:17;43852:319;;;43915:11;:41;;;;-1:-1:-1::0;43951:4:0::1;::::0;43930:9;;-1:-1:-1;;;;;43951:4:0;;::::1;::::0;43930:6;;43937:1;;43930:9;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;43930:26:0::1;;43915:41;43911:249;;;43977:65;23391:42;44010:31;23391:42;44010:10;:31::i;:::-;43977:11;:65::i;:::-;;43911:249;;;44083:61;44102:6;44109:1;44102:9;;;;;;;;;;;;;;44114:29;44132:6;44139:1;44132:9;;;;;;;;;;;;;;44114:10;:29::i;44083:61::-;;43911:249;43891:3;;43852:319;;;-1:-1:-1::0;44200:29:0::1;::::0;;;;44181:16:::1;::::0;-1:-1:-1;;;;;44200:14:0;::::1;::::0;::::1;::::0;:29:::1;::::0;44223:4:::1;::::0;44200:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44181:48;;44240:27;44252:4;44258:8;44240:11;:27::i;:::-;;22524:1;;;22486:284:::0;;;22558:16;22577:9;22558:28;;43034:23:::1;43060:4;-1:-1:-1::0;;;;;43060:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43060:21:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43123:13:::0;;43034:47;;-1:-1:-1;43100:36:0;::::1;43092:68;;;;-1:-1:-1::0;;;43092:68:0::1;;;;;;;:::i;:::-;43171:16;43211:9:::0;43206:370:::1;43230:6;:13;43226:1;:17;43206:370;;;43281:1;43269:9;:13;:43;;;;-1:-1:-1::0;43307:4:0::1;::::0;43286:9;;-1:-1:-1;;;;;43307:4:0;;::::1;::::0;43286:6;;43293:1;;43286:9;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;43286:26:0::1;;43269:43;43265:300;;;43333:70;23391:42;43372:12;;43385:1;43372:15;;;;;;;;;;;;;43397:4;43333:25;:70::i;:::-;;43436:4;43422:18;;43265:300;;;43481:68;43507:6;43514:1;43507:9;;;;;;;;;;;;;;43518:12;;43531:1;43518:15;;;;;;43481:68;;43265:300;43245:3;;43206:370;;;-1:-1:-1::0;43594:9:0::1;:14:::0;;:29:::1;;;43612:11;43594:29;43586:58;;;;-1:-1:-1::0;;;43586:58:0::1;;;;;;;:::i;:::-;43659:4;-1:-1:-1::0;;;;;43659:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43677:4;43659:22;43655:187;;;43698:42;::::0;;;;-1:-1:-1;;;;;43698:13:0;::::1;::::0;::::1;::::0;:42:::1;::::0;43712:13;;43727:12;;;;43698:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43655:187;;;43773:57;::::0;;;;-1:-1:-1;;;;;43773:16:0;::::1;::::0;::::1;::::0;:57:::1;::::0;43790:10:::1;::::0;43802:13;;43817:12;;;;43773:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43655:187;43857:9;43852:319;43876:6;:13;43872:1;:17;43852:319;;;43915:11;:41;;;;-1:-1:-1::0;43951:4:0::1;::::0;43930:9;;-1:-1:-1;;;;;43951:4:0;;::::1;::::0;43930:6;;43937:1;;43930:9;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;43930:26:0::1;;43915:41;43911:249;;;43977:65;23391:42;44010:31;23391:42;44010:10;:31::i;43977:65::-;;43911:249;;;44083:61;44102:6;44109:1;44102:9;;;;;;;44083:61;;43911:249;43891:3;;43852:319;;;-1:-1:-1::0;44200:29:0::1;::::0;;;;44181:16:::1;::::0;-1:-1:-1;;;;;44200:14:0;::::1;::::0;::::1;::::0;:29:::1;::::0;44223:4:::1;::::0;44200:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44181:48;;44240:27;44252:4;44258:8;44240:11;:27::i;:::-;-1:-1:-1::0;22617:16:0;;-1:-1:-1;;22667:2:0;22672:8;22667:20;;-1:-1:-1;22655:9:0;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;31683:814;31923:22;31908:4;22498:3;22491:10;;22486:284;;31958:19:::1;31992:14;31998:7;31992:5;:14::i;:::-;31988:391;;;32060:4;::::0;32035:73:::1;::::0;-1:-1:-1;;;;;32060:4:0::1;32075:8:::0;32086:13;32101:6;32035:16:::1;:73::i;:::-;-1:-1:-1::0;32023:85:0;-1:-1:-1;31988:391:0::1;;;32130:15;32136:8;32130:5;:15::i;:::-;32126:253;;;32217:4;::::0;32174:72:::1;::::0;32199:7;;-1:-1:-1;;;;;32217:4:0::1;32224:13:::0;32239:6;32174:16:::1;:72::i;32126:253::-;32291:76;32316:7;32334:8;32345:13;32360:6;32291:16;:76::i;:::-;-1:-1:-1::0;32279:88:0;-1:-1:-1;32126:253:0::1;32408:81;32425:5;32432:7;32441:8;32451:13;32466:17;32485:3;32408:16;:81::i;:::-;32391:98;;22524:1;22486:284:::0;;;22558:16;22577:9;22558:28;;31958:19:::1;31992:14;31998:7;31992:5;:14::i;:::-;31988:391;;;32060:4;::::0;32035:73:::1;::::0;-1:-1:-1;;;;;32060:4:0::1;32075:8:::0;32086:13;32101:6;32035:16:::1;:73::i;:::-;-1:-1:-1::0;32023:85:0;-1:-1:-1;31988:391:0::1;;;32130:15;32136:8;32130:5;:15::i;:::-;32126:253;;;32217:4;::::0;32174:72:::1;::::0;32199:7;;-1:-1:-1;;;;;32217:4:0::1;32224:13:::0;32239:6;32174:16:::1;:72::i;32126:253::-;32291:76;32316:7;32334:8;32345:13;32360:6;32291:16;:76::i;:::-;-1:-1:-1::0;32279:88:0;-1:-1:-1;32126:253:0::1;32408:81;32425:5;32432:7;32441:8;32451:13;32466:17;32485:3;32408:16;:81::i;:::-;32391:98:::0;-1:-1:-1;22617:16:0;;-1:-1:-1;22667:2:0;22672:8;22667:20;22655:9;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;;;22702:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22486:284;;;31683:814;;;;;;;;;:::o;25397:986::-;25610:21;25595:4;22498:3;22491:10;;22486:284;;25644:42:::1;25660:7;25669:16;25644:15;:42::i;:::-;;25704:9;25699:500;25723:5;:12;25719:1;:16;25699:500;;;25757:16;;:::i;:::-;25776:5;25782:1;25776:8;;;;;;;;;;;;;;25757:27;;25799:18;25827:4;:12;;;25799:41;;25855:11;25876:4;:9;;;25855:31;;25903:68;25923:11;25937:4;:9;;;25948:4;:22;;;25903:11;:68::i;:::-;26040:12;::::0;::::1;::::0;26054:22:::1;::::0;::::1;::::0;26078:13:::1;::::0;;::::1;::::0;26093:15:::1;::::0;::::1;::::0;26110:13:::1;::::0;::::1;::::0;26016:108;;;;;25989:21:::1;::::0;-1:-1:-1;;;;;26016:23:0;::::1;::::0;::::1;::::0;:108:::1;::::0;26040:12;;26054:22;;26016:108:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25988:136:0;-1:-1:-1;26155:32:0::1;25988:136:::0;26173:13;26155:17:::1;:32::i;:::-;26139:48:::0;-1:-1:-1;;25737:3:0::1;::::0;;::::1;::::0;-1:-1:-1;25699:500:0::1;::::0;-1:-1:-1;;25699:500:0::1;;;26234:16;26217:13;:33;;26209:58;;;;-1:-1:-1::0;;;26209:58:0::1;;;;;;;:::i;:::-;26280:43;26292:8;26302:20;26313:8;26302:10;:20::i;26280:43::-;;26334:41;26346:7;26355:19;26366:7;26355:10;:19::i;26334:41::-;;22486:284:::0;;;22558:16;22577:9;22558:28;;25644:42:::1;25660:7;25669:16;25644:15;:42::i;:::-;;25704:9;25699:500;25723:5;:12;25719:1;:16;25699:500;;;25757:16;;:::i;:::-;25776:5;25782:1;25776:8;;;;;;;;;;;;;;25757:27;;25799:18;25827:4;:12;;;25799:41;;25855:11;25876:4;:9;;;25855:31;;25903:68;25923:11;25937:4;:9;;;25948:4;:22;;;25903:11;:68::i;:::-;26040:12;::::0;::::1;::::0;26054:22:::1;::::0;::::1;::::0;26078:13:::1;::::0;;::::1;::::0;26093:15:::1;::::0;::::1;::::0;26110:13:::1;::::0;::::1;::::0;26016:108;;;;;25989:21:::1;::::0;-1:-1:-1;;;;;26016:23:0;::::1;::::0;::::1;::::0;:108:::1;::::0;26040:12;;26054:22;;26016:108:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25988:136:0;-1:-1:-1;26155:32:0::1;25988:136:::0;26173:13;26155:17:::1;:32::i;:::-;26139:48:::0;-1:-1:-1;;25737:3:0::1;::::0;;::::1;::::0;-1:-1:-1;25699:500:0::1;::::0;-1:-1:-1;;25699:500:0::1;;;26234:16;26217:13;:33;;26209:58;;;;-1:-1:-1::0;;;26209:58:0::1;;;;;;;:::i;:::-;26280:43;26292:8;26302:20;26313:8;26302:10;:20::i;26280:43::-;;26334:41;26346:7;26355:19;26366:7;26355:10;:19::i;26334:41::-;-1:-1:-1::0;22617:16:0;22667:2;22672:8;22667:20;22655:9;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;;;22702:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22486:284;;;25397:986;;;;;;;;:::o;24201:169::-;24283:10;;-1:-1:-1;;;;;24283:10:0;24269;:24;24261:48;;;;-1:-1:-1;;;24261:48:0;;;;;;;:::i;:::-;24320:8;:42;;;;-1:-1:-1;;;;;24320:42:0;;;;;;;;;;24201:169::o;24038:155::-;24124:10;;-1:-1:-1;;;;;24124:10:0;24110;:24;24102:48;;;;-1:-1:-1;;;24102:48:0;;;;;;;:::i;:::-;24161:10;:24;;;;-1:-1:-1;;;;;24161:24:0;;;;;;;;;;24038:155::o;26391:1502::-;26654:22;26639:4;22498:3;22491:10;;22486:284;;26689:39:::1;26705:7;26714:13;26689:15;:39::i;:::-;;26746:9;26741:969;26765:13;:20;26761:1;:24;26741:969;;;26807:22;::::0;26844:731:::1;26868:13;26882:1;26868:16;;;;;;;;;;;;;;:23;26864:1;:27;26844:731;;;26917:16;;:::i;:::-;26936:13;26950:1;26936:16;;;;;;;;;;;;;;26953:1;26936:19;;;;;;;;;;;;;;26917:38;;26974:18;27002:4;:12;;;26974:41;;27038:1;27043;27038:6;27034:247;;;27229:15;::::0;::::1;:32:::0;;;27034:247:::1;27322:9:::0;;27396:15:::1;::::0;::::1;::::0;27351:61:::1;::::0;27371:11;;27322:9;;27351:11:::1;:61::i;:::-;27452:4;-1:-1:-1::0;;;;;27452:22:0::1;;27475:4;:12;;;27489:4;:15;;;27506:4;:13;;;27521:4;:22;;;27545:4;:13;;;27452:107;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27431:128:0;-1:-1:-1;;26893:3:0::1;::::0;;::::1;::::0;-1:-1:-1;26844:731:0::1;::::0;-1:-1:-1;26844:731:0::1;;-1:-1:-1::0;27664:34:0::1;:14:::0;27683;27664:18:::1;:34::i;:::-;27647:51:::0;-1:-1:-1;;26787:3:0::1;;26741:969;;;;27748:17;27730:14;:35;;27722:61;;;;-1:-1:-1::0;;;27722:61:0::1;;;;;;;:::i;:::-;27796:37;27808:8;27818:14;27796:11;:37::i;:::-;;27844:41;27856:7;27865:19;27876:7;27865:10;:19::i;27844:41::-;;22486:284:::0;;;22558:16;22577:9;22558:28;;26689:39:::1;26705:7;26714:13;26689:15;:39::i;:::-;;26746:9;26741:969;26765:13;:20;26761:1;:24;26741:969;;;26807:22;::::0;26844:731:::1;26868:13;26882:1;26868:16;;;;;;;;;;;;;;:23;26864:1;:27;26844:731;;;26917:16;;:::i;:::-;26936:13;26950:1;26936:16;;;;;;;;;;;;;;26953:1;26936:19;;;;;;;;;;;;;;26917:38;;26974:18;27002:4;:12;;;26974:41;;27038:1;27043;27038:6;27034:247;;;27229:15;::::0;::::1;:32:::0;;;27034:247:::1;27322:9:::0;;27396:15:::1;::::0;::::1;::::0;27351:61:::1;::::0;27371:11;;27322:9;;27351:11:::1;:61::i;:::-;27452:4;-1:-1:-1::0;;;;;27452:22:0::1;;27475:4;:12;;;27489:4;:15;;;27506:4;:13;;;27521:4;:22;;;27545:4;:13;;;27452:107;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27431:128:0;-1:-1:-1;;26893:3:0::1;::::0;;::::1;::::0;-1:-1:-1;26844:731:0::1;::::0;-1:-1:-1;26844:731:0::1;;-1:-1:-1::0;27664:34:0::1;:14:::0;27683;27664:18:::1;:34::i;:::-;27647:51:::0;-1:-1:-1;;26787:3:0::1;;26741:969;;;;27748:17;27730:14;:35;;27722:61;;;;-1:-1:-1::0;;;27722:61:0::1;;;;;;;:::i;:::-;27796:37;27808:8;27818:14;27796:11;:37::i;:::-;;27844:41;27856:7;27865:19;27876:7;27865:10;:19::i;27844:41::-;-1:-1:-1::0;22617:16:0;22667:2;22672:8;22667:20;22655:9;22644:8;22636:5;:16;:28;:51;22617:70;;22390:42;-1:-1:-1;;;;;22702:16:0;;22719:10;22752:5;22732:8;22743:5;22732:16;22731:26;;;;27901:3774;28132:21;28117:4;22498:3;22491:10;;22486:284;;28166:42:::1;28182:7;28191:16;28166:15;:42::i;:::-;;28226:9;28221:3268;28245:13;:20;28241:1;:24;28221:3268;;;28287:30;28421:13;28435:1;28421:16;;;;;;;;;;;;;;:23;28448:1;28421:28;28417:2989;;;28470:16;;:::i;:::-;28489:13;28503:1;28489:16;;;;;;;;;;;;;;28506:1;28489:19;;;;;;;;;;;;;;28470:38;;28527:18;28555:4;:12;;;28527:41;;28589:11;28610:4;:9;;;28589:31;;28639:68;28659:11;28673:4;:9;;;28684:4;:22;;;28639:11;:68::i;:::-;28757:4;-1:-1:-1::0;;;;;28757:23:0::1;;28781:4;:12;;;28795:4;:22;;;28819:4;:13;;;28834:4;:15;;;28851:4;:13;;;28757:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28728:137:0;-1:-1:-1;28417:2989:0::1;::::0;-1:-1:-1;;;28417:2989:0::1;;29202:31;29313:22;;:::i;:::-;29338:13;29352:1;29338:16;;;;;;;;;;;;;;29355:1;29338:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;29407:15;;29546:18;;::::1;::::0;29520:45:::1;::::0;;;;29338:19;;-1:-1:-1;;;;;;29468:29:0;::::1;::::0;::::1;::::0;;;29520:25:::1;::::0;:45:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29625:18;::::0;::::1;::::0;29588:56:::1;::::0;;;;-1:-1:-1;;;;;29588:36:0;::::1;::::0;::::1;::::0;:56:::1;::::0;29625:18;29588:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29693:19;::::0;;::::1;::::0;29667:46;;;;;-1:-1:-1;;;;;29667:25:0;::::1;::::0;::::1;::::0;:46:::1;::::0;29693:19;29667:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29773:19;::::0;;::::1;::::0;29736:57;;;;;-1:-1:-1;;;;;29736:36:0;::::1;::::0;::::1;::::0;:57:::1;::::0;29773:19;29736:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29816:10;:21;;;29860:14;-1:-1:-1::0;;;;;29860:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29468:435;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29442:461;;30010:21;;:::i;:::-;30034:13;30048:1;30034:16;;;;;;;;;;;;;;30051:1;30034:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;30105:17;;::::1;::::0;30172:14;;30210:57:::1;::::0;;;;30034:19;;-1:-1:-1;30105:17:0;;-1:-1:-1;;30278:2:0;-1:-1:-1;;;;;30210:26:0;::::1;::::0;::::1;::::0;:57:::1;::::0;30245:4:::1;::::0;30172:14;;30210:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;30206:187;;;30306:67;30326:16;30345:9;:14;;;-1:-1:-1::0;;30306:11:0::1;:67::i;:::-;30442:13;-1:-1:-1::0;;;;;30442:32:0::1;;30497:9;:17;;;30537:9;:27;;;30587:9;:18;;;30628:23;30715:9;:18;;;30442:310;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;30869:18:0::1;::::0;::::1;::::0;30954:15;;30911:59:::1;::::0;;;;30413:339;;-1:-1:-1;30869:18:0;;-1:-1:-1;;30981:2:0;-1:-1:-1;;;;;30911:27:0;::::1;::::0;::::1;::::0;:59:::1;::::0;30947:4:::1;::::0;30954:15;30911:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;30907:191;;;31009:69;31029:17;31049:10;:15;;;-1:-1:-1::0;;31009:11:0::1;:69::i;:::-;31118:14;-1:-1:-1::0;;;;;31118:33:0::1;;31174:10;:18;;;31215:10;:28;;;31266:10;:19;;;31308:10;:21;;;31352:10;:19;;;31118:272;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28417:2989;;;;;;;;31436:41;:22:::0;31463:13;31436:26:::1;:41::i;:::-;31420:57:::0;-1:-1:-1;;28267:3:0::1;;28221:3268;;22486:284:::0;22558:16;22577:9;22558:28;;28166:42:::1;28182:7;28191:16;28166:15;:42::i;:::-;;28226:9;28221:3268;28245:13;:20;28241:1;:24;28221:3268;;;28287:30;28421:13;28435:1;28421:16;;;;;;;;;;;;;;:23;28448:1;28421:28;28417:2989;;;28470:16;;:::i;:::-;28489:13;28503:1;28489:16;;;;;;;;;;;;;;28506:1;28489:19;;;;;;;;;;;;;;28470:38;;28527:18;28555:4;:12;;;28527:41;;28589:11;28610:4;:9;;;28589:31;;28639:68;28659:11;28673:4;:9;;;28684:4;:22;;;28639:11;:68::i;:::-;28757:4;-1:-1:-1::0;;;;;28757:23:0::1;;28781:4;:12;;;28795:4;:22;;;28819:4;:13;;;28834:4;:15;;;28851:4;:13;;;28757:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28728:137:0;-1:-1:-1;28417:2989:0::1;::::0;-1:-1:-1;;;28417:2989:0::1;;29202:31;29313:22;;:::i;:::-;29338:13;29352:1;29338:16;;;;;;;;;;;;;;29355:1;29338:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;29407:15;;29546:18;;::::1;::::0;29520:45:::1;::::0;;;;29338:19;;-1:-1:-1;;;;;;29468:29:0;::::1;::::0;::::1;::::0;;;29520:25:::1;::::0;:45:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29625:18;::::0;::::1;::::0;29588:56:::1;::::0;;;;-1:-1:-1;;;;;29588:36:0;::::1;::::0;::::1;::::0;:56:::1;::::0;29625:18;29588:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29693:19;::::0;;::::1;::::0;29667:46;;;;;-1:-1:-1;;;;;29667:25:0;::::1;::::0;::::1;::::0;:46:::1;::::0;29693:19;29667:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29773:19;::::0;;::::1;::::0;29736:57;;;;;-1:-1:-1;;;;;29736:36:0;::::1;::::0;::::1;::::0;:57:::1;::::0;29773:19;29736:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29816:10;:21;;;29860:14;-1:-1:-1::0;;;;;29860:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29468:435;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29442:461;;30010:21;;:::i;:::-;30034:13;30048:1;30034:16;;;;;;;;;;;;;;30051:1;30034:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;30105:17;;::::1;::::0;30172:14;;30210:57:::1;::::0;;;;30034:19;;-1:-1:-1;30105:17:0;;-1:-1:-1;;30278:2:0;-1:-1:-1;;;;;30210:26:0;::::1;::::0;::::1;::::0;:57:::1;::::0;30245:4:::1;::::0;30172:14;;30210:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;30206:187;;;30306:67;30326:16;30345:9;:14;;;-1:-1:-1::0;;30306:11:0::1;:67::i;:::-;30442:13;-1:-1:-1::0;;;;;30442:32:0::1;;30497:9;:17;;;30537:9;:27;;;30587:9;:18;;;30628:23;30715:9;:18;;;30442:310;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;30869:18:0::1;::::0;::::1;::::0;30954:15;;30911:59:::1;::::0;;;;30413:339;;-1:-1:-1;30869:18:0;;-1:-1:-1;;30981:2:0;-1:-1:-1;;;;;30911:27:0;::::1;::::0;::::1;::::0;:59:::1;::::0;30947:4:::1;::::0;30954:15;30911:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;30907:191;;;31009:69;31029:17;31049:10;:15;;;-1:-1:-1::0;;31009:11:0::1;:69::i;:::-;31118:14;-1:-1:-1::0;;;;;31118:33:0::1;;31174:10;:18;;;31215:10;:28;;;31266:10;:19;;;31308:10;:21;;;31352:10;:19;;;31118:272;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28417:2989;;;;;;;;31436:41;:22:::0;31463:13;31436:26:::1;:41::i;:::-;31420:57:::0;-1:-1:-1;;28267:3:0::1;;28221:3268;;22340:93:::0;22390:42;22340:93;:::o;24378:1011::-;24623:22;24608:4;22498:3;22491:10;;22486:284;;24658:39:::1;24674:7;24683:13;24658:15;:39::i;:::-;;24715:9;24710:496;24734:5;:12;24730:1;:16;24710:496;;;24768:16;;:::i;:::-;24787:5;24793:1;24787:8;;;;;;;;;;;;;;24768:27;;24810:18;24838:4;:12;;;24810:41;;24866:11;24887:4;:9;;;24866:31;;24914:61;24934:11;24948:4;:9;;;24959:4;:15;;;24914:11;:61::i;:::-;25044:12;::::0;::::1;::::0;25058:15:::1;::::0;::::1;::::0;25075:13:::1;::::0;;::::1;::::0;25090:22:::1;::::0;::::1;::::0;25114:13:::1;::::0;::::1;::::0;25021:107;;;;;24993:22:::1;::::0;-1:-1:-1;;;;;25021:22:0;::::1;::::0;::::1;::::0;:107:::1;::::0;25044:12;;25058:15;;25021:107:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24992:136:0;-1:-1:-1;25160:34:0::1;24992:136:::0;25179:14;25160:18:::1;:34::i;:::-;25143:51:::0;-1:-1:-1;;24748:3:0::1;::::0;;::::1;::::0;-1:-1:-1;24710:496:0::1;::::0;-1:-1:-1;;24710:496:0::1;22486:284:::0;22558:16;22577:9;22558:28;;24658:39:::1;24674:7;24683:13;24658:15;:39::i;:::-;;24715:9;24710:496;24734:5;:12;24730:1;:16;24710:496;;;24768:16;;:::i;:::-;24787:5;24793:1;24787:8;;;;;;;;;;;;;;24768:27;;24810:18;24838:4;:12;;;24810:41;;24866:11;24887:4;:9;;;24866:31;;24914:61;24934:11;24948:4;:9;;;24959:4;:15;;;24914:11;:61::i;:::-;25044:12;::::0;::::1;::::0;25058:15:::1;::::0;::::1;::::0;25075:13:::1;::::0;;::::1;::::0;25090:22:::1;::::0;::::1;::::0;25114:13:::1;::::0;::::1;::::0;25021:107;;;;;24993:22:::1;::::0;-1:-1:-1;;;;;25021:22:0;::::1;::::0;::::1;::::0;:107:::1;::::0;25044:12;;25058:15;;25021:107:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24992:136:0;-1:-1:-1;25160:34:0::1;24992:136:::0;25179:14;25160:18:::1;:34::i;:::-;25143:51:::0;-1:-1:-1;;24748:3:0::1;::::0;;::::1;::::0;-1:-1:-1;24710:496:0::1;::::0;-1:-1:-1;;24710:496:0::1;32505:804:::0;32746:21;32731:4;22498:3;22491:10;;22486:284;;32780:19:::1;32814:14;32820:7;32814:5;:14::i;:::-;32810:397;;;32883:4;::::0;32857:75:::1;::::0;-1:-1:-1;;;;;32883:4:0::1;32898:8:::0;32909:14;32925:6;32857:17:::1;:75::i;:::-;-1:-1:-1::0;32845:87:0;-1:-1:-1;32810:397:0::1;;;32954:15;32960:8;32954:5;:15::i;:::-;32950:257;;;33042:4;::::0;32998:74:::1;::::0;33024:7;;-1:-1:-1;;;;;33042:4:0::1;33049:14:::0;33065:6;32998:17:::1;:74::i;32950:257::-;33117:78;33143:7;33161:8;33172:14;33188:6;33117:17;:78::i;:::-;-1:-1:-1::0;33105:90:0;-1:-1:-1;32950:257:0::1;33235:66;33253:5;33260:7;33269:8;33279:16;33297:3;33235:17;:66::i;22486:284::-:0;22558:16;22577:9;22558:28;;32780:19:::1;32814:14;32820:7;32814:5;:14::i;:::-;32810:397;;;32883:4;::::0;32857:75:::1;::::0;-1:-1:-1;;;;;32883:4:0::1;32898:8:::0;32909:14;32925:6;32857:17:::1;:75::i;:::-;-1:-1:-1::0;32845:87:0;-1:-1:-1;32810:397:0::1;;;32954:15;32960:8;32954:5;:15::i;:::-;32950:257;;;33042:4;::::0;32998:74:::1;::::0;33024:7;;-1:-1:-1;;;;;33042:4:0::1;33049:14:::0;33065:6;32998:17:::1;:74::i;32950:257::-;33117:78;33143:7;33161:8;33172:14;33188:6;33117:17;:78::i;:::-;-1:-1:-1::0;33105:90:0;-1:-1:-1;32950:257:0::1;33235:66;33253:5;33260:7;33269:8;33279:16;33297:3;33235:17;:66::i;36927:1042::-:0;37061:11;;:::i;:::-;37154:24;;;;;37106:11;;37085;;-1:-1:-1;;;;;37154:15:0;;;;;:24;;37170:7;;37154:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37129:49;;37189:23;37215:4;-1:-1:-1;;;;;37215:15:0;;37231:8;37215:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37189:51;;37251:21;37275:4;-1:-1:-1;;;;;37275:26:0;;37302:7;37275:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37251:59;;37321:22;37346:4;-1:-1:-1;;;;;37346:26:0;;37373:8;37346:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37321:61;;37393:15;37411:4;-1:-1:-1;;;;;37411:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37393:32;;37438:26;37467:70;37490:13;37505:15;37522:14;37467:22;:70::i;:::-;37438:99;;37548:22;;:::i;:::-;-1:-1:-1;37586:345:0;;;;;;;;-1:-1:-1;;;;;37586:345:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36927:1042:0;;;;;;:::o;3684:181::-;3742:7;3774:5;;;3798:6;;;;3790:46;;;;-1:-1:-1;;;3790:46:0;;;;;;;:::i;:::-;3856:1;-1:-1:-1;3684:181:0;;;;;:::o;5072:471::-;5130:7;5375:6;5371:47;;-1:-1:-1;5405:1:0;5398:8;;5371:47;5442:5;;;5446:1;5442;:5;:1;5466:5;;;;;:10;5458:56;;;;-1:-1:-1;;;5458:56:0;;;;;;;:::i;6019:132::-;6077:7;6104:39;6108:1;6111;6104:39;;;;;;;;;;;;;;;;;:3;:39::i;4148:136::-;4206:7;4233:43;4237:1;4240;4233:43;;;;;;;;;;;;;;;;;:3;:43::i;39100:720::-;39213:19;39276:9;39271:513;39295:16;:23;39291:1;:27;39271:513;;;39340:14;39381:9;39391:1;39381:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;39374:40:0;;39437:9;39447:1;39437:12;;;;;;;;;;;;;;:27;;;39487:9;39497:1;39487:12;;;;;;;;;;;;;;:26;;;39536:9;39546:1;39536:12;;;;;;;;;;;;;;:28;;;39587:9;39597:1;39587:12;;;;;;;;;;;;;;:27;;;39637:16;39654:1;39637:19;;;;;;;;;;;;;;39679:9;39689:1;39679:12;;;;;;;;;;;;;;:20;;;39374:344;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39340:378;-1:-1:-1;39749:23:0;:11;39340:378;39749:15;:23::i;:::-;39735:37;-1:-1:-1;;39320:3:0;;39271:513;;;;39100:720;;;;:::o;38373:719::-;38485:19;38548:9;38543:513;38567:16;:23;38563:1;:27;38543:513;;;38612:14;38653:9;38663:1;38653:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;38646:40:0;;38709:9;38719:1;38709:12;;;;;;;;;;;;;;:27;;;38759:9;38769:1;38759:12;;;;;;;;;;;;;;:26;;;38808:9;38818:1;38808:12;;;;;;;;;;;;;;:28;;;38859:9;38869:1;38859:12;;;;;;;;;;;;;;:27;;;38909:16;38926:1;38909:19;;;;;;;;;;;;;;38951:9;38961:1;38951:12;;;;;;;;;;;;;;:20;;;38646:344;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38612:378;-1:-1:-1;39021:23:0;:11;38612:378;39021:15;:23::i;:::-;39007:37;-1:-1:-1;;38592:3:0;;38543:513;;40803:115;-1:-1:-1;;;;;40880:29:0;;23391:42;40880:29;40803:115;;;;:::o;14941:211::-;15058:86;15078:5;15108:23;;;15133:2;15137:5;15085:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15085:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15058:19;:86::i;45650:583::-;45785:16;45818:20;45831:5;45818;:20::i;:::-;45814:383;;;45873:9;45863:6;:19;45855:47;;;;-1:-1:-1;;;45855:47:0;;;;;;;:::i;:::-;45917:4;;;;;;;;-1:-1:-1;;;;;45917:4:0;-1:-1:-1;;;;;45917:12:0;;45937:6;45917:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45981:4:0;;45961:43;;-1:-1:-1;;;;;;45981:4:0;;-1:-1:-1;45988:7:0;;-1:-1:-1;45997:6:0;45961:11;:43::i;:::-;-1:-1:-1;46033:4:0;45814:383;;;46070:65;-1:-1:-1;;;;;46070:30:0;;46101:10;46121:4;46128:6;46070:30;:65::i;:::-;46150:35;46162:5;46169:7;46178:6;46150:11;:35::i;45151:491::-;45273:16;45306:20;45319:5;45306;:20::i;:::-;45302:304;;;45361:9;45351:6;:19;45343:47;;;;-1:-1:-1;;;45343:47:0;;;;;;;:::i;:::-;45405:4;;;;;;;;-1:-1:-1;;;;;45405:4:0;-1:-1:-1;;;;;45405:12:0;;45425:6;45405:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45449:4:0;;:25;;;;;-1:-1:-1;;;;;45449:4:0;;;;-1:-1:-1;45449:13:0;;-1:-1:-1;45449:25:0;;-1:-1:-1;45463:2:0;;45467:6;;45449:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45503:4;45489:18;;45302:304;;;45540:54;-1:-1:-1;;;;;45540:30:0;;45571:10;45583:2;45587:6;45540:30;:54::i;40122:235::-;40179:7;40203:12;40209:5;40203;:12::i;:::-;40199:151;;;40239:4;;:29;;;;;-1:-1:-1;;;;;40239:4:0;;;;:14;;:29;;40262:4;;40239:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40232:36;;;;40199:151;40308:30;;;;;-1:-1:-1;;;;;40308:15:0;;;;;:30;;40332:4;;40308:30;;;:::i;40365:430::-;40434:4;40455:11;40451:55;;-1:-1:-1;40490:4:0;40483:11;;40451:55;40522:12;40528:5;40522;:12::i;:::-;40518:248;;;40551:4;;:21;;;;;-1:-1:-1;;;;;40551:4:0;;;;:13;;:21;;40565:6;;40551:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40588:9;40603:10;-1:-1:-1;;;;;40603:15:0;40626:6;40603:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40587:50;;;40660:4;40652:31;;;;-1:-1:-1;;;40652:31:0;;;;;;;:::i;:::-;40518:248;;;;40716:38;-1:-1:-1;;;;;40716:18:0;;40735:10;40747:6;40716:18;:38::i;:::-;-1:-1:-1;40783:4:0;40365:430;;;;:::o;39828:286::-;39901:4;39922:12;39928:5;39922;:12::i;:::-;39918:167;;;39951:4;;;;;;;;-1:-1:-1;;;;;39951:4:0;-1:-1:-1;;;;;39951:12:0;;39971:9;39951:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39918:167;;;40016:57;-1:-1:-1;;;;;40016:22:0;;40039:10;40059:4;40066:6;40016:22;:57::i;23635:395::-;23819:12;23833:17;23854:5;-1:-1:-1;;;;;23854:10:0;23888;23900:2;23904:5;23865:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23854:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23818:93;;;;23930:7;:57;;;;-1:-1:-1;23942:11:0;;:16;;:44;;;23973:4;23962:24;;;;;;;;;;;;:::i;:::-;23922:100;;;;-1:-1:-1;;;23922:100:0;;;;;;;:::i;:::-;23635:395;;;;;:::o;37977:388::-;38138:26;38226:93;23473:6;38226:83;38293:15;38226:62;38254:33;:14;38273:13;38254:18;:33::i;:::-;38226:23;:13;23473:6;38226:17;:23::i;:62::-;:66;;:83::i;:93::-;38205:114;37977:388;-1:-1:-1;;;;37977:388:0:o;6647:312::-;6767:7;6802:12;6795:5;6787:28;;;;-1:-1:-1;;;6787:28:0;;;;;;;;:::i;:::-;;6826:9;6842:1;6838;:5;;;;;;;6647:312;-1:-1:-1;;;;;6647:312:0:o;4587:226::-;4707:7;4743:12;4735:6;;;;4727:29;;;;-1:-1:-1;;;4727:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4779:5:0;;;4587:226::o;17402:774::-;17826:23;17852:69;17880:4;17852:69;;;;;;;;;;;;;;;;;17860:5;-1:-1:-1;;;;;17852:27:0;;;:69;;;;;:::i;:::-;17936:17;;17826:95;;-1:-1:-1;17936:21:0;17932:237;;18091:10;18080:30;;;;;;;;;;;;:::i;:::-;18072:85;;;;-1:-1:-1;;;18072:85:0;;;;;;;:::i;15160:248::-;15304:96;15324:5;15354:27;;;15383:4;15389:2;15393:5;15331:68;;;;;;;;;;:::i;15304:96::-;15160:248;;;;:::o;11867:230::-;12004:12;12036:53;12059:6;12067:4;12073:1;12076:12;13528;13561:18;13572:6;13561:10;:18::i;:::-;13553:60;;;;-1:-1:-1;;;13553:60:0;;;;;;;:::i;:::-;13687:12;13701:23;13728:6;-1:-1:-1;;;;;13728:11:0;13747:8;13757:4;13728:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13686:76;;;;13777:7;13773:595;;;13808:10;-1:-1:-1;13801:17:0;;-1:-1:-1;13801:17:0;13773:595;13922:17;;:21;13918:439;;14185:10;14179:17;14246:15;14233:10;14229:2;14225:19;14218:44;14133:148;14328:12;14321:20;;-1:-1:-1;;;14321:20:0;;;;;;;;:::i;8927:444::-;9307:20;9355:8;;;8927:444::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1802:819::-;;1966:3;1959:4;1951:6;1947:17;1943:27;1933:2;;-1:-1;;1974:12;1933:2;2021:6;2008:20;2043:127;2058:111;2162:6;2058:111;:::i;:::-;2043:127;:::i;:::-;2198:21;;;2034:136;-1:-1;2242:4;2255:14;;;;2230:17;;;2350:1;2335:280;2360:6;2357:1;2354:13;2335:280;;;2467:84;2547:3;2242:4;2443:3;2430:17;2234:6;2418:30;;2467:84;:::i;:::-;2455:97;;2566:14;;;;2594;;;;2382:1;2375:9;2335:280;;;2339:14;;;;;1926:695;;;;:::o;2665:773::-;;2804:3;2797:4;2789:6;2785:17;2781:27;2771:2;;-1:-1;;2812:12;2771:2;2859:6;2846:20;2881:102;2896:86;2975:6;2896:86;:::i;2881:102::-;3011:21;;;2872:111;-1:-1;3055:4;3068:14;;;;3043:17;;;3169:4;3157:17;;;3148:27;;;;3145:36;-1:-1;3142:2;;;3194:1;;3184:12;3142:2;3219:1;;3204:228;3229:6;3226:1;3223:13;3204:228;;;3169:4;4758:9;4753:3;4749:19;4745:30;4742:2;;;3219:1;;4778:12;4742:2;4806:20;3169:4;4806:20;:::i;:::-;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4883:75;;5076:22;;;72:20;97:33;72:20;97:33;:::i;:::-;5037:16;;;5030:75;5170:2;5224:22;;;72:20;97:33;72:20;97:33;:::i;:::-;5185:16;;;5178:75;5320:2;5374:22;;;5805:20;5335:16;;;5328:75;5477:3;5532:22;;;5805:20;5493:16;;;5486:75;5626:3;5681:22;;;5805:20;5642:16;;;5635:75;3297:72;;3383:14;;;;3411;;;;3251:1;3244:9;3204:228;;;3208:14;;;;;;;2764:674;;;;:::o;3464:352::-;;;3594:3;3587:4;3579:6;3575:17;3571:27;3561:2;;-1:-1;;3602:12;3561:2;-1:-1;3632:20;;3672:18;3661:30;;3658:2;;;-1:-1;;3694:12;3658:2;3738:4;3730:6;3726:17;3714:29;;3789:3;3738:4;;3773:6;3769:17;3730:6;3755:32;;3752:41;3749:2;;;3806:1;;3796:12;3749:2;3554:262;;;;;:::o;6016:126::-;6081:20;;44678:4;44667:16;;47084:33;;47074:2;;47131:1;;47121:12;6149:241;;6253:2;6241:9;6232:7;6228:23;6224:32;6221:2;;;-1:-1;;6259:12;6221:2;85:6;72:20;97:33;124:5;97:33;:::i;6397:617::-;;;;;6552:3;6540:9;6531:7;6527:23;6523:33;6520:2;;;-1:-1;;6559:12;6520:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6611:63;-1:-1;6711:2;6750:22;;72:20;97:33;72:20;97:33;:::i;:::-;6514:500;;6719:63;;-1:-1;;;;6819:2;6858:22;;5805:20;;6927:2;6966:22;5805:20;;6514:500::o;7021:392::-;;7161:2;;7149:9;7140:7;7136:23;7132:32;7129:2;;;-1:-1;;7167:12;7129:2;7218:17;7212:24;7256:18;7248:6;7245:30;7242:2;;;-1:-1;;7278:12;7242:2;7365:22;;1155:4;1143:17;;1139:27;-1:-1;1129:2;;-1:-1;;1170:12;1129:2;1210:6;1204:13;1232:80;1247:64;1304:6;1247:64;:::i;1232:80::-;1340:21;;;1397:14;;;;1372:17;;;1486;;;1477:27;;;;1474:36;-1:-1;1471:2;;;-1:-1;;1513:12;1471:2;-1:-1;1539:10;;1533:217;1558:6;1555:1;1552:13;1533:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;1626:61;;1580:1;1573:9;;;;;1701:14;;;;1729;;1533:217;;;-1:-1;7298:99;7123:290;-1:-1;;;;;;;7123:290::o;7420:1147::-;;;;;;;7705:3;7693:9;7684:7;7680:23;7676:33;7673:2;;;-1:-1;;7712:12;7673:2;7770:17;7757:31;7808:18;7800:6;7797:30;7794:2;;;-1:-1;;7830:12;7794:2;7860:125;7977:7;7968:6;7957:9;7953:22;7860:125;:::i;:::-;7850:135;;;8022:2;8078:9;8074:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;8030:76;-1:-1;8143:2;8195:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;8151:76;-1:-1;8264:2;8303:22;;5805:20;;-1:-1;8372:3;8412:22;;5805:20;;-1:-1;8500:51;8543:7;8481:3;8519:22;;8500:51;:::i;:::-;8490:61;;7667:900;;;;;;;;:::o;8574:1021::-;;;;;;8842:3;8830:9;8821:7;8817:23;8813:33;8810:2;;;-1:-1;;8849:12;8810:2;8907:17;8894:31;8945:18;8937:6;8934:30;8931:2;;;-1:-1;;8967:12;8931:2;8997:125;9114:7;9105:6;9094:9;9090:22;8997:125;:::i;:::-;8987:135;;;9159:2;9215:9;9211:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;9167:76;-1:-1;9280:2;9332:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;9288:76;-1:-1;9401:2;9440:22;;5805:20;;-1:-1;9509:3;9547:22;;6081:20;6106:31;6081:20;6106:31;:::i;:::-;9518:61;;;;8804:791;;;;;;;;:::o;9602:1097::-;;;;;;;9862:3;9850:9;9841:7;9837:23;9833:33;9830:2;;;-1:-1;;9869:12;9830:2;9927:17;9914:31;9965:18;9957:6;9954:30;9951:2;;;-1:-1;;9987:12;9951:2;10017:100;10109:7;10100:6;10089:9;10085:22;10017:100;:::i;10706:971::-;;;;;;10949:3;10937:9;10928:7;10924:23;10920:33;10917:2;;;-1:-1;;10956:12;10917:2;11014:17;11001:31;11052:18;11044:6;11041:30;11038:2;;;-1:-1;;11074:12;11038:2;11104:100;11196:7;11187:6;11176:9;11172:22;11104:100;:::i;:::-;11094:110;;;11241:2;11297:9;11293:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;11249:76;-1:-1;11362:2;11414:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;11370:76;-1:-1;11483:2;11522:22;;5805:20;;-1:-1;11610:51;11653:7;11591:3;11629:22;;11610:51;:::i;:::-;11600:61;;10911:766;;;;;;;;:::o;11684:257::-;;11796:2;11784:9;11775:7;11771:23;11767:32;11764:2;;;-1:-1;;11802:12;11764:2;3905:6;3899:13;46406:5;44036:13;44029:21;46384:5;46381:32;46371:2;;-1:-1;;46417:12;11948:1473;;;;;;;;;;12264:3;12252:9;12243:7;12239:23;12235:33;12232:2;;;-1:-1;;12271:12;12232:2;4068:50;4056:6;4043:20;4068:50;:::i;:::-;4056:6;4043:20;12323:80;;12492:18;;12468:2;12457:9;12453:18;12440:32;12481:30;12478:2;;;-1:-1;;12514:12;12478:2;12468;12457:9;12453:18;12440:32;12594:9;12590:22;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;495:80;510:64;473:6;460:20;510:64;:::i;495:80::-;581:16;473:6;460:20;610:5;603:21;12468:2;664:3;660:14;653:21;;12468:2;639:6;635:17;769:3;12468:2;;473:6;460:20;749:17;639:6;740:27;;737:36;734:2;;;-1:-1;;776:12;734:2;-1:-1;796:206;473:6;460:20;818:1;815:13;796:206;;;97:33;85:6;72:20;97:33;:::i;:::-;72:20;;889:50;;12468:2;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;12534:88;;;;;;12492:18;12687:2;12676:9;12672:18;12659:32;12700:30;12697:2;;;-1:-1;;12733:12;12697:2;12771:80;12843:7;12687:2;12676:9;12672:18;12659:32;12823:9;12819:22;12771:80;:::i;:::-;12753:98;;-1:-1;12753:98;-1:-1;12916:2;12901:18;;12888:32;12929:30;-1:-1;12926:2;;;-1:-1;;12962:12;12926:2;;13000:80;13072:7;12916:2;12905:9;12901:18;12888:32;13052:9;13048:22;13000:80;:::i;:::-;12982:98;;-1:-1;12982:98;-1:-1;13117:3;13157:22;;5805:20;;-1:-1;13226:3;13266:22;;5805:20;;-1:-1;13354:51;13397:7;13335:3;13373:22;;13354:51;:::i;:::-;13344:61;;12226:1195;;;;;;;;;;;:::o;13428:291::-;;13557:2;13545:9;13536:7;13532:23;13528:32;13525:2;;;-1:-1;;13563:12;13525:2;4393:6;4387:13;4405:47;4446:5;4405:47;:::i;13726:767::-;;;;;;13910:3;13898:9;13889:7;13885:23;13881:33;13878:2;;;-1:-1;;13917:12;13878:2;4224:6;4211:20;4236:47;4277:5;4236:47;:::i;:::-;13969:77;-1:-1;14083:2;14122:22;;72:20;97:33;72:20;97:33;:::i;:::-;14091:63;-1:-1;14191:2;14230:22;;5805:20;;-1:-1;14299:2;14338:22;;5805:20;;-1:-1;14407:3;14445:22;;6081:20;6106:31;6081:20;6106:31;:::i;14500:797::-;;;;;;14702:3;14690:9;14681:7;14677:23;14673:33;14670:2;;;-1:-1;;14709:12;14670:2;4224:6;4211:20;4236:47;4277:5;4236:47;:::i;:::-;14761:77;-1:-1;14875:2;14914:22;;5805:20;;-1:-1;15011:2;14996:18;;14983:32;15035:18;15024:30;;15021:2;;;-1:-1;;15057:12;15021:2;15095:80;15167:7;15158:6;15147:9;15143:22;15095:80;:::i;:::-;15077:98;;-1:-1;15077:98;-1:-1;15230:51;;-1:-1;15273:7;15212:2;15249:22;;15230:51;:::i;15304:917::-;;;;;;;15517:3;15505:9;15496:7;15492:23;15488:33;15485:2;;;-1:-1;;15524:12;15485:2;4557:6;4544:20;4569:46;4609:5;4569:46;:::i;:::-;15576:76;-1:-1;15689:2;15741:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;15697:76;-1:-1;15810:2;15849:22;;5805:20;;-1:-1;15918:2;15957:22;;5805:20;;-1:-1;16026:3;16066:22;;5805:20;;-1:-1;16154:51;16197:7;16135:3;16173:22;;16154:51;:::i;16228:517::-;;;;16379:2;16367:9;16358:7;16354:23;16350:32;16347:2;;;-1:-1;;16385:12;16347:2;4557:6;4544:20;4569:46;4609:5;4569:46;:::i;:::-;16437:76;-1:-1;16550:2;16589:22;;5805:20;;-1:-1;16658:2;16697:22;;72:20;97:33;72:20;97:33;:::i;:::-;16666:63;;;;16341:404;;;;;:::o;16752:263::-;;16867:2;16855:9;16846:7;16842:23;16838:32;16835:2;;;-1:-1;;16873:12;16835:2;-1:-1;5953:13;;16829:186;-1:-1;16829:186::o;17022:399::-;;;17154:2;17142:9;17133:7;17129:23;17125:32;17122:2;;;-1:-1;;17160:12;17122:2;-1:-1;;5953:13;;17323:2;17373:22;;;5953:13;;;;;-1:-1;17116:305::o;19960:467::-;;43095:6;43090:3;43083:19;20219:66;20211:6;20208:78;20205:2;;;-1:-1;;20289:12;20205:2;43132:4;20324:6;20320:17;45747:6;45742:3;43132:4;43127:3;43123:14;45724:30;45785:16;;;;43132:4;45785:16;45778:27;;;-1:-1;45785:16;;20092:335;-1:-1;20092:335::o;27240:271::-;;20595:5;42248:12;20706:52;20751:6;20746:3;20739:4;20732:5;20728:16;20706:52;:::i;:::-;20770:16;;;;;27374:137;-1:-1;;27374:137::o;27518:379::-;27882:10;27706:191::o;27904:222::-;-1:-1;;;;;44462:54;;;;18090:37;;28031:2;28016:18;;28002:124::o;28378:349::-;-1:-1;;;;;44462:54;;;17959:58;;44462:54;;28713:2;28698:18;;18090:37;28541:2;28526:18;;28512:215::o;28734:349::-;-1:-1;;;;;44462:54;;;;17959:58;;29069:2;29054:18;;27071:37;28897:2;28882:18;;28868:215::o;29090:628::-;;-1:-1;;;;;43952:5;44462:54;17966:3;17959:58;27101:5;29513:2;29502:9;29498:18;27071:37;29341:2;29550;29539:9;29535:18;29528:48;29590:118;29341:2;29330:9;29326:18;29694:6;29686;29590:118;:::i;:::-;29582:126;29312:406;-1:-1;;;;;;29312:406::o;29725:444::-;-1:-1;;;;;44462:54;;;18090:37;;44462:54;;;;30072:2;30057:18;;18090:37;30155:2;30140:18;;27071:37;;;;29908:2;29893:18;;29879:290::o;30516:668::-;-1:-1;;;;;44462:54;;;18090:37;;30920:2;30905:18;;27071:37;;;;44462:54;;;;31003:2;30988:18;;18090:37;31086:2;31071:18;;27071:37;;;;31169:3;31154:19;;27071:37;;;;30755:3;30740:19;;30726:458::o;31191:444::-;-1:-1;;;;;44462:54;;;;18090:37;;31538:2;31523:18;;27071:37;;;;31621:2;31606:18;;27071:37;31374:2;31359:18;;31345:290::o;31642:569::-;31891:2;31905:47;;;42248:12;;31876:18;;;43083:19;;;31642:569;;31891:2;43123:14;;;;;;43132:4;41922:14;;;31642:569;19573:326;19598:6;19595:1;19592:13;19573:326;;;19659:13;;26090:23;;-1:-1;;;;;44462:54;;;18090:37;;26253:16;;;26247:23;44462:54;;26324:14;;;18090:37;26411:16;;;26405:23;44462:54;26482:14;;;18090:37;26571:16;;;26565:23;26642:14;;;27071:37;26749:4;26738:16;;;26732:23;26809:14;;;27071:37;26907:4;26896:16;;;26890:23;26967:14;;;27071:37;17861:4;17852:14;;;;42801;;;;19620:1;19613:9;19573:326;;;-1:-1;;32182:18;;;;27071:37;;;;-1:-1;31958:160;;31862:349;-1:-1;;;;31862:349::o;32746:310::-;;32893:2;32914:17;32907:47;21279:5;42248:12;43095:6;32893:2;32882:9;32878:18;43083:19;21373:52;21418:6;43123:14;32882:9;43123:14;32893:2;21399:5;21395:16;21373:52;:::i;:::-;46184:2;46164:14;-1:-1;;46160:28;21437:39;;;;43123:14;21437:39;;32864:192;-1:-1;;32864:192::o;33063:416::-;33263:2;33277:47;;;21713:2;33248:18;;;43083:19;21749:13;43123:14;;;21729:34;21782:12;;;33234:245::o;33486:416::-;33686:2;33700:47;;;22033:2;33671:18;;;43083:19;22069:21;43123:14;;;22049:42;22110:12;;;33657:245::o;33909:416::-;34109:2;34123:47;;;22361:2;34094:18;;;43083:19;22397:18;43123:14;;;22377:39;22435:12;;;34080:245::o;34332:416::-;34532:2;34546:47;;;22686:2;34517:18;;;43083:19;22722:29;43123:14;;;22702:50;22771:12;;;34503:245::o;34755:416::-;34955:2;34969:47;;;23022:2;34940:18;;;43083:19;23058:32;43123:14;;;23038:53;23110:12;;;34926:245::o;35178:416::-;35378:2;35392:47;;;23361:2;35363:18;;;43083:19;23397:15;43123:14;;;23377:36;23432:12;;;35349:245::o;35601:416::-;35801:2;35815:47;;;23683:2;35786:18;;;43083:19;23719:14;43123;;;23699:35;23753:12;;;35772:245::o;36024:416::-;36224:2;36238:47;;;24004:2;36209:18;;;43083:19;24040:34;43123:14;;;24020:55;24109:3;24095:12;;;24088:25;24132:12;;;36195:245::o;36447:416::-;36647:2;36661:47;;;24383:2;36632:18;;;43083:19;24419:17;43123:14;;;24399:38;24456:12;;;36618:245::o;36870:416::-;37070:2;37084:47;;;24707:2;37055:18;;;43083:19;24743:16;43123:14;;;24723:37;24779:12;;;37041:245::o;37293:416::-;37493:2;37507:47;;;25335:2;37478:18;;;43083:19;25371:31;43123:14;;;25351:52;25422:12;;;37464:245::o;37716:416::-;37916:2;37930:47;;;25673:2;37901:18;;;43083:19;25709:34;43123:14;;;25689:55;25778:12;25764;;;25757:34;25810:12;;;37887:245::o;38139:222::-;27071:37;;;38266:2;38251:18;;38237:124::o;38368:501::-;;27101:5;27078:3;27071:37;38583:2;38701;38690:9;38686:18;38679:48;38741:118;38583:2;38572:9;38568:18;38845:6;38837;38741:118;:::i;:::-;38733:126;38554:315;-1:-1;;;;;38554:315::o;38876:872::-;;39197:3;39186:9;39182:19;27101:5;27078:3;27071:37;39362:2;27101:5;39362:2;39351:9;39347:18;27071:37;39197:3;39399:2;39388:9;39384:18;39377:48;39439:108;18483:5;42248:12;43095:6;43090:3;43083:19;43123:14;39186:9;43123:14;18495:93;;39362:2;18659:5;41922:14;18671:21;;-1:-1;18698:260;18723:6;18720:1;18717:13;18698:260;;;18784:13;;-1:-1;;;;;44462:54;18090:37;;42801:14;;;;17582;;;;18745:1;18738:9;18698:260;;;18702:14;;39595:9;39589:4;39585:20;39580:2;39569:9;39565:18;39558:48;39620:118;39733:4;39724:6;39716;39620:118;:::i;:::-;39612:126;39168:580;-1:-1;;;;;;;;;;39168:580::o;39755:780::-;27071:37;;;40187:2;40172:18;;27071:37;;;;40270:2;40255:18;;27071:37;;;;40353:2;40338:18;;27071:37;40436:3;40421:19;;27071:37;40520:3;40505:19;;27071:37;40022:3;40007:19;;39993:542::o;40542:256::-;40604:2;40598:9;40630:17;;;40705:18;40690:34;;40726:22;;;40687:62;40684:2;;;40762:1;;40752:12;40684:2;40604;40771:22;40582:216;;-1:-1;40582:216::o;40805:304::-;;40964:18;40956:6;40953:30;40950:2;;;-1:-1;;40986:12;40950:2;-1:-1;41031:4;41019:17;;;41084:15;;40887:222::o;45820:268::-;45885:1;45892:101;45906:6;45903:1;45900:13;45892:101;;;45973:11;;;45967:18;45954:11;;;45947:39;45928:2;45921:10;45892:101;;;46008:6;46005:1;46002:13;45999:2;;;-1:-1;;45885:1;46055:16;;46048:27;45869:219::o;46201:117::-;-1:-1;;;;;46288:5;44462:54;46263:5;46260:35;46250:2;;46309:1;;46299:12;46250:2;46244:74;:::o;47027:113::-;44678:4;47110:5;44667:16;47087:5;47084:33;47074:2;;47131:1;;47121:12
Swarm Source
ipfs://ac7c5697aa39e7fcb329127909c91b5c406622e90b3f824585f82055e27cacf1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.