@idexio/idex-sdk v2.3.0
API
Table of Contents
- Clients
- Enums
- Requests
- Responses
- response.Asset
- response.Balance
- response.Candle
- response.Deposit
- response.ExchangeInfo
- response.Fill
- response.Market
- response.Order
- response.OrderBookLevel1
- response.OrderBookLevel2
- response.OrderBookPriceLevel
- response.OrderFill
- response.Ping
- response.Ticker
- response.Time
- response.Trade
- response.User
- response.Wallet
- response.WebSocketToken
- response.Withdrawal
- WebSocket Responses
- WebsocketTokenManager
- ConnectListener
- request.FindBalances
- constructor
- subscribeAuthenticated
- subscribeUnauthenticated
- request.FindMarkets
- webSocketResponse.Subscriptions
- RawResponseMessage
- OrderBookPrice
- OrderBookSize
- OrderBookNumOrders
- autoDispatchEnabled
Clients
PublicClient
Public API client
import * as idex from '@idexio/idex-node';
// Edit the values below for your environment
const config = {
baseURL: 'https://api-sandbox.idex.io/v1',
apiKey:
'MTQxMA==.MQ==.TlRnM01qSmtPVEF0TmpJNFpDMHhNV1ZoTFRrMU5HVXROMlJrTWpRMVpEUmlNRFU0',
};
const publicClient = new idex.PublicClient(config.baseURL);
// Optionally provide an API key to increase rate limits
const publicClientWithApiKey = new idex.PublicClient(
config.baseURL,
config.apiKey,
);
Parameters
ping
Test connectivity to the REST API
Returns Promise<{: never}>
getServerTime
Get the current server time
Returns Promise<number> Milliseconds since UNIX epoch
getExchangeInfo
Get basic exchange info
Returns Promise<response.ExchangeInfo>
getAssets
Get comprehensive list of assets
Returns Promise<Array<response.Asset>>
getMarkets
Get currently listed markets
Parameters
findMarkets
FindMarkets
Returns Promise<Array<response.Market>>
getOrderBookLevel1
Get current top bid/ask price levels of order book for a market
Parameters
market
string Base-quote pair e.g. 'IDEX-ETH'
Returns Promise<response.OrderBookLevel1>
getOrderBookLevel2
Get current order book price levels for a market
Parameters
market
string Base-quote pair e.g. 'IDEX-ETH'limit
number Number of bids and asks to return. Default is 50, 0 returns the entire book (optional, default50
)
Returns Promise<response.OrderBookLevel2>
getTickers
Get currently listed markets
Parameters
market
string? Base-quote pair e.g. 'IDEX-ETH', if provided limits ticker data to a single market
Returns Promise<Array<response.Ticker>>
getCandles
Get candle (OHLCV) data for a market
Parameters
findCandles
FindCandles
Returns Promise<Array<response.Candle>>
getTrades
Get public trade history for a market
Parameters
findTrades
request.FindTrades
Returns Promise<Array<response.Trade>>
AuthenticatedClient
Authenticated API client
import * as idex from '@idexio/idex-node';
// Edit the values below for your environment
const config = {
baseURL: 'https://api-sandbox.idex.io/v1',
apiKey:
'MTQxMA==.MQ==.TlRnM01qSmtPVEF0TmpJNFpDMHhNV1ZoTFRrMU5HVXROMlJrTWpRMVpEUmlNRFU0',
apiSecret: 'axuh3ywgg854aq7m73oy6gnnpj5ar9a67szuw5lclbz77zqu0j',
walletPrivateKey: '0x3141592653589793238462643383279502884197169399375105820974944592'
};
const authenticatedClient = new idex.AuthenticatedClient(
config.baseURL,
config.apiKey,
config.apiSecret,
);
Parameters
cancelOrder
Cancel a single order
Parameters
Returns Promise<response.Order>
cancelOrders
Cancel multiple orders
Parameters
cancelOrders
request.CancelOrderssign
function (hash: string): Promise<string>order
string
Returns Promise<Array<response.Order>>
getBalances
Get asset quantity data (positions) held by a wallet on the exchange
Parameters
Returns Promise<Array<response.Balance>>
getDeposit
Get a deposit
Parameters
findDeposit
request.FindDeposit
Returns Promise<response.Deposit>
getDeposits
Get multiple deposits
Parameters
findDeposits
request.FindDeposits
Returns Promise<Array<response.Deposit>>
getFill
Get a fill
Parameters
findFill
request.FindFill
Returns Promise<response.Fill>
getFills
Get multiple fills
Parameters
findFills
request.FindFills
Returns Promise<Array<response.Fill>>
getOrder
Get an order
Parameters
findOrder
request.FindOrder
Returns Promise<response.Order>
getOrders
Get multiple orders
Parameters
findOrders
request.FindOrders
Returns Promise<Array<response.Order>>
getUser
Get account details for the API key’s user
Parameters
nonce
string UUIDv1
Returns Promise<response.User>
getWallets
Get account details for the API key’s user
Parameters
nonce
string UUIDv1
Returns Promise<Array<response.Wallet>>
getWithdrawal
Get a withdrawal
Parameters
findWithdrawal
request.FindWithdrawal
Returns Promise<response.Withdrawal>
getWithdrawals
Get multiple withdrawals
Parameters
findWithdrawals
request.FindWithdrawals
Returns Promise<Array<response.Withdrawal>>
placeOrder
Place a new order
Example:
await authenticatedClient.placeOrder(
orderObject, // See type
sign: idex.getPrivateKeySigner(config.walletPrivateKey),
);
Parameters
order
request.Ordersign
function Sign hash function implementation. Possbile to use built-ingetPrivateKeySigner('YourPrivateKey')
Returns Promise<response.Order>
placeTestOrder
Test new order creation, validation, and trading engine acceptance, but no order is placed or executed
Example:
await authenticatedClient.placeTestOrder(
orderObject, // See type
sign: idex.getPrivateKeySigner(config.walletPrivateKey),
);
Parameters
order
request.Ordersign
function Sign hash function implementation. Possbile to use built-ingetPrivateKeySigner('YourPrivateKey')
Returns Promise<response.Order>
withdraw
Create a new withdrawal
Example:
await authenticatedClient.withdraw(
withdrawalObject, // See type
sign: idex.getPrivateKeySigner(config.walletPrivateKey),
);
Parameters
withdrawal
request.Withdrawalsign
function Sign hash function implementation. Possbile to use built-ingetPrivateKeySigner('YourPrivateKey')
Returns Promise<response.Withdrawal>
getWsToken
Obtain a WebSocket API token
Parameters
Enums
Sets of named constants used as field types for several requests and responses
CandleInterval
Type: string
1m
Type: string
5m
Type: string
15m
Type: string
30m
Type: string
1h
Type: string
6h
Type: string
1d
Type: string
EthTransactionStatus
Type: string
pending
Either not yet submitted or not yet mined
Type: string
mined
Mined, no need for any block confirmation delay
Type: string
failed
Transaction reverted
Type: string
Liquidity
Type: string
maker
Maker provides liquidity
Type: string
taker
Taker removes liquidity
Type: string
MarketStatus
Type: string
inactive
No orders or cancels accepted
Type: string
cancelsOnly
Cancels accepted but not trades
Type: string
active
Trades and cancels accepted
Type: string
OrderSelfTradePrevention
Type: string
dc
Decrement And Cancel (DC) - When two orders from the same user cross, the smaller order will be canceled and the larger order size will be decremented by the smaller order size. If the two orders are the same size, both will be canceled.
Type: string
co
Cancel Oldest (CO) - Cancel the older (maker) order in full
Type: string
cn
Cancel Newest (CN) - Cancel the newer, taker order and leave the older, resting order on the order book. This is the only valid option when time-in-force is set to fill or kill
Type: string
cb
Cancel Both (CB) - Cancel both orders
Type: string
OrderSide
Type: string
buy
Type: string
sell
Type: string
OrderStateChange
Type: string
new
An order without a stop has been accepted into the trading engine. Will not be sent as a discrete change event if the order matches on execution.
Type: string
activated
A stop order has accepted into the trading engine, once triggered, will go through other normal events starting with new
Type: string
fill
An order has generated a fill, both on maker and taker sides. Will be the first change event sent if an order matches on execution.
Type: string
cancelled
An order is cancelled by the user.
Type: string
expired
LIMIT FOK orders with no fill, LIMIT IOC or MARKET orders that partially fill, GTT orders past time.
Type: string
OrderStatus
Type: string
active
Stop order exists on the order book
Type: string
open
Limit order exists on the order book
Type: string
partiallyFilled
Limit order has completed fills but has remaining open quantity
Type: string
filled
Limit order is completely filled and is no longer on the book; market order was filled
Type: string
cancelled
Limit order was cancelled prior to execution completion but may be partially filled
Type: string
rejected
Order was rejected by the trading engine
Type: string
expired
GTT limit order expired prior to execution completion but may be partially filled
Type: string
testOnlyAccepted
Order submitted to the test endpoint and accepted by the trading engine, not executed
Type: string
testOnlyRejected
Order submitted to the test endpoint and rejected by validation or the trading engine, not executed
Type: string
OrderTimeInForce
Type: string
gtc
Good until cancelled (default)
Type: string
gtt
Good until time
Type: string
ioc
Immediate or cancel
Type: string
fok
Fill or kill
Type: string
OrderType
Type: string
market
Type: string
limit
Type: string
limitMaker
Type: string
stopLoss
Type: string
stopLossLimit
Type: string
takeProfit
Type: string
takeProfitLimit
Type: string
Requests
request.CancelOrders
Type: Object
Properties
nonce
string UUIDv1wallet
stringorderId
string? Single orderId or clientOrderId to cancel; prefix client-provided ids with client:market
string? Base-quote pair e.g. 'IDEX-ETH'
request.FindCandles
Type: Object
Properties
market
string Base-quote pair e.g. 'IDEX-ETH'interval
CandleInterval Time interval for datastart
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000
request.FindDeposit
Type: Object
Properties
request.FindDeposits
Type: Object
Properties
nonce
string UUIDv1wallet
stringasset
string? Asset by symbolstart
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000fromId
string? Fills created at the same timestamp or after fillId
request.FindFill
Type: Object
Properties
request.FindFills
Type: Object
Properties
nonce
string UUIDv1wallet
string Ethereum wallet addressmarket
string Base-quote pair e.g. 'IDEX-ETH'start
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000fromId
string? Fills created at the same timestamp or after fillId
request.FindOrder
Type: Object
Properties
nonce
string UUIDv1wallet
stringorderId
string Single orderId or clientOrderId to cancel; prefix client-provided ids with client:
request.FindOrders
Type: Object
Properties
nonce
string UUIDv1wallet
stringmarket
string? Base-quote pair e.g. 'IDEX-ETH'closed
boolean? false only returns active orders on the order book; true only returns orders that are no longer on the order book and resulted in at least one fill; only applies if orderId is absentstart
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000fromId
string? orderId of the earliest (oldest) order, only applies if orderId is absent
request.FindTrades
Type: Object
Properties
market
string Base-quote pair e.g. 'IDEX-ETH'start
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000fromId
string? Trades created at the same timestamp or after fromId
request.FindWithdrawal
Type: Object
Properties
request.FindWithdrawals
Type: Object
Properties
nonce
string UUIDv1wallet
stringasset
string? Asset by symbolassetContractAddress
string? Asset by contract addressstart
number? Starting timestamp (inclusive)end
number? Ending timestamp (inclusive)limit
number? Max results to return from 1-1000fromId
string? Withdrawals created after the fromId
request.Order
Type: Object
Properties
nonce
string UUIDv1wallet
stringmarket
string Base-quote pair e.g. 'IDEX-ETH'type
OrderTypeside
OrderSidetimeInForce
OrderTimeInForce? Defaults to good until canceledquantity
string? Order quantity in base terms, exclusive with quoteOrderQuantityquoteOrderQuantity
string? Order quantity in quote terms, exclusive with quantityprice
string? Price in quote terms, optional for market ordersclientOrderId
ustring? Client-supplied order idstopPrice
string? Stop loss or take profit price, only if stop or take orderselfTradePrevention
OrderSelfTradePrevention? Defaults to decrease and cancelcancelAfter
number? Timestamp after which a standing limit order will be automatically cancelled; gtt tif only
request.Withdrawal
Type: Object
Properties
nonce
string UUIDv1wallet
stringasset
string? Asset by symbolassetContractAddress
string? Asset by contract addressquantity
string Withdrawal amount in asset terms, fees are taken from this value
Responses
response.Asset
Asset
Type: Object
Properties
id
number Internal id of the assetname
stringsymbol
stringcontractAddress
stringdecimals
stringdepositMinimum
stringtradeMinimum
stringwithdrawalMinimum
string
response.Balance
Balance
Type: Object
Properties
asset
string Asset symbolquantity
string Total quantity of the asset held by the wallet on the exchangeavailableForTrade
string Quantity of the asset available for trading; quantity - lockedlocked
string Quantity of the asset held in trades on the order bookusdValue
string Total value of the asset held by the wallet on the exchange in USD
response.Candle
Candle (OHLCV) data points aggregated by time interval
Type: Object
Properties
start
number Time of the start of the intervalopen
string Price of the first fill of the interval in quote termshigh
string Price of the highest fill of the interval in quote termslow
string Price of the lowest fill of the interval in quote termsclose
string Price of the last fill of the interval in quote termsvolume
string Total volume of the period in base termssequence
number Fill sequence number of the last trade in the interval
response.Deposit
Asset deposits into smart contract
Type: Object
Properties
depositId
string IDEX-issued deposit identifierasset
string Asset by symbolquantity
string Deposit amount in asset termstxId
string Ethereum transaction hashtxTime
number Timestamp of the Ethereum deposit txconfirmationTime
number Timestamp of credit on IDEX including block confirmations
response.ExchangeInfo
Basic exchange info
Type: Object
Properties
timeZone
string Server time zone, always UTCserverTime
number Current server timeethereumDepositContractAddress
string Ethereum address of the exchange custody contract for depositsethUsdPrice
string Current price of ETH in USDgasPrice
number Current gas price used by the exchange for trade settlement and withdrawal transactions in Gweivolume24hUsd
string Total exchange trading volume for the trailing 24 hours in USDmakerFeeRate
string Maker trade fee ratetakerFeeRate
string Taker trade fee ratemakerTradeMinimum
string Minimum size of an order that can rest on the order book in ETH, applies to both ETH and tokenstakerTradeMinimum
string Minimum order size that is accepted by the matching engine for execution in ETH, applies to both ETH and tokenswithdrawMinimum
string Minimum withdrawal amount in ETH, applies to both ETH and tokens
response.Fill
Fill
Type: Object
Properties
fillId
string Internal ID of fillorderId
string Internal ID of orderclientOrderId
string? Client-provided ID of ordermarket
string Base-quote pair e.g. 'IDEX-ETH'price
string Executed price of fill in quote termsquantity
string Executed quantity of fill in base termsquoteQuantity
string Executed quantity of trade in quote termsmakerSide
OrderSide Which side of the order the liquidity maker was onfee
string Fee amount on fillfeeAsset
string Which token the fee was taken ingas
stringside
OrderSideliquidity
Liquiditytime
string Fill timestampsequence
string Last trade sequence number for the markettxId
string? Ethereum transaction id, if availabletxStatus
string Eth Tx Status
response.Market
Market
Type: Object
Properties
market
string Base-quote pair e.g. 'IDEX-ETH'status
MarketStatusbaseAsset
string e.g. 'IDEX'baseAssetPrecision
numberquoteAsset
string e.g. 'ETH'quoteAssetPrecision
numbermakerFeeRate
stringtakerFeeRate
stringorderTypes
Array<OrderType>tradeMinimum
string Minimum quantity in base terms
response.Order
Order
Type: Object
Properties
market
string Market symbol as base-quote pair e.g. 'IDEX-ETH'orderId
string Exchange-assigned order identifierclientOrderId
string? Client-specified order identifierwallet
string Ethereum address of placing wallettime
string Time of initial order processing by the matching enginestatus
OrderStatus Current order statuserrorCode
string? Error short code explaining order error or failed batch cancelerrorMessage
string? Error description explaining order error or failed batch canceltype
OrderType Order typeside
OrderSide Order sideoriginalQuantity
string? Original quantity specified by the order in base terms, omitted for market orders specified in quote termsoriginalQuoteQuantity
string? Original quantity specified by the order in quote terms, only present for market orders specified in quote termsexecutedQuantity
string Quantity that has been executed in base termscumulativeQuoteQuantity
string Cumulative quantity that has been spent (buy orders) or received (sell orders) in quote terms, omitted if unavailable for historical ordersavgExecutionPrice
string? Weighted average price of fills associated with the order; only present with fillsprice
string? Original price specified by the order in quote terms, omitted for all market ordersstopPrice
string? Stop loss or take profit price, only present for stopLoss, stopLossLimit, takeProfit, and takeProfitLimit orderstimeInForce
OrderTimeInForce? Time in force policy, see values, only present for all limit orders specifying a non-default (gtc) policyselfTradePrevention
OrderSelfTradePrevention? Self-trade prevention policy, see values, only present for orders specifying a non-default (dc) policynull-null
Array<response.OrderFill> Array of order fill objects
response.OrderBookLevel1
OrderBookLevel1
Type: Object
Properties
bids
[response.OrderBookPriceLevel]asks
[response.OrderBookPriceLevel]
response.OrderBookLevel2
OrderBookLevel2
Type: Object
Properties
response.OrderBookPriceLevel
OrderBookPriceLevel
Type: [OrderBookPrice, OrderBookSize, OrderBookNumOrders]
response.OrderFill
OrderFill
Type: Object
Properties
fillId
string Internal ID of fillprice
string Executed price of fill in quote termsquantity
string Executed quantity of fill in base termsquoteQuantity
string Executed quantity of trade in quote termsmakerSide
OrderSide Which side of the order the liquidity maker was onfee
string Fee amount on fillfeeAsset
string Which token the fee was taken ingas
string?liquidity
Liquiditytime
string Fill timestampsequence
number Last trade sequence number for the markettxId
string? Ethereum transaction id, if availabletxStatus
string Eth Tx Status
response.Ping
Ping
Type: Object
response.Ticker
Ticker
Type: Object
Properties
market
string Base-quote pair e.g. 'IDEX-ETH'percentChange
string % change from open to closebaseVolume
string 24h volume in base termsquoteVolume
string 24h volume in quote termslow
string? Lowest traded price in the period in quote termshigh
string? Highest traded price in the period in quote termsbid
string? Best bid price on the order bookask
string? Best ask price on the order bookopen
string? Price of the first trade for the period in quote termsclose
string? Same as lastcloseQuantity
string? Quantity of the last period in base termstime
number Time when data was calculated, open and change is assumed to be trailing 24hnumTrades
number Number of fills for the market in the periodsequence
number? Last trade sequence number for the market
response.Time
Time
Type: Object
Properties
time
number Current server time
response.Trade
Trade
Type: Object
Properties
fillId
string Internal ID of fillprice
string Executed price of trade in quote termsquantity
string Executed quantity of trade in base termsquoteQuantity
string Executed quantity of trade in quote termstime
number Fill timestampmakerSide
OrderSide Which side of the order the liquidity maker was onsequence
number Last trade sequence number for the market
response.User
User
Type: Object
Properties
depositEnabled
boolean Deposits are enabled for the user accountorderEnabled
boolean Placing orders is enabled for the user accountcancelEnabled
boolean Cancelling orders is enabled for the user accountwithdrawEnabled
boolean Withdrawals are enabled for the user accountkycTier
number Approved KYC tier; 0, 1, 2totalPortfolioValueUsd
string Total value of all holdings deposited on the exchange, for all wallets associated with the user account, in USDwithdrawalLimit
string 24-hour withdrawal limit in USD, or unlimited, determined by KYC tierwithdrawalRemaining
string Currently withdrawable amount in USD, or unlimited, based on trailing 24 hour withdrawals and KYC tiermakerFeeRate
string User-specific maker trade fee ratetakerFeeRate
string User-specific taker trade fee rate
response.Wallet
Type: Object
Properties
address
string Ethereum address of the wallettotalPortfolioValueUsd
string Total value of all holdings deposited on the exchange for the wallet in USDtime
number Timestamp of association of the wallet with the user account
response.WebSocketToken
Type: Object
Properties
token
string WebSocket subscription authentication token
response.Withdrawal
Type: Object
Properties
withdrawalId
string Exchange-assigned withdrawal identifierasset
string? Symbol of the withdrawn asset, exclusive with assetContractAddressassetContractAddress
string? Token contract address of withdrawn asset, exclusive with assetquantity
string Quantity of the withdrawaltime
number Timestamp of withdrawal API requestfee
string Amount deducted from withdrawal to cover IDEX-paid gastxId
string? Ethereum id of the withdrawal transactiontxStatus
string Status of the withdrawal settlement transaction
WebSocket Responses
webSocketResponse.Error
Error Response
Type: Object
Properties
WebsocketTokenManager
https://docs.idex.io/#websocket-authentication-endpoints
const wsTokenStore = new WebsocketTokenManager(wallet => client.getWsToken(uuidv1(), wallet))
const token = await wsTokenStore.getToken("0x123abc...");
wsClient.subscribe([{ name: 'balance', wallet: '0x0'}], token);
Parameters
websocketAuthTokenFetch
WebsocketTokenFetch
ConnectListener
WebSocket API client
import * as idex from '@idexio/idex-node';
const config = {
baseURL: 'wss://ws.idex.io',
shouldReconnectAutomatically: true,
}
const webSocketClient = new idex.WebSocketClient(
config.baseURL,
// Optional, but required for authenticated wallet subscriptions
wallet => authenticatedClient.getWsToken(uuidv1(), wallet),
config.shouldReconnectAutomatically,
);
await webSocketClient.connect();
Type: function (): any
request.FindBalances
Type: Object
Properties
constructor
Create a WebSocket client
Parameters
baseURL
string Base URL of websocket APIwebsocketAuthTokenFetch
function Authenticated Rest API client fetch token call (/wsToken
) SDK Websocket client will then automatically handle Websocket token generation and refresh. You can omit this when using only public websocket subscription. Examplewallet => authenticatedClient.getWsToken(uuidv1(), wallet)
See API specificationshouldReconnectAutomatically
(optional, defaultfalse
)
subscribeAuthenticated
Strictly typed subscribe which only can be used on authenticated subscriptions.
For this methods you need to pass websocketAuthTokenFetch
to the websocket constructor.
Library will automatically refresh user's wallet auth tokens for you.
Parameters
subscriptions
Array<types.webSocket.AuthenticatedSubscription>
Returns void
subscribeUnauthenticated
Subscribe which only can be used on non-authenticated subscriptions
Parameters
subscriptions
Array<types.webSocket.UnauthenticatedSubscription>
Returns void
request.FindMarkets
Type: Object
Properties
market
string Target market, all markets are returned if omittedregionOnly
boolean? true only returns markets available in the geographic region of the requestdepositId
string
webSocketResponse.Subscriptions
Subscriptions Response
Type: Object
Properties
RawResponseMessage
Response message without transformation to human readable form
Type: webSocketSubscriptionMessages.SubscriptionMessageShort
OrderBookPrice
OrderBookPrice
Type: string
OrderBookSize
OrderBookSize
Type: string
OrderBookNumOrders
OrderBookNumOrders
Type: string
autoDispatchEnabled
Currently has no effect
Type: boolean
Contracts
View the provided contract for a corresponding Solidity implementation of order signature verification.
3 days ago
6 days ago
6 days ago
6 days ago
6 days ago
11 days ago
12 days ago
13 days ago
14 days ago
13 days ago
15 days ago
24 days ago
24 days ago
24 days ago
24 days ago
24 days ago
24 days ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago