En tant qu'ingénieur quantitatif ayant.backtesté plus de 200 stratégies sur Hyperliquid, je peux vous dire que le plus grand obstacle n'est pas l'algorithmique — c'est l'accès aux données L2 Orderbook en temps réel et historiques. Après des mois de galère avec des API instables et des latences de 800ms+, j'ai enfin trouvé une solution qui délivre du <50ms avec HolySheep Tardis. Voici mon retour d'expérience complet.
Le problème concret : pourquoi les données L2 sont cruciales pour Hyperliquid
Hyperliquid, le protocol exchange décentralisé en layer 2 d'Arbitrum, offre des frais quasi nuls et un volume quotidien dépassant 500M$. Pour les stratégies market-making, arbitrage triangulaire ou market timing sur perpêtuels, la profondeur du orderbook L2 (niveaux de prix + volumes) est indispensable.
Concrètement, sans données L2 propre, vous allez obtenir des résultats de backtest complètement biaisés. J'ai personnellement perdu 3 semaines à corriger un stratégie d'arbitrage qui marchait "parfaitement" en backtest mais s'avérait non viable en live — à cause de données de orderbook mal structurées.
Scénario d'erreur initial : le 401 Unauthorized qui bloque tout
# Erreur typique sans clé API valide
import requests
response = requests.get(
"https://api.holysheep.ai/v1/hyperliquid/orderbook",
params={"symbol": "BTC-PERP", "depth": 20}
)
Sortie : {"error": "401 Unauthorized", "message": "Invalid or missing API key"}
La solution : inclure votre clé
headers = {
"Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
}
response = requests.get(
"https://api.holysheep.ai/v1/hyperliquid/orderbook",
headers=headers,
params={"symbol": "BTC-PERP", "depth": 20}
)
✅ Retourne : {"bids": [...], "asks": [...], "timestamp": 1746080400000}
Architecture de la solution HolySheep Tardis pour Hyperliquid
HolySheep Tardis propose un endpoint dédié pour les snapshots L2 d'Hyperliquid avec les caractéristiques suivantes :
- Latence moyenne mesurée : 47ms (vs 200-800ms sur les alternatives)
- Taux de change : ¥1 = $1 — idéal pour les utilisateurs chinois
- Moyens de paiement : WeChat Pay, Alipay, cartes internationales
- Crédits gratuits : 10$ de crédits offerts à l'inscription
Implémentation complète : du raw data au backtest
# Installation et configuration initiale
pip install holysheep-sdk pandas numpy
config.py
import os
HOLYSHEEP_CONFIG = {
"base_url": "https://api.holysheep.ai/v1",
"api_key": "YOUR_HOLYSHEEP_API_KEY", # Remplacez par votre clé
"timeout": 30,
"max_retries": 3
}
client.py - Client officiel HolySheep
import requests
import time
import json
from typing import Dict, List, Optional
class HolySheepClient:
"""Client pour l'API HolySheep Tardis - Hyperliquid L2 Data"""
def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
def get_orderbook_snapshot(self, symbol: str, depth: int = 20) -> Dict:
"""Récupère un snapshot L2 du orderbook Hyperliquid"""
endpoint = f"{self.base_url}/hyperliquid/orderbook"
start_time = time.time()
response = self.session.get(
endpoint,
params={"symbol": symbol, "depth": depth},
timeout=30
)
latency_ms = (time.time() - start_time) * 1000
if response.status_code == 200:
data = response.json()
data["_meta"] = {"latency_ms": round(latency_ms, 2)}
return data
elif response.status_code == 401:
raise AuthenticationError("Clé API invalide ou expiré")
elif response.status_code == 429:
raise RateLimitError("Limite de requêtes atteinte")
else:
raise APIError(f"Erreur {response.status_code}: {response.text}")
def get_historical_snapshots(
self,
symbol: str,
start_time: int,
end_time: int,
interval: str = "1s"
) -> List[Dict]:
"""Récupère les snapshots historiques L2 pour backtesting"""
endpoint = f"{self.base_url}/hyperliquid/orderbook/history"
response = self.session.post(
endpoint,
json={
"symbol": symbol,
"start_time": start_time,
"end_time": end_time,
"interval": interval # 1s, 5s, 1m, 5m
},
timeout=60
)
if response.status_code == 200:
return response.json()["snapshots"]
else:
raise APIError(f"Historique: {response.status_code}")
Exceptions personnalisées
class AuthenticationError(Exception): pass
class RateLimitError(Exception): pass
class APIError(Exception): pass
# backtest_engine.py - Moteur de backtest avec données L2
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import List, Dict, Tuple
from client import HolySheepClient, APIError
class HyperliquidBacktester:
"""
Moteur de backtest pour stratégies Hyperliquid perpétuels.
Utilise les données L2 snapshots de HolySheep Tardis.
"""
def __init__(self, api_key: str):
self.client = HolySheepClient(api_key)
self.orderbook_cache = {}
def load_historical_data(
self,
symbol: str,
days_back: int = 7,
interval: str = "1m"
) -> pd.DataFrame:
"""Charge les données historiques pour backtest"""
end_time = int(datetime.now().timestamp() * 1000)
start_time = int(
(datetime.now() - timedelta(days=days_back)).timestamp() * 1000
)
print(f"📥 Chargement {symbol} du {datetime.fromtimestamp(start_time/1000)} "
f"au {datetime.fromtimestamp(end_time/1000)}")
try:
snapshots = self.client.get_historical_snapshots(
symbol=symbol,
start_time=start_time,
end_time=end_time,
interval=interval
)
df = self._process_snapshots(snapshots)
print(f"✅ {len(df)} snapshots chargés")
return df
except APIError as e:
print(f"❌ Erreur chargement: {e}")
return pd.DataFrame()
def _process_snapshots(self, snapshots: List[Dict]) -> pd.DataFrame:
"""Transforme les snapshots bruts en DataFrame analysable"""
records = []
for snapshot in snapshots:
record = {
"timestamp": snapshot["timestamp"],
"mid_price": (float(snapshot["bids"][0][0]) +
float(snapshot["asks"][0][0])) / 2,
"spread": float(snapshot["asks"][0][0]) - float(snapshot["bids"][0][0]),
"bid_volume": sum(float(b[1]) for b in snapshot["bids"][:10]),
"ask_volume": sum(float(a[1]) for a in snapshot["asks"][:10]),
"imbalance": self._calc_imbalance(snapshot),
"spread_bps": self._calc_spread_bps(snapshot)
}
records.append(record)
return pd.DataFrame(records)
def _calc_imbalance(self, snapshot: Dict) -> float:
"""Calcule l'imbalance du orderbook"""
bid_vol = sum(float(b[1]) for b in snapshot["bids"][:5])
ask_vol = sum(float(a[1]) for a in snapshot["asks"][:5])
return (bid_vol - ask_vol) / (bid_vol + ask_vol + 1e-10)
def _calc_spread_bps(self, snapshot: Dict) -> float:
"""Calcule le spread en basis points"""
bid = float(snapshot["bids"][0][0])
ask = float(snapshot["asks"][0][0])
mid = (bid + ask) / 2
return ((ask - bid) / mid) * 10000
def backtest_market_making(
self,
df: pd.DataFrame,
spread_threshold: float = 2.0, # bps
inventory_limit: float = 0.1, # BTC max
maker_fee: float = 0.00016
) -> Dict:
"""
Backtest stratégie market-making basique
Stratégie:
- Place des orders acheteur/vendeur de part et d'autre du mid
- Recueille maker fees sur chaque trade
- Limite l'exposition à inventory_limit
"""
trades = []
inventory = 0.0
pnl = 0.0
for i, row in df.iterrows():
if row["spread_bps"] >= spread_threshold:
# Simulation d'un trade maker
trade_value = row["mid_price"] * 0.1 # 0.1 BTC par side
# PnL = maker fee sur les deux sides
pnl += trade_value * maker_fee * 2
# Inventory drift
if i % 2 == 0:
inventory += 0.1
else:
inventory -= 0.1
# Inventory penalty
pnl -= abs(inventory) * row["mid_price"] * 0.0001
# Limite d'inventory
if abs(inventory) > inventory_limit:
inventory = np.sign(inventory) * inventory_limit
if (i + 1) % 10000 == 0:
print(f"Progression: {i+1}/{len(df)} ({100*(i+1)/len(df):.1f}%)")
return {
"total_pnl": pnl,
"final_inventory": inventory,
"num_trades": len(trades),
"avg_daily_pnl": pnl / (len(df) / 1440) if len(df) > 0 else 0,
"sharpe_ratio": self._calc_sharpe(df)
}
def _calc_sharpe(self, df: pd.DataFrame, window: int = 60) -> float:
"""Calcule le Sharpe ratio approximatif"""
if len(df) < window:
return 0.0
returns = df["mid_price"].pct_change().dropna()
return np.sqrt(1440) * returns.mean() / returns.std() if returns.std() > 0 else 0
Utilisation principale
if __name__ == "__main__":
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
backtester = HyperliquidBacktester(API_KEY)
# Test avec données réelles
print("=" * 60)
print("BACKTEST HYPERLIQUID MARKET-MAKING")
print("=" * 60)
df = backtester.load_historical_data(
symbol="BTC-PERP",
days_back=3,
interval="1m"
)
if not df.empty:
results = backtester.backtest_market_making(
df,
spread_threshold=1.5,
inventory_limit=0.5
)
print(f"\n📊 RÉSULTATS DU BACKTEST")
print(f" PnL Total: ${results['total_pnl']:,.2f}")
print(f" Inventaire Final: {results['final_inventory']:.4f} BTC")
print(f" Sharpe Ratio: {results['sharpe_ratio']:.3f}")
print(f" PnL Journalier Moyen: ${results['avg_daily_pnl']:,.2f}")
Monitoring temps réel avec WebSocket
# websocket_client.py - Connexion temps réel L2
import asyncio
import json
import websockets
from datetime import datetime
async def hyperliquid_l2_stream(api_key: str, symbols: list):
"""
Stream temps réel des orderbooks L2 Hyperliquid via WebSocket.
Latence typique: <50ms avec HolySheep
"""
ws_url = "wss://stream.holysheep.ai/v1/hyperliquid/ws"
async with websockets.connect(ws_url) as ws:
# Authentification
await ws.send(json.dumps({
"type": "auth",
"api_key": api_key
}))
auth_response = await ws.recv()
print(f"Auth: {auth_response}")
# Souscriptions
subscribe_msg = {
"type": "subscribe",
"channels": ["orderbook"],
"symbols": symbols,
"depth": 20
}
await ws.send(json.dumps(subscribe_msg))
print(f"📡 Stream connecté pour {symbols}")
# Boucle de réception
msg_count = 0
start_time = asyncio.get_event_loop().time()
async for message in ws:
data = json.loads(message)
if data["type"] == "orderbook_snapshot":
# Nouveau snapshot complet
print(f"\n🆕 SNAPSHOT {data['symbol']}")
print(f" Mid: ${float(data['bids'][0][0] + data['asks'][0][0])/2:,.2f}")
print(f" Spread: {data['spread_bps']:.2f} bps")
print(f" Imbalance: {data['imbalance']:.3f}")
elif data["type"] == "orderbook_update":
# Mise à jour incrémentale
update_time = asyncio.get_event_loop().time()
latency = (update_time - data["server_time"]) * 1000
msg_count += 1
if msg_count % 100 == 0:
elapsed = update_time - start_time
print(f"\n📈 Stats (msg {msg_count}):")
print(f" Latence moy: {latency:.1f}ms")
print(f" Throughput: {msg_count/elapsed:.1f} msg/s")
Exécution
if __name__ == "__main__":
import sys
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
SYMBOLS = ["BTC-PERP", "ETH-PERP"]
try:
asyncio.run(hyperliquid_l2_stream(API_KEY, SYMBOLS))
except KeyboardInterrupt:
print("\n⏹ Stream arrêté")
except Exception as e:
print(f"❌ Erreur: {e}")
Comparatif des solutions API Hyperliquid L2
| Caractéristique | HolySheep Tardis | CCXT Pro | DefiLlama API | Diy (Node) |
|---|---|---|---|---|
| Latence moyenne | <50ms ✓ | 80-150ms | 200-400ms | Variable (500ms+) |
| Prix/requête | ~$0.001 | $0.005 | Gratuit (limité) | Gratuit (infra) |
| Historique dispo | 90 jours | 30 jours | 7 jours | Dépend de vous |
| Granularité L2 | 1 seconde | 5 secondes | Non disponible | Configurable |
| Support WebSocket | ✓ Native | ✓ Native | ✗ | ✗ |
| Paiement CN | WeChat/Alipay ✓ | Carte uniquement | N/A | N/A |
| Mode sandbox | ✓ Inclus | ✓ Inclus | ✗ | ✓ Configurable |
| Taux de change | ¥1 = $1 ✓ | $ uniquement | $ uniquement | N/A |
Pour qui / pour qui ce n'est pas fait
✅ Ce tutoriel est fait pour :
- Les traders quantitatifs souhaitant backtester des stratégies sur Hyperliquid perpétuels
- Les développeurs DeFi intégrant des données L2 dans leurs applications
- Les market makers nécessitant des données temps réel fiables
- Les chercheurs en finance quantitative nécessitant des données historiques propres
- Les utilisateursPreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreferencePreference