Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiquidityPool
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-30 */ // Sources flattened with hardhat v2.19.4 https://hardhat.org // SPDX-License-Identifier: Apache-2.0 AND MIT pragma abicoder v2; // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; 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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @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 SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable 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( IERC20Upgradeable 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' 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( IERC20Upgradeable token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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(IERC20Upgradeable 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/hyphen/structures/SwapRequest.sol pragma solidity 0.8.0; enum SwapOperation {ExactOutput, ExactInput} struct SwapRequest { address tokenAddress; uint256 percentage; uint256 amount; SwapOperation operation; bytes path; } // File contracts/hyphen/interfaces/ISwapAdaptor.sol pragma solidity 0.8.0; interface ISwapAdaptor { function swap( address inputTokenAddress, uint256 amountInMaximum, address receiver, SwapRequest[] calldata swapRequests ) external returns (uint256 amountIn); function swapNative( uint256 amountInMaximum, address receiver, SwapRequest[] calldata swapRequests ) external returns (uint256 amountOut); } // File contracts/hyphen/structures/TokenConfig.sol pragma solidity 0.8.0; struct TokenInfo { uint256 transferOverhead; bool supportedToken; uint256 equilibriumFee; // Percentage fee Represented in basis points uint256 maxFee; // Percentage fee Represented in basis points TokenConfig tokenConfig; } struct TokenConfig { uint256 min; uint256 max; } // File contracts/hyphen/interfaces/ITokenManager.sol pragma solidity 0.8.0; interface ITokenManager { function getEquilibriumFee(address tokenAddress) external view returns (uint256); function getMaxFee(address tokenAddress) external view returns (uint256); function changeFee( address tokenAddress, uint256 _equilibriumFee, uint256 _maxFee ) external; function tokensInfo(address tokenAddress) external view returns ( uint256 transferOverhead, bool supportedToken, uint256 equilibriumFee, uint256 maxFee, TokenConfig memory config ); function excessStateTransferFeePerc(address tokenAddress) external view returns (uint256); function getTokensInfo(address tokenAddress) external view returns (TokenInfo memory); function getDepositConfig(uint256 toChainId, address tokenAddress) external view returns (TokenConfig memory); function getTransferConfig(address tokenAddress) external view returns (TokenConfig memory); function changeExcessStateFee(address _tokenAddress, uint256 _excessStateFeePer) external; } // File contracts/hyphen/interfaces/IExecutorManager.sol pragma solidity 0.8.0; interface IExecutorManager { function getExecutorStatus(address executor) external view returns (bool status); function getAllExecutors() external view returns (address[] memory); //Register new Executors function addExecutors(address[] calldata executorArray) external; // Register single executor function addExecutor(address executorAddress) external; //Remove registered Executors function removeExecutors(address[] calldata executorArray) external; // Remove Register single executor function removeExecutor(address executorAddress) external; } // File contracts/hyphen/interfaces/ILiquidityProviders.sol pragma solidity 0.8.0; interface ILiquidityProviders { function BASE_DIVISOR() external view returns (uint256); function initialize(address _trustedForwarder, address _lpToken) external; function addLPFee(address _token, uint256 _amount) external; function addNativeLiquidity() external; function addTokenLiquidity(address _token, uint256 _amount) external; function claimFee(uint256 _nftId) external; function getFeeAccumulatedOnNft(uint256 _nftId) external view returns (uint256); function getSuppliedLiquidityByToken(address tokenAddress) external view returns (uint256); function getTokenPriceInLPShares(address _baseToken) external view returns (uint256); function getTotalLPFeeByToken(address tokenAddress) external view returns (uint256); function getTotalReserveByToken(address tokenAddress) external view returns (uint256); function getSuppliedLiquidity(uint256 _nftId) external view returns (uint256); function increaseNativeLiquidity(uint256 _nftId) external; function increaseTokenLiquidity(uint256 _nftId, uint256 _amount) external; function isTrustedForwarder(address forwarder) external view returns (bool); function owner() external view returns (address); function paused() external view returns (bool); function removeLiquidity(uint256 _nftId, uint256 amount) external; function renounceOwnership() external; function setLiquidityPool(address _liquidityPool) external; function setLpToken(address _lpToken) external; function setWhiteListPeriodManager(address _whiteListPeriodManager) external; function sharesToTokenAmount(uint256 _shares, address _tokenAddress) external view returns (uint256); function totalLPFees(address) external view returns (uint256); function totalLiquidity(address) external view returns (uint256); function totalReserve(address) external view returns (uint256); function totalSharesMinted(address) external view returns (uint256); function transferOwnership(address newOwner) external; function whiteListPeriodManager() external view returns (address); function increaseCurrentLiquidity(address tokenAddress, uint256 amount) external; function decreaseCurrentLiquidity(address tokenAddress, uint256 amount) external; function getCurrentLiquidity(address tokenAddress) external view returns (uint256); function setCurrentLiquidity(address tokenAddress, uint256 amount) external; } // File contracts/hyphen/metatx/ERC2771ContextUpgradeable.sol pragma solidity 0.8.0; /** * @dev Context variant with ERC2771 support. * Here _trustedForwarder is made internal instead of private * so it can be changed via Child contracts with a setter method. */ abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable { event TrustedForwarderChanged(address indexed _tf); address internal _trustedForwarder; function __ERC2771Context_init(address trustedForwarder) internal initializer { __Context_init_unchained(); __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address trustedForwarder) internal initializer { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } function _setTrustedForwarder(address _tf) internal virtual { require(_tf != address(0), "TrustedForwarder can't be 0"); _trustedForwarder = _tf; emit TrustedForwarderChanged(_tf); } uint256[49] private __gap; } // File contracts/interfaces/IERC20Permit.sol pragma solidity 0.8.0; interface IERC20Detailed is IERC20Upgradeable { function name() external view returns(string memory); function decimals() external view returns(uint256); } interface IERC20Nonces is IERC20Detailed { function nonces(address holder) external view returns(uint); } interface IERC20Permit is IERC20Nonces { function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external; function permit(address holder, address spender, uint256 value, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external; } // File contracts/security/Pausable.sol pragma solidity 0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Initializable, PausableUpgradeable { address private _pauser; event PauserChanged(address indexed previousPauser, address indexed newPauser); /** * @dev The pausable constructor sets the original `pauser` of the contract to the sender * account & Initializes the contract in unpaused state.. */ function __Pausable_init(address pauser) internal initializer { require(pauser != address(0), "Pauser Address cannot be 0"); __Pausable_init(); _pauser = pauser; } /** * @return true if `msg.sender` is the owner of the contract. */ function isPauser(address pauser) public view returns (bool) { return pauser == _pauser; } /** * @dev Throws if called by any account other than the pauser. */ modifier onlyPauser() { require(isPauser(msg.sender), "Only pauser is allowed to perform this operation"); _; } /** * @dev Allows the current pauser to transfer control of the contract to a newPauser. * @param newPauser The address to transfer pauserShip to. */ function changePauser(address newPauser) public onlyPauser whenNotPaused { _changePauser(newPauser); } /** * @dev Transfers control of the contract to a newPauser. * @param newPauser The address to transfer ownership to. */ function _changePauser(address newPauser) internal { require(newPauser != address(0)); emit PauserChanged(_pauser, newPauser); _pauser = newPauser; } function renouncePauser() external virtual onlyPauser whenNotPaused { emit PauserChanged(_pauser, address(0)); _pauser = address(0); } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } } // File contracts/hyphen/LiquidityPool.sol // $$\ $$\ $$\ $$$$$$$\ $$\ // $$ | $$ | $$ | $$ __$$\ $$ | // $$ | $$ |$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$\ $$$$$$$\ $$ | $$ | $$$$$$\ $$$$$$\ $$ | // $$$$$$$$ |$$ | $$ |$$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\ $$$$$$$ |$$ __$$\ $$ __$$\ $$ | // $$ __$$ |$$ | $$ |$$ / $$ |$$ | $$ |$$$$$$$$ |$$ | $$ | $$ ____/ $$ / $$ |$$ / $$ |$$ | // $$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ ____|$$ | $$ | $$ | $$ | $$ |$$ | $$ |$$ | // $$ | $$ |\$$$$$$$ |$$$$$$$ |$$ | $$ |\$$$$$$$\ $$ | $$ | $$ | \$$$$$$ |\$$$$$$ |$$ | // \__| \__| \____$$ |$$ ____/ \__| \__| \_______|\__| \__| \__| \______/ \______/ \__| // $$\ $$ |$$ | // \$$$$$$ |$$ | // \______/ \__| // pragma solidity 0.8.0; // Original pragma directive: pragma abicoder v2 contract LiquidityPool is Initializable, ReentrancyGuardUpgradeable, Pausable, OwnableUpgradeable, ERC2771ContextUpgradeable { address private constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 private constant BASE_DIVISOR = 10000000000; // Basis Points * 100 for better accuracy uint256 private constant TOKEN_PRICE_BASE_DIVISOR = 10**28; uint256 public baseGas; IExecutorManager private executorManager; ITokenManager public tokenManager; ILiquidityProviders public liquidityProviders; struct PermitRequest { uint256 nonce; uint256 expiry; bool allowed; uint8 v; bytes32 r; bytes32 s; } mapping(bytes32 => bool) public processedHash; mapping(address => uint256) public gasFeeAccumulatedByToken; // Gas fee accumulated by token address => executor address mapping(address => mapping(address => uint256)) public gasFeeAccumulated; // Incentive Pool amount per token address mapping(address => uint256) public incentivePool; mapping(string => address) public swapAdaptorMap; event AssetSent( address indexed asset, uint256 indexed amount, uint256 indexed transferredAmount, address target, bytes depositHash, uint256 fromChainId, uint256 lpFee, uint256 transferFee, uint256 gasFee ); event Received(address indexed from, uint256 indexed amount); event Deposit( address indexed from, address indexed tokenAddress, address indexed receiver, uint256 toChainId, uint256 amount, uint256 reward, string tag ); event GasFeeWithdraw(address indexed tokenAddress, address indexed owner, uint256 indexed amount); event LiquidityProvidersChanged(address indexed liquidityProvidersAddress); event TokenManagerChanged(address indexed tokenManagerAddress); event BaseGasUpdated(uint256 indexed baseGas); event EthReceived(address, uint256); event DepositAndSwap( address indexed from, address indexed tokenAddress, address indexed receiver, uint256 toChainId, uint256 amount, uint256 reward, string tag, SwapRequest[] swapRequests ); event SwapAdaptorChanged(string indexed name, address indexed liquidityProvidersAddress); event GasFeeCalculated( uint256 indexed gasUsed, uint256 indexed gasPrice, uint256 indexed nativeTokenPriceInTransferredToken, uint256 tokenGasBaseFee, uint256 gasFeeInTransferredToken ); // MODIFIERS modifier onlyExecutor() { require(executorManager.getExecutorStatus(_msgSender()), "Only executor is allowed"); _; } modifier onlyLiquidityProviders() { require(_msgSender() == address(liquidityProviders), "Only liquidityProviders is allowed"); _; } modifier tokenChecks(address tokenAddress) { (, bool supportedToken, , , ) = tokenManager.tokensInfo(tokenAddress); require(supportedToken, "Token not supported"); _; } function initialize( address _executorManagerAddress, address _pauser, address _trustedForwarder, address _tokenManager, address _liquidityProviders ) public initializer { require(_executorManagerAddress != address(0), "ExecutorManager cannot be 0x0"); require(_trustedForwarder != address(0), "TrustedForwarder cannot be 0x0"); require(_liquidityProviders != address(0), "LiquidityProviders cannot be 0x0"); __ERC2771Context_init(_trustedForwarder); __ReentrancyGuard_init(); __Ownable_init(); __Pausable_init(_pauser); executorManager = IExecutorManager(_executorManagerAddress); tokenManager = ITokenManager(_tokenManager); liquidityProviders = ILiquidityProviders(_liquidityProviders); baseGas = 21000; } function setSwapAdaptor(string calldata name, address _swapAdaptor) external onlyOwner { swapAdaptorMap[name] = _swapAdaptor; emit SwapAdaptorChanged(name, _swapAdaptor); } function setTrustedForwarder(address trustedForwarder) external onlyOwner { _setTrustedForwarder(trustedForwarder); } function setLiquidityProviders(address _liquidityProviders) external onlyOwner { require(_liquidityProviders != address(0), "LiquidityProviders can't be 0"); liquidityProviders = ILiquidityProviders(_liquidityProviders); emit LiquidityProvidersChanged(_liquidityProviders); } function setTokenManager(address _tokenManager) external onlyOwner { require(_tokenManager != address(0), "TokenManager can't be 0"); tokenManager = ITokenManager(_tokenManager); emit TokenManagerChanged(_tokenManager); } function setBaseGas(uint128 gas) external onlyOwner { baseGas = gas; emit BaseGasUpdated(baseGas); } function getExecutorManager() external view returns (address) { return address(executorManager); } function setExecutorManager(address _executorManagerAddress) external onlyOwner { require(_executorManagerAddress != address(0), "Executor Manager cannot be 0"); executorManager = IExecutorManager(_executorManagerAddress); } function getCurrentLiquidity(address tokenAddress) public view returns (uint256 currentLiquidity) { uint256 liquidityPoolBalance = liquidityProviders.getCurrentLiquidity(tokenAddress); currentLiquidity = liquidityPoolBalance - liquidityProviders.totalLPFees(tokenAddress) - gasFeeAccumulatedByToken[tokenAddress] - incentivePool[tokenAddress]; } /** * @dev Function used to deposit tokens into pool to initiate a cross chain token transfer. * @param toChainId Chain id where funds needs to be transfered * @param tokenAddress ERC20 Token address that needs to be transfered * @param receiver Address on toChainId where tokens needs to be transfered * @param amount Amount of token being transfered */ function depositErc20( uint256 toChainId, address tokenAddress, address receiver, uint256 amount, string calldata tag ) public tokenChecks(tokenAddress) whenNotPaused nonReentrant { address sender = _msgSender(); uint256 rewardAmount = _depositErc20(sender, toChainId, tokenAddress, receiver, amount); // Emit (amount + reward amount) in event emit Deposit(sender, tokenAddress, receiver, toChainId, amount + rewardAmount, rewardAmount, tag); } /** * @dev Function used to deposit tokens into pool to initiate a cross chain token swap And transfer . * @param toChainId Chain id where funds needs to be transfered * @param tokenAddress ERC20 Token address that needs to be transfered * @param receiver Address on toChainId where tokens needs to be transfered * @param amount Amount of token being transfered * @param tag Dapp unique identifier * @param swapRequest information related to token swap on exit chain */ function depositAndSwapErc20( address tokenAddress, address receiver, uint256 toChainId, uint256 amount, string calldata tag, SwapRequest[] calldata swapRequest ) external tokenChecks(tokenAddress) whenNotPaused nonReentrant { uint256 totalPercentage = 0; { uint256 swapArrayLength = swapRequest.length; unchecked { for (uint256 index = 0; index < swapArrayLength; ++index) { totalPercentage += swapRequest[index].percentage; } } } require(totalPercentage <= 100 * BASE_DIVISOR, "Total percentage cannot be > 100"); address sender = _msgSender(); uint256 rewardAmount = _depositErc20(sender, toChainId, tokenAddress, receiver, amount); // Emit (amount + reward amount) in event emit DepositAndSwap( sender, tokenAddress, receiver, toChainId, amount + rewardAmount, rewardAmount, tag, swapRequest ); } function _depositErc20( address sender, uint256 toChainId, address tokenAddress, address receiver, uint256 amount ) internal returns (uint256) { require(toChainId != block.chainid, "To chain must be different than current chain"); require(tokenAddress != NATIVE, "wrong function"); TokenConfig memory config = tokenManager.getDepositConfig(toChainId, tokenAddress); require(config.min <= amount && config.max >= amount, "Deposit amount not in Cap limit"); require(receiver != address(0), "Receiver address cannot be 0"); require(amount != 0, "Amount cannot be 0"); uint256 rewardAmount = getRewardAmount(amount, tokenAddress); if (rewardAmount != 0) { incentivePool[tokenAddress] = incentivePool[tokenAddress] - rewardAmount; } liquidityProviders.increaseCurrentLiquidity(tokenAddress, amount); SafeERC20Upgradeable.safeTransferFrom(IERC20Upgradeable(tokenAddress), sender, address(this), amount); return rewardAmount; } function getRewardAmount(uint256 amount, address tokenAddress) public view returns (uint256 rewardAmount) { uint256 currentLiquidity = getCurrentLiquidity(tokenAddress); uint256 providedLiquidity = liquidityProviders.getSuppliedLiquidityByToken(tokenAddress); if (currentLiquidity < providedLiquidity) { uint256 liquidityDifference = providedLiquidity - currentLiquidity; if (amount >= liquidityDifference) { rewardAmount = incentivePool[tokenAddress]; } else { // Multiply by 10000000000 to avoid 0 reward amount for small amount and liquidity difference rewardAmount = (amount * incentivePool[tokenAddress] * 10000000000) / liquidityDifference; rewardAmount = rewardAmount / 10000000000; } } } /** * DAI permit and Deposit. */ function permitAndDepositErc20( address tokenAddress, address receiver, uint256 amount, uint256 toChainId, PermitRequest calldata permitOptions, string calldata tag ) external { IERC20Permit(tokenAddress).permit( _msgSender(), address(this), permitOptions.nonce, permitOptions.expiry, permitOptions.allowed, permitOptions.v, permitOptions.r, permitOptions.s ); depositErc20(toChainId, tokenAddress, receiver, amount, tag); } /** * EIP2612 and Deposit. */ function permitEIP2612AndDepositErc20( address tokenAddress, address receiver, uint256 amount, uint256 toChainId, PermitRequest calldata permitOptions, string calldata tag ) external { IERC20Permit(tokenAddress).permit( _msgSender(), address(this), amount, permitOptions.expiry, permitOptions.v, permitOptions.r, permitOptions.s ); depositErc20(toChainId, tokenAddress, receiver, amount, tag); } /** * @dev Function used to deposit native token into pool to initiate a cross chain token transfer. * @param receiver Address on toChainId where tokens needs to be transfered * @param toChainId Chain id where funds needs to be transfered */ function depositNative( address receiver, uint256 toChainId, string calldata tag ) external payable whenNotPaused nonReentrant { uint256 rewardAmount = _depositNative(receiver, toChainId); emit Deposit(_msgSender(), NATIVE, receiver, toChainId, msg.value + rewardAmount, rewardAmount, tag); } function depositNativeAndSwap( address receiver, uint256 toChainId, string calldata tag, SwapRequest[] calldata swapRequest ) external payable whenNotPaused nonReentrant { uint256 totalPercentage = 0; { uint256 swapArrayLength = swapRequest.length; unchecked { for (uint256 index = 0; index < swapArrayLength; ++index) { totalPercentage += swapRequest[index].percentage; } } } require(totalPercentage <= 100 * BASE_DIVISOR, "Total percentage cannot be > 100"); uint256 rewardAmount = _depositNative(receiver, toChainId); // TODO: check if need to pass msg.value emit DepositAndSwap( _msgSender(), NATIVE, receiver, toChainId, msg.value + rewardAmount, rewardAmount, tag, swapRequest ); } function _depositNative(address receiver, uint256 toChainId) internal returns (uint256) { require(toChainId != block.chainid, "To chain must be different than current chain"); require( tokenManager.getDepositConfig(toChainId, NATIVE).min <= msg.value && tokenManager.getDepositConfig(toChainId, NATIVE).max >= msg.value, "Deposit amount not in Cap limit" ); require(receiver != address(0), "Receiver address cannot be 0"); require(msg.value != 0, "Amount cannot be 0"); uint256 rewardAmount = getRewardAmount(msg.value, NATIVE); if (rewardAmount != 0) { incentivePool[NATIVE] = incentivePool[NATIVE] - rewardAmount; } liquidityProviders.increaseCurrentLiquidity(NATIVE, msg.value); return rewardAmount; } function sendFundsToUser( address tokenAddress, uint256 amount, address payable receiver, bytes calldata depositHash, uint256 tokenGasPrice, uint256 fromChainId ) external nonReentrant onlyExecutor whenNotPaused { uint256 initialGas = gasleft(); TokenConfig memory config = tokenManager.getTransferConfig(tokenAddress); require(config.min <= amount && config.max >= amount, "Withdraw amount not in Cap limit"); require(receiver != address(0), "Bad receiver address"); (bytes32 hashSendTransaction, bool status) = checkHashStatus(tokenAddress, amount, receiver, depositHash); require(!status, "Already Processed"); processedHash[hashSendTransaction] = true; // uint256 amountToTransfer, uint256 lpFee, uint256 transferFeeAmount, uint256 gasFee uint256[4] memory transferDetails = getAmountToTransfer(initialGas, tokenAddress, amount, tokenGasPrice); liquidityProviders.decreaseCurrentLiquidity(tokenAddress, transferDetails[0]); if (tokenAddress == NATIVE) { (bool success, ) = receiver.call{value: transferDetails[0]}(""); require(success, "Native Transfer Failed"); } else { SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable(tokenAddress), receiver, transferDetails[0]); } emit AssetSent( tokenAddress, amount, transferDetails[0], receiver, depositHash, fromChainId, transferDetails[1], transferDetails[2], transferDetails[3] ); } /** * @dev Internal function to calculate amount of token that needs to be transfered afetr deducting all required fees. * Fee to be deducted includes gas fee, lp fee and incentive pool amount if needed. * @param initialGas Gas provided initially before any calculations began * @param tokenAddress Token address for which calculation needs to be done * @param amount Amount of token to be transfered before deducting the fee * @param tokenGasPrice Gas price in the token being transfered to be used to calculate gas fee * @return [ amountToTransfer, lpFee, transferFeeAmount, gasFee ] */ function getAmountToTransfer( uint256 initialGas, address tokenAddress, uint256 amount, uint256 tokenGasPrice ) internal returns (uint256[4] memory) { TokenInfo memory tokenInfo = tokenManager.getTokensInfo(tokenAddress); uint256 transferFeePerc = _getTransferFee(tokenAddress, amount, tokenInfo); uint256 lpFee; if (transferFeePerc > tokenInfo.equilibriumFee) { // Here add some fee to incentive pool also lpFee = (amount * tokenInfo.equilibriumFee) / BASE_DIVISOR; unchecked { incentivePool[tokenAddress] += (amount * (transferFeePerc - tokenInfo.equilibriumFee)) / BASE_DIVISOR; } } else { lpFee = (amount * transferFeePerc) / BASE_DIVISOR; } uint256 transferFeeAmount = (amount * transferFeePerc) / BASE_DIVISOR; liquidityProviders.addLPFee(tokenAddress, lpFee); uint256 totalGasUsed = initialGas + tokenInfo.transferOverhead + baseGas - gasleft(); uint256 gasFee = totalGasUsed * tokenGasPrice; gasFeeAccumulatedByToken[tokenAddress] += gasFee; gasFeeAccumulated[tokenAddress][_msgSender()] += gasFee; uint256 amountToTransfer = amount - (transferFeeAmount + gasFee); return [amountToTransfer, lpFee, transferFeeAmount, gasFee]; } function sendFundsToUserV2( address tokenAddress, uint256 amount, address payable receiver, bytes calldata depositHash, uint256 nativeTokenPriceInTransferredToken, uint256 fromChainId, uint256 tokenGasBaseFee ) external nonReentrant onlyExecutor whenNotPaused { uint256[4] memory transferDetails = _calculateAmountAndDecreaseAvailableLiquidity( tokenAddress, amount, receiver, depositHash, nativeTokenPriceInTransferredToken, tokenGasBaseFee ); if (tokenAddress == NATIVE) { (bool success, ) = receiver.call{value: transferDetails[0]}(""); require(success, "Native Transfer Failed"); } else { SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable(tokenAddress), receiver, transferDetails[0]); } emit AssetSent( tokenAddress, amount, transferDetails[0], receiver, depositHash, fromChainId, transferDetails[1], transferDetails[2], transferDetails[3] ); } function swapAndSendFundsToUser( address tokenAddress, uint256 amount, address payable receiver, bytes calldata depositHash, uint256 nativeTokenPriceInTransferredToken, uint256 tokenGasBaseFee, uint256 fromChainId, uint256 swapGasOverhead, SwapRequest[] calldata swapRequests, string memory swapAdaptor ) external nonReentrant onlyExecutor whenNotPaused { require(swapRequests.length > 0, "Wrong method call"); require(swapAdaptorMap[swapAdaptor] != address(0), "Swap adaptor not found"); uint256[4] memory transferDetails = _calculateAmountAndDecreaseAvailableLiquidity( tokenAddress, amount, receiver, depositHash, nativeTokenPriceInTransferredToken, tokenGasBaseFee ); if (tokenAddress == NATIVE) { (bool success, ) = swapAdaptorMap[swapAdaptor].call{value: transferDetails[0]}(""); require(success, "Native Transfer to Adaptor Failed"); ISwapAdaptor(swapAdaptorMap[swapAdaptor]).swapNative(transferDetails[0], receiver, swapRequests); } else { { uint256 gasBeforeApproval = gasleft(); SafeERC20Upgradeable.safeApprove( IERC20Upgradeable(tokenAddress), address(swapAdaptorMap[swapAdaptor]), 0 ); SafeERC20Upgradeable.safeApprove( IERC20Upgradeable(tokenAddress), address(swapAdaptorMap[swapAdaptor]), transferDetails[0] ); swapGasOverhead += (gasBeforeApproval - gasleft()); } { uint256 swapGasFee = calculateGasFee( tokenAddress, nativeTokenPriceInTransferredToken, swapGasOverhead, 0, _msgSender() ); transferDetails[0] -= swapGasFee; // Deduct swap gas fee from amount to be sent transferDetails[3] += swapGasFee; // Add swap gas fee to gas fee } ISwapAdaptor(swapAdaptorMap[swapAdaptor]).swap(tokenAddress, transferDetails[0], receiver, swapRequests); } emit AssetSent( tokenAddress, amount, transferDetails[0], receiver, depositHash, fromChainId, transferDetails[1], transferDetails[2], transferDetails[3] ); } function _calculateAmountAndDecreaseAvailableLiquidity( address tokenAddress, uint256 amount, address payable receiver, bytes calldata depositHash, uint256 nativeTokenPriceInTransferredToken, uint256 tokenGasBaseFee ) internal returns (uint256[4] memory) { uint256 initialGas = gasleft(); TokenConfig memory config = tokenManager.getTransferConfig(tokenAddress); require(config.min <= amount && config.max >= amount, "Withdraw amount not in Cap limit"); require(receiver != address(0), "Bad receiver address"); (bytes32 hashSendTransaction, bool status) = checkHashStatus(tokenAddress, amount, receiver, depositHash); require(!status, "Already Processed"); processedHash[hashSendTransaction] = true; // uint256 amountToTransfer, uint256 lpFee, uint256 transferFeeAmount, uint256 gasFee uint256[4] memory transferDetails = getAmountToTransferV2( initialGas, tokenAddress, amount, nativeTokenPriceInTransferredToken, tokenGasBaseFee ); liquidityProviders.decreaseCurrentLiquidity(tokenAddress, transferDetails[0]); return transferDetails; } /** * @dev Internal function to calculate amount of token that needs to be transfered afetr deducting all required fees. * Fee to be deducted includes gas fee, lp fee and incentive pool amount if needed. * @param initialGas Gas provided initially before any calculations began * @param tokenAddress Token address for which calculation needs to be done * @param amount Amount of token to be transfered before deducting the fee * @param nativeTokenPriceInTransferredToken Price of native token in terms of the token being transferred (multiplied base div), used to calculate gas fee * @return [ amountToTransfer, lpFee, transferFeeAmount, gasFee ] */ function getAmountToTransferV2( uint256 initialGas, address tokenAddress, uint256 amount, uint256 nativeTokenPriceInTransferredToken, uint256 tokenGasBaseFee ) internal returns (uint256[4] memory) { TokenInfo memory tokenInfo = tokenManager.getTokensInfo(tokenAddress); uint256 transferFeePerc = _getTransferFee(tokenAddress, amount, tokenInfo); uint256 lpFee; if (transferFeePerc > tokenInfo.equilibriumFee) { // Here add some fee to incentive pool also lpFee = (amount * tokenInfo.equilibriumFee) / BASE_DIVISOR; unchecked { incentivePool[tokenAddress] += (amount * (transferFeePerc - tokenInfo.equilibriumFee)) / BASE_DIVISOR; } } else { lpFee = (amount * transferFeePerc) / BASE_DIVISOR; } uint256 transferFeeAmount = (amount * transferFeePerc) / BASE_DIVISOR; liquidityProviders.addLPFee(tokenAddress, lpFee); uint256 totalGasUsed = initialGas + tokenInfo.transferOverhead + baseGas - gasleft(); uint256 gasFee = calculateGasFee( tokenAddress, nativeTokenPriceInTransferredToken, totalGasUsed, tokenGasBaseFee, _msgSender() ); require(transferFeeAmount + gasFee <= amount, "Insufficient funds to cover transfer fee"); unchecked { uint256 amountToTransfer = amount - (transferFeeAmount + gasFee); return [amountToTransfer, lpFee, transferFeeAmount, gasFee]; } } function calculateGasFee( address tokenAddress, uint256 nativeTokenPriceInTransferredToken, uint256 gasUsed, uint256 tokenGasBaseFee, address sender ) internal returns (uint256) { uint256 gasFee = (gasUsed * nativeTokenPriceInTransferredToken * tx.gasprice) / TOKEN_PRICE_BASE_DIVISOR + tokenGasBaseFee; emit GasFeeCalculated(gasUsed, tx.gasprice, nativeTokenPriceInTransferredToken, tokenGasBaseFee, gasFee); gasFeeAccumulatedByToken[tokenAddress] += gasFee; gasFeeAccumulated[tokenAddress][sender] += gasFee; return gasFee; } function _getTransferFee( address tokenAddress, uint256 amount, TokenInfo memory tokenInfo ) private view returns (uint256) { uint256 currentLiquidity = getCurrentLiquidity(tokenAddress); uint256 providedLiquidity = liquidityProviders.getSuppliedLiquidityByToken(tokenAddress); uint256 resultingLiquidity = currentLiquidity - amount; // We return a constant value in excess state if (resultingLiquidity > providedLiquidity) { return tokenManager.excessStateTransferFeePerc(tokenAddress); } // Fee is represented in basis points * 10 for better accuracy uint256 numerator = providedLiquidity * providedLiquidity * tokenInfo.equilibriumFee * tokenInfo.maxFee; // F(max) * F(e) * L(e) ^ 2 uint256 denominator = tokenInfo.equilibriumFee * providedLiquidity * providedLiquidity + (tokenInfo.maxFee - tokenInfo.equilibriumFee) * resultingLiquidity * resultingLiquidity; // F(e) * L(e) ^ 2 + (F(max) - F(e)) * L(r) ^ 2 uint256 fee; if (denominator == 0) { fee = 0; } else { fee = numerator / denominator; } return fee; } function getTransferFee(address tokenAddress, uint256 amount) external view returns (uint256) { return _getTransferFee(tokenAddress, amount, tokenManager.getTokensInfo(tokenAddress)); } function checkHashStatus( address tokenAddress, uint256 amount, address payable receiver, bytes calldata depositHash ) public view returns (bytes32 hashSendTransaction, bool status) { hashSendTransaction = keccak256(abi.encode(tokenAddress, amount, receiver, keccak256(depositHash))); status = processedHash[hashSendTransaction]; } function withdrawErc20GasFee(address tokenAddress) external onlyExecutor whenNotPaused nonReentrant { require(tokenAddress != NATIVE, "Can't withdraw native token fee"); // uint256 gasFeeAccumulated = gasFeeAccumulatedByToken[tokenAddress]; uint256 _gasFeeAccumulated = gasFeeAccumulated[tokenAddress][_msgSender()]; require(_gasFeeAccumulated != 0, "Gas Fee earned is 0"); gasFeeAccumulatedByToken[tokenAddress] = gasFeeAccumulatedByToken[tokenAddress] - _gasFeeAccumulated; gasFeeAccumulated[tokenAddress][_msgSender()] = 0; SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable(tokenAddress), _msgSender(), _gasFeeAccumulated); liquidityProviders.decreaseCurrentLiquidity(tokenAddress, _gasFeeAccumulated); emit GasFeeWithdraw(tokenAddress, _msgSender(), _gasFeeAccumulated); } function withdrawNativeGasFee() external onlyExecutor whenNotPaused nonReentrant { uint256 _gasFeeAccumulated = gasFeeAccumulated[NATIVE][_msgSender()]; require(_gasFeeAccumulated != 0, "Gas Fee earned is 0"); gasFeeAccumulatedByToken[NATIVE] = gasFeeAccumulatedByToken[NATIVE] - _gasFeeAccumulated; gasFeeAccumulated[NATIVE][_msgSender()] = 0; (bool success, ) = payable(_msgSender()).call{value: _gasFeeAccumulated}(""); require(success, "Native Transfer Failed"); liquidityProviders.decreaseCurrentLiquidity(NATIVE, _gasFeeAccumulated); emit GasFeeWithdraw(address(this), _msgSender(), _gasFeeAccumulated); } function setCurrentLiquidity(address tokenAddress) public onlyOwner { uint256 tokenLiquidity = 0; if (tokenAddress == NATIVE) { tokenLiquidity = address(this).balance; } else { IERC20Upgradeable baseToken = IERC20Upgradeable(tokenAddress); tokenLiquidity = baseToken.balanceOf(address(this)); } liquidityProviders.setCurrentLiquidity(tokenAddress, tokenLiquidity); } function transfer( address _tokenAddress, address receiver, uint256 _tokenAmount ) external whenNotPaused onlyLiquidityProviders nonReentrant { require(receiver != address(0), "Invalid receiver"); if (_tokenAddress == NATIVE) { require(address(this).balance >= _tokenAmount, "ERR__INSUFFICIENT_BALANCE"); (bool success, ) = receiver.call{value: _tokenAmount}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); } else { IERC20Upgradeable baseToken = IERC20Upgradeable(_tokenAddress); require(baseToken.balanceOf(address(this)) >= _tokenAmount, "ERR__INSUFFICIENT_BALANCE"); SafeERC20Upgradeable.safeTransfer(baseToken, receiver, _tokenAmount); } } function _msgSender() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (address sender) { return ERC2771ContextUpgradeable._msgSender(); } function _msgData() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (bytes calldata) { return ERC2771ContextUpgradeable._msgData(); } receive() external payable { emit EthReceived(_msgSender(), msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"transferredAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"depositHash","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fromChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFee","type":"uint256"}],"name":"AssetSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"baseGas","type":"uint256"}],"name":"BaseGasUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"string","name":"tag","type":"string"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"string","name":"tag","type":"string"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum SwapOperation","name":"operation","type":"uint8"},{"internalType":"bytes","name":"path","type":"bytes"}],"indexed":false,"internalType":"struct SwapRequest[]","name":"swapRequests","type":"tuple[]"}],"name":"DepositAndSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"gasPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nativeTokenPriceInTransferredToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenGasBaseFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFeeInTransferredToken","type":"uint256"}],"name":"GasFeeCalculated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GasFeeWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityProvidersAddress","type":"address"}],"name":"LiquidityProvidersChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousPauser","type":"address"},{"indexed":true,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"address","name":"liquidityProvidersAddress","type":"address"}],"name":"SwapAdaptorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenManagerAddress","type":"address"}],"name":"TokenManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tf","type":"address"}],"name":"TrustedForwarderChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"baseGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPauser","type":"address"}],"name":"changePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"bytes","name":"depositHash","type":"bytes"}],"name":"checkHashStatus","outputs":[{"internalType":"bytes32","name":"hashSendTransaction","type":"bytes32"},{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"tag","type":"string"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum SwapOperation","name":"operation","type":"uint8"},{"internalType":"bytes","name":"path","type":"bytes"}],"internalType":"struct SwapRequest[]","name":"swapRequest","type":"tuple[]"}],"name":"depositAndSwapErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"tag","type":"string"}],"name":"depositErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"string","name":"tag","type":"string"}],"name":"depositNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"string","name":"tag","type":"string"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum SwapOperation","name":"operation","type":"uint8"},{"internalType":"bytes","name":"path","type":"bytes"}],"internalType":"struct SwapRequest[]","name":"swapRequest","type":"tuple[]"}],"name":"depositNativeAndSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"gasFeeAccumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gasFeeAccumulatedByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getCurrentLiquidity","outputs":[{"internalType":"uint256","name":"currentLiquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExecutorManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTransferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"incentivePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executorManagerAddress","type":"address"},{"internalType":"address","name":"_pauser","type":"address"},{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"address","name":"_tokenManager","type":"address"},{"internalType":"address","name":"_liquidityProviders","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauser","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityProviders","outputs":[{"internalType":"contract ILiquidityProviders","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct LiquidityPool.PermitRequest","name":"permitOptions","type":"tuple"},{"internalType":"string","name":"tag","type":"string"}],"name":"permitAndDepositErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct LiquidityPool.PermitRequest","name":"permitOptions","type":"tuple"},{"internalType":"string","name":"tag","type":"string"}],"name":"permitEIP2612AndDepositErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedHash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"bytes","name":"depositHash","type":"bytes"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"fromChainId","type":"uint256"}],"name":"sendFundsToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"bytes","name":"depositHash","type":"bytes"},{"internalType":"uint256","name":"nativeTokenPriceInTransferredToken","type":"uint256"},{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"uint256","name":"tokenGasBaseFee","type":"uint256"}],"name":"sendFundsToUserV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"gas","type":"uint128"}],"name":"setBaseGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setCurrentLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executorManagerAddress","type":"address"}],"name":"setExecutorManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityProviders","type":"address"}],"name":"setLiquidityProviders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_swapAdaptor","type":"address"}],"name":"setSwapAdaptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenManager","type":"address"}],"name":"setTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"swapAdaptorMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"bytes","name":"depositHash","type":"bytes"},{"internalType":"uint256","name":"nativeTokenPriceInTransferredToken","type":"uint256"},{"internalType":"uint256","name":"tokenGasBaseFee","type":"uint256"},{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"uint256","name":"swapGasOverhead","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum SwapOperation","name":"operation","type":"uint8"},{"internalType":"bytes","name":"path","type":"bytes"}],"internalType":"struct SwapRequest[]","name":"swapRequests","type":"tuple[]"},{"internalType":"string","name":"swapAdaptor","type":"string"}],"name":"swapAndSendFundsToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenManager","outputs":[{"internalType":"contract ITokenManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawErc20GasFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNativeGasFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50615f4a80620000216000396000f3fe6080604052600436106102605760003560e01c806383f75fa311610144578063ca2ba943116100b6578063ea3684211161007a578063ea36842114610706578063ee58591c14610719578063ef0d457214610739578063f16c2c2514610759578063f2fde38b14610779578063fc42b58f14610799576102a7565b8063ca2ba94314610671578063ccb844e114610691578063da6f6794146106b1578063da742228146106c6578063e06179fe146106e6576102a7565b8063a4479b4811610108578063a4479b48146105bc578063ab1635b7146105dc578063bcc1f5ad146105f1578063beabacc814610611578063bf33e81214610631578063c87e4e2514610651576102a7565b806383f75fa31461052f5780638456cb591461054f57806385a25597146105645780638da5cb5b14610592578063a2419a6b146105a7576102a7565b8063583bbc40116101dd5780636e8ae0a3116101a15780636e8ae0a3146104925780636ef8d66d146104b2578063715018a6146104c7578063760d098a146104dc57806376d2cbb4146104fc5780637cb2b79c1461050f576102a7565b8063583bbc40146103fb57806359ca6c011461041d5780635c975abb1461043d5780636583de671461045257806367924a5614610472576102a7565b8063316182a311610224578063316182a3146103595780633f4ba83a1461037957806346fbf68e1461038e57806355d73595146103bb578063572b6c05146103db576102a7565b80631459457a146102ac5780631dbb76b3146102ce5780631ef6626b146102ee5780632a709b141461030e5780632cd271e714610339576102a7565b366102a7577f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f8669561028e6107b9565b3460405161029d92919061531a565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102cc6102c73660046148aa565b6107c9565b005b3480156102da57600080fd5b506102cc6102e9366004614c36565b610923565b3480156102fa57600080fd5b506102cc610309366004614b30565b610e0a565b34801561031a57600080fd5b506103236111d4565b60405161033091906151f3565b60405180910390f35b34801561034557600080fd5b506102cc610354366004614856565b6111e3565b34801561036557600080fd5b506102cc610374366004614baf565b611239565b34801561038557600080fd5b506102cc611459565b34801561039a57600080fd5b506103ae6103a9366004614856565b611488565b6040516103309190615391565b3480156103c757600080fd5b506102cc6103d6366004614fda565b61149f565b3480156103e757600080fd5b506103ae6103f6366004614856565b611629565b34801561040757600080fd5b5061041061163d565b6040516103309190615ce2565b34801561042957600080fd5b506102cc610438366004614856565b611643565b34801561044957600080fd5b506103ae6116f2565b34801561045e57600080fd5b506102cc61046d366004614856565b6116fb565b34801561047e57600080fd5b506102cc61048d3660046149fe565b611844565b34801561049e57600080fd5b506104106104ad366004614fb6565b6118f9565b3480156104be57600080fd5b506102cc611a28565b3480156104d357600080fd5b506102cc611abc565b3480156104e857600080fd5b506103ae6104f7366004614e42565b611b05565b6102cc61050a366004614d82565b611b1b565b34801561051b57600080fd5b506102cc61052a366004614856565b611c7c565b34801561053b57600080fd5b506102cc61054a366004614e5a565b611d2b565b34801561055b57600080fd5b506102cc611def565b34801561057057600080fd5b5061058461057f366004614ac0565b611e1c565b60405161033092919061539c565b34801561059e57600080fd5b50610323611e82565b3480156105b357600080fd5b50610323611e91565b3480156105c857600080fd5b506104106105d7366004614856565b611ea0565b3480156105e857600080fd5b50610323611eb3565b3480156105fd57600080fd5b506102cc61060c36600461495a565b611ec2565b34801561061d57600080fd5b506102cc61062c36600461491a565b6120ba565b34801561063d57600080fd5b506102cc61064c3660046149fe565b6122dc565b34801561065d57600080fd5b506102cc61066c366004614856565b612336565b34801561067d57600080fd5b5061041061068c366004614856565b6125ec565b34801561069d57600080fd5b506102cc6106ac366004614f77565b61273e565b3480156106bd57600080fd5b506102cc6127b8565b3480156106d257600080fd5b506102cc6106e1366004614856565b612b3a565b3480156106f257600080fd5b50610410610701366004614856565b612b82565b6102cc610714366004614d29565b612b95565b34801561072557600080fd5b50610323610734366004614eae565b612c6d565b34801561074557600080fd5b506102cc610754366004614856565b612c94565b34801561076557600080fd5b50610410610774366004614872565b612d1b565b34801561078557600080fd5b506102cc610794366004614856565b612d39565b3480156107a557600080fd5b506104106107b4366004614a95565b612da7565b60006107c3612e37565b90505b90565b600054610100900460ff16806107e2575060005460ff16155b6108075760405162461bcd60e51b81526004016107fe90615785565b60405180910390fd5b600054610100900460ff16158015610832576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166108585760405162461bcd60e51b81526004016107fe90615ab6565b6001600160a01b03841661087e5760405162461bcd60e51b81526004016107fe9061596b565b6001600160a01b0382166108a45760405162461bcd60e51b81526004016107fe90615cad565b6108ad84612e65565b6108b5612eec565b6108bd612f68565b6108c685612fd8565b60fd80546001600160a01b038089166001600160a01b03199283161790925560fe805486841690831617905560ff80549285169290911691909117905561520860fc55801561091b576000805461ff00191690555b505050505050565b600260015414156109465760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c6109646107b9565b6040518263ffffffff1660e01b815260040161098091906151f3565b60206040518083038186803b15801561099857600080fd5b505afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190614e26565b6109ec5760405162461bcd60e51b81526004016107fe906153df565b6109f46116f2565b15610a115760405162461bcd60e51b81526004016107fe90615719565b81610a2e5760405162461bcd60e51b81526004016107fe90615a24565b60006001600160a01b031661010482604051610a4a91906151d7565b908152604051908190036020019020546001600160a01b03161415610a815760405162461bcd60e51b81526004016107fe906155ed565b6000610a928d8d8d8d8d8d8d613096565b90506001600160a01b038d16600080516020615ef58339815191521415610c0857600061010483604051610ac691906151d7565b908152604051908190036020019020546001600160a01b03168260006020020151604051610af3906107c6565b60006040518083038185875af1925050503d8060008114610b30576040519150601f19603f3d011682016040523d82523d6000602084013e610b35565b606091505b5050905080610b565760405162461bcd60e51b81526004016107fe906155ac565b61010483604051610b6791906151d7565b908152604051908190036020019020546001600160a01b03166355a4aafb83600060200201518e88886040518563ffffffff1660e01b8152600401610baf9493929190615d02565b602060405180830381600087803b158015610bc957600080fd5b505af1158015610bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c019190614f9e565b5050610d8c565b60005a9050610c428e61010485604051610c2291906151d7565b908152604051908190036020019020546001600160a01b03166000613258565b610c7d8e61010485604051610c5791906151d7565b908152604051908190036020019020546001600160a01b03168460006020020151613258565b5a610c889082615e62565b610c929087615e0b565b9550506000610cac8e8a886000610ca76107b9565b613357565b825190915081908390610cc0908390615e62565b9052508082600360200201818151610cd89190615e0b565b9052505060405161010490610cee9084906151d7565b908152604051908190036020019020546001600160a01b0316632180777e8e83600060200201518e88886040518663ffffffff1660e01b8152600401610d38959493929190615333565b602060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614f9e565b505b80600060200201518c6001600160a01b038f167f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c8e8e8e8c886001602002015189600260200201518a60036020020151604051610def9796959493929190615207565b60405180910390a45050600180555050505050505050505050565b60026001541415610e2d5760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c610e4b6107b9565b6040518263ffffffff1660e01b8152600401610e6791906151f3565b60206040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb79190614e26565b610ed35760405162461bcd60e51b81526004016107fe906153df565b610edb6116f2565b15610ef85760405162461bcd60e51b81526004016107fe90615719565b60005a60fe546040516302502c3560e31b81529192506000916001600160a01b039091169063128161a890610f31908c906004016151f3565b604080518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f809190614ee0565b905087816000015111158015610f9a575087816020015110155b610fb65760405162461bcd60e51b81526004016107fe906154b2565b6001600160a01b038716610fdc5760405162461bcd60e51b81526004016107fe906157d3565b600080610fec8b8b8b8b8b611e1c565b91509150801561100e5760405162461bcd60e51b81526004016107fe90615ba5565b600082815261010060205260408120805460ff19166001179055611034858d8d8a613445565b60ff549091506001600160a01b031663dd8b99238d83600060200201516040518363ffffffff1660e01b815260040161106e92919061531a565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050506001600160a01b038c16600080516020615ef583398151915214156111445780516040516000916001600160a01b038d16916110db906107c6565b60006040518083038185875af1925050503d8060008114611118576040519150601f19603f3d011682016040523d82523d6000602084013e61111d565b606091505b505090508061113e5760405162461bcd60e51b81526004016107fe90615a4f565b50611157565b6111578c8b8360005b6020020151613704565b80600060200201518b6001600160a01b038e167f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c8d8d8d8c886001602002015189600260200201518a600360200201516040516111ba9796959493929190615207565b60405180910390a450506001805550505050505050505050565b60fe546001600160a01b031681565b6111ec33611488565b6112085760405162461bcd60e51b81526004016107fe90615c5d565b6112106116f2565b1561122d5760405162461bcd60e51b81526004016107fe90615719565b61123681613723565b50565b6002600154141561125c5760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c61127a6107b9565b6040518263ffffffff1660e01b815260040161129691906151f3565b60206040518083038186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e69190614e26565b6113025760405162461bcd60e51b81526004016107fe906153df565b61130a6116f2565b156113275760405162461bcd60e51b81526004016107fe90615719565b600061133889898989898988613096565b90506001600160a01b038916600080516020615ef583398151915214156113de5780516040516000916001600160a01b038a1691611375906107c6565b60006040518083038185875af1925050503d80600081146113b2576040519150601f19603f3d011682016040523d82523d6000602084013e6113b7565b606091505b50509050806113d85760405162461bcd60e51b81526004016107fe90615a4f565b506113eb565b6113eb898883600061114d565b80516020820151604080840151606085015191518c936001600160a01b038f16937f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c93611442938f938f938f938e93909190615207565b60405180910390a450506001805550505050505050565b61146233611488565b61147e5760405162461bcd60e51b81526004016107fe90615c5d565b611486613792565b565b6097546001600160a01b038281169116145b919050565b60fe54604051635d46df5160e11b815286916000916001600160a01b039091169063ba8dbea2906114d49085906004016151f3565b60c06040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115249190615041565b505050915050806115475760405162461bcd60e51b81526004016107fe9061593e565b61154f6116f2565b1561156c5760405162461bcd60e51b81526004016107fe90615719565b6002600154141561158f5760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600061159e6107b9565b905060006115af828b8b8b8b613800565b9050876001600160a01b0316896001600160a01b0316836001600160a01b03167f522e11fa05593b306c8df10d2b0b8e01eec48f9d0a9427a7a93f21ff90d66fb18d858c6115fd9190615e0b565b868c8c604051611611959493929190615d45565b60405180910390a45050600180555050505050505050565b60ca546001600160a01b0390811691161490565b60fc5481565b61164b6107b9565b6001600160a01b031661165c611e82565b6001600160a01b0316146116825760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b0381166116a85760405162461bcd60e51b81526004016107fe9061547b565b60ff80546001600160a01b0319166001600160a01b0383169081179091556040517f0988d9952b4295aedfb755253e8d1dcebd105e8a5cf7507e419b544da764706690600090a250565b60655460ff1690565b6117036107b9565b6001600160a01b0316611714611e82565b6001600160a01b03161461173a5760405162461bcd60e51b81526004016107fe906158a6565b60006001600160a01b038216600080516020615ef583398151915214156117625750476117e4565b6040516370a0823160e01b815282906001600160a01b038216906370a08231906117909030906004016151f3565b60206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190614f9e565b9150505b60ff546040516332550d6960e11b81526001600160a01b03909116906364aa1ad290611816908590859060040161531a565b600060405180830381600087803b15801561183057600080fd5b505af115801561091b573d6000803e3d6000fd5b866001600160a01b0316638fcbaf0c61185b6107b9565b308635602088013561187360608a0160408b01614e0a565b61188360808b0160608c01615094565b8a608001358b60a001356040518963ffffffff1660e01b81526004016118b0989796959493929190615290565b600060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506118f084888888868661149f565b50505050505050565b600080611905836125ec565b60ff54604051630b3524e360e41b81529192506000916001600160a01b039091169063b3524e309061193b9087906004016151f3565b60206040518083038186803b15801561195357600080fd5b505afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190614f9e565b905080821015611a205760006119a18383615e62565b90508086106119cb576001600160a01b038516600090815261010360205260409020549350611a1e565b6001600160a01b0385166000908152610103602052604090205481906119f19088615e43565b611a00906402540be400615e43565b611a0a9190615e23565b9350611a1b6402540be40085615e23565b93505b505b505092915050565b611a3133611488565b611a4d5760405162461bcd60e51b81526004016107fe90615c5d565b611a556116f2565b15611a725760405162461bcd60e51b81526004016107fe90615719565b6097546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a3609780546001600160a01b0319169055565b611ac46107b9565b6001600160a01b0316611ad5611e82565b6001600160a01b031614611afb5760405162461bcd60e51b81526004016107fe906158a6565b6114866000613a23565b6101006020526000908152604090205460ff1681565b611b236116f2565b15611b405760405162461bcd60e51b81526004016107fe90615719565b60026001541415611b635760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600081815b81811015611bb857848482818110611b9557634e487b7160e01b600052603260045260246000fd5b9050602002810190611ba79190615db2565b602001359290920191600101611b6d565b50611bcb90506402540be4006064615e43565b811115611bea5760405162461bcd60e51b81526004016107fe906159a2565b6000611bf68888613a75565b90506001600160a01b038816600080516020615ef5833981519152611c196107b9565b6001600160a01b03167fe0c1647854700a22165488c301138e1e29036e60ec14c1e78653b1e0c918f8748a611c4e8634615e0b565b868c8c8c8c604051611c669796959493929190615d6b565b60405180910390a4505060018055505050505050565b611c846107b9565b6001600160a01b0316611c95611e82565b6001600160a01b031614611cbb5760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116611ce15760405162461bcd60e51b81526004016107fe90615bd0565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517f331ea0c3b6547bb3d7c5798698a5f25c7b9f5484af90723a847eba9e885a3d7f90600090a250565b611d336107b9565b6001600160a01b0316611d44611e82565b6001600160a01b031614611d6a5760405162461bcd60e51b81526004016107fe906158a6565b806101048484604051611d7e9291906151c7565b90815260405190819003602001812080546001600160a01b039384166001600160a01b031990911617905590821690611dba90859085906151c7565b604051908190038120907f32987e7b04c960bad9e4a93936f2b82bd108cf13934d9eef41bc48453664e7ea90600090a3505050565b611df833611488565b611e145760405162461bcd60e51b81526004016107fe90615c5d565b611486613d41565b6000808686868686604051611e329291906151c7565b604051908190038120611e4a94939291602001615367565b60408051601f1981840301815291815281516020928301206000818152610100909352912054909860ff909116975095505050505050565b6098546001600160a01b031690565b60ff546001600160a01b031681565b6101036020526000908152604090205481565b60fd546001600160a01b031690565b60fe54604051635d46df5160e11b815289916000916001600160a01b039091169063ba8dbea290611ef79085906004016151f3565b60c06040518083038186803b158015611f0f57600080fd5b505afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f479190615041565b50505091505080611f6a5760405162461bcd60e51b81526004016107fe9061593e565b611f726116f2565b15611f8f5760405162461bcd60e51b81526004016107fe90615719565b60026001541415611fb25760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600083815b8181101561200757868682818110611fe457634e487b7160e01b600052603260045260246000fd5b9050602002810190611ff69190615db2565b602001359290920191600101611fbc565b5061201a90506402540be4006064615e43565b8111156120395760405162461bcd60e51b81526004016107fe906159a2565b60006120436107b9565b90506000612054828c8f8f8e613800565b90508b6001600160a01b03168d6001600160a01b0316836001600160a01b03167fe0c1647854700a22165488c301138e1e29036e60ec14c1e78653b1e0c918f8748e858f6120a29190615e0b565b868f8f8f8f604051610def9796959493929190615d6b565b6120c26116f2565b156120df5760405162461bcd60e51b81526004016107fe90615719565b60ff546001600160a01b03166120f36107b9565b6001600160a01b0316146121195760405162461bcd60e51b81526004016107fe90615743565b6002600154141561213c5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556001600160a01b0382166121675760405162461bcd60e51b81526004016107fe906156ef565b6001600160a01b038316600080516020615ef5833981519152141561222857804710156121a65760405162461bcd60e51b81526004016107fe90615aed565b6000826001600160a01b0316826040516121bf906107c6565b60006040518083038185875af1925050503d80600081146121fc576040519150601f19603f3d011682016040523d82523d6000602084013e612201565b606091505b50509050806122225760405162461bcd60e51b81526004016107fe906154e7565b506122d3565b6040516370a0823160e01b8152839082906001600160a01b038316906370a08231906122589030906004016151f3565b60206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a89190614f9e565b10156122c65760405162461bcd60e51b81526004016107fe90615aed565b6122d1818484613704565b505b50506001805550565b866001600160a01b031663d505accf6122f36107b9565b3088602088013561230a60808a0160608b01615094565b89608001358a60a001356040518863ffffffff1660e01b81526004016118b097969594939291906152d9565b60fd546001600160a01b0316630768d65c61234f6107b9565b6040518263ffffffff1660e01b815260040161236b91906151f3565b60206040518083038186803b15801561238357600080fd5b505afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190614e26565b6123d75760405162461bcd60e51b81526004016107fe906153df565b6123df6116f2565b156123fc5760405162461bcd60e51b81526004016107fe90615719565b6002600154141561241f5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556001600160a01b038116600080516020615ef5833981519152141561245b5760405162461bcd60e51b81526004016107fe90615801565b6001600160a01b0381166000908152610102602052604081208161247d6107b9565b6001600160a01b031681526020810191909152604001600020549050806124b65760405162461bcd60e51b81526004016107fe9061561d565b6001600160a01b038216600090815261010160205260409020546124db908290615e62565b6001600160a01b0383166000908152610101602090815260408083209390935561010290529081208161250c6107b9565b6001600160a01b03168152602081019190915260400160002055612538826125326107b9565b83613704565b60ff5460405163dd8b992360e01b81526001600160a01b039091169063dd8b99239061256a908590859060040161531a565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b50505050806125a56107b9565b6001600160a01b0316836001600160a01b03167fc129cf8730ce23dfea8953a499f9b276ad5777855ff41fafe198ebc2a0d2324360405160405180910390a4505060018055565b60ff5460405163ca2ba94360e01b815260009182916001600160a01b039091169063ca2ba943906126219086906004016151f3565b60206040518083038186803b15801561263957600080fd5b505afa15801561264d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126719190614f9e565b6001600160a01b0380851660009081526101036020908152604080832054610101909252918290205460ff5492516368da78c960e11b815294955090939092919091169063d1b4f192906126c99088906004016151f3565b60206040518083038186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190614f9e565b6127239084615e62565b61272d9190615e62565b6127379190615e62565b9392505050565b6127466107b9565b6001600160a01b0316612757611e82565b6001600160a01b03161461277d5760405162461bcd60e51b81526004016107fe906158a6565b6001600160801b03811660fc8190556040517f1f7e24d1f8ac9b596a34502db87778da821b5ac198a6738cfb24ab379b969bfe90600090a250565b60fd546001600160a01b0316630768d65c6127d16107b9565b6040518263ffffffff1660e01b81526004016127ed91906151f3565b60206040518083038186803b15801561280557600080fd5b505afa158015612819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283d9190614e26565b6128595760405162461bcd60e51b81526004016107fe906153df565b6128616116f2565b1561287e5760405162461bcd60e51b81526004016107fe90615719565b600260015414156128a15760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600080516020615ef583398151915260009081526101026020527f8c843e863d6980427013005c2fd6c559f82753ab35a5ed8f9caaa5df7d58739d816128ea6107b9565b6001600160a01b031681526020810191909152604001600020549050806129235760405162461bcd60e51b81526004016107fe9061561d565b600080516020615ef58339815191526000526101016020527ffc69fe689a10849a4c810115708945edcdce02b4ce0b8911d1cf85d0b30251d554612968908290615e62565b600080516020615ef583398151915260009081527ffc69fe689a10849a4c810115708945edcdce02b4ce0b8911d1cf85d0b30251d5919091556101026020527f8c843e863d6980427013005c2fd6c559f82753ab35a5ed8f9caaa5df7d58739d816129d16107b9565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006129ff6107b9565b6001600160a01b031682604051612a15906107c6565b60006040518083038185875af1925050503d8060008114612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b5050905080612a785760405162461bcd60e51b81526004016107fe90615a4f565b60ff5460405163dd8b992360e01b81526001600160a01b039091169063dd8b992390612ab890600080516020615ef583398151915290869060040161531a565b600060405180830381600087803b158015612ad257600080fd5b505af1158015612ae6573d6000803e3d6000fd5b5050505081612af36107b9565b6001600160a01b0316306001600160a01b03167fc129cf8730ce23dfea8953a499f9b276ad5777855ff41fafe198ebc2a0d2324360405160405180910390a4505060018055565b612b426107b9565b6001600160a01b0316612b53611e82565b6001600160a01b031614612b795760405162461bcd60e51b81526004016107fe906158a6565b61123681613d9c565b6101016020526000908152604090205481565b612b9d6116f2565b15612bba5760405162461bcd60e51b81526004016107fe90615719565b60026001541415612bdd5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556000612bee8585613a75565b90506001600160a01b038516600080516020615ef5833981519152612c116107b9565b6001600160a01b03167f522e11fa05593b306c8df10d2b0b8e01eec48f9d0a9427a7a93f21ff90d66fb187612c468634615e0b565b868989604051612c5a959493929190615d45565b60405180910390a4505060018055505050565b8051602081830181018051610104825292820191909301209152546001600160a01b031681565b612c9c6107b9565b6001600160a01b0316612cad611e82565b6001600160a01b031614612cd35760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116612cf95760405162461bcd60e51b81526004016107fe90615416565b60fd80546001600160a01b0319166001600160a01b0392909216919091179055565b61010260209081526000928352604080842090915290825290205481565b612d416107b9565b6001600160a01b0316612d52611e82565b6001600160a01b031614612d785760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116612d9e5760405162461bcd60e51b81526004016107fe90615566565b61123681613a23565b60fe54604051633e978aaf60e21b815260009161273791859185916001600160a01b039091169063fa5e2abc90612de29085906004016151f3565b60c06040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e329190614efb565b613e0c565b6000612e4233611629565b15612e56575060131936013560601c6107c6565b612e5e613fea565b90506107c6565b600054610100900460ff1680612e7e575060005460ff16155b612e9a5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612ec5576000805460ff1961ff0019909116610100171660011790555b612ecd613fee565b612ed682614061565b8015612ee8576000805461ff00191690555b5050565b600054610100900460ff1680612f05575060005460ff16155b612f215760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612f4c576000805460ff1961ff0019909116610100171660011790555b612f546140f1565b8015611236576000805461ff001916905550565b600054610100900460ff1680612f81575060005460ff16155b612f9d5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612fc8576000805460ff1961ff0019909116610100171660011790555b612fd0613fee565b612f54614169565b600054610100900460ff1680612ff1575060005460ff16155b61300d5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015613038576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03821661305e5760405162461bcd60e51b81526004016107fe906158db565b6130666141d9565b609780546001600160a01b0319166001600160a01b0384161790558015612ee8576000805461ff00191690555050565b61309e6146d9565b60005a60fe546040516302502c3560e31b81529192506000916001600160a01b039091169063128161a8906130d7908d906004016151f3565b604080518083038186803b1580156130ee57600080fd5b505afa158015613102573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131269190614ee0565b905088816000015111158015613140575088816020015110155b61315c5760405162461bcd60e51b81526004016107fe906154b2565b6001600160a01b0388166131825760405162461bcd60e51b81526004016107fe906157d3565b6000806131928c8c8c8c8c611e1c565b9150915080156131b45760405162461bcd60e51b81526004016107fe90615ba5565b600082815261010060205260408120805460ff191660011790556131db858e8e8b8b614249565b60ff549091506001600160a01b031663dd8b99238e83600060200201516040518363ffffffff1660e01b815260040161321592919061531a565b600060405180830381600087803b15801561322f57600080fd5b505af1158015613243573d6000803e3d6000fd5b50929f9e505050505050505050505050505050565b8015806132e05750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061328e9030908690600401615252565b60206040518083038186803b1580156132a657600080fd5b505afa1580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614f9e565b155b6132fc5760405162461bcd60e51b81526004016107fe90615c07565b6133528363095ea7b360e01b848460405160240161331b92919061531a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261449a565b505050565b600080836b204fce5e3e250261100000003a6133738989615e43565b61337d9190615e43565b6133879190615e23565b6133919190615e0b565b9050853a867f9b36696d0f99bcef3d9db526d18d2e13abee9741727d7d21128c6079d985c2e187856040516133c7929190615d37565b60405180910390a46001600160a01b03871660009081526101016020526040812080548392906133f8908490615e0b565b90915550506001600160a01b0380881660009081526101026020908152604080832093871683529290529081208054839290613435908490615e0b565b9091555090979650505050505050565b61344d6146d9565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc9061347e9088906004016151f3565b60c06040518083038186803b15801561349657600080fd5b505afa1580156134aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ce9190614efb565b905060006134dd868684613e0c565b905060008260400151821115613562576402540be4008360400151876135039190615e43565b61350d9190615e23565b90506402540be4008360400151830387028161353957634e487b7160e01b600052601260045260246000fd5b6001600160a01b038916600090815261010360205260409020805492909104909101905561357f565b6402540be4006135728388615e43565b61357c9190615e23565b90505b60006402540be4006135918489615e43565b61359b9190615e23565b60ff54604051634993584560e11b81529192506001600160a01b031690639326b08a906135ce908b90869060040161531a565b600060405180830381600087803b1580156135e857600080fd5b505af11580156135fc573d6000803e3d6000fd5b5050505060005a60fc548651613612908d615e0b565b61361c9190615e0b565b6136269190615e62565b905060006136348883615e43565b6001600160a01b038b1660009081526101016020526040812080549293508392909190613662908490615e0b565b90915550506001600160a01b038a16600090815261010260205260408120829161368a6107b9565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546136b99190615e0b565b90915550600090506136cb8285615e0b565b6136d5908b615e62565b604080516080810182529182526020820196909652948501939093526060840152509098975050505050505050565b6133528363a9059cbb60e01b848460405160240161331b92919061531a565b6001600160a01b03811661373657600080fd5b6097546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b61379a6116f2565b6137b65760405162461bcd60e51b81526004016107fe9061544d565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6137e96107b9565b6040516137f691906151f3565b60405180910390a1565b6000468514156138225760405162461bcd60e51b81526004016107fe906159d7565b6001600160a01b038416600080516020615ef583398151915214156138595760405162461bcd60e51b81526004016107fe906156c7565b60fe5460405163c0e4d62760e01b81526000916001600160a01b03169063c0e4d6279061388c9089908990600401615ceb565b604080518083038186803b1580156138a357600080fd5b505afa1580156138b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138db9190614ee0565b9050828160000151111580156138f5575082816020015110155b6139115760405162461bcd60e51b81526004016107fe9061586f565b6001600160a01b0384166139375760405162461bcd60e51b81526004016107fe90615838565b826139545760405162461bcd60e51b81526004016107fe90615912565b600061396084876118f9565b905080156139a8576001600160a01b0386166000908152610103602052604090205461398d908290615e62565b6001600160a01b038716600090815261010360205260409020555b60ff546040516353403fb560e01b81526001600160a01b03909116906353403fb5906139da908990889060040161531a565b600060405180830381600087803b1580156139f457600080fd5b505af1158015613a08573d6000803e3d6000fd5b50505050613a1886893087614529565b979650505050505050565b609880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600046821415613a975760405162461bcd60e51b81526004016107fe906159d7565b60fe5460405163c0e4d62760e01b815234916001600160a01b03169063c0e4d62790613ad7908690600080516020615ef583398151915290600401615ceb565b604080518083038186803b158015613aee57600080fd5b505afa158015613b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b269190614ee0565b5111801590613bc6575060fe5460405163c0e4d62760e01b815234916001600160a01b03169063c0e4d62790613b70908690600080516020615ef583398151915290600401615ceb565b604080518083038186803b158015613b8757600080fd5b505afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614ee0565b6020015110155b613be25760405162461bcd60e51b81526004016107fe9061586f565b6001600160a01b038316613c085760405162461bcd60e51b81526004016107fe90615838565b34613c255760405162461bcd60e51b81526004016107fe90615912565b6000613c3f34600080516020615ef58339815191526118f9565b90508015613cc757600080516020615ef58339815191526000526101036020527f56826d040b5c8f3e11711a6f0a85f75994bf6271dc9e6c62c9d3cf2fa418e86054613c8c908290615e62565b600080516020615ef58339815191526000526101036020527f56826d040b5c8f3e11711a6f0a85f75994bf6271dc9e6c62c9d3cf2fa418e860555b60ff546040516353403fb560e01b81526001600160a01b03909116906353403fb590613d0790600080516020615ef583398151915290349060040161531a565b600060405180830381600087803b158015613d2157600080fd5b505af1158015613d35573d6000803e3d6000fd5b50929695505050505050565b613d496116f2565b15613d665760405162461bcd60e51b81526004016107fe90615719565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137e96107b9565b6001600160a01b038116613dc25760405162461bcd60e51b81526004016107fe9061564a565b60ca80546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600080613e18856125ec565b60ff54604051630b3524e360e41b81529192506000916001600160a01b039091169063b3524e3090613e4e9089906004016151f3565b60206040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9e9190614f9e565b90506000613eac8684615e62565b905081811115613f405760fe54604051630af7c68d60e31b81526001600160a01b03909116906357be346890613ee6908a906004016151f3565b60206040518083038186803b158015613efe57600080fd5b505afa158015613f12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f369190614f9e565b9350505050612737565b6000856060015186604001518485613f589190615e43565b613f629190615e43565b613f6c9190615e43565b90506000828388604001518960600151613f869190615e62565b613f909190615e43565b613f9a9190615e43565b84858960400151613fab9190615e43565b613fb59190615e43565b613fbf9190615e0b565b9050600081613fd057506000613fdd565b613fda8284615e23565b90505b9998505050505050505050565b3390565b600054610100900460ff1680614007575060005460ff16155b6140235760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612f54576000805460ff1961ff0019909116610100171660011790558015611236576000805461ff001916905550565b600054610100900460ff168061407a575060005460ff16155b6140965760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156140c1576000805460ff1961ff0019909116610100171660011790555b60ca80546001600160a01b0319166001600160a01b0384161790558015612ee8576000805461ff00191690555050565b600054610100900460ff168061410a575060005460ff16155b6141265760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015614151576000805460ff1961ff0019909116610100171660011790555b600180558015611236576000805461ff001916905550565b600054610100900460ff1680614182575060005460ff16155b61419e5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156141c9576000805460ff1961ff0019909116610100171660011790555b612f546141d46107b9565b613a23565b600054610100900460ff16806141f2575060005460ff16155b61420e5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015614239576000805460ff1961ff0019909116610100171660011790555b614241613fee565b612f54614550565b6142516146d9565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc906142829089906004016151f3565b60c06040518083038186803b15801561429a57600080fd5b505afa1580156142ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d29190614efb565b905060006142e1878784613e0c565b905060008260400151821115614366576402540be4008360400151886143079190615e43565b6143119190615e23565b90506402540be4008360400151830388028161433d57634e487b7160e01b600052601260045260246000fd5b6001600160a01b038a166000908152610103602052604090208054929091049091019055614383565b6402540be4006143768389615e43565b6143809190615e23565b90505b60006402540be400614395848a615e43565b61439f9190615e23565b60ff54604051634993584560e11b81529192506001600160a01b031690639326b08a906143d2908c90869060040161531a565b600060405180830381600087803b1580156143ec57600080fd5b505af1158015614400573d6000803e3d6000fd5b5050505060005a60fc548651614416908e615e0b565b6144209190615e0b565b61442a9190615e62565b9050600061443d8b8a848b610ca76107b9565b90508961444a8285615e0b565b11156144685760405162461bcd60e51b81526004016107fe9061551e565b604080516080810182528483018c03815260208101959095528401929092525060608201529250505095945050505050565b60006144ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145ce9092919063ffffffff16565b805190915015613352578080602001905181019061450d9190614e26565b6133525760405162461bcd60e51b81526004016107fe90615b24565b61454a846323b872dd60e01b85858560405160240161331b9392919061526c565b50505050565b600054610100900460ff1680614569575060005460ff16155b6145855760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156145b0576000805460ff1961ff0019909116610100171660011790555b6065805460ff191690558015611236576000805461ff001916905550565b60606145dd84846000856145e5565b949350505050565b6060824710156146075760405162461bcd60e51b81526004016107fe90615681565b6146108561469a565b61462c5760405162461bcd60e51b81526004016107fe90615a7f565b600080866001600160a01b0316858760405161464891906151d7565b60006040518083038185875af1925050503d8060008114614685576040519150601f19603f3d011682016040523d82523d6000602084013e61468a565b606091505b5091509150613a188282866146a0565b3b151590565b606083156146af575081612737565b8251156146bf5782518084602001fd5b8160405162461bcd60e51b81526004016107fe91906153ac565b60405180608001604052806004906020820280368337509192915050565b803561149a81615ed1565b60008083601f840112614713578081fd5b5081356001600160401b03811115614729578182fd5b602083019150836020808302850101111561474357600080fd5b9250929050565b60008083601f84011261475b578182fd5b5081356001600160401b03811115614771578182fd5b60208301915083602082850101111561474357600080fd5b600082601f830112614799578081fd5b81356001600160401b03808211156147b3576147b3615ebb565b604051601f8301601f1916810160200182811182821017156147d7576147d7615ebb565b6040528281528483016020018610156147ee578384fd5b82602086016020830137918201602001929092529392505050565b60006040828403121561481a578081fd5b604051604081018181106001600160401b038211171561483c5761483c615ebb565b604052825181526020928301519281019290925250919050565b600060208284031215614867578081fd5b813561273781615ed1565b60008060408385031215614884578081fd5b823561488f81615ed1565b9150602083013561489f81615ed1565b809150509250929050565b600080600080600060a086880312156148c1578081fd5b85356148cc81615ed1565b945060208601356148dc81615ed1565b935060408601356148ec81615ed1565b925060608601356148fc81615ed1565b9150608086013561490c81615ed1565b809150509295509295909350565b60008060006060848603121561492e578283fd5b833561493981615ed1565b9250602084013561494981615ed1565b929592945050506040919091013590565b60008060008060008060008060c0898b031215614975578283fd5b883561498081615ed1565b9750602089013561499081615ed1565b9650604089013595506060890135945060808901356001600160401b03808211156149b9578485fd5b6149c58c838d0161474a565b909650945060a08b01359150808211156149dd578384fd5b506149ea8b828c01614702565b999c989b5096995094979396929594505050565b6000806000806000806000878903610160811215614a1a578182fd5b8835614a2581615ed1565b97506020890135614a3581615ed1565b9650604089013595506060890135945060c0607f1982011215614a56578182fd5b506080880192506101408801356001600160401b03811115614a76578182fd5b614a828a828b0161474a565b989b979a50959850939692959293505050565b60008060408385031215614aa7578182fd5b8235614ab281615ed1565b946020939093013593505050565b600080600080600060808688031215614ad7578283fd5b8535614ae281615ed1565b9450602086013593506040860135614af981615ed1565b925060608601356001600160401b03811115614b13578182fd5b614b1f8882890161474a565b969995985093965092949392505050565b600080600080600080600060c0888a031215614b4a578081fd5b8735614b5581615ed1565b9650602088013595506040880135614b6c81615ed1565b945060608801356001600160401b03811115614b86578182fd5b614b928a828b0161474a565b989b979a50959895979660808701359660a0013595509350505050565b60008060008060008060008060e0898b031215614bca578182fd5b8835614bd581615ed1565b9750602089013596506040890135614bec81615ed1565b955060608901356001600160401b03811115614c06578283fd5b614c128b828c0161474a565b999c989b50969996989760808801359760a0810135975060c0013595509350505050565b6000806000806000806000806000806000806101408d8f031215614c58578586fd5b614c618d6146f7565b9b5060208d01359a50614c7660408e016146f7565b99506001600160401b0360608e01351115614c8f578586fd5b614c9f8e60608f01358f0161474a565b909950975060808d0135965060a08d0135955060c08d0135945060e08d013593506001600160401b036101008e01351115614cd8578283fd5b614ce98e6101008f01358f01614702565b90935091506001600160401b036101208e01351115614d06578081fd5b614d178e6101208f01358f01614789565b90509295989b509295989b509295989b565b60008060008060608587031215614d3e578182fd5b8435614d4981615ed1565b93506020850135925060408501356001600160401b03811115614d6a578283fd5b614d768782880161474a565b95989497509550505050565b60008060008060008060808789031215614d9a578384fd5b8635614da581615ed1565b95506020870135945060408701356001600160401b0380821115614dc7578586fd5b614dd38a838b0161474a565b90965094506060890135915080821115614deb578384fd5b50614df889828a01614702565b979a9699509497509295939492505050565b600060208284031215614e1b578081fd5b813561273781615ee6565b600060208284031215614e37578081fd5b815161273781615ee6565b600060208284031215614e53578081fd5b5035919050565b600080600060408486031215614e6e578081fd5b83356001600160401b03811115614e83578182fd5b614e8f8682870161474a565b9094509250506020840135614ea381615ed1565b809150509250925092565b600060208284031215614ebf578081fd5b81356001600160401b03811115614ed4578182fd5b6145dd84828501614789565b600060408284031215614ef1578081fd5b6127378383614809565b600060c08284031215614f0c578081fd5b60405160a081018181106001600160401b0382111715614f2e57614f2e615ebb565b604052825181526020830151614f4381615ee6565b806020830152506040830151604082015260608301516060820152614f6b8460808501614809565b60808201529392505050565b600060208284031215614f88578081fd5b81356001600160801b0381168114612737578182fd5b600060208284031215614faf578081fd5b5051919050565b60008060408385031215614fc8578182fd5b82359150602083013561489f81615ed1565b60008060008060008060a08789031215614ff2578384fd5b86359550602087013561500481615ed1565b9450604087013561501481615ed1565b93506060870135925060808701356001600160401b03811115615035578283fd5b614df889828a0161474a565b600080600080600060c08688031215615058578283fd5b85519450602086015161506a81615ee6565b60408701516060880151919550935091506150888760808801614809565b90509295509295909350565b6000602082840312156150a5578081fd5b813560ff81168114612737578182fd5b60008284526020808501945084818502860184845b8781101561516e5783830389528135609e198836030181126150ea578687fd5b870160a081356150f981615ed1565b6001600160a01b031685528187013587860152604080830135908601526060808301356002811061512857898afd5b615134828801826151a5565b5050608061514481840184615dc7565b93508282880152615158838801858361517b565b9c89019c965050509286019250506001016150ca565b5090979650505050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600281106151c357634e487b7160e01b600052602160045260246000fd5b9052565b6000828483379101908152919050565b600082516151e9818460208701615e79565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038816815260c06020820181905260009061522c908301888a61517b565b90508560408301528460608301528360808301528260a083015298975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682526020820186905284166040820152608060608201819052600090613a1890830184866150b5565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b901515815260200190565b9182521515602082015260400190565b60006020825282518060208401526153cb816040850160208701615e79565b601f01601f19169190910160400192915050565b60208082526018908201527f4f6e6c79206578656375746f7220697320616c6c6f7765640000000000000000604082015260600190565b6020808252601c908201527f4578656375746f72204d616e616765722063616e6e6f74206265203000000000604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4c697175696469747950726f7669646572732063616e27742062652030000000604082015260600190565b6020808252818101527f576974686472617720616d6f756e74206e6f7420696e20436170206c696d6974604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526028908201527f496e73756666696369656e742066756e647320746f20636f766572207472616e604082015267736665722066656560c01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f4e6174697665205472616e7366657220746f2041646170746f72204661696c656040820152601960fa1b606082015260800190565b60208082526016908201527514ddd85c081859185c1d1bdc881b9bdd08199bdd5b9960521b604082015260600190565b602080825260139082015272047617320466565206561726e6564206973203606c1b604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600e908201526d3bb937b73390333ab731ba34b7b760911b604082015260600190565b60208082526010908201526f24b73b30b634b2103932b1b2b4bb32b960811b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526022908201527f4f6e6c79206c697175696469747950726f76696465727320697320616c6c6f77604082015261195960f21b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b602080825260149082015273426164207265636569766572206164647265737360601b604082015260600190565b6020808252601f908201527f43616e2774207769746864726177206e617469766520746f6b656e2066656500604082015260600190565b6020808252601c908201527f526563656976657220616464726573732063616e6e6f74206265203000000000604082015260600190565b6020808252601f908201527f4465706f73697420616d6f756e74206e6f7420696e20436170206c696d697400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b6020808252601290820152710416d6f756e742063616e6e6f7420626520360741b604082015260600190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b6020808252601e908201527f54727573746564466f727761726465722063616e6e6f74206265203078300000604082015260600190565b6020808252818101527f546f74616c2070657263656e746167652063616e6e6f74206265203e20313030604082015260600190565b6020808252602d908201527f546f20636861696e206d75737420626520646966666572656e74207468616e2060408201526c31bab93932b73a1031b430b4b760991b606082015260800190565b60208082526011908201527015dc9bdb99c81b595d1a1bd90818d85b1b607a1b604082015260600190565b60208082526016908201527513985d1a5d9948151c985b9cd9995c8811985a5b195960521b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601d908201527f4578656375746f724d616e616765722063616e6e6f7420626520307830000000604082015260600190565b60208082526019908201527f4552525f5f494e53554646494349454e545f42414c414e434500000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260119082015270105b1c9958591e48141c9bd8d95cdcd959607a1b604082015260600190565b60208082526017908201527f546f6b656e4d616e616765722063616e27742062652030000000000000000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b6020808252818101527f4c697175696469747950726f7669646572732063616e6e6f7420626520307830604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b8481526001600160a01b0384166020820152606060408201819052600090615d2d90830184866150b5565b9695505050505050565b918252602082015260400190565b600086825285602083015284604083015260806060830152613a1860808301848661517b565b600088825287602083015286604083015260a06060830152615d9160a08301868861517b565b8281036080840152615da48185876150b5565b9a9950505050505050505050565b60008235609e198336030181126151e9578182fd5b6000808335601e19843603018112615ddd578283fd5b83016020810192503590506001600160401b03811115615dfc57600080fd5b80360383131561474357600080fd5b60008219821115615e1e57615e1e615ea5565b500190565b600082615e3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615e5d57615e5d615ea5565b500290565b600082821015615e7457615e74615ea5565b500390565b60005b83811015615e94578181015183820152602001615e7c565b8381111561454a5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461123657600080fd5b801515811461123657600080fdfe000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea2646970667358221220e4f8e94dd13db1bfa1cdccfeb5ab67b6ae9b3730e048602f2fb40ed48fa4992c64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102605760003560e01c806383f75fa311610144578063ca2ba943116100b6578063ea3684211161007a578063ea36842114610706578063ee58591c14610719578063ef0d457214610739578063f16c2c2514610759578063f2fde38b14610779578063fc42b58f14610799576102a7565b8063ca2ba94314610671578063ccb844e114610691578063da6f6794146106b1578063da742228146106c6578063e06179fe146106e6576102a7565b8063a4479b4811610108578063a4479b48146105bc578063ab1635b7146105dc578063bcc1f5ad146105f1578063beabacc814610611578063bf33e81214610631578063c87e4e2514610651576102a7565b806383f75fa31461052f5780638456cb591461054f57806385a25597146105645780638da5cb5b14610592578063a2419a6b146105a7576102a7565b8063583bbc40116101dd5780636e8ae0a3116101a15780636e8ae0a3146104925780636ef8d66d146104b2578063715018a6146104c7578063760d098a146104dc57806376d2cbb4146104fc5780637cb2b79c1461050f576102a7565b8063583bbc40146103fb57806359ca6c011461041d5780635c975abb1461043d5780636583de671461045257806367924a5614610472576102a7565b8063316182a311610224578063316182a3146103595780633f4ba83a1461037957806346fbf68e1461038e57806355d73595146103bb578063572b6c05146103db576102a7565b80631459457a146102ac5780631dbb76b3146102ce5780631ef6626b146102ee5780632a709b141461030e5780632cd271e714610339576102a7565b366102a7577f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f8669561028e6107b9565b3460405161029d92919061531a565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102cc6102c73660046148aa565b6107c9565b005b3480156102da57600080fd5b506102cc6102e9366004614c36565b610923565b3480156102fa57600080fd5b506102cc610309366004614b30565b610e0a565b34801561031a57600080fd5b506103236111d4565b60405161033091906151f3565b60405180910390f35b34801561034557600080fd5b506102cc610354366004614856565b6111e3565b34801561036557600080fd5b506102cc610374366004614baf565b611239565b34801561038557600080fd5b506102cc611459565b34801561039a57600080fd5b506103ae6103a9366004614856565b611488565b6040516103309190615391565b3480156103c757600080fd5b506102cc6103d6366004614fda565b61149f565b3480156103e757600080fd5b506103ae6103f6366004614856565b611629565b34801561040757600080fd5b5061041061163d565b6040516103309190615ce2565b34801561042957600080fd5b506102cc610438366004614856565b611643565b34801561044957600080fd5b506103ae6116f2565b34801561045e57600080fd5b506102cc61046d366004614856565b6116fb565b34801561047e57600080fd5b506102cc61048d3660046149fe565b611844565b34801561049e57600080fd5b506104106104ad366004614fb6565b6118f9565b3480156104be57600080fd5b506102cc611a28565b3480156104d357600080fd5b506102cc611abc565b3480156104e857600080fd5b506103ae6104f7366004614e42565b611b05565b6102cc61050a366004614d82565b611b1b565b34801561051b57600080fd5b506102cc61052a366004614856565b611c7c565b34801561053b57600080fd5b506102cc61054a366004614e5a565b611d2b565b34801561055b57600080fd5b506102cc611def565b34801561057057600080fd5b5061058461057f366004614ac0565b611e1c565b60405161033092919061539c565b34801561059e57600080fd5b50610323611e82565b3480156105b357600080fd5b50610323611e91565b3480156105c857600080fd5b506104106105d7366004614856565b611ea0565b3480156105e857600080fd5b50610323611eb3565b3480156105fd57600080fd5b506102cc61060c36600461495a565b611ec2565b34801561061d57600080fd5b506102cc61062c36600461491a565b6120ba565b34801561063d57600080fd5b506102cc61064c3660046149fe565b6122dc565b34801561065d57600080fd5b506102cc61066c366004614856565b612336565b34801561067d57600080fd5b5061041061068c366004614856565b6125ec565b34801561069d57600080fd5b506102cc6106ac366004614f77565b61273e565b3480156106bd57600080fd5b506102cc6127b8565b3480156106d257600080fd5b506102cc6106e1366004614856565b612b3a565b3480156106f257600080fd5b50610410610701366004614856565b612b82565b6102cc610714366004614d29565b612b95565b34801561072557600080fd5b50610323610734366004614eae565b612c6d565b34801561074557600080fd5b506102cc610754366004614856565b612c94565b34801561076557600080fd5b50610410610774366004614872565b612d1b565b34801561078557600080fd5b506102cc610794366004614856565b612d39565b3480156107a557600080fd5b506104106107b4366004614a95565b612da7565b60006107c3612e37565b90505b90565b600054610100900460ff16806107e2575060005460ff16155b6108075760405162461bcd60e51b81526004016107fe90615785565b60405180910390fd5b600054610100900460ff16158015610832576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166108585760405162461bcd60e51b81526004016107fe90615ab6565b6001600160a01b03841661087e5760405162461bcd60e51b81526004016107fe9061596b565b6001600160a01b0382166108a45760405162461bcd60e51b81526004016107fe90615cad565b6108ad84612e65565b6108b5612eec565b6108bd612f68565b6108c685612fd8565b60fd80546001600160a01b038089166001600160a01b03199283161790925560fe805486841690831617905560ff80549285169290911691909117905561520860fc55801561091b576000805461ff00191690555b505050505050565b600260015414156109465760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c6109646107b9565b6040518263ffffffff1660e01b815260040161098091906151f3565b60206040518083038186803b15801561099857600080fd5b505afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190614e26565b6109ec5760405162461bcd60e51b81526004016107fe906153df565b6109f46116f2565b15610a115760405162461bcd60e51b81526004016107fe90615719565b81610a2e5760405162461bcd60e51b81526004016107fe90615a24565b60006001600160a01b031661010482604051610a4a91906151d7565b908152604051908190036020019020546001600160a01b03161415610a815760405162461bcd60e51b81526004016107fe906155ed565b6000610a928d8d8d8d8d8d8d613096565b90506001600160a01b038d16600080516020615ef58339815191521415610c0857600061010483604051610ac691906151d7565b908152604051908190036020019020546001600160a01b03168260006020020151604051610af3906107c6565b60006040518083038185875af1925050503d8060008114610b30576040519150601f19603f3d011682016040523d82523d6000602084013e610b35565b606091505b5050905080610b565760405162461bcd60e51b81526004016107fe906155ac565b61010483604051610b6791906151d7565b908152604051908190036020019020546001600160a01b03166355a4aafb83600060200201518e88886040518563ffffffff1660e01b8152600401610baf9493929190615d02565b602060405180830381600087803b158015610bc957600080fd5b505af1158015610bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c019190614f9e565b5050610d8c565b60005a9050610c428e61010485604051610c2291906151d7565b908152604051908190036020019020546001600160a01b03166000613258565b610c7d8e61010485604051610c5791906151d7565b908152604051908190036020019020546001600160a01b03168460006020020151613258565b5a610c889082615e62565b610c929087615e0b565b9550506000610cac8e8a886000610ca76107b9565b613357565b825190915081908390610cc0908390615e62565b9052508082600360200201818151610cd89190615e0b565b9052505060405161010490610cee9084906151d7565b908152604051908190036020019020546001600160a01b0316632180777e8e83600060200201518e88886040518663ffffffff1660e01b8152600401610d38959493929190615333565b602060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614f9e565b505b80600060200201518c6001600160a01b038f167f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c8e8e8e8c886001602002015189600260200201518a60036020020151604051610def9796959493929190615207565b60405180910390a45050600180555050505050505050505050565b60026001541415610e2d5760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c610e4b6107b9565b6040518263ffffffff1660e01b8152600401610e6791906151f3565b60206040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb79190614e26565b610ed35760405162461bcd60e51b81526004016107fe906153df565b610edb6116f2565b15610ef85760405162461bcd60e51b81526004016107fe90615719565b60005a60fe546040516302502c3560e31b81529192506000916001600160a01b039091169063128161a890610f31908c906004016151f3565b604080518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f809190614ee0565b905087816000015111158015610f9a575087816020015110155b610fb65760405162461bcd60e51b81526004016107fe906154b2565b6001600160a01b038716610fdc5760405162461bcd60e51b81526004016107fe906157d3565b600080610fec8b8b8b8b8b611e1c565b91509150801561100e5760405162461bcd60e51b81526004016107fe90615ba5565b600082815261010060205260408120805460ff19166001179055611034858d8d8a613445565b60ff549091506001600160a01b031663dd8b99238d83600060200201516040518363ffffffff1660e01b815260040161106e92919061531a565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050506001600160a01b038c16600080516020615ef583398151915214156111445780516040516000916001600160a01b038d16916110db906107c6565b60006040518083038185875af1925050503d8060008114611118576040519150601f19603f3d011682016040523d82523d6000602084013e61111d565b606091505b505090508061113e5760405162461bcd60e51b81526004016107fe90615a4f565b50611157565b6111578c8b8360005b6020020151613704565b80600060200201518b6001600160a01b038e167f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c8d8d8d8c886001602002015189600260200201518a600360200201516040516111ba9796959493929190615207565b60405180910390a450506001805550505050505050505050565b60fe546001600160a01b031681565b6111ec33611488565b6112085760405162461bcd60e51b81526004016107fe90615c5d565b6112106116f2565b1561122d5760405162461bcd60e51b81526004016107fe90615719565b61123681613723565b50565b6002600154141561125c5760405162461bcd60e51b81526004016107fe90615b6e565b600260015560fd546001600160a01b0316630768d65c61127a6107b9565b6040518263ffffffff1660e01b815260040161129691906151f3565b60206040518083038186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e69190614e26565b6113025760405162461bcd60e51b81526004016107fe906153df565b61130a6116f2565b156113275760405162461bcd60e51b81526004016107fe90615719565b600061133889898989898988613096565b90506001600160a01b038916600080516020615ef583398151915214156113de5780516040516000916001600160a01b038a1691611375906107c6565b60006040518083038185875af1925050503d80600081146113b2576040519150601f19603f3d011682016040523d82523d6000602084013e6113b7565b606091505b50509050806113d85760405162461bcd60e51b81526004016107fe90615a4f565b506113eb565b6113eb898883600061114d565b80516020820151604080840151606085015191518c936001600160a01b038f16937f6bfd5ee5792d66b151a3fab9f56ee828a0f1c3216d4b752e267cd5590326b15c93611442938f938f938f938e93909190615207565b60405180910390a450506001805550505050505050565b61146233611488565b61147e5760405162461bcd60e51b81526004016107fe90615c5d565b611486613792565b565b6097546001600160a01b038281169116145b919050565b60fe54604051635d46df5160e11b815286916000916001600160a01b039091169063ba8dbea2906114d49085906004016151f3565b60c06040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115249190615041565b505050915050806115475760405162461bcd60e51b81526004016107fe9061593e565b61154f6116f2565b1561156c5760405162461bcd60e51b81526004016107fe90615719565b6002600154141561158f5760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600061159e6107b9565b905060006115af828b8b8b8b613800565b9050876001600160a01b0316896001600160a01b0316836001600160a01b03167f522e11fa05593b306c8df10d2b0b8e01eec48f9d0a9427a7a93f21ff90d66fb18d858c6115fd9190615e0b565b868c8c604051611611959493929190615d45565b60405180910390a45050600180555050505050505050565b60ca546001600160a01b0390811691161490565b60fc5481565b61164b6107b9565b6001600160a01b031661165c611e82565b6001600160a01b0316146116825760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b0381166116a85760405162461bcd60e51b81526004016107fe9061547b565b60ff80546001600160a01b0319166001600160a01b0383169081179091556040517f0988d9952b4295aedfb755253e8d1dcebd105e8a5cf7507e419b544da764706690600090a250565b60655460ff1690565b6117036107b9565b6001600160a01b0316611714611e82565b6001600160a01b03161461173a5760405162461bcd60e51b81526004016107fe906158a6565b60006001600160a01b038216600080516020615ef583398151915214156117625750476117e4565b6040516370a0823160e01b815282906001600160a01b038216906370a08231906117909030906004016151f3565b60206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190614f9e565b9150505b60ff546040516332550d6960e11b81526001600160a01b03909116906364aa1ad290611816908590859060040161531a565b600060405180830381600087803b15801561183057600080fd5b505af115801561091b573d6000803e3d6000fd5b866001600160a01b0316638fcbaf0c61185b6107b9565b308635602088013561187360608a0160408b01614e0a565b61188360808b0160608c01615094565b8a608001358b60a001356040518963ffffffff1660e01b81526004016118b0989796959493929190615290565b600060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506118f084888888868661149f565b50505050505050565b600080611905836125ec565b60ff54604051630b3524e360e41b81529192506000916001600160a01b039091169063b3524e309061193b9087906004016151f3565b60206040518083038186803b15801561195357600080fd5b505afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190614f9e565b905080821015611a205760006119a18383615e62565b90508086106119cb576001600160a01b038516600090815261010360205260409020549350611a1e565b6001600160a01b0385166000908152610103602052604090205481906119f19088615e43565b611a00906402540be400615e43565b611a0a9190615e23565b9350611a1b6402540be40085615e23565b93505b505b505092915050565b611a3133611488565b611a4d5760405162461bcd60e51b81526004016107fe90615c5d565b611a556116f2565b15611a725760405162461bcd60e51b81526004016107fe90615719565b6097546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a3609780546001600160a01b0319169055565b611ac46107b9565b6001600160a01b0316611ad5611e82565b6001600160a01b031614611afb5760405162461bcd60e51b81526004016107fe906158a6565b6114866000613a23565b6101006020526000908152604090205460ff1681565b611b236116f2565b15611b405760405162461bcd60e51b81526004016107fe90615719565b60026001541415611b635760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600081815b81811015611bb857848482818110611b9557634e487b7160e01b600052603260045260246000fd5b9050602002810190611ba79190615db2565b602001359290920191600101611b6d565b50611bcb90506402540be4006064615e43565b811115611bea5760405162461bcd60e51b81526004016107fe906159a2565b6000611bf68888613a75565b90506001600160a01b038816600080516020615ef5833981519152611c196107b9565b6001600160a01b03167fe0c1647854700a22165488c301138e1e29036e60ec14c1e78653b1e0c918f8748a611c4e8634615e0b565b868c8c8c8c604051611c669796959493929190615d6b565b60405180910390a4505060018055505050505050565b611c846107b9565b6001600160a01b0316611c95611e82565b6001600160a01b031614611cbb5760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116611ce15760405162461bcd60e51b81526004016107fe90615bd0565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517f331ea0c3b6547bb3d7c5798698a5f25c7b9f5484af90723a847eba9e885a3d7f90600090a250565b611d336107b9565b6001600160a01b0316611d44611e82565b6001600160a01b031614611d6a5760405162461bcd60e51b81526004016107fe906158a6565b806101048484604051611d7e9291906151c7565b90815260405190819003602001812080546001600160a01b039384166001600160a01b031990911617905590821690611dba90859085906151c7565b604051908190038120907f32987e7b04c960bad9e4a93936f2b82bd108cf13934d9eef41bc48453664e7ea90600090a3505050565b611df833611488565b611e145760405162461bcd60e51b81526004016107fe90615c5d565b611486613d41565b6000808686868686604051611e329291906151c7565b604051908190038120611e4a94939291602001615367565b60408051601f1981840301815291815281516020928301206000818152610100909352912054909860ff909116975095505050505050565b6098546001600160a01b031690565b60ff546001600160a01b031681565b6101036020526000908152604090205481565b60fd546001600160a01b031690565b60fe54604051635d46df5160e11b815289916000916001600160a01b039091169063ba8dbea290611ef79085906004016151f3565b60c06040518083038186803b158015611f0f57600080fd5b505afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f479190615041565b50505091505080611f6a5760405162461bcd60e51b81526004016107fe9061593e565b611f726116f2565b15611f8f5760405162461bcd60e51b81526004016107fe90615719565b60026001541415611fb25760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600083815b8181101561200757868682818110611fe457634e487b7160e01b600052603260045260246000fd5b9050602002810190611ff69190615db2565b602001359290920191600101611fbc565b5061201a90506402540be4006064615e43565b8111156120395760405162461bcd60e51b81526004016107fe906159a2565b60006120436107b9565b90506000612054828c8f8f8e613800565b90508b6001600160a01b03168d6001600160a01b0316836001600160a01b03167fe0c1647854700a22165488c301138e1e29036e60ec14c1e78653b1e0c918f8748e858f6120a29190615e0b565b868f8f8f8f604051610def9796959493929190615d6b565b6120c26116f2565b156120df5760405162461bcd60e51b81526004016107fe90615719565b60ff546001600160a01b03166120f36107b9565b6001600160a01b0316146121195760405162461bcd60e51b81526004016107fe90615743565b6002600154141561213c5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556001600160a01b0382166121675760405162461bcd60e51b81526004016107fe906156ef565b6001600160a01b038316600080516020615ef5833981519152141561222857804710156121a65760405162461bcd60e51b81526004016107fe90615aed565b6000826001600160a01b0316826040516121bf906107c6565b60006040518083038185875af1925050503d80600081146121fc576040519150601f19603f3d011682016040523d82523d6000602084013e612201565b606091505b50509050806122225760405162461bcd60e51b81526004016107fe906154e7565b506122d3565b6040516370a0823160e01b8152839082906001600160a01b038316906370a08231906122589030906004016151f3565b60206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a89190614f9e565b10156122c65760405162461bcd60e51b81526004016107fe90615aed565b6122d1818484613704565b505b50506001805550565b866001600160a01b031663d505accf6122f36107b9565b3088602088013561230a60808a0160608b01615094565b89608001358a60a001356040518863ffffffff1660e01b81526004016118b097969594939291906152d9565b60fd546001600160a01b0316630768d65c61234f6107b9565b6040518263ffffffff1660e01b815260040161236b91906151f3565b60206040518083038186803b15801561238357600080fd5b505afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190614e26565b6123d75760405162461bcd60e51b81526004016107fe906153df565b6123df6116f2565b156123fc5760405162461bcd60e51b81526004016107fe90615719565b6002600154141561241f5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556001600160a01b038116600080516020615ef5833981519152141561245b5760405162461bcd60e51b81526004016107fe90615801565b6001600160a01b0381166000908152610102602052604081208161247d6107b9565b6001600160a01b031681526020810191909152604001600020549050806124b65760405162461bcd60e51b81526004016107fe9061561d565b6001600160a01b038216600090815261010160205260409020546124db908290615e62565b6001600160a01b0383166000908152610101602090815260408083209390935561010290529081208161250c6107b9565b6001600160a01b03168152602081019190915260400160002055612538826125326107b9565b83613704565b60ff5460405163dd8b992360e01b81526001600160a01b039091169063dd8b99239061256a908590859060040161531a565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b50505050806125a56107b9565b6001600160a01b0316836001600160a01b03167fc129cf8730ce23dfea8953a499f9b276ad5777855ff41fafe198ebc2a0d2324360405160405180910390a4505060018055565b60ff5460405163ca2ba94360e01b815260009182916001600160a01b039091169063ca2ba943906126219086906004016151f3565b60206040518083038186803b15801561263957600080fd5b505afa15801561264d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126719190614f9e565b6001600160a01b0380851660009081526101036020908152604080832054610101909252918290205460ff5492516368da78c960e11b815294955090939092919091169063d1b4f192906126c99088906004016151f3565b60206040518083038186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190614f9e565b6127239084615e62565b61272d9190615e62565b6127379190615e62565b9392505050565b6127466107b9565b6001600160a01b0316612757611e82565b6001600160a01b03161461277d5760405162461bcd60e51b81526004016107fe906158a6565b6001600160801b03811660fc8190556040517f1f7e24d1f8ac9b596a34502db87778da821b5ac198a6738cfb24ab379b969bfe90600090a250565b60fd546001600160a01b0316630768d65c6127d16107b9565b6040518263ffffffff1660e01b81526004016127ed91906151f3565b60206040518083038186803b15801561280557600080fd5b505afa158015612819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283d9190614e26565b6128595760405162461bcd60e51b81526004016107fe906153df565b6128616116f2565b1561287e5760405162461bcd60e51b81526004016107fe90615719565b600260015414156128a15760405162461bcd60e51b81526004016107fe90615b6e565b6002600155600080516020615ef583398151915260009081526101026020527f8c843e863d6980427013005c2fd6c559f82753ab35a5ed8f9caaa5df7d58739d816128ea6107b9565b6001600160a01b031681526020810191909152604001600020549050806129235760405162461bcd60e51b81526004016107fe9061561d565b600080516020615ef58339815191526000526101016020527ffc69fe689a10849a4c810115708945edcdce02b4ce0b8911d1cf85d0b30251d554612968908290615e62565b600080516020615ef583398151915260009081527ffc69fe689a10849a4c810115708945edcdce02b4ce0b8911d1cf85d0b30251d5919091556101026020527f8c843e863d6980427013005c2fd6c559f82753ab35a5ed8f9caaa5df7d58739d816129d16107b9565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006129ff6107b9565b6001600160a01b031682604051612a15906107c6565b60006040518083038185875af1925050503d8060008114612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b5050905080612a785760405162461bcd60e51b81526004016107fe90615a4f565b60ff5460405163dd8b992360e01b81526001600160a01b039091169063dd8b992390612ab890600080516020615ef583398151915290869060040161531a565b600060405180830381600087803b158015612ad257600080fd5b505af1158015612ae6573d6000803e3d6000fd5b5050505081612af36107b9565b6001600160a01b0316306001600160a01b03167fc129cf8730ce23dfea8953a499f9b276ad5777855ff41fafe198ebc2a0d2324360405160405180910390a4505060018055565b612b426107b9565b6001600160a01b0316612b53611e82565b6001600160a01b031614612b795760405162461bcd60e51b81526004016107fe906158a6565b61123681613d9c565b6101016020526000908152604090205481565b612b9d6116f2565b15612bba5760405162461bcd60e51b81526004016107fe90615719565b60026001541415612bdd5760405162461bcd60e51b81526004016107fe90615b6e565b60026001556000612bee8585613a75565b90506001600160a01b038516600080516020615ef5833981519152612c116107b9565b6001600160a01b03167f522e11fa05593b306c8df10d2b0b8e01eec48f9d0a9427a7a93f21ff90d66fb187612c468634615e0b565b868989604051612c5a959493929190615d45565b60405180910390a4505060018055505050565b8051602081830181018051610104825292820191909301209152546001600160a01b031681565b612c9c6107b9565b6001600160a01b0316612cad611e82565b6001600160a01b031614612cd35760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116612cf95760405162461bcd60e51b81526004016107fe90615416565b60fd80546001600160a01b0319166001600160a01b0392909216919091179055565b61010260209081526000928352604080842090915290825290205481565b612d416107b9565b6001600160a01b0316612d52611e82565b6001600160a01b031614612d785760405162461bcd60e51b81526004016107fe906158a6565b6001600160a01b038116612d9e5760405162461bcd60e51b81526004016107fe90615566565b61123681613a23565b60fe54604051633e978aaf60e21b815260009161273791859185916001600160a01b039091169063fa5e2abc90612de29085906004016151f3565b60c06040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e329190614efb565b613e0c565b6000612e4233611629565b15612e56575060131936013560601c6107c6565b612e5e613fea565b90506107c6565b600054610100900460ff1680612e7e575060005460ff16155b612e9a5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612ec5576000805460ff1961ff0019909116610100171660011790555b612ecd613fee565b612ed682614061565b8015612ee8576000805461ff00191690555b5050565b600054610100900460ff1680612f05575060005460ff16155b612f215760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612f4c576000805460ff1961ff0019909116610100171660011790555b612f546140f1565b8015611236576000805461ff001916905550565b600054610100900460ff1680612f81575060005460ff16155b612f9d5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612fc8576000805460ff1961ff0019909116610100171660011790555b612fd0613fee565b612f54614169565b600054610100900460ff1680612ff1575060005460ff16155b61300d5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015613038576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03821661305e5760405162461bcd60e51b81526004016107fe906158db565b6130666141d9565b609780546001600160a01b0319166001600160a01b0384161790558015612ee8576000805461ff00191690555050565b61309e6146d9565b60005a60fe546040516302502c3560e31b81529192506000916001600160a01b039091169063128161a8906130d7908d906004016151f3565b604080518083038186803b1580156130ee57600080fd5b505afa158015613102573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131269190614ee0565b905088816000015111158015613140575088816020015110155b61315c5760405162461bcd60e51b81526004016107fe906154b2565b6001600160a01b0388166131825760405162461bcd60e51b81526004016107fe906157d3565b6000806131928c8c8c8c8c611e1c565b9150915080156131b45760405162461bcd60e51b81526004016107fe90615ba5565b600082815261010060205260408120805460ff191660011790556131db858e8e8b8b614249565b60ff549091506001600160a01b031663dd8b99238e83600060200201516040518363ffffffff1660e01b815260040161321592919061531a565b600060405180830381600087803b15801561322f57600080fd5b505af1158015613243573d6000803e3d6000fd5b50929f9e505050505050505050505050505050565b8015806132e05750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061328e9030908690600401615252565b60206040518083038186803b1580156132a657600080fd5b505afa1580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614f9e565b155b6132fc5760405162461bcd60e51b81526004016107fe90615c07565b6133528363095ea7b360e01b848460405160240161331b92919061531a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261449a565b505050565b600080836b204fce5e3e250261100000003a6133738989615e43565b61337d9190615e43565b6133879190615e23565b6133919190615e0b565b9050853a867f9b36696d0f99bcef3d9db526d18d2e13abee9741727d7d21128c6079d985c2e187856040516133c7929190615d37565b60405180910390a46001600160a01b03871660009081526101016020526040812080548392906133f8908490615e0b565b90915550506001600160a01b0380881660009081526101026020908152604080832093871683529290529081208054839290613435908490615e0b565b9091555090979650505050505050565b61344d6146d9565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc9061347e9088906004016151f3565b60c06040518083038186803b15801561349657600080fd5b505afa1580156134aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ce9190614efb565b905060006134dd868684613e0c565b905060008260400151821115613562576402540be4008360400151876135039190615e43565b61350d9190615e23565b90506402540be4008360400151830387028161353957634e487b7160e01b600052601260045260246000fd5b6001600160a01b038916600090815261010360205260409020805492909104909101905561357f565b6402540be4006135728388615e43565b61357c9190615e23565b90505b60006402540be4006135918489615e43565b61359b9190615e23565b60ff54604051634993584560e11b81529192506001600160a01b031690639326b08a906135ce908b90869060040161531a565b600060405180830381600087803b1580156135e857600080fd5b505af11580156135fc573d6000803e3d6000fd5b5050505060005a60fc548651613612908d615e0b565b61361c9190615e0b565b6136269190615e62565b905060006136348883615e43565b6001600160a01b038b1660009081526101016020526040812080549293508392909190613662908490615e0b565b90915550506001600160a01b038a16600090815261010260205260408120829161368a6107b9565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546136b99190615e0b565b90915550600090506136cb8285615e0b565b6136d5908b615e62565b604080516080810182529182526020820196909652948501939093526060840152509098975050505050505050565b6133528363a9059cbb60e01b848460405160240161331b92919061531a565b6001600160a01b03811661373657600080fd5b6097546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b61379a6116f2565b6137b65760405162461bcd60e51b81526004016107fe9061544d565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6137e96107b9565b6040516137f691906151f3565b60405180910390a1565b6000468514156138225760405162461bcd60e51b81526004016107fe906159d7565b6001600160a01b038416600080516020615ef583398151915214156138595760405162461bcd60e51b81526004016107fe906156c7565b60fe5460405163c0e4d62760e01b81526000916001600160a01b03169063c0e4d6279061388c9089908990600401615ceb565b604080518083038186803b1580156138a357600080fd5b505afa1580156138b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138db9190614ee0565b9050828160000151111580156138f5575082816020015110155b6139115760405162461bcd60e51b81526004016107fe9061586f565b6001600160a01b0384166139375760405162461bcd60e51b81526004016107fe90615838565b826139545760405162461bcd60e51b81526004016107fe90615912565b600061396084876118f9565b905080156139a8576001600160a01b0386166000908152610103602052604090205461398d908290615e62565b6001600160a01b038716600090815261010360205260409020555b60ff546040516353403fb560e01b81526001600160a01b03909116906353403fb5906139da908990889060040161531a565b600060405180830381600087803b1580156139f457600080fd5b505af1158015613a08573d6000803e3d6000fd5b50505050613a1886893087614529565b979650505050505050565b609880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600046821415613a975760405162461bcd60e51b81526004016107fe906159d7565b60fe5460405163c0e4d62760e01b815234916001600160a01b03169063c0e4d62790613ad7908690600080516020615ef583398151915290600401615ceb565b604080518083038186803b158015613aee57600080fd5b505afa158015613b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b269190614ee0565b5111801590613bc6575060fe5460405163c0e4d62760e01b815234916001600160a01b03169063c0e4d62790613b70908690600080516020615ef583398151915290600401615ceb565b604080518083038186803b158015613b8757600080fd5b505afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614ee0565b6020015110155b613be25760405162461bcd60e51b81526004016107fe9061586f565b6001600160a01b038316613c085760405162461bcd60e51b81526004016107fe90615838565b34613c255760405162461bcd60e51b81526004016107fe90615912565b6000613c3f34600080516020615ef58339815191526118f9565b90508015613cc757600080516020615ef58339815191526000526101036020527f56826d040b5c8f3e11711a6f0a85f75994bf6271dc9e6c62c9d3cf2fa418e86054613c8c908290615e62565b600080516020615ef58339815191526000526101036020527f56826d040b5c8f3e11711a6f0a85f75994bf6271dc9e6c62c9d3cf2fa418e860555b60ff546040516353403fb560e01b81526001600160a01b03909116906353403fb590613d0790600080516020615ef583398151915290349060040161531a565b600060405180830381600087803b158015613d2157600080fd5b505af1158015613d35573d6000803e3d6000fd5b50929695505050505050565b613d496116f2565b15613d665760405162461bcd60e51b81526004016107fe90615719565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137e96107b9565b6001600160a01b038116613dc25760405162461bcd60e51b81526004016107fe9061564a565b60ca80546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600080613e18856125ec565b60ff54604051630b3524e360e41b81529192506000916001600160a01b039091169063b3524e3090613e4e9089906004016151f3565b60206040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9e9190614f9e565b90506000613eac8684615e62565b905081811115613f405760fe54604051630af7c68d60e31b81526001600160a01b03909116906357be346890613ee6908a906004016151f3565b60206040518083038186803b158015613efe57600080fd5b505afa158015613f12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f369190614f9e565b9350505050612737565b6000856060015186604001518485613f589190615e43565b613f629190615e43565b613f6c9190615e43565b90506000828388604001518960600151613f869190615e62565b613f909190615e43565b613f9a9190615e43565b84858960400151613fab9190615e43565b613fb59190615e43565b613fbf9190615e0b565b9050600081613fd057506000613fdd565b613fda8284615e23565b90505b9998505050505050505050565b3390565b600054610100900460ff1680614007575060005460ff16155b6140235760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015612f54576000805460ff1961ff0019909116610100171660011790558015611236576000805461ff001916905550565b600054610100900460ff168061407a575060005460ff16155b6140965760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156140c1576000805460ff1961ff0019909116610100171660011790555b60ca80546001600160a01b0319166001600160a01b0384161790558015612ee8576000805461ff00191690555050565b600054610100900460ff168061410a575060005460ff16155b6141265760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015614151576000805460ff1961ff0019909116610100171660011790555b600180558015611236576000805461ff001916905550565b600054610100900460ff1680614182575060005460ff16155b61419e5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156141c9576000805460ff1961ff0019909116610100171660011790555b612f546141d46107b9565b613a23565b600054610100900460ff16806141f2575060005460ff16155b61420e5760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff16158015614239576000805460ff1961ff0019909116610100171660011790555b614241613fee565b612f54614550565b6142516146d9565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc906142829089906004016151f3565b60c06040518083038186803b15801561429a57600080fd5b505afa1580156142ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d29190614efb565b905060006142e1878784613e0c565b905060008260400151821115614366576402540be4008360400151886143079190615e43565b6143119190615e23565b90506402540be4008360400151830388028161433d57634e487b7160e01b600052601260045260246000fd5b6001600160a01b038a166000908152610103602052604090208054929091049091019055614383565b6402540be4006143768389615e43565b6143809190615e23565b90505b60006402540be400614395848a615e43565b61439f9190615e23565b60ff54604051634993584560e11b81529192506001600160a01b031690639326b08a906143d2908c90869060040161531a565b600060405180830381600087803b1580156143ec57600080fd5b505af1158015614400573d6000803e3d6000fd5b5050505060005a60fc548651614416908e615e0b565b6144209190615e0b565b61442a9190615e62565b9050600061443d8b8a848b610ca76107b9565b90508961444a8285615e0b565b11156144685760405162461bcd60e51b81526004016107fe9061551e565b604080516080810182528483018c03815260208101959095528401929092525060608201529250505095945050505050565b60006144ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145ce9092919063ffffffff16565b805190915015613352578080602001905181019061450d9190614e26565b6133525760405162461bcd60e51b81526004016107fe90615b24565b61454a846323b872dd60e01b85858560405160240161331b9392919061526c565b50505050565b600054610100900460ff1680614569575060005460ff16155b6145855760405162461bcd60e51b81526004016107fe90615785565b600054610100900460ff161580156145b0576000805460ff1961ff0019909116610100171660011790555b6065805460ff191690558015611236576000805461ff001916905550565b60606145dd84846000856145e5565b949350505050565b6060824710156146075760405162461bcd60e51b81526004016107fe90615681565b6146108561469a565b61462c5760405162461bcd60e51b81526004016107fe90615a7f565b600080866001600160a01b0316858760405161464891906151d7565b60006040518083038185875af1925050503d8060008114614685576040519150601f19603f3d011682016040523d82523d6000602084013e61468a565b606091505b5091509150613a188282866146a0565b3b151590565b606083156146af575081612737565b8251156146bf5782518084602001fd5b8160405162461bcd60e51b81526004016107fe91906153ac565b60405180608001604052806004906020820280368337509192915050565b803561149a81615ed1565b60008083601f840112614713578081fd5b5081356001600160401b03811115614729578182fd5b602083019150836020808302850101111561474357600080fd5b9250929050565b60008083601f84011261475b578182fd5b5081356001600160401b03811115614771578182fd5b60208301915083602082850101111561474357600080fd5b600082601f830112614799578081fd5b81356001600160401b03808211156147b3576147b3615ebb565b604051601f8301601f1916810160200182811182821017156147d7576147d7615ebb565b6040528281528483016020018610156147ee578384fd5b82602086016020830137918201602001929092529392505050565b60006040828403121561481a578081fd5b604051604081018181106001600160401b038211171561483c5761483c615ebb565b604052825181526020928301519281019290925250919050565b600060208284031215614867578081fd5b813561273781615ed1565b60008060408385031215614884578081fd5b823561488f81615ed1565b9150602083013561489f81615ed1565b809150509250929050565b600080600080600060a086880312156148c1578081fd5b85356148cc81615ed1565b945060208601356148dc81615ed1565b935060408601356148ec81615ed1565b925060608601356148fc81615ed1565b9150608086013561490c81615ed1565b809150509295509295909350565b60008060006060848603121561492e578283fd5b833561493981615ed1565b9250602084013561494981615ed1565b929592945050506040919091013590565b60008060008060008060008060c0898b031215614975578283fd5b883561498081615ed1565b9750602089013561499081615ed1565b9650604089013595506060890135945060808901356001600160401b03808211156149b9578485fd5b6149c58c838d0161474a565b909650945060a08b01359150808211156149dd578384fd5b506149ea8b828c01614702565b999c989b5096995094979396929594505050565b6000806000806000806000878903610160811215614a1a578182fd5b8835614a2581615ed1565b97506020890135614a3581615ed1565b9650604089013595506060890135945060c0607f1982011215614a56578182fd5b506080880192506101408801356001600160401b03811115614a76578182fd5b614a828a828b0161474a565b989b979a50959850939692959293505050565b60008060408385031215614aa7578182fd5b8235614ab281615ed1565b946020939093013593505050565b600080600080600060808688031215614ad7578283fd5b8535614ae281615ed1565b9450602086013593506040860135614af981615ed1565b925060608601356001600160401b03811115614b13578182fd5b614b1f8882890161474a565b969995985093965092949392505050565b600080600080600080600060c0888a031215614b4a578081fd5b8735614b5581615ed1565b9650602088013595506040880135614b6c81615ed1565b945060608801356001600160401b03811115614b86578182fd5b614b928a828b0161474a565b989b979a50959895979660808701359660a0013595509350505050565b60008060008060008060008060e0898b031215614bca578182fd5b8835614bd581615ed1565b9750602089013596506040890135614bec81615ed1565b955060608901356001600160401b03811115614c06578283fd5b614c128b828c0161474a565b999c989b50969996989760808801359760a0810135975060c0013595509350505050565b6000806000806000806000806000806000806101408d8f031215614c58578586fd5b614c618d6146f7565b9b5060208d01359a50614c7660408e016146f7565b99506001600160401b0360608e01351115614c8f578586fd5b614c9f8e60608f01358f0161474a565b909950975060808d0135965060a08d0135955060c08d0135945060e08d013593506001600160401b036101008e01351115614cd8578283fd5b614ce98e6101008f01358f01614702565b90935091506001600160401b036101208e01351115614d06578081fd5b614d178e6101208f01358f01614789565b90509295989b509295989b509295989b565b60008060008060608587031215614d3e578182fd5b8435614d4981615ed1565b93506020850135925060408501356001600160401b03811115614d6a578283fd5b614d768782880161474a565b95989497509550505050565b60008060008060008060808789031215614d9a578384fd5b8635614da581615ed1565b95506020870135945060408701356001600160401b0380821115614dc7578586fd5b614dd38a838b0161474a565b90965094506060890135915080821115614deb578384fd5b50614df889828a01614702565b979a9699509497509295939492505050565b600060208284031215614e1b578081fd5b813561273781615ee6565b600060208284031215614e37578081fd5b815161273781615ee6565b600060208284031215614e53578081fd5b5035919050565b600080600060408486031215614e6e578081fd5b83356001600160401b03811115614e83578182fd5b614e8f8682870161474a565b9094509250506020840135614ea381615ed1565b809150509250925092565b600060208284031215614ebf578081fd5b81356001600160401b03811115614ed4578182fd5b6145dd84828501614789565b600060408284031215614ef1578081fd5b6127378383614809565b600060c08284031215614f0c578081fd5b60405160a081018181106001600160401b0382111715614f2e57614f2e615ebb565b604052825181526020830151614f4381615ee6565b806020830152506040830151604082015260608301516060820152614f6b8460808501614809565b60808201529392505050565b600060208284031215614f88578081fd5b81356001600160801b0381168114612737578182fd5b600060208284031215614faf578081fd5b5051919050565b60008060408385031215614fc8578182fd5b82359150602083013561489f81615ed1565b60008060008060008060a08789031215614ff2578384fd5b86359550602087013561500481615ed1565b9450604087013561501481615ed1565b93506060870135925060808701356001600160401b03811115615035578283fd5b614df889828a0161474a565b600080600080600060c08688031215615058578283fd5b85519450602086015161506a81615ee6565b60408701516060880151919550935091506150888760808801614809565b90509295509295909350565b6000602082840312156150a5578081fd5b813560ff81168114612737578182fd5b60008284526020808501945084818502860184845b8781101561516e5783830389528135609e198836030181126150ea578687fd5b870160a081356150f981615ed1565b6001600160a01b031685528187013587860152604080830135908601526060808301356002811061512857898afd5b615134828801826151a5565b5050608061514481840184615dc7565b93508282880152615158838801858361517b565b9c89019c965050509286019250506001016150ca565b5090979650505050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600281106151c357634e487b7160e01b600052602160045260246000fd5b9052565b6000828483379101908152919050565b600082516151e9818460208701615e79565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038816815260c06020820181905260009061522c908301888a61517b565b90508560408301528460608301528360808301528260a083015298975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682526020820186905284166040820152608060608201819052600090613a1890830184866150b5565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b901515815260200190565b9182521515602082015260400190565b60006020825282518060208401526153cb816040850160208701615e79565b601f01601f19169190910160400192915050565b60208082526018908201527f4f6e6c79206578656375746f7220697320616c6c6f7765640000000000000000604082015260600190565b6020808252601c908201527f4578656375746f72204d616e616765722063616e6e6f74206265203000000000604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4c697175696469747950726f7669646572732063616e27742062652030000000604082015260600190565b6020808252818101527f576974686472617720616d6f756e74206e6f7420696e20436170206c696d6974604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526028908201527f496e73756666696369656e742066756e647320746f20636f766572207472616e604082015267736665722066656560c01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f4e6174697665205472616e7366657220746f2041646170746f72204661696c656040820152601960fa1b606082015260800190565b60208082526016908201527514ddd85c081859185c1d1bdc881b9bdd08199bdd5b9960521b604082015260600190565b602080825260139082015272047617320466565206561726e6564206973203606c1b604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600e908201526d3bb937b73390333ab731ba34b7b760911b604082015260600190565b60208082526010908201526f24b73b30b634b2103932b1b2b4bb32b960811b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526022908201527f4f6e6c79206c697175696469747950726f76696465727320697320616c6c6f77604082015261195960f21b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b602080825260149082015273426164207265636569766572206164647265737360601b604082015260600190565b6020808252601f908201527f43616e2774207769746864726177206e617469766520746f6b656e2066656500604082015260600190565b6020808252601c908201527f526563656976657220616464726573732063616e6e6f74206265203000000000604082015260600190565b6020808252601f908201527f4465706f73697420616d6f756e74206e6f7420696e20436170206c696d697400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b6020808252601290820152710416d6f756e742063616e6e6f7420626520360741b604082015260600190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b6020808252601e908201527f54727573746564466f727761726465722063616e6e6f74206265203078300000604082015260600190565b6020808252818101527f546f74616c2070657263656e746167652063616e6e6f74206265203e20313030604082015260600190565b6020808252602d908201527f546f20636861696e206d75737420626520646966666572656e74207468616e2060408201526c31bab93932b73a1031b430b4b760991b606082015260800190565b60208082526011908201527015dc9bdb99c81b595d1a1bd90818d85b1b607a1b604082015260600190565b60208082526016908201527513985d1a5d9948151c985b9cd9995c8811985a5b195960521b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601d908201527f4578656375746f724d616e616765722063616e6e6f7420626520307830000000604082015260600190565b60208082526019908201527f4552525f5f494e53554646494349454e545f42414c414e434500000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260119082015270105b1c9958591e48141c9bd8d95cdcd959607a1b604082015260600190565b60208082526017908201527f546f6b656e4d616e616765722063616e27742062652030000000000000000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b6020808252818101527f4c697175696469747950726f7669646572732063616e6e6f7420626520307830604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b8481526001600160a01b0384166020820152606060408201819052600090615d2d90830184866150b5565b9695505050505050565b918252602082015260400190565b600086825285602083015284604083015260806060830152613a1860808301848661517b565b600088825287602083015286604083015260a06060830152615d9160a08301868861517b565b8281036080840152615da48185876150b5565b9a9950505050505050505050565b60008235609e198336030181126151e9578182fd5b6000808335601e19843603018112615ddd578283fd5b83016020810192503590506001600160401b03811115615dfc57600080fd5b80360383131561474357600080fd5b60008219821115615e1e57615e1e615ea5565b500190565b600082615e3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615e5d57615e5d615ea5565b500290565b600082821015615e7457615e74615ea5565b500390565b60005b83811015615e94578181015183820152602001615e7c565b8381111561454a5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461123657600080fd5b801515811461123657600080fdfe000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea2646970667358221220e4f8e94dd13db1bfa1cdccfeb5ab67b6ae9b3730e048602f2fb40ed48fa4992c64736f6c63430008000033
Deployed Bytecode Sourcemap
37145:31706:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68804:36;68816:12;:10;:12::i;:::-;68830:9;68804:36;;;;;;;:::i;:::-;;;;;;;;37145:31706;;;;;40417:862;;;;;;;;;;-1:-1:-1;40417:862:0;;;;;:::i;:::-;;:::i;:::-;;56519:2709;;;;;;;;;;-1:-1:-1;56519:2709:0;;;;;:::i;:::-;;:::i;51536:1700::-;;;;;;;;;;-1:-1:-1;51536:1700:0;;;;;:::i;:::-;;:::i;37631:33::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35298:116;;;;;;;;;;-1:-1:-1;35298:116:0;;;;;:::i;:::-;;:::i;55289:1222::-;;;;;;;;;;-1:-1:-1;55289:1222:0;;;;;:::i;:::-;;:::i;35990:66::-;;;;;;;;;;;;;:::i;34785:104::-;;;;;;;;;;-1:-1:-1;34785:104:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43537:537::-;;;;;;;;;;-1:-1:-1;43537:537:0;;;;;:::i;:::-;;:::i;31821:138::-;;;;;;;;;;-1:-1:-1;31821:138:0;;;;;:::i;:::-;;:::i;37553:22::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41629:307::-;;;;;;;;;;-1:-1:-1;41629:307:0;;;;;:::i;:::-;;:::i;7014:86::-;;;;;;;;;;;;;:::i;66997:458::-;;;;;;;;;;-1:-1:-1;66997:458:0;;;;;:::i;:::-;;:::i;47780:619::-;;;;;;;;;;-1:-1:-1;47780:619:0;;;;;:::i;:::-;;:::i;46866:856::-;;;;;;;;;;-1:-1:-1;46866:856:0;;;;;:::i;:::-;;:::i;35755:157::-;;;;;;;;;;;;;:::i;5028:94::-;;;;;;;;;;;;;:::i;37892:45::-;;;;;;;;;;-1:-1:-1;37892:45:0;;;;;:::i;:::-;;:::i;49665:998::-;;;;;;:::i;:::-;;:::i;41944:253::-;;;;;;;;;;-1:-1:-1;41944:253:0;;;;;:::i;:::-;;:::i;41287:195::-;;;;;;;;;;-1:-1:-1;41287:195:0;;;;;:::i;:::-;;:::i;35920:62::-;;;;;;;;;;;;;:::i;65024:397::-;;;;;;;;;;-1:-1:-1;65024:397:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4377:87::-;;;;;;;;;;;;;:::i;37671:45::-;;;;;;;;;;;;;:::i;38206:48::-;;;;;;;;;;-1:-1:-1;38206:48:0;;;;;:::i;:::-;;:::i;42336:112::-;;;;;;;;;;;;;:::i;44605:1145::-;;;;;;;;;;-1:-1:-1;44605:1145:0;;;;;:::i;:::-;;:::i;67463:800::-;;;;;;;;;;-1:-1:-1;67463:800:0;;;;;:::i;:::-;;:::i;48454:577::-;;;;;;;;;;-1:-1:-1;48454:577:0;;;;;:::i;:::-;;:::i;65429:864::-;;;;;;;;;;-1:-1:-1;65429:864:0;;;;;:::i;:::-;;:::i;42711:422::-;;;;;;;;;;-1:-1:-1;42711:422:0;;;;;:::i;:::-;;:::i;42205:123::-;;;;;;;;;;-1:-1:-1;42205:123:0;;;;;:::i;:::-;;:::i;66301:688::-;;;;;;;;;;;;;:::i;41490:131::-;;;;;;;;;;-1:-1:-1;41490:131:0;;;;;:::i;:::-;;:::i;37944:59::-;;;;;;;;;;-1:-1:-1;37944:59:0;;;;;:::i;:::-;;:::i;49310:347::-;;;;;;:::i;:::-;;:::i;38263:48::-;;;;;;;;;;-1:-1:-1;38263:48:0;;;;;:::i;:::-;;:::i;42456:247::-;;;;;;;;;;-1:-1:-1;42456:247:0;;;;;:::i;:::-;;:::i;38077:72::-;;;;;;;;;;-1:-1:-1;38077:72:0;;;;;:::i;:::-;;:::i;5277:192::-;;;;;;;;;;-1:-1:-1;5277:192:0;;;;;:::i;:::-;;:::i;64817:199::-;;;;;;;;;;-1:-1:-1;64817:199:0;;;;;:::i;:::-;;:::i;68271:239::-;68425:14;68464:38;:36;:38::i;:::-;68457:45;;68271:239;;:::o;40417:862::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;;;;;;;;;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;-1:-1:-1;;;;;40656:37:0;::::1;40648:79;;;;-1:-1:-1::0;;;40648:79:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40746:31:0;::::1;40738:74;;;;-1:-1:-1::0;;;40738:74:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40831:33:0;::::1;40823:78;;;;-1:-1:-1::0;;;40823:78:0::1;;;;;;;:::i;:::-;40912:40;40934:17;40912:21;:40::i;:::-;40963:24;:22;:24::i;:::-;40998:16;:14;:16::i;:::-;41025:24;41041:7;41025:15;:24::i;:::-;41060:15;:59:::0;;-1:-1:-1;;;;;41060:59:0;;::::1;-1:-1:-1::0;;;;;;41060:59:0;;::::1;;::::0;;;41130:12:::1;:43:::0;;;;::::1;::::0;;::::1;;::::0;;41184:18:::1;:61:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;41266:5:::1;41256:7;:15:::0;1948:68;;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;1948:68;40417:862;;;;;;:::o;56519:2709::-;10038:1;10801:7;;:19;;10793:63;;;;-1:-1:-1;;;10793:63:0;;;;;;;:::i;:::-;10038:1;10934:7;:18;39942:15:::1;::::0;-1:-1:-1;;;;;39942:15:0::1;:33;39976:12;:10;:12::i;:::-;39942:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:84;;;;-1:-1:-1::0;;;39934:84:0::1;;;;;;;:::i;:::-;7340:8:::2;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::2;;;;;;;:::i;:::-;56987:23:::0;56979:53:::3;;;;-1:-1:-1::0;;;56979:53:0::3;;;;;;;:::i;:::-;57090:1;-1:-1:-1::0;;;;;57051:41:0::3;:14;57066:11;57051:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;57051:27:0::3;:41;;57043:76;;;;-1:-1:-1::0;;;57043:76:0::3;;;;;;;:::i;:::-;57132:33;57168:232;57228:12;57255:6;57276:8;57299:11;;57325:34;57374:15;57168:45;:232::i;:::-;57132:268:::0;-1:-1:-1;;;;;;57417:22:0;::::3;-1:-1:-1::0;;;;;;;;;;;57417:22:0::3;57413:1515;;;57457:12;57475:14;57490:11;57475:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;57475:27:0::3;57515:15:::0;57475:27:::3;57515:18;;;;57475:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57456:82;;;57561:7;57553:53;;;;-1:-1:-1::0;;;57553:53:0::3;;;;;;;:::i;:::-;57634:14;57649:11;57634:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;57634:27:0::3;57621:52;57674:15:::0;57634:27:::3;57674:18;;;;57694:8;57704:12;;57621:96;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57413:1515;;;;57769:25;57797:9;57769:37;;57825:188;57898:12;57942:14;57957:11;57942:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;57942:27:0::3;;57825:32;:188::i;:::-;58032:205;58105:12;58149:14;58164:11;58149:27;;;;;;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;58149:27:0::3;58200:15:::0;58149:27:::3;58200:18;;;;58032:32;:205::i;:::-;58298:9;58278:29;::::0;:17;:29:::3;:::i;:::-;58258:50;::::0;;::::3;:::i;:::-;;;57413:1515;58357:18;58378:223;58416:12;58451:34;58508:15;58546:1;58570:12;:10;:12::i;:::-;58378:15;:223::i;:::-;58620:32:::0;;58357:244;;-1:-1:-1;58357:244:0;;58620:15;;:32:::3;::::0;58357:244;;58620:32:::3;:::i;:::-;::::0;;-1:-1:-1;58739:10:0;58717:15;58733:1:::3;58717:18;;;:32;;;;;;;:::i;:::-;::::0;;-1:-1:-1;;58825:27:0::3;::::0;:14:::3;::::0;:27:::3;::::0;58840:11;;58825:27:::3;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;-1:-1:-1;;;;;58825:27:0::3;58812:46;58859:12:::0;58873:15;58825:27:::3;58873:18;;;;58893:8;58903:12;;58812:104;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57413:1515;59017:15:::0;59033:1:::3;59017:18;;;::::0;58996:6;-1:-1:-1;;;;;58945:275:0;::::3;;59050:8:::0;59073:11;;59099;59125:15;59141:1:::3;59125:18;;;::::0;59158:15;59174:1:::3;59158:18;;;::::0;59191:15;59207:1:::3;59191:18;;;;58945:275;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0;11113:22;;-1:-1:-1;;;;;;;;;;;56519:2709:0:o;51536:1700::-;10038:1;10801:7;;:19;;10793:63;;;;-1:-1:-1;;;10793:63:0;;;;;;;:::i;:::-;10038:1;10934:7;:18;39942:15:::1;::::0;-1:-1:-1;;;;;39942:15:0::1;:33;39976:12;:10;:12::i;:::-;39942:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:84;;;;-1:-1:-1::0;;;39934:84:0::1;;;;;;;:::i;:::-;7340:8:::2;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::2;;;;;;;:::i;:::-;51818:18:::3;51839:9;51887:12;::::0;:44:::3;::::0;-1:-1:-1;;;51887:44:0;;51818:30;;-1:-1:-1;51859:25:0::3;::::0;-1:-1:-1;;;;;51887:12:0;;::::3;::::0;:30:::3;::::0;:44:::3;::::0;51918:12;;51887:44:::3;;;:::i;:::-;;::::0;::::3;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51859:72;;51964:6;51950;:10;;;:20;;:44;;;;;51988:6;51974;:10;;;:20;;51950:44;51942:89;;;;-1:-1:-1::0;;;51942:89:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52050:22:0;::::3;52042:55;;;;-1:-1:-1::0;;;52042:55:0::3;;;;;;;:::i;:::-;52111:27;52140:11:::0;52155:60:::3;52171:12;52185:6;52193:8;52203:11;;52155:15;:60::i;:::-;52110:105;;;;52237:6;52236:7;52228:37;;;;-1:-1:-1::0;;;52228:37:0::3;;;;;;;:::i;:::-;52276:34;::::0;;;:13:::3;:34;::::0;;;;:41;;-1:-1:-1;;52276:41:0::3;52313:4;52276:41;::::0;;52461:68:::3;52481:10:::0;52493:12;52507:6;52515:13;52461:19:::3;:68::i;:::-;52542:18;::::0;52425:104;;-1:-1:-1;;;;;;52542:18:0::3;:43;52586:12:::0;52425:104;52542:18:::3;52600;;;;52542:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;;;;;;;52636:22:0;::::3;-1:-1:-1::0;;;;;;;;;;;52636:22:0::3;52632:304;;;52715:18:::0;;52694:44:::3;::::0;52676:12:::3;::::0;-1:-1:-1;;;;;52694:13:0;::::3;::::0;:44:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52675:63;;;52761:7;52753:42;;;;-1:-1:-1::0;;;52753:42:0::3;;;;;;;:::i;:::-;52632:304;;;;52828:96;52880:12:::0;52895:8;52905:15;52921:1:::3;52905:18;;;;;52828:33;:96::i;:::-;53025:15:::0;53041:1:::3;53025:18;;;::::0;53004:6;-1:-1:-1;;;;;52953:275:0;::::3;;53058:8:::0;53081:11;;53107;53133:15;53149:1:::3;53133:18;;;::::0;53166:15;53182:1:::3;53166:18;;;::::0;53199:15;53215:1:::3;53199:18;;;;52953:275;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0;11113:22;;-1:-1:-1;;;;;;;;;;51536:1700:0:o;37631:33::-;;;-1:-1:-1;;;;;37631:33:0;;:::o;35298:116::-;35024:20;35033:10;35024:8;:20::i;:::-;35016:81;;;;-1:-1:-1;;;35016:81:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;35382:24:::2;35396:9;35382:13;:24::i;:::-;35298:116:::0;:::o;55289:1222::-;10038:1;10801:7;;:19;;10793:63;;;;-1:-1:-1;;;10793:63:0;;;;;;;:::i;:::-;10038:1;10934:7;:18;39942:15:::1;::::0;-1:-1:-1;;;;;39942:15:0::1;:33;39976:12;:10;:12::i;:::-;39942:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:84;;;;-1:-1:-1::0;;;39934:84:0::1;;;;;;;:::i;:::-;7340:8:::2;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::2;;;;;;;:::i;:::-;55628:33:::3;55664:232;55724:12;55751:6;55772:8;55795:11;;55821:34;55870:15;55664:45;:232::i;:::-;55628:268:::0;-1:-1:-1;;;;;;55911:22:0;::::3;-1:-1:-1::0;;;;;;;;;;;55911:22:0::3;55907:304;;;55990:18:::0;;55969:44:::3;::::0;55951:12:::3;::::0;-1:-1:-1;;;;;55969:13:0;::::3;::::0;:44:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55950:63;;;56036:7;56028:42;;;;-1:-1:-1::0;;;56028:42:0::3;;;;;;;:::i;:::-;55907:304;;;;56103:96;56155:12:::0;56170:8;56180:15;56196:1:::3;56180:18;::::0;56103:96:::3;56300:18:::0;;::::3;56408::::0;::::3;::::0;56441;;;::::3;::::0;56474;;::::3;::::0;56228:275;;56279:6;;-1:-1:-1;;;;;56228:275:0;::::3;::::0;::::3;::::0;::::3;::::0;56333:8;;56356:11;;;;56382;;56441:18;;56474;56228:275:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0;11113:22;;-1:-1:-1;;;;;;;55289:1222:0:o;35990:66::-;35024:20;35033:10;35024:8;:20::i;:::-;35016:81;;;;-1:-1:-1;;;35016:81:0;;;;;;;:::i;:::-;36038:10:::1;:8;:10::i;:::-;35990:66::o:0;34785:104::-;34874:7;;-1:-1:-1;;;;;34864:17:0;;;34874:7;;34864:17;34785:104;;;;:::o;43537:537::-;40295:12;;:37;;-1:-1:-1;;;40295:37:0;;43726:12;;40266:19;;-1:-1:-1;;;;;40295:12:0;;;;:23;;:37;;43726:12;;40295:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40263:69;;;;;;40351:14;40343:46;;;;-1:-1:-1;;;40343:46:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;10038:1:::2;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::2;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;43778:14:::3;43795:12;:10;:12::i;:::-;43778:29;;43818:20;43841:64;43855:6;43863:9;43874:12;43888:8;43898:6;43841:13;:64::i;:::-;43818:87;;44004:8;-1:-1:-1::0;;;;;43974:92:0::3;43990:12;-1:-1:-1::0;;;;;43974:92:0::3;43982:6;-1:-1:-1::0;;;;;43974:92:0::3;;44014:9;44034:12;44025:6;:21;;;;:::i;:::-;44048:12;44062:3;;43974:92;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0::2;11113:22:::0;;-1:-1:-1;;;;;;;;43537:537:0:o;31821:138::-;31934:17;;-1:-1:-1;;;;;31934:17:0;;;31921:30;;;;31821:138::o;37553:22::-;;;;:::o;41629:307::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41727:33:0;::::1;41719:75;;;;-1:-1:-1::0;;;41719:75:0::1;;;;;;;:::i;:::-;41805:18;:61:::0;;-1:-1:-1;;;;;;41805:61:0::1;-1:-1:-1::0;;;;;41805:61:0;::::1;::::0;;::::1;::::0;;;41882:46:::1;::::0;::::1;::::0;-1:-1:-1;;41882:46:0::1;41629:307:::0;:::o;7014:86::-;7085:7;;;;7014:86;:::o;66997:458::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;67076:22:::1;-1:-1:-1::0;;;;;67117:22:0;::::1;-1:-1:-1::0;;;;;;;;;;;67117:22:0::1;67113:254;;;-1:-1:-1::0;67173:21:0::1;67113:254;;;67321:34;::::0;-1:-1:-1;;;67321:34:0;;67275:12;;-1:-1:-1;;;;;67321:19:0;::::1;::::0;::::1;::::0;:34:::1;::::0;67349:4:::1;::::0;67321:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67303:52;;67113:254;;67379:18;::::0;:68:::1;::::0;-1:-1:-1;;;67379:68:0;;-1:-1:-1;;;;;67379:18:0;;::::1;::::0;:38:::1;::::0;:68:::1;::::0;67418:12;;67432:14;;67379:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;47780:619:::0;48039:12;-1:-1:-1;;;;;48026:33:0;;48074:12;:10;:12::i;:::-;48109:4;48129:19;;48163:20;;;;48198:21;;;;;;;;:::i;:::-;48234:15;;;;;;;;:::i;:::-;48264:13;:15;;;48294:13;:15;;;48026:294;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48331:60;48344:9;48355:12;48369:8;48379:6;48387:3;;48331:12;:60::i;:::-;47780:619;;;;;;;:::o;46866:856::-;46950:20;46983:24;47010:33;47030:12;47010:19;:33::i;:::-;47082:18;;:60;;-1:-1:-1;;;47082:60:0;;46983;;-1:-1:-1;47054:25:0;;-1:-1:-1;;;;;47082:18:0;;;;:46;;:60;;47129:12;;47082:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47054:88;;47176:17;47157:16;:36;47153:562;;;47210:27;47240:36;47260:16;47240:17;:36;:::i;:::-;47210:66;;47305:19;47295:6;:29;47291:413;;-1:-1:-1;;;;;47360:27:0;;;;;;:13;:27;;;;;;;-1:-1:-1;47291:413:0;;;-1:-1:-1;;;;;47564:27:0;;;;;;:13;:27;;;;;;47609:19;;47555:36;;:6;:36;:::i;:::-;:50;;47594:11;47555:50;:::i;:::-;47554:74;;;;:::i;:::-;47539:89;-1:-1:-1;47662:26:0;47677:11;47539:89;47662:26;:::i;:::-;47647:41;;47291:413;47153:562;;46866:856;;;;;;:::o;35755:157::-;35024:20;35033:10;35024:8;:20::i;:::-;35016:81;;;;-1:-1:-1;;;35016:81:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;35853:7:::2;::::0;35839:34:::2;::::0;35870:1:::2;::::0;-1:-1:-1;;;;;35853:7:0::2;::::0;35839:34:::2;::::0;35870:1;;35839:34:::2;35884:7;:20:::0;;-1:-1:-1;;;;;;35884:20:0::2;::::0;;35755:157::o;5028:94::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;5093:21:::1;5111:1;5093:9;:21::i;37892:45::-:0;;;;;;;;;;;;;;;:::o;49665:998::-;7340:8;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1;;;7331:38:0;;;;;;;:::i;:::-;10038:1:::1;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::1;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;49887:23:::2;49966:11:::0;49887:23;50028:149:::2;50060:15;50052:5;:23;50028:149;;;50128:11;;50140:5;50128:18;;;;;-1:-1:-1::0;;;50128:18:0::2;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;50109:48:::0;;;::::2;::::0;50077:7:::2;;50028:149;;;-1:-1:-1::0;50242:18:0::2;::::0;-1:-1:-1;37426:11:0::2;50242:3;:18;:::i;:::-;50223:15;:37;;50215:82;;;;-1:-1:-1::0;;;50215:82:0::2;;;;;;;:::i;:::-;50310:20;50333:35;50348:8;50358:9;50333:14;:35::i;:::-;50310:58:::0;-1:-1:-1;;;;;;50425:230:0;::::2;-1:-1:-1::0;;;;;;;;;;;50454:12:0::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;50425:230:0::2;;50525:9:::0;50549:24:::2;50561:12:::0;50549:9:::2;:24;:::i;:::-;50588:12;50615:3;;50633:11;;50425:230;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0::1;11113:22:::0;;-1:-1:-1;;;;;;49665:998:0:o;41944:253::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42030:27:0;::::1;42022:63;;;;-1:-1:-1::0;;;42022:63:0::1;;;;;;;:::i;:::-;42096:12;:43:::0;;-1:-1:-1;;;;;;42096:43:0::1;-1:-1:-1::0;;;;;42096:43:0;::::1;::::0;;::::1;::::0;;;42155:34:::1;::::0;::::1;::::0;-1:-1:-1;;42155:34:0::1;41944:253:::0;:::o;41287:195::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;41408:12:::1;41385:14;41400:4;;41385:20;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;;-1:-1:-1;;;;;41385:35:0;;::::1;-1:-1:-1::0;;;;;;41385:35:0;;::::1;;::::0;;41436:38;;::::1;::::0;::::1;::::0;41455:4;;;;41436:38:::1;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;41287:195:::0;;;:::o;35920:62::-;35024:20;35033:10;35024:8;:20::i;:::-;35016:81;;;;-1:-1:-1;;;35016:81:0;;;;;;;:::i;:::-;35966:8:::1;:6;:8::i;65024:397::-:0;65205:27;65234:11;65301:12;65315:6;65323:8;65343:11;;65333:22;;;;;;;:::i;:::-;;;;;;;;;65290:66;;;;;;;;:::i;:::-;;;;-1:-1:-1;;65290:66:0;;;;;;;;;65280:77;;65290:66;65280:77;;;;65379:34;;;;:13;:34;;;;;;65280:77;;65379:34;;;;;-1:-1:-1;65024:397:0;-1:-1:-1;;;;;;65024:397:0:o;4377:87::-;4450:6;;-1:-1:-1;;;;;4450:6:0;4377:87;:::o;37671:45::-;;;-1:-1:-1;;;;;37671:45:0;;:::o;38206:48::-;;;;;;;;;;;;;:::o;42336:112::-;42424:15;;-1:-1:-1;;;;;42424:15:0;42336:112;:::o;44605:1145::-;40295:12;;:37;;-1:-1:-1;;;40295:37:0;;44848:12;;40266:19;;-1:-1:-1;;;;;40295:12:0;;;;:23;;:37;;44848:12;;40295:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40263:69;;;;;;40351:14;40343:46;;;;-1:-1:-1;;;40343:46:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;10038:1:::2;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::2;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;44900:23:::3;44979:11:::0;44900:23;45041:149:::3;45073:15;45065:5;:23;45041:149;;;45141:11;;45153:5;45141:18;;;;;-1:-1:-1::0;;;45141:18:0::3;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;45122:48:::0;;;::::3;::::0;45090:7:::3;;45041:149;;;-1:-1:-1::0;45255:18:0::3;::::0;-1:-1:-1;37426:11:0::3;45255:3;:18;:::i;:::-;45236:15;:37;;45228:82;;;;-1:-1:-1::0;;;45228:82:0::3;;;;;;;:::i;:::-;45321:14;45338:12;:10;:12::i;:::-;45321:29;;45361:20;45384:64;45398:6;45406:9;45417:12;45431:8;45441:6;45384:13;:64::i;:::-;45361:87;;45592:8;-1:-1:-1::0;;;;;45515:227:0::3;45565:12;-1:-1:-1::0;;;;;45515:227:0::3;45544:6;-1:-1:-1::0;;;;;45515:227:0::3;;45615:9;45648:12;45639:6;:21;;;;:::i;:::-;45675:12;45702:3;;45720:11;;45515:227;;;;;;;;;;;;:::i;67463:800::-:0;7340:8;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1;;;7331:38:0;;;;;;;:::i;:::-;40123:18:::1;::::0;-1:-1:-1;;;;;40123:18:0::1;40099:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40099:43:0::1;;40091:90;;;;-1:-1:-1::0;;;40091:90:0::1;;;;;;;:::i;:::-;10038:1:::2;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::2;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;-1:-1:-1;;;;;67656:22:0;::::3;67648:51;;;;-1:-1:-1::0;;;67648:51:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67714:23:0;::::3;-1:-1:-1::0;;;;;;;;;;;67714:23:0::3;67710:546;;;67787:12;67762:21;:37;;67754:75;;;;-1:-1:-1::0;;;67754:75:0::3;;;;;;;:::i;:::-;67845:12;67863:8;-1:-1:-1::0;;;;;67863:13:0::3;67884:12;67863:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67844:57;;;67924:7;67916:47;;;;-1:-1:-1::0;;;67916:47:0::3;;;;;;;:::i;:::-;67710:546;;;;68081:34;::::0;-1:-1:-1;;;68081:34:0;;68044:13;;68119:12;;-1:-1:-1;;;;;68081:19:0;::::3;::::0;::::3;::::0;:34:::3;::::0;68109:4:::3;::::0;68081:34:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;68073:88;;;;-1:-1:-1::0;;;68073:88:0::3;;;;;;;:::i;:::-;68176:68;68210:9;68221:8;68231:12;68176:33;:68::i;:::-;67710:546;;-1:-1:-1::0;;9994:1:0::2;11113:22:::0;;-1:-1:-1;67463:800:0:o;48454:577::-;48720:12;-1:-1:-1;;;;;48707:33:0;;48755:12;:10;:12::i;:::-;48790:4;48810:6;48831:20;;;;48866:15;;;;;;;;:::i;:::-;48896:13;:15;;;48926:13;:15;;;48707:245;;;;;;;;;;;;;;;;;;;;;:::i;65429:864::-;39942:15;;-1:-1:-1;;;;;39942:15:0;:33;39976:12;:10;:12::i;:::-;39942:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:84;;;;-1:-1:-1;;;39934:84:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;10038:1:::2;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::2;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;-1:-1:-1;;;;;65548:22:0;::::3;-1:-1:-1::0;;;;;;;;;;;65548:22:0::3;;65540:66;;;;-1:-1:-1::0;;;65540:66:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65726:31:0;::::3;65697:26;65726:31:::0;;;:17:::3;:31;::::0;;;;65697:26;65758:12:::3;:10;:12::i;:::-;-1:-1:-1::0;;;;;65726:45:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;65726:45:0;;;-1:-1:-1;65790:23:0;65782:55:::3;;;;-1:-1:-1::0;;;65782:55:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65889:38:0;::::3;;::::0;;;:24:::3;:38;::::0;;;;;:59:::3;::::0;65930:18;;65889:59:::3;:::i;:::-;-1:-1:-1::0;;;;;65848:38:0;::::3;;::::0;;;:24:::3;:38;::::0;;;;;;;:100;;;;65959:17:::3;:31:::0;;;;;65848:38;65991:12:::3;:10;:12::i;:::-;-1:-1:-1::0;;;;;65959:45:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;65959:45:0;:49;66019:100:::3;66071:12:::0;66086::::3;:10;:12::i;:::-;66100:18;66019:33;:100::i;:::-;66130:18;::::0;:77:::3;::::0;-1:-1:-1;;;66130:77:0;;-1:-1:-1;;;;;66130:18:0;;::::3;::::0;:43:::3;::::0;:77:::3;::::0;66174:12;;66188:18;;66130:77:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66266:18;66252:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;66223:62:0::3;66238:12;-1:-1:-1::0;;;;;66223:62:0::3;;;;;;;;;;;-1:-1:-1::0;;9994:1:0::2;11113:22:::0;;65429:864::o;42711:422::-;42851:18;;:52;;-1:-1:-1;;;42851:52:0;;42783:24;;;;-1:-1:-1;;;;;42851:18:0;;;;:38;;:52;;42890:12;;42851:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43098:27:0;;;;;;;:13;:27;;;;;;;;;43044:24;:38;;;;;;;;42984:18;;:44;;-1:-1:-1;;;42984:44:0;;42820:83;;-1:-1:-1;43098:27:0;;43044:38;;42984:18;;;;;:30;;:44;;43112:12;;42984:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42948:80;;:20;:80;:::i;:::-;:134;;;;:::i;:::-;:177;;;;:::i;:::-;42916:209;42711:422;-1:-1:-1;;;42711:422:0:o;42205:123::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42268:13:0;::::1;:7;:13:::0;;;42297:23:::1;::::0;::::1;::::0;;;::::1;42205:123:::0;:::o;66301:688::-;39942:15;;-1:-1:-1;;;;;39942:15:0;:33;39976:12;:10;:12::i;:::-;39942:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:84;;;;-1:-1:-1;;;39934:84:0;;;;;;;:::i;:::-;7340:8:::1;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1::0;;;7331:38:0::1;;;;;;;:::i;:::-;10038:1:::2;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::2;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;-1:-1:-1;;;;;;;;;;;66393:26:0::3;66422:25:::0;;;:17:::3;:25;::::0;;66393:26;66448:12:::3;:10;:12::i;:::-;-1:-1:-1::0;;;;;66422:39:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;66422:39:0;;;-1:-1:-1;66480:23:0;66472:55:::3;;;;-1:-1:-1::0;;;66472:55:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;66573:32:0::3;::::0;:24:::3;:32;::::0;;;:53:::3;::::0;66608:18;;66573:53:::3;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;66538:32:0::3;::::0;;;;:88;;;;66637:17:::3;66538:32;66637:25:::0;;66538:32;66663:12:::3;:10;:12::i;:::-;-1:-1:-1::0;;;;;66637:39:0::3;-1:-1:-1::0;;;;;66637:39:0::3;;;;;;;;;;;;:43;;;;66692:12;66718;:10;:12::i;:::-;-1:-1:-1::0;;;;;66710:26:0::3;66744:18;66710:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66691:76;;;66786:7;66778:42;;;;-1:-1:-1::0;;;66778:42:0::3;;;;;;;:::i;:::-;66831:18;::::0;:71:::3;::::0;-1:-1:-1;;;66831:71:0;;-1:-1:-1;;;;;66831:18:0;;::::3;::::0;:43:::3;::::0;:71:::3;::::0;-1:-1:-1;;;;;;;;;;;37337:42:0;66883:18;;66831:71:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66962:18;66948:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;66918:63:0::3;66941:4;-1:-1:-1::0;;;;;66918:63:0::3;;;;;;;;;;;-1:-1:-1::0;;9994:1:0::2;11113:22:::0;;66301:688::o;41490:131::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;41575:38:::1;41596:16;41575:20;:38::i;37944:59::-:0;;;;;;;;;;;;;:::o;49310:347::-;7340:8;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1;;;7331:38:0;;;;;;;:::i;:::-;10038:1:::1;10801:7;;:19;;10793:63;;;;-1:-1:-1::0;;;10793:63:0::1;;;;;;;:::i;:::-;10038:1;10934:7;:18:::0;49480:20:::2;49503:35;49518:8:::0;49528:9;49503:14:::2;:35::i;:::-;49480:58:::0;-1:-1:-1;;;;;;49554:95:0;::::2;-1:-1:-1::0;;;;;;;;;;;49562:12:0::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;49554:95:0::2;;49594:9:::0;49605:24:::2;49617:12:::0;49605:9:::2;:24;:::i;:::-;49631:12;49645:3;;49554:95;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9994:1:0::1;11113:22:::0;;-1:-1:-1;;;49310:347:0:o;38263:48::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38263:48:0;;:::o;42456:247::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42555:37:0;::::1;42547:78;;;;-1:-1:-1::0;;;42547:78:0::1;;;;;;;:::i;:::-;42636:15;:59:::0;;-1:-1:-1;;;;;;42636:59:0::1;-1:-1:-1::0;;;;;42636:59:0;;;::::1;::::0;;;::::1;::::0;;42456:247::o;38077:72::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5277:192::-;4608:12;:10;:12::i;:::-;-1:-1:-1;;;;;4597:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4597:23:0;;4589:68;;;;-1:-1:-1;;;4589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5366:22:0;::::1;5358:73;;;;-1:-1:-1::0;;;5358:73:0::1;;;;;;;:::i;:::-;5442:19;5452:8;5442:9;:19::i;64817:199::-:0;64967:12;;:40;;-1:-1:-1;;;64967:40:0;;64902:7;;64929:79;;64945:12;;64959:6;;-1:-1:-1;;;;;64967:12:0;;;;:26;;:40;;64945:12;;64967:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64929:15;:79::i;31967:410::-;32029:14;32060:30;32079:10;32060:18;:30::i;:::-;32056:314;;;-1:-1:-1;;;32265:14:0;32261:23;32248:37;32244:2;32240:46;32211:90;;;32340:18;:16;:18::i;:::-;32333:25;;;;31479:183;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;31568:26:::1;:24;:26::i;:::-;31605:49;31637:16;31605:31;:49::i;:::-;1952:14:::0;1948:68;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;1948:68;31479:183;;:::o;10080:108::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;10146:34:::1;:32;:34::i;:::-;1952:14:::0;1948:68;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;10080:108;:::o;4060:129::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;4118:26:::1;:24;:26::i;:::-;4155;:24;:26::i;34497:195::-:0;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;-1:-1:-1;;;;;34578:20:0;::::1;34570:59;;;;-1:-1:-1::0;;;34570:59:0::1;;;;;;;:::i;:::-;34640:17;:15;:17::i;:::-;34668:7;:16:::0;;-1:-1:-1;;;;;;34668:16:0::1;-1:-1:-1::0;;;;;34668:16:0;::::1;;::::0;;1948:68;;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;34497:195;;:::o;59236:1281::-;59531:17;;:::i;:::-;59561:18;59582:9;59630:12;;:44;;-1:-1:-1;;;59630:44:0;;59561:30;;-1:-1:-1;59602:25:0;;-1:-1:-1;;;;;59630:12:0;;;;:30;;:44;;59661:12;;59630:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59602:72;;59707:6;59693;:10;;;:20;;:44;;;;;59731:6;59717;:10;;;:20;;59693:44;59685:89;;;;-1:-1:-1;;;59685:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59793:22:0;;59785:55;;;;-1:-1:-1;;;59785:55:0;;;;;;;:::i;:::-;59852:27;59881:11;59896:60;59912:12;59926:6;59934:8;59944:11;;59896:15;:60::i;:::-;59851:105;;;;59978:6;59977:7;59969:37;;;;-1:-1:-1;;;59969:37:0;;;;;;;:::i;:::-;60017:34;;;;:13;:34;;;;;:41;;-1:-1:-1;;60017:41:0;60054:4;60017:41;;;60200:184;60236:10;60261:12;60288:6;60309:34;60358:15;60200:21;:184::i;:::-;60397:18;;60164:220;;-1:-1:-1;;;;;;60397:18:0;:43;60441:12;60164:220;60397:18;60455;;;;60397:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60494:15:0;;59236:1281;-1:-1:-1;;;;;;;;;;;;;;;59236:1281:0:o;22661:627::-;23036:10;;;23035:62;;-1:-1:-1;23052:39:0;;-1:-1:-1;;;23052:39:0;;-1:-1:-1;;;;;23052:15:0;;;;;:39;;23076:4;;23083:7;;23052:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23035:62;23013:166;;;;-1:-1:-1;;;23013:166:0;;;;;;;:::i;:::-;23190:90;23210:5;23240:22;;;23264:7;23273:5;23217:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23217:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23217:62:0;-1:-1:-1;;;;;;23217:62:0;;;;;;;;;;23190:19;:90::i;:::-;22661:627;;;:::o;62858:655::-;63077:7;;63230:15;37538:6;63162:11;63115:44;63125:34;63115:7;:44;:::i;:::-;:58;;;;:::i;:::-;63114:100;;;;:::i;:::-;:131;;;;:::i;:::-;63097:148;;63300:34;63287:11;63278:7;63261:99;63336:15;63353:6;63261:99;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;63373:38:0;;;;;;:24;:38;;;;;:48;;63415:6;;63373:38;:48;;63415:6;;63373:48;:::i;:::-;;;;-1:-1:-1;;;;;;;63432:31:0;;;;;;;:17;:31;;;;;;;;:39;;;;;;;;;;;:49;;63475:6;;63432:31;:49;;63475:6;;63432:49;:::i;:::-;;;;-1:-1:-1;63499:6:0;;62858:655;-1:-1:-1;;;;;;;62858:655:0:o;53886:1395::-;54057:17;;:::i;:::-;54116:12;;:40;;-1:-1:-1;;;54116:40:0;;54087:26;;-1:-1:-1;;;;;54116:12:0;;:26;;:40;;54143:12;;54116:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54087:69;;54167:23;54193:48;54209:12;54223:6;54231:9;54193:15;:48::i;:::-;54167:74;;54252:13;54298:9;:24;;;54280:15;:42;54276:432;;;37426:11;54414:9;:24;;;54405:6;:33;;;;:::i;:::-;54404:50;;;;:::i;:::-;54396:58;;37426:11;54558:9;:24;;;54540:15;:42;54530:6;:53;54529:70;;;-1:-1:-1;;;54529:70:0;;;;;;;;;-1:-1:-1;;;;;54498:27:0;;;;;;:13;:27;;;;;:101;;54529:70;;;;54498:101;;;;;54276:432;;;37426:11;54656:24;54665:15;54656:6;:24;:::i;:::-;54655:41;;;;:::i;:::-;54647:49;;54276:432;54718:25;37426:11;54747:24;54756:15;54747:6;:24;:::i;:::-;54746:41;;;;:::i;:::-;54800:18;;:48;;-1:-1:-1;;;54800:48:0;;54718:69;;-1:-1:-1;;;;;;54800:18:0;;:27;;:48;;54828:12;;54842:5;;54800:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54861:20;54936:9;54926:7;;54897:26;;54884:39;;:10;:39;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;54861:84;-1:-1:-1;54958:14:0;54975:28;54990:13;54861:84;54975:28;:::i;:::-;-1:-1:-1;;;;;55014:38:0;;;;;;:24;:38;;;;;:48;;54958:45;;-1:-1:-1;54958:45:0;;55014:38;;;:48;;54958:45;;55014:48;:::i;:::-;;;;-1:-1:-1;;;;;;;55073:31:0;;;;;;:17;:31;;;;;55122:6;;55105:12;:10;:12::i;:::-;-1:-1:-1;;;;;55073:45:0;-1:-1:-1;;;;;55073:45:0;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;55139:24:0;;-1:-1:-1;55176:26:0;55196:6;55176:17;:26;:::i;:::-;55166:37;;:6;:37;:::i;:::-;55214:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55214:59:0;;53886:1395;-1:-1:-1;;;;;;;;53886:1395:0:o;21903:222::-;22031:86;22051:5;22081:23;;;22106:2;22110:5;22058:58;;;;;;;;;:::i;35566:181::-;-1:-1:-1;;;;;35636:23:0;;35628:32;;;;;;35690:7;;35676:33;;-1:-1:-1;;;;;35676:33:0;;;;35690:7;;35676:33;;35690:7;;35676:33;35720:7;:19;;-1:-1:-1;;;;;;35720:19:0;-1:-1:-1;;;;;35720:19:0;;;;;;;;;;35566:181::o;8073:120::-;7617:8;:6;:8::i;:::-;7609:41;;;;-1:-1:-1;;;7609:41:0;;;;;;;:::i;:::-;8132:7:::1;:15:::0;;-1:-1:-1;;8132:15:0::1;::::0;;8163:22:::1;8172:12;:10;:12::i;:::-;8163:22;;;;;;:::i;:::-;;;;;;;;8073:120::o:0;45758:1100::-;45942:7;45983:13;45970:9;:26;;45962:84;;;;-1:-1:-1;;;45962:84:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46065:22:0;;-1:-1:-1;;;;;;;;;;;46065:22:0;;46057:49;;;;-1:-1:-1;;;46057:49:0;;;;;;;:::i;:::-;46145:12;;:54;;-1:-1:-1;;;46145:54:0;;46117:25;;-1:-1:-1;;;;;46145:12:0;;:29;;:54;;46175:9;;46186:12;;46145:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46117:82;;46234:6;46220;:10;;;:20;;:44;;;;;46258:6;46244;:10;;;:20;;46220:44;46212:88;;;;-1:-1:-1;;;46212:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46319:22:0;;46311:63;;;;-1:-1:-1;;;46311:63:0;;;;;;;:::i;:::-;46393:11;46385:42;;;;-1:-1:-1;;;46385:42:0;;;;;;;:::i;:::-;46440:20;46463:37;46479:6;46487:12;46463:15;:37::i;:::-;46440:60;-1:-1:-1;46515:17:0;;46511:122;;-1:-1:-1;;;;;46579:27:0;;;;;;:13;:27;;;;;;:42;;46609:12;;46579:42;:::i;:::-;-1:-1:-1;;;;;46549:27:0;;;;;;:13;:27;;;;;:72;46511:122;46643:18;;:65;;-1:-1:-1;;;46643:65:0;;-1:-1:-1;;;;;46643:18:0;;;;:43;;:65;;46687:12;;46701:6;;46643:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46719:101;46775:12;46790:6;46806:4;46813:6;46719:37;:101::i;:::-;46838:12;45758:1100;-1:-1:-1;;;;;;;45758:1100:0:o;5477:173::-;5552:6;;;-1:-1:-1;;;;;5569:17:0;;;-1:-1:-1;;;;;;5569:17:0;;;;;;;5602:40;;5552:6;;;5569:17;5552:6;;5602:40;;5533:16;;5602:40;5477:173;;:::o;50671:857::-;50750:7;50791:13;50778:9;:26;;50770:84;;;;-1:-1:-1;;;50770:84:0;;;;;;;:::i;:::-;50887:12;;:48;;-1:-1:-1;;;50887:48:0;;50943:9;;-1:-1:-1;;;;;50887:12:0;;:29;;:48;;50917:9;;-1:-1:-1;;;;;;;;;;;37337:42:0;50887:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;:65;;;;:151;;-1:-1:-1;50973:12:0;;:48;;-1:-1:-1;;;50973:48:0;;51029:9;;-1:-1:-1;;;;;50973:12:0;;:29;;:48;;51003:9;;-1:-1:-1;;;;;;;;;;;37337:42:0;50973:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;:65;;50887:151;50865:232;;;;-1:-1:-1;;;50865:232:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51116:22:0;;51108:63;;;;-1:-1:-1;;;51108:63:0;;;;;;;:::i;:::-;51190:9;51182:45;;;;-1:-1:-1;;;51182:45:0;;;;;;;:::i;:::-;51240:20;51263:34;51279:9;-1:-1:-1;;;;;;;;;;;51263:15:0;:34::i;:::-;51240:57;-1:-1:-1;51312:17:0;;51308:110;;-1:-1:-1;;;;;;;;;;;51370:21:0;;:13;:21;;;;:36;;51394:12;;51370:36;:::i;:::-;-1:-1:-1;;;;;;;;;;;51346:21:0;;:13;:21;;;:60;51308:110;51428:18;;:62;;-1:-1:-1;;;51428:62:0;;-1:-1:-1;;;;;51428:18:0;;;;:43;;:62;;-1:-1:-1;;;;;;;;;;;37337:42:0;51480:9;;51428:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51508:12:0;;50671:857;-1:-1:-1;;;;;;50671:857:0:o;7814:118::-;7340:8;:6;:8::i;:::-;7339:9;7331:38;;;;-1:-1:-1;;;7331:38:0;;;;;;;:::i;:::-;7874:7:::1;:14:::0;;-1:-1:-1;;7874:14:0::1;7884:4;7874:14;::::0;;7904:20:::1;7911:12;:10;:12::i;32644:214::-:0;-1:-1:-1;;;;;32723:17:0;;32715:57;;;;-1:-1:-1;;;32715:57:0;;;;;;;:::i;:::-;32783:17;:23;;-1:-1:-1;;;;;;32783:23:0;-1:-1:-1;;;;;32783:23:0;;;;;;;;32822:28;;;;-1:-1:-1;;32822:28:0;32644:214;:::o;63521:1288::-;63668:7;63688:24;63715:33;63735:12;63715:19;:33::i;:::-;63787:18;;:60;;-1:-1:-1;;;63787:60:0;;63688;;-1:-1:-1;63759:25:0;;-1:-1:-1;;;;;63787:18:0;;;;:46;;:60;;63834:12;;63787:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63759:88;-1:-1:-1;63860:26:0;63889:25;63908:6;63889:16;:25;:::i;:::-;63860:54;;64007:17;63986:18;:38;63982:131;;;64048:12;;:53;;-1:-1:-1;;;64048:53:0;;-1:-1:-1;;;;;64048:12:0;;;;:39;;:53;;64088:12;;64048:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64041:60;;;;;;;63982:131;64197:17;64284:9;:16;;;64257:9;:24;;;64237:17;64217;:37;;;;:::i;:::-;:64;;;;:::i;:::-;:83;;;;:::i;:::-;64197:103;;64339:19;64562:18;64528;64487:9;:24;;;64468:9;:16;;;:43;;;;:::i;:::-;64467:79;;;;:::i;:::-;:113;;;;:::i;:::-;64434:17;64401;64361:9;:24;;;:57;;;;:::i;:::-;:90;;;;:::i;:::-;:219;;;;:::i;:::-;64339:241;-1:-1:-1;64641:11:0;64667:16;64663:118;;-1:-1:-1;64706:1:0;64663:118;;;64746:23;64758:11;64746:9;:23;:::i;:::-;64740:29;;64663:118;64798:3;63521:1288;-1:-1:-1;;;;;;;;;63521:1288:0:o;2885:98::-;2965:10;2885:98;:::o;2814:65::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1952:14;1948:68;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;2814:65;:::o;31670:143::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;31769:17:::1;:36:::0;;-1:-1:-1;;;;;;31769:36:0::1;-1:-1:-1::0;;;;;31769:36:0;::::1;;::::0;;1948:68;;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;31670:143;;:::o;10196:106::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;9994:1:::1;10272:22:::0;;1948:68;;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;10196:106;:::o;4197:99::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;4265:23:::1;4275:12;:10;:12::i;:::-;4265:9;:23::i;6683:131::-:0;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;6742:26:::1;:24;:26::i;:::-;6779:27;:25;:27::i;61227:1623::-:0;61455:17;;:::i;:::-;61514:12;;:40;;-1:-1:-1;;;61514:40:0;;61485:26;;-1:-1:-1;;;;;61514:12:0;;:26;;:40;;61541:12;;61514:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61485:69;;61565:23;61591:48;61607:12;61621:6;61629:9;61591:15;:48::i;:::-;61565:74;;61650:13;61696:9;:24;;;61678:15;:42;61674:432;;;37426:11;61812:9;:24;;;61803:6;:33;;;;:::i;:::-;61802:50;;;;:::i;:::-;61794:58;;37426:11;61956:9;:24;;;61938:15;:42;61928:6;:53;61927:70;;;-1:-1:-1;;;61927:70:0;;;;;;;;;-1:-1:-1;;;;;61896:27:0;;;;;;:13;:27;;;;;:101;;61927:70;;;;61896:101;;;;;61674:432;;;37426:11;62054:24;62063:15;62054:6;:24;:::i;:::-;62053:41;;;;:::i;:::-;62045:49;;61674:432;62116:25;37426:11;62145:24;62154:15;62145:6;:24;:::i;:::-;62144:41;;;;:::i;:::-;62198:18;;:48;;-1:-1:-1;;;62198:48:0;;62116:69;;-1:-1:-1;;;;;;62198:18:0;;:27;;:48;;62226:12;;62240:5;;62198:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62259:20;62334:9;62324:7;;62295:26;;62282:39;;:10;:39;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;62259:84;;62354:14;62371:186;62401:12;62428:34;62477:12;62504:15;62534:12;:10;:12::i;62371:186::-;62354:203;-1:-1:-1;62606:6:0;62576:26;62354:203;62576:17;:26;:::i;:::-;:36;;62568:89;;;;-1:-1:-1;;;62568:89:0;;;;;;;:::i;:::-;62772:59;;;;;;;;62730:26;;;62720:37;;62772:59;;;;;;;;;;;;;;;-1:-1:-1;62772:59:0;;;;;-1:-1:-1;;;61227:1623:0;;;;;;;:::o;24531:727::-;24966:23;24992:69;25020:4;24992:69;;;;;;;;;;;;;;;;;25000:5;-1:-1:-1;;;;;24992:27:0;;;:69;;;;;:::i;:::-;25076:17;;24966:95;;-1:-1:-1;25076:21:0;25072:179;;25173:10;25162:30;;;;;;;;;;;;:::i;:::-;25154:85;;;;-1:-1:-1;;;25154:85:0;;;;;;;:::i;22133:259::-;22288:96;22308:5;22338:27;;;22367:4;22373:2;22377:5;22315:68;;;;;;;;;;:::i;22288:96::-;22133:259;;;;:::o;6822:92::-;1680:13;;;;;;;;:30;;-1:-1:-1;1698:12:0;;;;1697:13;1680:30;1672:89;;;;-1:-1:-1;;;1672:89:0;;;;;;;:::i;:::-;1774:19;1797:13;;;;;;1796:14;1821:101;;;;1856:13;:20;;-1:-1:-1;;;;1856:20:0;;;;;1891:19;1872:4;1891:19;;;1821:101;6891:7:::1;:15:::0;;-1:-1:-1;;6891:15:0::1;::::0;;1948:68;;;;1999:5;1983:21;;-1:-1:-1;;1983:21:0;;;6822:92;:::o;17675:229::-;17812:12;17844:52;17866:6;17874:4;17880:1;17883:12;17844:21;:52::i;:::-;17837:59;17675:229;-1:-1:-1;;;;17675:229:0:o;18795:510::-;18965:12;19023:5;18998:21;:30;;18990:81;;;;-1:-1:-1;;;18990:81:0;;;;;;;:::i;:::-;19090:18;19101:6;19090:10;:18::i;:::-;19082:60;;;;-1:-1:-1;;;19082:60:0;;;;;;;:::i;:::-;19156:12;19170:23;19197:6;-1:-1:-1;;;;;19197:11:0;19216:5;19223:4;19197:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19155:73;;;;19246:51;19263:7;19272:10;19284:12;19246:16;:51::i;14869:387::-;15192:20;15240:8;;;14869:387::o;20504:712::-;20654:12;20683:7;20679:530;;;-1:-1:-1;20714:10:0;20707:17;;20679:530;20828:17;;:21;20824:374;;21026:10;21020:17;21087:15;21074:10;21070:2;21066:19;21059:44;20974:148;21169:12;21162:20;;-1:-1:-1;;;21162:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:421::-;;;311:3;304:4;296:6;292:17;288:27;278:2;;334:6;326;319:22;278:2;-1:-1:-1;362:20:1;;-1:-1:-1;;;;;394:30:1;;391:2;;;444:8;434;427:26;391:2;488:4;480:6;476:17;464:29;;551:3;544:4;536;528:6;524:17;516:6;512:30;508:41;505:50;502:2;;;568:1;565;558:12;502:2;268:310;;;;;:::o;583:377::-;;;700:3;693:4;685:6;681:17;677:27;667:2;;725:8;715;708:26;667:2;-1:-1:-1;755:20:1;;-1:-1:-1;;;;;787:30:1;;784:2;;;837:8;827;820:26;784:2;881:4;873:6;869:17;857:29;;933:3;926:4;917:6;909;905:19;901:30;898:39;895:2;;;950:1;947;940:12;965:713;;1063:3;1056:4;1048:6;1044:17;1040:27;1030:2;;1085:5;1078;1071:20;1030:2;1125:6;1112:20;-1:-1:-1;;;;;1188:2:1;1184;1181:10;1178:2;;;1194:18;;:::i;:::-;1243:2;1237:9;1312:2;1293:13;;-1:-1:-1;;1289:27:1;1277:40;;1319:4;1273:51;1339:18;;;1359:22;;;1336:46;1333:2;;;1385:18;;:::i;:::-;1421:2;1414:22;1445:18;;;1482:15;;;1499:4;1478:26;1475:35;-1:-1:-1;1472:2:1;;;1527:5;1520;1513:20;1472:2;1595;1588:4;1580:6;1576:17;1569:4;1561:6;1557:17;1544:54;1618:15;;;1635:4;1614:26;1607:41;;;;1622:6;1020:658;-1:-1:-1;;;1020:658:1:o;1683:488::-;;1803:4;1791:9;1786:3;1782:19;1778:30;1775:2;;;1825:5;1818;1811:20;1775:2;1862:4;1856:11;1906:4;1898:6;1894:17;1977:6;1965:10;1962:22;-1:-1:-1;;;;;1929:10:1;1926:34;1923:62;1920:2;;;1988:18;;:::i;:::-;2024:4;2017:24;2089:16;;2074:32;;2160:2;2145:18;;;2139:25;2122:15;;;2115:50;;;;-1:-1:-1;2059:6:1;1765:406;-1:-1:-1;1765:406:1:o;2176:259::-;;2288:2;2276:9;2267:7;2263:23;2259:32;2256:2;;;2309:6;2301;2294:22;2256:2;2353:9;2340:23;2372:33;2399:5;2372:33;:::i;2440:402::-;;;2569:2;2557:9;2548:7;2544:23;2540:32;2537:2;;;2590:6;2582;2575:22;2537:2;2634:9;2621:23;2653:33;2680:5;2653:33;:::i;:::-;2705:5;-1:-1:-1;2762:2:1;2747:18;;2734:32;2775:35;2734:32;2775:35;:::i;:::-;2829:7;2819:17;;;2527:315;;;;;:::o;2847:833::-;;;;;;3027:3;3015:9;3006:7;3002:23;2998:33;2995:2;;;3049:6;3041;3034:22;2995:2;3093:9;3080:23;3112:33;3139:5;3112:33;:::i;:::-;3164:5;-1:-1:-1;3221:2:1;3206:18;;3193:32;3234:35;3193:32;3234:35;:::i;:::-;3288:7;-1:-1:-1;3347:2:1;3332:18;;3319:32;3360:35;3319:32;3360:35;:::i;:::-;3414:7;-1:-1:-1;3473:2:1;3458:18;;3445:32;3486:35;3445:32;3486:35;:::i;:::-;3540:7;-1:-1:-1;3599:3:1;3584:19;;3571:33;3613:35;3571:33;3613:35;:::i;:::-;3667:7;3657:17;;;2985:695;;;;;;;;:::o;3685:470::-;;;;3831:2;3819:9;3810:7;3806:23;3802:32;3799:2;;;3852:6;3844;3837:22;3799:2;3896:9;3883:23;3915:33;3942:5;3915:33;:::i;:::-;3967:5;-1:-1:-1;4024:2:1;4009:18;;3996:32;4037:35;3996:32;4037:35;:::i;:::-;3789:366;;4091:7;;-1:-1:-1;;;4145:2:1;4130:18;;;;4117:32;;3789:366::o;4160:1254::-;;;;;;;;;4442:3;4430:9;4421:7;4417:23;4413:33;4410:2;;;4464:6;4456;4449:22;4410:2;4508:9;4495:23;4527:33;4554:5;4527:33;:::i;:::-;4579:5;-1:-1:-1;4636:2:1;4621:18;;4608:32;4649:35;4608:32;4649:35;:::i;:::-;4703:7;-1:-1:-1;4757:2:1;4742:18;;4729:32;;-1:-1:-1;4808:2:1;4793:18;;4780:32;;-1:-1:-1;4863:3:1;4848:19;;4835:33;-1:-1:-1;;;;;4917:14:1;;;4914:2;;;4949:6;4941;4934:22;4914:2;4993:60;5045:7;5036:6;5025:9;5021:22;4993:60;:::i;:::-;5072:8;;-1:-1:-1;4967:86:1;-1:-1:-1;5160:3:1;5145:19;;5132:33;;-1:-1:-1;5177:16:1;;;5174:2;;;5211:6;5203;5196:22;5174:2;;5255:99;5346:7;5335:8;5324:9;5320:24;5255:99;:::i;:::-;4400:1014;;;;-1:-1:-1;4400:1014:1;;-1:-1:-1;4400:1014:1;;;;;;5373:8;-1:-1:-1;;;4400:1014:1:o;5419:1025::-;;;;;;;;5660:9;5651:7;5647:23;5690:3;5686:2;5682:12;5679:2;;;5712:6;5704;5697:22;5679:2;5756:9;5743:23;5775:33;5802:5;5775:33;:::i;:::-;5827:5;-1:-1:-1;5884:2:1;5869:18;;5856:32;5897:35;5856:32;5897:35;:::i;:::-;5951:7;-1:-1:-1;6005:2:1;5990:18;;5977:32;;-1:-1:-1;6056:2:1;6041:18;;6028:32;;-1:-1:-1;6095:3:1;-1:-1:-1;;6076:17:1;;6072:27;6069:2;;;6117:6;6109;6102:22;6069:2;;6160:3;6149:9;6145:19;6135:29;;6215:3;6204:9;6200:19;6187:33;-1:-1:-1;;;;;6235:6:1;6232:30;6229:2;;;6280:6;6272;6265:22;6229:2;6324:60;6376:7;6367:6;6356:9;6352:22;6324:60;:::i;:::-;5627:817;;;;-1:-1:-1;5627:817:1;;-1:-1:-1;5627:817:1;;;;6298:86;;-1:-1:-1;;;5627:817:1:o;6449:327::-;;;6578:2;6566:9;6557:7;6553:23;6549:32;6546:2;;;6599:6;6591;6584:22;6546:2;6643:9;6630:23;6662:33;6689:5;6662:33;:::i;:::-;6714:5;6766:2;6751:18;;;;6738:32;;-1:-1:-1;;;6536:240:1:o;6781:788::-;;;;;;6971:3;6959:9;6950:7;6946:23;6942:33;6939:2;;;6993:6;6985;6978:22;6939:2;7037:9;7024:23;7056:33;7083:5;7056:33;:::i;:::-;7108:5;-1:-1:-1;7160:2:1;7145:18;;7132:32;;-1:-1:-1;7216:2:1;7201:18;;7188:32;7229:35;7188:32;7229:35;:::i;:::-;7283:7;-1:-1:-1;7341:2:1;7326:18;;7313:32;-1:-1:-1;;;;;7357:30:1;;7354:2;;;7405:6;7397;7390:22;7354:2;7449:60;7501:7;7492:6;7481:9;7477:22;7449:60;:::i;:::-;6929:640;;;;-1:-1:-1;6929:640:1;;-1:-1:-1;7528:8:1;;7423:86;6929:640;-1:-1:-1;;;6929:640:1:o;7574:926::-;;;;;;;;7798:3;7786:9;7777:7;7773:23;7769:33;7766:2;;;7820:6;7812;7805:22;7766:2;7864:9;7851:23;7883:33;7910:5;7883:33;:::i;:::-;7935:5;-1:-1:-1;7987:2:1;7972:18;;7959:32;;-1:-1:-1;8043:2:1;8028:18;;8015:32;8056:35;8015:32;8056:35;:::i;:::-;8110:7;-1:-1:-1;8168:2:1;8153:18;;8140:32;-1:-1:-1;;;;;8184:30:1;;8181:2;;;8232:6;8224;8217:22;8181:2;8276:60;8328:7;8319:6;8308:9;8304:22;8276:60;:::i;:::-;7756:744;;;;-1:-1:-1;7756:744:1;;8355:8;;8250:86;8437:3;8422:19;;8409:33;;8489:3;8474:19;8461:33;;-1:-1:-1;7756:744:1;-1:-1:-1;;;;7756:744:1:o;8505:995::-;;;;;;;;;8746:3;8734:9;8725:7;8721:23;8717:33;8714:2;;;8768:6;8760;8753:22;8714:2;8812:9;8799:23;8831:33;8858:5;8831:33;:::i;:::-;8883:5;-1:-1:-1;8935:2:1;8920:18;;8907:32;;-1:-1:-1;8991:2:1;8976:18;;8963:32;9004:35;8963:32;9004:35;:::i;:::-;9058:7;-1:-1:-1;9116:2:1;9101:18;;9088:32;-1:-1:-1;;;;;9132:30:1;;9129:2;;;9180:6;9172;9165:22;9129:2;9224:60;9276:7;9267:6;9256:9;9252:22;9224:60;:::i;:::-;8704:796;;;;-1:-1:-1;8704:796:1;;9303:8;;9198:86;9385:3;9370:19;;9357:33;;9437:3;9422:19;;9409:33;;-1:-1:-1;9489:3:1;9474:19;9461:33;;-1:-1:-1;8704:796:1;-1:-1:-1;;;;8704:796:1:o;9505:1553::-;;;;;;;;;;;;;9874:3;9862:9;9853:7;9849:23;9845:33;9842:2;;;9896:6;9888;9881:22;9842:2;9924:31;9945:9;9924:31;:::i;:::-;9914:41;;10002:2;9991:9;9987:18;9974:32;9964:42;;10025:40;10061:2;10050:9;10046:18;10025:40;:::i;:::-;10015:50;;-1:-1:-1;;;;;10108:2:1;10097:9;10093:18;10080:32;10077:56;10074:2;;;10151:6;10143;10136:22;10074:2;10195:86;10273:7;10266:2;10255:9;10251:18;10238:32;10227:9;10223:48;10195:86;:::i;:::-;10300:8;;-1:-1:-1;10327:8:1;-1:-1:-1;10382:3:1;10367:19;;10354:33;;-1:-1:-1;10434:3:1;10419:19;;10406:33;;-1:-1:-1;10486:3:1;10471:19;;10458:33;;-1:-1:-1;10538:3:1;10523:19;;10510:33;;-1:-1:-1;;;;;;10586:3:1;10571:19;;10558:33;10555:57;10552:2;;;10630:6;10622;10615:22;10552:2;10675:124;10791:7;10783:3;10772:9;10768:19;10755:33;10744:9;10740:49;10675:124;:::i;:::-;10818:8;;-1:-1:-1;10846:9:1;-1:-1:-1;;;;;;10898:3:1;10883:19;;10870:33;10867:57;10864:2;;;10943:7;10934;10927:24;10864:2;10973:79;11044:7;11036:3;11025:9;11021:19;11008:33;10997:9;10993:49;10973:79;:::i;:::-;10962:90;;9832:1226;;;;;;;;;;;;;;:::o;11063:637::-;;;;;11229:2;11217:9;11208:7;11204:23;11200:32;11197:2;;;11250:6;11242;11235:22;11197:2;11294:9;11281:23;11313:33;11340:5;11313:33;:::i;:::-;11365:5;-1:-1:-1;11417:2:1;11402:18;;11389:32;;-1:-1:-1;11472:2:1;11457:18;;11444:32;-1:-1:-1;;;;;11488:30:1;;11485:2;;;11536:6;11528;11521:22;11485:2;11580:60;11632:7;11623:6;11612:9;11608:22;11580:60;:::i;:::-;11187:513;;;;-1:-1:-1;11659:8:1;-1:-1:-1;;;;11187:513:1:o;11705:1041::-;;;;;;;11953:3;11941:9;11932:7;11928:23;11924:33;11921:2;;;11975:6;11967;11960:22;11921:2;12019:9;12006:23;12038:33;12065:5;12038:33;:::i;:::-;12090:5;-1:-1:-1;12142:2:1;12127:18;;12114:32;;-1:-1:-1;12197:2:1;12182:18;;12169:32;-1:-1:-1;;;;;12250:14:1;;;12247:2;;;12282:6;12274;12267:22;12247:2;12326:60;12378:7;12369:6;12358:9;12354:22;12326:60;:::i;:::-;12405:8;;-1:-1:-1;12300:86:1;-1:-1:-1;12493:2:1;12478:18;;12465:32;;-1:-1:-1;12509:16:1;;;12506:2;;;12543:6;12535;12528:22;12506:2;;12587:99;12678:7;12667:8;12656:9;12652:24;12587:99;:::i;:::-;11911:835;;;;-1:-1:-1;11911:835:1;;-1:-1:-1;11911:835:1;;12705:8;;11911:835;-1:-1:-1;;;11911:835:1:o;12751:253::-;;12860:2;12848:9;12839:7;12835:23;12831:32;12828:2;;;12881:6;12873;12866:22;12828:2;12925:9;12912:23;12944:30;12968:5;12944:30;:::i;13009:257::-;;13129:2;13117:9;13108:7;13104:23;13100:32;13097:2;;;13150:6;13142;13135:22;13097:2;13187:9;13181:16;13206:30;13230:5;13206:30;:::i;13271:190::-;;13383:2;13371:9;13362:7;13358:23;13354:32;13351:2;;;13404:6;13396;13389:22;13351:2;-1:-1:-1;13432:23:1;;13341:120;-1:-1:-1;13341:120:1:o;13466:569::-;;;;13615:2;13603:9;13594:7;13590:23;13586:32;13583:2;;;13636:6;13628;13621:22;13583:2;13681:9;13668:23;-1:-1:-1;;;;;13706:6:1;13703:30;13700:2;;;13751:6;13743;13736:22;13700:2;13795:60;13847:7;13838:6;13827:9;13823:22;13795:60;:::i;:::-;13874:8;;-1:-1:-1;13769:86:1;-1:-1:-1;;13959:2:1;13944:18;;13931:32;13972:33;13931:32;13972:33;:::i;:::-;14024:5;14014:15;;;13573:462;;;;;:::o;14040:344::-;;14162:2;14150:9;14141:7;14137:23;14133:32;14130:2;;;14183:6;14175;14168:22;14130:2;14228:9;14215:23;-1:-1:-1;;;;;14253:6:1;14250:30;14247:2;;;14298:6;14290;14283:22;14247:2;14326:52;14370:7;14361:6;14350:9;14346:22;14326:52;:::i;14389:269::-;;14540:2;14528:9;14519:7;14515:23;14511:32;14508:2;;;14561:6;14553;14546:22;14508:2;14589:63;14644:7;14633:9;14589:63;:::i;14663:807::-;;14812:3;14800:9;14791:7;14787:23;14783:33;14780:2;;;14834:6;14826;14819:22;14780:2;14872;14866:9;14914:4;14906:6;14902:17;14985:6;14973:10;14970:22;-1:-1:-1;;;;;14937:10:1;14934:34;14931:62;14928:2;;;14996:18;;:::i;:::-;15032:2;15025:22;15071:16;;15056:32;;15131:2;15116:18;;15110:25;15144:30;15110:25;15144:30;:::i;:::-;15207:5;15202:2;15194:6;15190:15;15183:30;;15267:2;15256:9;15252:18;15246:25;15241:2;15233:6;15229:15;15222:50;15326:2;15315:9;15311:18;15305:25;15300:2;15292:6;15288:15;15281:50;15365:73;15430:7;15424:3;15413:9;15409:19;15365:73;:::i;:::-;15359:3;15347:16;;15340:99;15351:6;14770:700;-1:-1:-1;;;14770:700:1:o;15475:321::-;;15587:2;15575:9;15566:7;15562:23;15558:32;15555:2;;;15608:6;15600;15593:22;15555:2;15652:9;15639:23;-1:-1:-1;;;;;15695:5:1;15691:46;15684:5;15681:57;15671:2;;15757:6;15749;15742:22;15801:194;;15924:2;15912:9;15903:7;15899:23;15895:32;15892:2;;;15945:6;15937;15930:22;15892:2;-1:-1:-1;15973:16:1;;15882:113;-1:-1:-1;15882:113:1:o;16000:327::-;;;16129:2;16117:9;16108:7;16104:23;16100:32;16097:2;;;16150:6;16142;16135:22;16097:2;16191:9;16178:23;16168:33;;16251:2;16240:9;16236:18;16223:32;16264:33;16291:5;16264:33;:::i;16332:850::-;;;;;;;16532:3;16520:9;16511:7;16507:23;16503:33;16500:2;;;16554:6;16546;16539:22;16500:2;16595:9;16582:23;16572:33;;16655:2;16644:9;16640:18;16627:32;16668:33;16695:5;16668:33;:::i;:::-;16720:5;-1:-1:-1;16777:2:1;16762:18;;16749:32;16790:35;16749:32;16790:35;:::i;:::-;16844:7;-1:-1:-1;16898:2:1;16883:18;;16870:32;;-1:-1:-1;16953:3:1;16938:19;;16925:33;-1:-1:-1;;;;;16970:30:1;;16967:2;;;17018:6;17010;17003:22;16967:2;17062:60;17114:7;17105:6;17094:9;17090:22;17062:60;:::i;17187:578::-;;;;;;17403:3;17391:9;17382:7;17378:23;17374:33;17371:2;;;17425:6;17417;17410:22;17371:2;17459:9;17453:16;17443:26;;17512:2;17501:9;17497:18;17491:25;17525:30;17549:5;17525:30;:::i;:::-;17619:2;17604:18;;17598:25;17663:2;17648:18;;17642:25;17574:5;;-1:-1:-1;17598:25:1;-1:-1:-1;17642:25:1;-1:-1:-1;17686:73:1;17751:7;17745:3;17730:19;;17686:73;:::i;:::-;17676:83;;17361:404;;;;;;;;:::o;17770:289::-;;17880:2;17868:9;17859:7;17855:23;17851:32;17848:2;;;17901:6;17893;17886:22;17848:2;17945:9;17932:23;17995:4;17988:5;17984:16;17977:5;17974:27;17964:2;;18020:6;18012;18005:22;18064:1558;;18191:6;18186:3;18179:19;18217:4;18246:2;18241:3;18237:12;18230:19;;18271:3;18316:2;18308:6;18304:15;18299:3;18295:25;18343:5;18366:3;18378:1218;18392:6;18389:1;18386:13;18378:1218;;;18463:5;18457:4;18453:16;18448:3;18441:29;18522:6;18509:20;18612:3;18608:8;18600:5;18584:14;18580:26;18576:41;18556:18;18552:66;18542:2;;18634:3;18629;18622:16;18542:2;18668:30;;18721:4;18753:21;;18787:35;18753:21;18787:35;:::i;:::-;-1:-1:-1;;;;;18848:33:1;18835:47;;18930:16;;;18917:30;18902:13;;;18895:53;18971:4;19023:16;;;19010:30;18995:13;;;18988:53;19064:4;19109:16;;;19096:30;19161:1;19149:14;;19139:2;;19179:3;19174;19167:16;19139:2;19198:56;19250:2;19244:4;19240:13;19231:7;19198:56;:::i;:::-;;;19277:4;19328:59;19383:2;19374:7;19370:16;19361:7;19328:59;:::i;:::-;19294:93;;19422:2;19417;19411:4;19407:13;19400:25;19446:70;19512:2;19506:4;19502:13;19488:12;19474;19446:70;:::i;:::-;19574:12;;;;19438:78;-1:-1:-1;;;19539:15:1;;;;-1:-1:-1;;18414:1:1;18407:9;18378:1218;;;-1:-1:-1;19612:4:1;;18169:1453;-1:-1:-1;;;;;;;18169:1453:1:o;19627:270::-;;19717:6;19712:3;19705:19;19769:6;19762:5;19755:4;19750:3;19746:14;19733:43;19821:3;19814:4;19805:6;19800:3;19796:16;19792:27;19785:40;19886:4;19879:2;19875:7;19870:2;19862:6;19858:15;19854:29;19849:3;19845:39;19841:50;19834:57;;19695:202;;;;;:::o;19902:244::-;19990:1;19983:5;19980:12;19970:2;;20035:10;20030:3;20026:20;20023:1;20016:31;20070:4;20067:1;20060:15;20098:4;20095:1;20088:15;19970:2;20122:18;;19960:186::o;20151:273::-;;20334:6;20326;20321:3;20308:33;20360:16;;20385:15;;;20360:16;20298:126;-1:-1:-1;20298:126:1:o;20429:274::-;;20596:6;20590:13;20612:53;20658:6;20653:3;20646:4;20638:6;20634:17;20612:53;:::i;:::-;20681:16;;;;;20566:137;-1:-1:-1;;20566:137:1:o;21479:203::-;-1:-1:-1;;;;;21643:32:1;;;;21625:51;;21613:2;21598:18;;21580:102::o;21687:639::-;-1:-1:-1;;;;;21992:32:1;;21974:51;;22061:3;22056:2;22041:18;;22034:31;;;21687:639;;22082:64;;22126:19;;22118:6;22110;22082:64;:::i;:::-;22074:72;;22182:6;22177:2;22166:9;22162:18;22155:34;22225:6;22220:2;22209:9;22205:18;22198:34;22269:6;22263:3;22252:9;22248:19;22241:35;22313:6;22307:3;22296:9;22292:19;22285:35;21964:362;;;;;;;;;;:::o;22331:304::-;-1:-1:-1;;;;;22561:15:1;;;22543:34;;22613:15;;22608:2;22593:18;;22586:43;22493:2;22478:18;;22460:175::o;22640:375::-;-1:-1:-1;;;;;22898:15:1;;;22880:34;;22950:15;;;;22945:2;22930:18;;22923:43;22997:2;22982:18;;22975:34;;;;22830:2;22815:18;;22797:218::o;23020:752::-;-1:-1:-1;;;;;23409:15:1;;;23391:34;;23461:15;;;;23456:2;23441:18;;23434:43;23508:2;23493:18;;23486:34;;;;23551:2;23536:18;;23529:34;;;;23607:14;23600:22;23594:3;23579:19;;23572:51;23672:4;23660:17;23371:3;23639:19;;23632:46;23709:3;23694:19;;23687:35;23753:3;23738:19;;23731:35;;;;23340:3;23325:19;;23307:465::o;23777:670::-;-1:-1:-1;;;;;24144:15:1;;;24126:34;;24196:15;;;;24191:2;24176:18;;24169:43;24243:2;24228:18;;24221:34;;;;24286:2;24271:18;;24264:34;;;;24347:4;24335:17;24329:3;24314:19;;24307:46;24106:3;24369:19;;24362:35;24428:3;24413:19;;24406:35;;;;24075:3;24060:19;;24042:405::o;24452:274::-;-1:-1:-1;;;;;24644:32:1;;;;24626:51;;24708:2;24693:18;;24686:34;24614:2;24599:18;;24581:145::o;24731:652::-;-1:-1:-1;;;;;25108:15:1;;;25090:34;;25155:2;25140:18;;25133:34;;;25203:15;;25198:2;25183:18;;25176:43;25255:3;25250:2;25235:18;;25228:31;;;24731:652;;25276:101;;25357:19;;25349:6;25341;25276:101;:::i;25388:463::-;-1:-1:-1;;;;;25691:15:1;;;25673:34;;25738:2;25723:18;;25716:34;;;;25786:15;;25781:2;25766:18;;25759:43;25833:2;25818:18;;25811:34;;;;25622:3;25607:19;;25589:262::o;25856:187::-;26021:14;;26014:22;25996:41;;25984:2;25969:18;;25951:92::o;26048:258::-;26216:25;;;26284:14;26277:22;26272:2;26257:18;;26250:50;26204:2;26189:18;;26171:135::o;26777:383::-;;26926:2;26915:9;26908:21;26958:6;26952:13;27001:6;26996:2;26985:9;26981:18;26974:34;27017:66;27076:6;27071:2;27060:9;27056:18;27051:2;27043:6;27039:15;27017:66;:::i;:::-;27144:2;27123:15;-1:-1:-1;;27119:29:1;27104:45;;;;27151:2;27100:54;;26898:262;-1:-1:-1;;26898:262:1:o;27165:348::-;27367:2;27349:21;;;27406:2;27386:18;;;27379:30;27445:26;27440:2;27425:18;;27418:54;27504:2;27489:18;;27339:174::o;27518:352::-;27720:2;27702:21;;;27759:2;27739:18;;;27732:30;27798;27793:2;27778:18;;27771:58;27861:2;27846:18;;27692:178::o;27875:344::-;28077:2;28059:21;;;28116:2;28096:18;;;28089:30;-1:-1:-1;;;28150:2:1;28135:18;;28128:50;28210:2;28195:18;;28049:170::o;28224:353::-;28426:2;28408:21;;;28465:2;28445:18;;;28438:30;28504:31;28499:2;28484:18;;28477:59;28568:2;28553:18;;28398:179::o;28582:356::-;28784:2;28766:21;;;28803:18;;;28796:30;28862:34;28857:2;28842:18;;28835:62;28929:2;28914:18;;28756:182::o;28943:351::-;29145:2;29127:21;;;29184:2;29164:18;;;29157:30;29223:29;29218:2;29203:18;;29196:57;29285:2;29270:18;;29117:177::o;29299:404::-;29501:2;29483:21;;;29540:2;29520:18;;;29513:30;29579:34;29574:2;29559:18;;29552:62;-1:-1:-1;;;29645:2:1;29630:18;;29623:38;29693:3;29678:19;;29473:230::o;29708:402::-;29910:2;29892:21;;;29949:2;29929:18;;;29922:30;29988:34;29983:2;29968:18;;29961:62;-1:-1:-1;;;30054:2:1;30039:18;;30032:36;30100:3;30085:19;;29882:228::o;30115:397::-;30317:2;30299:21;;;30356:2;30336:18;;;30329:30;30395:34;30390:2;30375:18;;30368:62;-1:-1:-1;;;30461:2:1;30446:18;;30439:31;30502:3;30487:19;;30289:223::o;30517:346::-;30719:2;30701:21;;;30758:2;30738:18;;;30731:30;-1:-1:-1;;;30792:2:1;30777:18;;30770:52;30854:2;30839:18;;30691:172::o;30868:343::-;31070:2;31052:21;;;31109:2;31089:18;;;31082:30;-1:-1:-1;;;31143:2:1;31128:18;;31121:49;31202:2;31187:18;;31042:169::o;31216:351::-;31418:2;31400:21;;;31457:2;31437:18;;;31430:30;31496:29;31491:2;31476:18;;31469:57;31558:2;31543:18;;31390:177::o;31572:402::-;31774:2;31756:21;;;31813:2;31793:18;;;31786:30;31852:34;31847:2;31832:18;;31825:62;-1:-1:-1;;;31918:2:1;31903:18;;31896:36;31964:3;31949:19;;31746:228::o;31979:338::-;32181:2;32163:21;;;32220:2;32200:18;;;32193:30;-1:-1:-1;;;32254:2:1;32239:18;;32232:44;32308:2;32293:18;;32153:164::o;32322:340::-;32524:2;32506:21;;;32563:2;32543:18;;;32536:30;-1:-1:-1;;;32597:2:1;32582:18;;32575:46;32653:2;32638:18;;32496:166::o;32667:340::-;32869:2;32851:21;;;32908:2;32888:18;;;32881:30;-1:-1:-1;;;32942:2:1;32927:18;;32920:46;32998:2;32983:18;;32841:166::o;33012:398::-;33214:2;33196:21;;;33253:2;33233:18;;;33226:30;33292:34;33287:2;33272:18;;33265:62;-1:-1:-1;;;33358:2:1;33343:18;;33336:32;33400:3;33385:19;;33186:224::o;33415:410::-;33617:2;33599:21;;;33656:2;33636:18;;;33629:30;33695:34;33690:2;33675:18;;33668:62;-1:-1:-1;;;33761:2:1;33746:18;;33739:44;33815:3;33800:19;;33589:236::o;33830:344::-;34032:2;34014:21;;;34071:2;34051:18;;;34044:30;-1:-1:-1;;;34105:2:1;34090:18;;34083:50;34165:2;34150:18;;34004:170::o;34179:355::-;34381:2;34363:21;;;34420:2;34400:18;;;34393:30;34459:33;34454:2;34439:18;;34432:61;34525:2;34510:18;;34353:181::o;34539:352::-;34741:2;34723:21;;;34780:2;34760:18;;;34753:30;34819;34814:2;34799:18;;34792:58;34882:2;34867:18;;34713:178::o;34896:355::-;35098:2;35080:21;;;35137:2;35117:18;;;35110:30;35176:33;35171:2;35156:18;;35149:61;35242:2;35227:18;;35070:181::o;35256:356::-;35458:2;35440:21;;;35477:18;;;35470:30;35536:34;35531:2;35516:18;;35509:62;35603:2;35588:18;;35430:182::o;35617:350::-;35819:2;35801:21;;;35858:2;35838:18;;;35831:30;35897:28;35892:2;35877:18;;35870:56;35958:2;35943:18;;35791:176::o;35972:342::-;36174:2;36156:21;;;36213:2;36193:18;;;36186:30;-1:-1:-1;;;36247:2:1;36232:18;;36225:48;36305:2;36290:18;;36146:168::o;36319:343::-;36521:2;36503:21;;;36560:2;36540:18;;;36533:30;-1:-1:-1;;;36594:2:1;36579:18;;36572:49;36653:2;36638:18;;36493:169::o;36667:354::-;36869:2;36851:21;;;36908:2;36888:18;;;36881:30;36947:32;36942:2;36927:18;;36920:60;37012:2;36997:18;;36841:180::o;37026:356::-;37228:2;37210:21;;;37247:18;;;37240:30;37306:34;37301:2;37286:18;;37279:62;37373:2;37358:18;;37200:182::o;37387:409::-;37589:2;37571:21;;;37628:2;37608:18;;;37601:30;37667:34;37662:2;37647:18;;37640:62;-1:-1:-1;;;37733:2:1;37718:18;;37711:43;37786:3;37771:19;;37561:235::o;37801:341::-;38003:2;37985:21;;;38042:2;38022:18;;;38015:30;-1:-1:-1;;;38076:2:1;38061:18;;38054:47;38133:2;38118:18;;37975:167::o;38147:346::-;38349:2;38331:21;;;38388:2;38368:18;;;38361:30;-1:-1:-1;;;38422:2:1;38407:18;;38400:52;38484:2;38469:18;;38321:172::o;38498:353::-;38700:2;38682:21;;;38739:2;38719:18;;;38712:30;38778:31;38773:2;38758:18;;38751:59;38842:2;38827:18;;38672:179::o;38856:353::-;39058:2;39040:21;;;39097:2;39077:18;;;39070:30;39136:31;39131:2;39116:18;;39109:59;39200:2;39185:18;;39030:179::o;39214:349::-;39416:2;39398:21;;;39455:2;39435:18;;;39428:30;39494:27;39489:2;39474:18;;39467:55;39554:2;39539:18;;39388:175::o;39568:406::-;39770:2;39752:21;;;39809:2;39789:18;;;39782:30;39848:34;39843:2;39828:18;;39821:62;-1:-1:-1;;;39914:2:1;39899:18;;39892:40;39964:3;39949:19;;39742:232::o;39979:355::-;40181:2;40163:21;;;40220:2;40200:18;;;40193:30;40259:33;40254:2;40239:18;;40232:61;40325:2;40310:18;;40153:181::o;40339:341::-;40541:2;40523:21;;;40580:2;40560:18;;;40553:30;-1:-1:-1;;;40614:2:1;40599:18;;40592:47;40671:2;40656:18;;40513:167::o;40685:347::-;40887:2;40869:21;;;40926:2;40906:18;;;40899:30;40965:25;40960:2;40945:18;;40938:53;41023:2;41008:18;;40859:173::o;41037:418::-;41239:2;41221:21;;;41278:2;41258:18;;;41251:30;41317:34;41312:2;41297:18;;41290:62;-1:-1:-1;;;41383:2:1;41368:18;;41361:52;41445:3;41430:19;;41211:244::o;41460:412::-;41662:2;41644:21;;;41701:2;41681:18;;;41674:30;41740:34;41735:2;41720:18;;41713:62;-1:-1:-1;;;41806:2:1;41791:18;;41784:46;41862:3;41847:19;;41634:238::o;41877:356::-;42079:2;42061:21;;;42098:18;;;42091:30;42157:34;42152:2;42137:18;;42130:62;42224:2;42209:18;;42051:182::o;42238:177::-;42384:25;;;42372:2;42357:18;;42339:76::o;42420:274::-;42594:25;;;-1:-1:-1;;;;;42655:32:1;42650:2;42635:18;;42628:60;42582:2;42567:18;;42549:145::o;42699:549::-;42992:25;;;-1:-1:-1;;;;;43053:32:1;;43048:2;43033:18;;43026:60;43122:2;43117;43102:18;;43095:30;;;42699:549;;43142:100;;43223:18;;43215:6;43207;43142:100;:::i;:::-;43134:108;42982:266;-1:-1:-1;;;;;;42982:266:1:o;43253:248::-;43427:25;;;43483:2;43468:18;;43461:34;43415:2;43400:18;;43382:119::o;43506:463::-;;43749:6;43738:9;43731:25;43792:6;43787:2;43776:9;43772:18;43765:34;43835:6;43830:2;43819:9;43815:18;43808:34;43878:3;43873:2;43862:9;43858:18;43851:31;43899:64;43958:3;43947:9;43943:19;43935:6;43927;43899:64;:::i;43974:780::-;;44363:6;44352:9;44345:25;44406:6;44401:2;44390:9;44386:18;44379:34;44449:6;44444:2;44433:9;44429:18;44422:34;44492:3;44487:2;44476:9;44472:18;44465:31;44519:64;44578:3;44567:9;44563:19;44555:6;44547;44519:64;:::i;:::-;44632:9;44624:6;44620:22;44614:3;44603:9;44599:19;44592:51;44660:88;44741:6;44733;44725;44660:88;:::i;:::-;44652:96;44335:419;-1:-1:-1;;;;;;;;;;44335:419:1:o;44759:334::-;;44913:11;44900:25;45007:3;45003:8;44992;44976:14;44972:29;44968:44;44948:18;44944:69;44934:2;;45030:4;45024;45017:18;45098:513;;;45225:3;45212:17;45311:2;45307:7;45296:8;45280:14;45276:29;45272:43;45252:18;45248:68;45238:2;;45334:5;45327;45320:20;45238:2;45366:33;;45470:4;45457:18;;;-1:-1:-1;45418:21:1;;-1:-1:-1;;;;;;45487:30:1;;45484:2;;;45530:1;45527;45520:12;45484:2;45580:6;45564:14;45560:27;45550:8;45546:42;45543:2;;;45601:1;45598;45591:12;45616:128;;45687:1;45683:6;45680:1;45677:13;45674:2;;;45693:18;;:::i;:::-;-1:-1:-1;45729:9:1;;45664:80::o;45749:217::-;;45815:1;45805:2;;-1:-1:-1;;;45840:31:1;;45894:4;45891:1;45884:15;45922:4;45847:1;45912:15;45805:2;-1:-1:-1;45951:9:1;;45795:171::o;45971:168::-;;46077:1;46073;46069:6;46065:14;46062:1;46059:21;46054:1;46047:9;46040:17;46036:45;46033:2;;;46084:18;;:::i;:::-;-1:-1:-1;46124:9:1;;46023:116::o;46144:125::-;;46212:1;46209;46206:8;46203:2;;;46217:18;;:::i;:::-;-1:-1:-1;46254:9:1;;46193:76::o;46274:258::-;46346:1;46356:113;46370:6;46367:1;46364:13;46356:113;;;46446:11;;;46440:18;46427:11;;;46420:39;46392:2;46385:10;46356:113;;;46487:6;46484:1;46481:13;46478:2;;;-1:-1:-1;;46522:1:1;46504:16;;46497:27;46327:205::o;46537:127::-;46598:10;46593:3;46589:20;46586:1;46579:31;46629:4;46626:1;46619:15;46653:4;46650:1;46643:15;46669:127;46730:10;46725:3;46721:20;46718:1;46711:31;46761:4;46758:1;46751:15;46785:4;46782:1;46775:15;46801:133;-1:-1:-1;;;;;46878:31:1;;46868:42;;46858:2;;46924:1;46921;46914:12;46939:120;47027:5;47020:13;47013:21;47006:5;47003:32;46993:2;;47049:1;47046;47039:12
Swarm Source
ipfs://e4f8e94dd13db1bfa1cdccfeb5ab67b6ae9b3730e048602f2fb40ed48fa4992c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.