From d8402ddfbeecc369c78001d0e289e7a833f0aa8b Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Fri, 3 Jan 2014 23:58:27 +0100 Subject: [PATCH 001/110] Update README.md --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 26396865..edd76cc5 100644 --- a/README.md +++ b/README.md @@ -126,20 +126,19 @@ This example uses the OAuth2 Ruby gem. ``` require 'oauth2' -client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://bitcoin-central.net') +client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://staging.bitcoin-central.net', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') -client.auth_code.authorize_url(redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', scope: 'read trade') - => "https://bitcoin-central.net/oauth/authorize?response_type=code&client_id=6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=read+trade" +client.auth_code.authorize_url(redirect_uri: 'https://staging.bitcoin-central.net/page/oauth/test', scope: 'basic activity trade withdraw') + => "https://staging.bitcoin-central.net/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.bitcoin-central.net%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" # Visit this URL in your browser, approve the request and copy the authorization code -authorization_code = '...' +authorization_code = '9b55e27c840f59d927284fdc438ee3d8fac94b00e24d331162ddff76c1a6bcc0' -token = client.auth_code.get_token(authorization_code, redirect_uri: 'urn:ietf:wg:oauth:2.0:oob') +token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://staging.bitcoin-central.net/page/oauth/test') -token.get('/api/v1/trade_orders/active').body - -=> [{"uuid":"148ab996-ab63-45cc-b240-99c78bb18a11","instructed_amount":300.0,"amount":268.70563158,"state":"active","created_at":"2013-02-07T19:09:44+01:00","updated_at":"2013-02-14T13:12:00+01:00","price":15.9199,"type":"buy"}] +token.get('/api/v1/user').body +=> {"name":"BC-U537315","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} ``` If you encounter SSL certificate errors while trying this example it's probably because your Ruby install doesn't know where to find the CA certificates. In development you can use an incredibly ugly hack to temporarily skip SSL certificate validation : `OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE`. You should never do this in production. From 484c83398a98122cbd25472b2565c400ad7e8def Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 7 Jan 2014 16:07:07 +0100 Subject: [PATCH 002/110] Updating docs. --- README.md | 1866 +++++++++-------------------------------------------- 1 file changed, 320 insertions(+), 1546 deletions(-) diff --git a/README.md b/README.md index edd76cc5..25dd441a 100644 --- a/README.md +++ b/README.md @@ -1,151 +1,38 @@ -![Paytuna logo](https://bitcoin-central.net/paytunia.png) +The Bitcoin-Central API allows developers to extend the capabilities of Bitcoin-Central, from reading the latest ticker to automating trades with bots. -This document describes the API calls available as part of the Paytunia v1 API. +Is is possible to, among other things: -The API is shared by both [Bitcoin-Central.net](https://bitcoin-central.net) and [Paytunia.com](https://paytunia.com). Both apps run against the same database, therefore using the API against one of them is equivalent to using the API against the other. +* Access public data (ticker, asks, bids, trades, etc...) +* Authenticate users with their permission using OAuth2 * +* Access authenticated user balances, trades, and other data * +* Automate trading * -If your language of choice is Ruby we recommend using the [Paytunia gem](https://github.com/paytunia/paytunia) instead of writing your own client. +_* Authenticating users is only available to developers that have a fully verified and approved Bitcoin-Central account. On the other hand, public data is available to everyone_ ## Table of contents -- [**General API description**](#general-api-description) -

- - [Authentication](#authentication) - - [Base URL](#base-url) - - [Formats and required HTTP request headers](#formats-and-required-http-request-headers) - - [Rate-limiting](#rate-limiting) - - [Pagination](#pagination) - - [HTTP response header](#http-response-header) - - [Controlling pagination](#controlling-pagination) - - [Localization](#localization) - - [Error handling](#error-handling) - - [Successful calls](#successful-calls) - -

- -- [**API Calls**](#api-calls) -

- - [Account](#account) - - [Get balances (A)](#get-balances-a) -

- - [Account operations](#account-operations) - - [Get the detail of an account operation (A)](#get-the-details-of-an-account-operation-a) - - [Get a list of account operations (A,P)](#get-a-list-of-account-operations-ap) -

- - [Send money](#send-money) - - [Send Bitcoins (A)](#send-bitcoins-a) - - [Send money to an e-mail address (A)](#send-money-to-an-e-mail-address-a) -

- - [Quotes](#quotes) - - [Create a quote (A)](#create-a-quote-a) - - [View a quote (A)](#view-a-quote-a) - - [List quotes (A,P)](#list-quotes) - - [Pay a quote (A)](#pay-a-quote-a) - - [Execute a quote (A)](#execute-a-quote-a) -

- - [Invoices](#invoices) - - [View an invoice (A)](#view-an-invoice-a) - - [View an invoice (Public)](#view-an-invoice-public) - - [List invoices (A,P)](#list-invoices-ap) - - [Create an invoice (A)](#create-an-invoice-a) - - [Payment buttons and creation through signed GET request](#payment-buttons-and-creation-through-signed-get-request) - - [Payment callbacks](#payment-callbacks) -

- - [Trading](#trading) - - [Place an order (A)](#place-an-order-a) - - [Cancel an order (A)](#cancel-an-order-a) - - [View trades for an order (A)](#view-trades-for-an-order-a) - - [View an order (A)](#view-an-order-a) - - [List active orders (A,P)](#list-active-orders-ap) - - [List all orders (A,P)](#list-all-orders-ap) - - [Read the ticker](#read-the-ticker) - - [Read the market depth](#read-the-market-depth) - - [Read historical trades](#read-historical-trades-p) -

- - [Coupons](#coupons) - - [Create a coupon (A)](#create-a-coupon-a) - - [View a coupon](#view-a-coupon) - - [Redeem a coupon (A)](#redeem-a-coupon-a) - -

- - - [**Appendix**](#appendix) - - [Codes and types tables](#codes-and-types-tables) - - [Currencies](#currencies) - - [Operation types](#operation-types) - - - [States](#states) - - [Transfer (Bitcoin transfer, Wire transfers) statuses](#transfer-bitcoin-transfer-wire-transfer-statuses) - - [Coupon statuses](#coupon-statuses) - - [E-mail transfer statuses](#e-mail-transfer-statuses) - - [Invoice statuses](#invoice-statuses) - - [Trade order statuses](#trade-order-statuses) - - -# General API description - -## Authentication - -Calls that require authentication are marked with "A" in the call description title. - -Authentication and authorization may be done with : - - - HTTP Basic - - [OAuth2](http://oauth.net/2/) - -OAuth2 is useful when it is not desirable for client apps to handle the user's credentials directly or when it is necessary to have access to an account with limited privileges. - -Each API call description mentions the OAuth2 scope required to use it. - -The available OAuth2 scopes are : - -| Scope | Description | -|----------|------------------------------------------------------------------------------------| -| read | Read transaction history, balances and profile information | -| withdraw | Perform API calls that result in money being sent or withdrawn from the account | -| trade | Manage trade orders (create, read, cancel) | -| merchant | Manage invoices, read merchant dashboard and data | -| devices | Manage devices | - -In order to test OAuth2 integration a test app is available. - -| Application parameter | Value | -|-----------------------|--------------------------------------------------------------------| -| Application ID | `6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b` | -| Application secret | `55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798` | -| Callback URL | `urn:ietf:wg:oauth:2.0:oob` | - -After authorization the authorization token will be directly displayed in your browser (that's what the special test callback URL is for). - -**Example authorization link :** [https://bitcoin-central.net/oauth/authorize?client_id=6...pe=code](https://bitcoin-central.net/oauth/authorize?client_id=6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code) - -**Full usage example :** +* [**General information**](#general-information) + * [Formats and required HTTP request headers](#formats-and-required-http-request-headers) + * [Rate-limiting](#rate-limiting) -This example uses the OAuth2 Ruby gem. - -``` -require 'oauth2' - -client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://staging.bitcoin-central.net', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') - -client.auth_code.authorize_url(redirect_uri: 'https://staging.bitcoin-central.net/page/oauth/test', scope: 'basic activity trade withdraw') - => "https://staging.bitcoin-central.net/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.bitcoin-central.net%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" - -# Visit this URL in your browser, approve the request and copy the authorization code +* [**Public data**](#public-data) + * [Ticker](#ticker) + * [Latest trades](#latest-trades) + * [Market depth](#market-depth) -authorization_code = '9b55e27c840f59d927284fdc438ee3d8fac94b00e24d331162ddff76c1a6bcc0' +* [**User data**](#user-data) + * [Authentication](#authentication) + * [User info](#user-info) + * [User activity](#user-activity) + * [Trading](#trading) + * [Withdrawing](#withdrawing) -token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://staging.bitcoin-central.net/page/oauth/test') +* [**Appendix**](#appendix) + * [Currencies](#currencies) + * [States](#states) + * [Ruby example](#ruby-example) -token.get('/api/v1/user').body -=> {"name":"BC-U537315","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} -``` - -If you encounter SSL certificate errors while trying this example it's probably because your Ruby install doesn't know where to find the CA certificates. In development you can use an incredibly ugly hack to temporarily skip SSL certificate validation : `OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE`. You should never do this in production. - -## Base URL - -The base URL for all calls is `https://bitcoin-central.net`. A complete URL would look like this `https://bitcoin-central.net/api/v1/quotes/3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d`. +## General information ## Formats and required HTTP request headers @@ -163,1519 +50,406 @@ API calls are rate-limited by IP to 5000 calls per day. Information about the st X-Ratelimit-Remaining: 4982 Date: Wed, 30 Jan 2013 12:08:58 GMT +## Public data -## Pagination - -Some API calls returning collections may be paginated. In this case the call description title mentions it. - -Calls that return paginated data are marked with "P" in the call description title. - -### HTTP response header - -Calls that return paginated collections will add a `Pagination` HTT header to the response. It will contain a pagination meta-data JSON object. - -**Pagination header example** - - { - // Whether the current page is the first of the collection - "first_page": true, - - // Total amount of available pages - "total_pages": 1, - - // Previous page number - "previous_page": null, - - // Total number of items in the collection - "total": 1, - - // Next page number - "next_page": null, - - // Whether the current page is the last available one - "last_page": true, - - // Record collection offset - "offset": 0 - } - -### Controlling pagination - -Optional pagination parameters may be passed in the request URI in order to control the way the collection gets paginated. If parameters are incorrect a HTTP 400 Bad request status is returned along with an empty body. - -| Parameter | Default | Acceptable values | -|-----------|---------|--------------------------------| -| page | 1 | Positive integer >0 | -| per_page | 20 | Positive integer >=5 and <=100 | - -## Localization - -The relevant results and error messages will be localized to the language associated to the user, currently English and French are supported. - -## Datetime formats +Public data (ticker, asks, bids, trades) can be accessed without registering an application. -Datetime values will be returned as regular JSON format and Unix timestamps, the timestamps are suffixed with `_int`. +### Ticker -## Error handling +##### Description -Whenever an error is encountered, the answer to a JSON API call will have : +Read the latest ticker data. - * An HTTP 422 status (Unprocessable entity) or HTTP 400 (Bad request), - * A JSON array of localized error messages as body +##### Endpoint -## Successful calls +| method | path | authorization | +|--------|-------------------------|---------------| +| GET | /api/v1/data/eur/ticker | not required | -If the API call was successful, the platform will answer with : +##### Example - * An HTTP 200 status (OK) or HTTP 201 (Created), - * A JSON representation of the entity being created or updated if relevant - - -# API Calls - -## Account - -### Get balances (A) - -This call will return the balances in all currencies. - -This call requires the `read` OAuth2 scope. - -**Request path :** `/api/v1/balances` - -**Request method :** `GET` - -**Request parameters** - -_None_ +```bash +$ curl "https://bitcoin-central.net/api/v1/data/eur/ticker" +``` -**Response** +```json +{ + "high": 720.0, + "low": 640.0001, + "volume": 198.16844745, + "bid": 676.01, + "ask": 679.9999999, + "midpoint": 678.00499995, + "at": 1389092410, + "price": 680.0, + "variation": -5.5556, + "currency": "EUR" +} +``` -A JSON object with the following attributes is returned : +##### Properties -| Name | Type | Description | -|------|----------|-------------| -| EUR | Decimal | EUR balance | -| USD | Decimal | USD balance | -| GBP | Decimal | GBP balance | -| BTC | Decimal | BTC balance | - -**Example request :** `GET /api/v1/balances` +| name | description | example value | +|--------------|----------------------------------------------|---------------------------| +| currency | currency | "EUR" | +| at | timestamp | 1389092410 | +| price | price of latest trade | 680.0 | +| bid | bid price | 676.01 | +| ask | ask price | 679.9999999 | +| midpoint | midpoint price | 678.00499995 | +| volume | 24h volume | 198.16844745 | +| variation | 24h variation (percentage) | -5.5556 | +| high | 24h high price | 720.0 | +| low | 24h low price | 640.0001 | -**Example response :** - - { - "EUR" : 1.0, - "BTC" : 1.42, - "USD" : 0.0, - "GBP" : 0.0 - } - -## Account operations +### Latest trades -An account operation is any ledger operation that changes the account's balance. +##### Description -These calls require the `read` OAuth2 scope. +Read the latest executed trades. -### Get the details of an account operation (A) - -This call will return the details of a single account operation, the response contains : the UUID identifying the operation, the amount of this particular operation, its currency, its creation timestamp, its state (if relevant), a string indicating the type of the operation and the account balance that this operation led to (the sum of all transactions in the same currency including this one but not the ones that came after it). +##### Endpoint -**Request path :** `/api/v1/account_operations/{uuid}` +| method | path | authorization | +|--------|-------------------------|---------------| +| GET | /api/v1/data/eur/trades | not required | -**Request method :** `GET` +##### Example -**Request parameters** +```bash +$ curl "https://bitcoin-central.net/api/v1/data/eur/trades" +``` -| Name | Type | Description | -|------|------|-------------------------------| -| uuid | UUID | UUID of the account operation | +```json +[ + { + "uuid": "59f9c458-cb22-48d6-9103-0b6e54130e29", + "traded_btc": 0.153, + "traded_currency": 102.51, + "created_at": "2014-01-07T11:30:59Z", + "currency": "EUR", + "price": 670.0, + "created_at_int": 1389094259 + }, + { + "uuid": "4787c80b-bc90-48d4-87ee-b23fbff2fbb7", + "traded_btc": 0.06, + "traded_currency": 40.2, + "created_at": "2014-01-07T11:31:00Z", + "currency": "EUR", + "price": 670.0, + "created_at_int": 1389094260 + }, + { + "uuid": "67838a4d-cd2e-47d1-9b3c-0ff7a6d2ea89", + "traded_btc": 0.4, + "traded_currency": 268.0, + "created_at": "2014-01-07T11:31:00Z", + "currency": "EUR", + "price": 670.0, + "created_at_int": 1389094260 + } +] +``` -**Response** +##### Properties -A JSON object with the following attributes is returned : +The response is an array of trades. -| Name | Type | Description | -|------------|----------|---------------------------------------------------| -| uuid | UUID | UUID of the account operation | -| amount | Decimal | Amount of the operation (1) | -| currency | String | Currency of the operation (2) | -| created_at | Datetime | Timestamp of operation creation | -| state | String | Operation state if relevant, `null` otherwise (3) | -| type | String | Operation type (4) | -| balance | Decimal | Balance this operation led to | +##### Trade properties - 1. Credits are expressed as positive amounts, debits are expressed as negative amounts - 2. See currencies table - 3. See states table - 4. See operation types table - -**Example request :** `GET /api/v1/account_operations/3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d` +| name | description | example value | +|-----------------|----------------------------------------------|----------------------------------------| +| uuid | unique ID of trade | "59f9c458-cb22-48d6-9103-0b6e54130e29" | +| currency | currency | "EUR" | +| created_at | date created | "2014-01-07T11:30:59Z" | +| created_at_int | timestamp | 1389094259 | +| price | price per BTC | 670.0 | +| traded_btc | amount of BTC traded | 0.153 | +| traded_currency | amount of currency traded | 102.51 | -**Example response :** - - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "amount" : 50.0, - "currency" : "EUR", - "created_at" : "2013-01-14T16:28:57Z", - "created_at_int" : 1363858355, - "state" : null, - "type" : "wire_deposit", - "balance" : 550.0 - } - -### Get a list of account operations (A,P) - -This call will return a paginated list of account operations relative to the authenticated account. +### Market depth -**Request path :** `/api/v1/account_operations` +##### Description -**Request method :** `GET` +Read the market depth. Bids and asks are grouped by price. -**Request parameters** +##### Endpoint -_None_ +| method | path | authorization | +|--------|-------------------------|---------------| +| GET | /api/v1/data/eur/depth | not required | -**Response** +##### Example -A JSON array of account operations is returned. The structure collection elements is detailed at "Get the details of an account operation". - -**Example request :** `GET /api/v1/account_operations` - -**Example response :** - - [ - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "amount" : 50.0, - "currency" : "EUR", - "created_at" : "2013-01-14T16:28:57Z", - "created_at_int" : 1363858355, - "state" : null, - "type" : "wire_deposit", - "balance" : 550.0 - }, - { - "uuid" : "b3c08962-4dc3-9ffc-4dc3-3a7bc1b2ff4d", - "amount" : 500.0, - "currency" : "EUR", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "state" : null, - "type" : "wire_deposit", - "balance" : 500.0 - } - ] - -## Send money - -These calls require the `withdraw` OAuth2 scope. - -### Send Bitcoins (A) - -This call will perform a Bitcoin transaction. - -**Request path :** `/api/v1/transfers/send_bitcoins` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|---------|---------|-----------------------------| -| amount | Decimal | Amount to send | -| address | String | Recipient's Bitcoin address | - -**Response** - -An `UUID` is returned after the request is queued for execution. It enables the client to make subsequent status check requests. - -**Example request :** `POST /api/v1/transfers/send_bitcoins` +```bash +$ curl "https://bitcoin-central.net/api/v1/data/eur/depth" +``` +```json +{ + "bids": [ { - "amount" : 10.0, - "address" : "1KfNzSKFAmpC4kNYaGLqj8LGPHxGmRG2nZ" - } - -**Example response :** - + "timestamp": 1389087724, + "amount": 0.89744, + "price": 665.0, + "currency": "EUR" + }, { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d" + "timestamp": 1389082088, + "amount": 0.06, + "price": 666.0, + "currency": "EUR" } - -### Send money to an e-mail address (A) - -This call will move money to the account identified with the given e-mail address. If no such account is found an e-mail gets sent inviting its recipient to create an account, or sign-in to one to retrieve the sent funds. If the amount isn't claimed after a week the funds are returned to the sender. - -**Request path :** `/api/v1/transfers/send_to_email` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|----------|---------|-------------------------------------------| -| amount | Decimal | Amount to send | -| currency | String | Currency in which the amount is expressed | -| address | String | Recipient's e-mail address | - -**Response** - -An `UUID` is returned after the request is queued for execution. It enables the client to make subsequent status check requests. - -**Example request :** `POST /api/v1/transfers/send_bitcoins` - + ], + "asks": [ { - "amount" : 10.0, - "currency" : "EUR", - "address" : "david@bitcoin-central.net" - } - -**Example response :** - + "timestamp": 1389094178, + "amount": 0.57709999, + "price": 679.99, + "currency": "EUR" + }, { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d" + "timestamp": 1389092448, + "amount": 0.20684181, + "price": 680.0, + "currency": "EUR" } + ] +} +``` -## Quotes - -Quotes are a mechanism for clients to send funds or exchange them to other currencies. They provide clients with a guaranteed fixed-rate at which the system will convert their funds before crediting them to their account or send them out. - -The canonical use of a quote is to pay in currency to a Bitcoin invoice, materialized as a QR code : - - 1. User scans Bitcoin QR code - 2. Client app extracts requested Bitcoin amount - 3. Client app requests a quote for this Bitcoin amount to the API and provides the currency in which debit upon quote payment - 4. A guaranteed rate is returned by the API - 5. Client app shows price expressed in the user's currency - 6. After user confirmation the client app instructs the API to pay the quote to a specific Bitcoin address - 7. The merchant receives the payment in Bitcoin and the user is debited in his native currency - -These calls require the `trade` OAuth2 scope, the [Pay a quote](#pay-a-quote-a) action requires the `withdraw` scope. - -### Create a quote (A) - -This call will create a quote. When doing so clients must specify a currency (the other currency is always assumed to be "BTC") an amount they are requesting and a direction. Combining these parameters in various ways will have the system address a wide array of use cases. - -For example a client can request : - - 1. How much BTC would need to be sold to get exactly 10 EUR - 2. How much BTC could be bought with 10 EUR - 3. How much EUR would the sale of 1 BTC get - 4. How much EUR would be required to buy 1 BTC - -To obtain the relevant quote a client would pass the following parameters : - -| Case | Currency | direction | requested\_btc\_amount | requested\_currency\_amount | -|------|----------|-----------|------------------------|-----------------------------| -| 1 | EUR | sell | N/A | 10 | -| 2 | EUR | buy | N/A | 10 | -| 3 | EUR | sell | 1 | N/A | -| 4 | EUR | buy | 1 | N/A | - -**Request path :** `/api/v1/quotes` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|-----------------------------|---------|------------------------------------------------------------------------| -| requested\_currency\_amount | Decimal | Constrain on the currency amount (1) | -| requested\_btc\_amount | Decimal | Constrain on the Bitcoin amount (1) | -| direction | String | Whether the quote should apply to a sale or a purchase of Bitcoins (2) | -| currency | String | Currency in which the requested_amount is expressed | - - 1. Exactly one of the currencies must be constrained, the other parameter may be omitted - 2. Acceptable values are `buy` and `sell` - -**Response** - -A JSON object with the following parameters is returned. If the current market depth or volatility does not allow for a quote to be given an error will be returned. - -| Name | Type | Description | -|-----------------------------|----------|-------------------------------------------------------| -| uuid | UUID | Quote identifier | -| requested\_currency\_amount | Decimal | The instructed currency amount or `null` | -| requested\_btc\_amount | Decimal | The instructed Bitcoin amount or `null` | -| direction | String | The direction you provided | -| currency_amount | Decimal | The quoted currency amount or `null` | -| btc_amount | Decimal | The quoted Bitcoin amount or `null` | -| rate | Decimal | The quoted exchange rate | -| valid_until | Datetime | The timestamp at which this quote will be invalidated | -| created_at | Datetime | The creation date timestamp | -| executed | Boolean | Whether this quote has already been settled or paid | - - -**Example request :** `POST /api/v1/quotes` - -This demonstrates how to obtain a quote as described in the example use case #1. - - { - "requested_amount" : 10.0, - "currency" : "EUR", - "direction" : "sell" - } - -**Example response :** - - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : false - } - -### View a quote (A) - -This call will return a JSON object representing a quote - -**Request path :** `/api/v1/quotes/{uuid}` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|------|------|------------------| -| uuid | UUID | Quote identifier | - - -**Response** - -A JSON object with the following parameters is returned. - -| Name | Type | Description | -|-----------------------------|----------|-------------------------------------------------------| -| uuid | UUID | Quote identifier | -| requested\_currency\_amount | Decimal | The instructed currency amount or `null` | -| requested\_btc\_amount | Decimal | The instructed Bitcoin amount or `null` | -| direction | String | The direction you provided | -| currency_amount | Decimal | The quoted currency amount or `null` | -| btc_amount | Decimal | The quoted Bitcoin amount or `null` | -| rate | Decimal | The quoted exchange rate | -| valid_until | Datetime | The timestamp at which this quote will be invalidated | -| created_at | Datetime | The creation date timestamp | -| executed | Boolean | Whether this quote has already been settled or paid | - - -**Example request :** `GET /api/v1/quotes/3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d` - -**Example response :** - - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : false - } - -### List quotes (A,P) - -This call will return a paginated list of quotes for the client account. - -**Request path :** `/api/v1/quotes` - -**Request method :** `GET` - -**Request parameters** - -N/A - -**Response** - -A JSON array of quote objects is returned. - -**Example request :** `GET /api/v1/quotes` - -**Example response :** - - [ - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : true - }, - { - "uuid" : "4dc33a7bc1b2-9b7e-3a7b-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : true - } - ] - -### Pay a quote (A) - -This action applies only to quotes for buying BTC. - -It will perform the exchange creating a user account debit of the calculated `currency_amount` or instructed `requested_currency_amount` and send out the calculated `btc_amount` or instructed `requested_btc_amount` to the Bitcoin address in the `address` field. - -Calling this method queues the quote for payment if possible. The quote status can later be queried using the [view a quote](#view-a-quote-a) call. - -**Request path :** `/api/v1/quotes/{uuid}/pay` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|---------|--------|-----------------------| -| uuid | UUID | Quote identifier | -| address | String | Valid Bitcoin address | - - -**Response** - -The quote as it was when the payment was requested is returned. +##### Properties -**Example request :** `GET /api/v1/quotes/3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d/pay` +| name | description | +|-----------------|----------------------------------------------| +| bids | an array of bids | +| asks | an array of asks | -**Example response :** - - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : false - } +##### Bids / asks properties -### Execute a quote (A) +| name | description | example value | +|-----------------|----------------------------------------------|----------------------------------------| +| currency | currency | "EUR" | +| timestamp | timestamp | 1389087724 | +| price | price | 665.0 | +| amount | amount at price | 0.06 | -This action applies to quotes for buying and selling BTC. It will perform the exchange creating user account debit and credit operations depending on the quote requested. +## User data -Calling this method queues the quote for execution if possible. The quote status can later be queried using the [view a quote](#view-a-quote-a) call. +Before you can access your own data or other users data, you must register an application on Bitcoin-Central: -**Request path :** `/api/v1/quotes/{uuid}/execute` +1. Verify your account and log in +2. Visit [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps) +3. Create an application (set redirect URI to https://bitcoin-central.net/page/oauth/test when testing) -**Request method :** `POST` +### Authentication -**Request parameters** +To access and manipulate user data, you must first request permission from the user. -| Name | Type | Description | -|---------|--------|-----------------------| -| uuid | UUID | Quote identifier | +Authorizations are granted using the standard [OAuth2 protocol](http://oauth.net/2/). +Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). -**Response** +The process of authenticating a user can be summarized as follows: -The quote as it was when the execution was requested is returned. +1. Send the user to your application's authorization URL +2. Receive the authorization code if the user accepted the request +3. Get an access token and a refresh token from the authorization code +4. Refresh the access token when needed -**Example request :** `POST /api/v1/quotes/3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d/execute` +##### Scopes -**Example response :** - - { - "uuid" : "3a7bc1b2-9b7e-4dc3-9ffc-b3c08962ff4d", - "currency" : "EUR", - "direction" : "sell", - "rate" : 10.65 - "currency_amount" : null, - "btc_amount" : 0.93896714 - "requested_currency_amount" : 10, - "requested_btc_amount" : null, - "valid_until" : "2013-01-10T13:00:50Z", - "created_at" : "2013-01-10T12:45:50Z", - "created_at_int" : 1363858355, - "executed" : false - } +Before you request authorization to access a user's account, you must decide which scopes you would like to access. -## Invoices +The following scopes are available: -Invoices are requests for payment. They can be expressed in any arbitrary currency. They all get a unique Bitcoin payment address assigned and a Bitcoin amount calculated from the requested currency amount. +| name | description | +|----------------|---------------------------------------------------------------------------| +| basic (default)| Read account number, language, and balances | +| activity | Read trade orders, deposits, widthdrawals | +| trade | Create and cancel trade orders | +| withdraw | Request EUR and BTC withdrawals (requires email confirmations from users) | -Payment can be made by sending the `btc_amount` amount of Bitcoins to the `payment_address` address or directly in the requested currency from another account. The invoice payment will trigger a `POST`to the `callback_url`. +##### Requesting user authorization -These calls require the `merchant` OAuth2 scope. +To get user's permission to use his/her account, you must send him/her to your application's redirect URI. You can see this URI by visiting your application's page: [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps). -### View an invoice (A) +By default, the `basic` scope will be requested. -This call will return a JSON object representing an invoice +If your application requires specific access scopes, you must append a scope GET parameter to the authorization URI: -**Request path :** `/api/v1/invoices/{uuid}` + https://bitcoin-central.net/...&scope=basic+activity+trade -**Request method :** `GET` +The user will then be prompted to authorize your application with the specified scopes. -**Request parameters** +##### Receiving the authorization code -| Name | Type | Description | -|------|------|------------------| -| uuid | UUID | Quote identifier | +If you specified the test redirection URI `https://bitcoin-central.net/page/oauth/test ` the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. +Otherwise the code or error will be send to the redirection URI so that your application can retrieve it (in this case https://example.com/callback): -**Response** + https://example.com/callback?code=AUTHORIZATION_CODE -A JSON object with the following parameters is returned. +Or if the request was denied by the user: -| Name | Type | Description | -|---------------------------|----------|-----------------------------------------------------------------| -| uuid | UUID | Invoice identifier | -| state | String | Invoice state _(see appendix)_ | -| payment\_address | String | Bitcoin payment address | -| payment\_bitcoin_\uri | String | Payment URI, should be used to generate QR codes | -| amount | Decimal | Requested amount to be credited upon payment | -| btc_amount | Decimal | Payable amount expressed in BTC | -| amount\_to\_pay | Decimal | Amount left to pay | -| btc\_amount\_to\_pay | Decimal | Bitcoin amount amount left to pay | -| currency | String | Currency in which the amount is expressed | -| merchant\_reference | String | Merchant reference | -| merchant\_memo | String | Merchant memo | -| callback\_url | String | URL to which a callback should be made when the invoice is paid | -| item\_url | String | Order-related URL | -| paid\_at | Datetime | Payment timestamp | -| created\_at | Datetime | Creation timestamp | -| updated\_at | Datetime | Update timestamp | -| expires\_at | Datetime | Expiration timestamp | -| settled | Boolean | Has this invoice already been credited ? | -| notification\_email\_sent | Boolean | Has the notification e-mail already been sent ? | -| public\_url | String | The URL at which this invoice is publicly visible and payable | + https://example.com/callback?error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request. +The authorization code is valid 5 minutes. -**Example request :** `GET /api/v1/invoices/70c7936b-f8ce-443a-8338-3762de0a1e92` +##### Fetching an access token and a refresh token -**Example response :** - - { - "uuid": "70c7936b-f8ce-443a-8338-3762de0a1e92", - "amount": 10.0, - "amount_to_pay": 10.0, - "btc_amount": 1.021732, - "btc_amount_to_pay": 1.021732, - "notification_email_sent": false, - "callback_url": null, - "created_at": "2013-01-21T10:20:07Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "expires_at": "2013-01-21T10:40:07Z", - "item_url": null, - "merchant_memo": null, - "merchant_reference": null, - "paid_at": null, - "payment_address": "1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz", - "payment_bitcoin_uri" : "bitcoin:1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz?amount=100.0&label=&x-pay-curamt=100.0&x-pay-cur=BTC&x-pay-id=7653453d-6372-4ffa-bc56-1e3182ef7f35", - "settled": false, - "state": "pending", - "updated_at": "2013-01-21T10:20:07Z", - "public_url": "https://paytunia.com/invoices/70c7936b-f8ce-443a-8338-3762de0a1e92" - } +Once your application received the authorization code, it can request an access token and a refresh token: -### View an invoice (Public) +```bash +$ curl "https://bitcoin-central.net/api/oauth/token" \ + -d "client_id=APPLICATION_KEY" \ + -d "client_secret=APPLICATION_SECRET" \ + -d "grant_type=authorization_code" \ + -d "redirect_uri=REDIRECT_URI" \ + -d "code=AUTHORIZATION_CODE" +``` -It is the same call as the above one, except this call will return a subset of the JSON object representing an invoice. +```json +{ + "access_token": "ACCESS_TOKEN", + "token_type": "bearer", + "expires_in": 1800, + "refresh_token": "REFRESH_TOKEN", + "scope": "basic" +} +``` -**Request path :** `/api/v1/invoices/{uuid}` +An access token can be used to authorize user requests for the approved scopes and is valid 5 minutes. -**Request method :** `GET` +##### Refreshing the access token -**Request parameters** +Since an access token is valid only 30 minutes, your application may need to fetch a new access token using your refresh token: -| Name | Type | Description | -|------|------|------------------| -| uuid | UUID | Quote identifier | +```bash +$ curl "https://bitcoin-central.net/api/oauth/token" \ + -d "client_id=APPLICATION_KEY" \ + -d "client_secret=APPLICATION_SECRET" \ + -d "grant_type=refresh_token" \ + -d "redirect_uri=REDIRECT_URI" \ + -d "refresh_token=REFRESH_TOKEN" +``` +```json +{ + "access_token": "NEW_ACCESS_TOKEN", + "token_type": "bearer", + "expires_in": 1800, + "refresh_token": "NEW_REFRESH_TOKEN", + "scope": "basic" +} +``` -**Response** +After refreshing the access token, the previous tokens (access and refresh) are no longer valid. -A JSON object with the following parameters is returned. +### User info -| Name | Type | Description | -|---------------------|----------|-----------------------------------------------------------------| -| uuid | UUID | Invoice identifier | -| state | String | Invoice state _(see appendix)_ | -| payment\_address | String | Bitcoin payment address | -| amount | Decimal | Requested amount to be credited upon payment | -| btc_amount | Decimal | Payable amount expressed in BTC | -| currency | String | Currency in which the amount is expressed | -| merchant\_reference | String | Merchant reference | -| merchant\_memo | String | Merchant memo | -| item\_url | String | Order-related URL | -| paid\_at | Datetime | Payment timestamp | -| created\_at | Datetime | Creation timestamp | -| updated\_at | Datetime | Update timestamp | -| expires\_at | Datetime | Expiration timestamp | +##### Description +Read the latest user info. -**Example request :** `GET /api/v1/invoices/70c7936b-f8ce-443a-8338-3762de0a1e92` +##### Endpoint -**Example response :** - - { - "uuid": "70c7936b-f8ce-443a-8338-3762de0a1e92", - "amount": 10.0, - "btc_amount": 1.021732, - "callback_fired": false, - "callback_url": null, - "created_at": "2013-01-21T10:20:07Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "expires_at": "2013-01-21T10:40:07Z", - "item_url": null, - "merchant_memo": null, - "merchant_reference": null, - "paid_at": null, - "payment_address": "1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz", - "payment_bitcoin_uri" : "bitcoin:1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz?amount=100.0&label=&x-pay-curamt=100.0&x-pay-cur=BTC&x-pay-id=7653453d-6372-4ffa-bc56-1e3182ef7f35", - "settled": false, - "state": "pending", - "updated_at": "2013-01-21T10:20:07Z" - } +| method | path | authorization | +|--------|-------------------------|-----------------------| +| GET | /api/v1/user | oauth2 (scope: basic) | -### List invoices (A,P) - -This call will return a paginated list of invoices for the client account. - -**Request path :** `/api/v1/invoices` - -**Request method :** `GET` - -**Request parameters** - -N/A - -**Response** - -A JSON array of invoice objects is returned. - -**Example request :** `GET /api/v1/quotes` - -**Example response :** - - [ - { - "uuid": "8338936b-f8ce-443a-70c7-3762de0a1e92", - "amount": 10.0, - "btc_amount": 1.021732, - "callback_fired": false, - "callback_url": null, - "created_at": "2013-01-21T10:20:07Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "expires_at": "2013-01-21T10:40:07Z", - "item_url": null, - "merchant_memo": null, - "merchant_reference": null, - "paid_at": null, - "payment_address": "1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz", - "settled": false, - "state": "pending", - "updated_at": "2013-01-21T10:20:07Z" - }, - { - "uuid": "70c7936b-f8ce-443a-8338-3762de0a1e92", - "amount": 10.0, - "btc_amount": 1.021732, - "callback_fired": false, - "callback_url": null, - "created_at": "2013-01-21T10:20:07Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "expires_at": "2013-01-21T10:40:07Z", - "item_url": null, - "merchant_memo": null, - "merchant_reference": null, - "paid_at": null, - "payment_address": "1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz", - "settled": false, - "state": "pending", - "updated_at": "2013-01-21T10:20:07Z" - } - ] - -### Create an invoice (A) - -This call creates an invoice - -**Request path :** `/api/v1/invoices` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|---------------------|---------|------------------------------------------------------------------------------| -| amount | Decimal | Requested amount to be credited upon payment | -| currency | String | Currency in which the amount is expressed | -| merchant\_reference | String | Merchant reference _(optional)_ | -| merchant\_memo | String | Merchant memo _(optional)_ | -| callback\_url | String | URL to which a callback should be made when the invoice is paid _(optional)_ | -| item\_url | String | Order-related URL _(optional)_ | - -**Response** - -An invoice JSON object is returned. - -**Example request :** `POST /api/v1/invoices` +##### Example - { - "amount" : 10.0, - "currency" : "EUR" - } +```bash +$ curl "https://bitcoin-central.net/api/v1/user" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` -**Example response :** - - { - "uuid": "70c7936b-f8ce-443a-8338-3762de0a1e92", - "amount": 10.0, - "btc_amount": 1.021732, - "callback_fired": false, - "callback_url": null, - "created_at": "2013-01-21T10:20:07Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "expires_at": "2013-01-21T10:40:07Z", - "item_url": null, - "merchant_memo": null, - "merchant_reference": null, - "paid_at": null, - "payment_address": "1JnjJNhdKSgvMKr6xMbqVEudB3eACsGJSz", - "settled": false, - "state": "pending", - "updated_at": "2013-01-21T10:20:07Z" - } +```json +{ + "name": "BC-U123456", + "locale": "en", + "balance_btc": 25.78866278, + "locked_btc": 1.0, + "balance_eur": 1893.96, + "locked_eur": 300.00743886 +} +``` -### Payment buttons and creation through signed GET request +##### Properties -This approach can be used when it is not desirable to create invoices before presenting them to the user, to create payment buttons, or when the previous flow is not practical. +| name | description | example value | +|--------------|----------------------------------------------|---------------------------| +| name | account number / name | "BC-U123456" | +| locale | locale code | "en" | +| balance_eur | available EUR balance | 1893.96 | +| locked_eur | EUR balance locked in trading | 300.00743886 | +| balance_btc | available BTC balance | 25.78866278 | +| locked_btc | BTC balance locked in trading | 1.0 | -The approach will let a merchant securely redirect a customer to a the payment page that will generate an invoice on the fly for this particular request. +### User activity -The URL includes : +##### Description - - The merchant's account number, - - A `query` parameter describing the payment, - - A unique token used to make these invoice creations non-replayable, - - A signature string created by hashing a shared secret along with the invoice data - -The current value of the shared secret for each account is available on the account details page. - -All parameters are passed in the query-string. +Read user activity. -**Request path :** `/api/v1/invoices/create_unauthenticated` +##### Endpoint -**Request method :** `GET` +| method | path | authorization | +|--------|-------------------------|--------------------------| +| GET | /api/v1/orders | oauth2 (scope: activity) | -**Request parameters** +##### Example -| Name | Value | -|-----------|---------------------------------------------------------------| -| merchant | Merchant account number | -| token | A globally unique token, a random UUID is recommended | -| query | The invoice parameters | -| signature | The SHA256 hash of `merchant + shared_secret + token + query` | +```bash +$ curl "https://bitcoin-central.net/api/v1/orders" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` -**Building the query parameter** +```json +{ + "name": "BC-U123456", + "locale": "en", + "balance_btc": 25.78866278, + "locked_btc": 1.0, + "balance_eur": 1893.96, + "locked_eur": 300.00743886 +} +``` -The `query` parameter is created by building a string with parameters separated with the pipe character "|". Optional parameters may use a blank value. +##### Properties -The parameters should be concatenated according to the following model : +| name | description | example value | +|--------------|----------------------------------------------|---------------------------| +| name | account number / name | "BC-U123456" | +| locale | locale code | "en" | +| balance_eur | available EUR balance | 1893.96 | +| locked_eur | EUR balance locked in trading | 300.00743886 | +| balance_btc | available BTC balance | 25.78866278 | +| locked_btc | BTC balance locked in trading | 1.0 | - AMOUNT_IN_CENTS|CURRENCY|MERCHANT_REFERENCE|MERCHANT_MEMO|CALLBACK_URL|ITEM_URL - -For example, to create a payment for 12.58 EUR with the "123456" reference and `https://example.com/callback` callback URL the query should look like this : - 1258|EUR|123456||https://example.com/callback| +## Appendix +### Ruby example -#### Full example +This example uses the OAuth2 Ruby gem. -A merchant wishes to display a link redirecting to a Paytunia payment page, his shared secret is `792fae4f81c12764c4e4f570920fbe89`, he wishes to create an invoice for 10 EUR with the reference "SALE-42" and a "Hello world" merchant memo, his account number is "PY-123456". The URLs are `https://example.com/callback` and `https://merchant.com/orders/SALE-42` +```ruby +require 'oauth2' -First, the `query` parameter must be constructed, it should look like : +client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://bitcoin-central.net', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') - 1000|EUR|SALE-42|Hello world|https://example.com/callback|https://merchant.com/orders/SALE-42 - -Then a unique token should be generated, a random UUID is perfect, we'll use `46113b61-1590-447a-9bab-ceb4a5586aa9` - -The signature should then be generated by hashing the following string with SHA256 : - - # Hashed string - PY-123456792fae4f81c12764c4e4f570920fbe8946113b61-1590-447a-9bab-ceb4a5586aa91000|EUR|SALE-42|Hello world|https://example.com/callback|https://merchant.com/orders/SALE-42 - - # Signature generated in command-line - $ echo -n "PY-123456792fae4f81c12764c4e4f570920fbe8946113b61-1590-447a-9bab-ceb4a5586aa91000|EUR|SALE-42|Hello world|https://example.com/callback|https://merchant.com/orders/SALE-42" | sha256sum - - -> 8e26068a13cbf81dac5ddca203897bbafc5a227411b36771cebcf7aad693d0ab - -Finally, the full URL can be generated by appending the URL-encoded parameters as following : - - https://bitcoin-central.net/api/v1/invoices/create_unauthenticated?merchant=PY-123456&token=46113b61-1590-447a-9bab-ceb4a5586aa9&signature=8e26068a13cbf81dac5ddca203897bbafc5a227411b36771cebcf7aad693d0ab&query=PY-123456792fae4f81c12764c4e4f570920fbe8946113b61-1590-447a-9bab-ceb4a5586aa91000%7CEUR%7CSALE-42%7CHello+world%7Chttps%3A%2F%2Fexample.com%2Fcallback%7Chttps%3A%2F%2Fmerchant.com%2Forders%2FSALE-42 - -### Payment callbacks - -When a payment is received for an invoice the backend will perform an HTTP POST to the URL given as `callback_url`. The content-type for the request will be `application/x-www-form-urlencoded`. - -The parameters sent are the exact same as the ones returned by a [view invoice](#view-an-invoice-a). - -The callback is not guaranteed to be fired and may be fired multiple times, the receiver must take it into account when designing a proper handling logic. - -#### Signature headers - -A `X-Paytunia-Signature` header is added to all callback requests. Its purpose is to authenticate the call from the backend to the callback URL, this signature **must** be properly checked by the receiving server in order to ensure that the request is legitimate and hasn't been tampered with. - -The signature is computed by concatenating the raw request body with the client's shared secret and applying a SHA256 hash function to it. - -**Example signed callback request :** - -In this example the client secret is `792fae4f81c12764c4e4f570920fbe89`. - - POST / HTTP/1.1 - Accept: */* - User-Agent: Ruby - Content-Type: application/x-www-form-urlencoded - X-Paytunia-Signature: ab9c3b33631e40d2880b2c4cf5bdf894bf42d6ea115dd2de71277e4382aaaeab - Connection: close - Host: lvh.me:3000 - Content-Length: 642 - - uuid=cbfb237f-dd9e-47bd-b18b-73b2f4ccdb51&state=paid&btc_amount=100.0&payment_address=1FXWhKPChEcUnSEoFQ3DGzxKe44MDbat0.42903373550437307&payment_bitcoin_uri=bitcoin%3A1FXWhKPChEcUnSEoFQ3DGzxKe44MDbatz%3Famount%3D0.0%26label%3D%26x-pay-cur%3DBTC%26x-pay-id%3Dcbfb237f-dd9e-47bd-b18b-73b2f4ccdb51&callback_url=http%3A%2F%2Flvh.me%3A3000%2F&paid_at=2013-02-08+12%3A22%3A39+UTC&created_at=2013-02-08+12%3A22%3A39+UTC&updated_at=2013-02-08+12%3A22%3A39+UTC&merchant_reference&merchant_memo&item_url¬ification_email_sent=true¤cy=BTC&amount=100.0&settled=false&expires_at=2013-02-08+12%3A42%3A39+UTC&amount_to_pay=0.0&btc_amount_to_pay=0.0 - -In Ruby this signature can be easily checked by doing `Digest::SHA2.hexdigest(data + secret)` where `data` is the raw request body and `secret` is the client's shared secret. - -## Trading - -Account specific calls require the `trade` OAuth2 scope. - -### Place an order (A) - -This call will place a trade order and queue it for execution. - -**Request path :** `/api/v1/trade_orders` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|----------|---------|--------------------------------------------------| -| amount | Decimal | Amount of Bitcoins to trade | -| currency | String | Currency to trade against | -| price | Decimal | Price _(may be omitted to place a market order)_ | -| type | String | Must be `buy` (bid) or `sell` (ask) | - -**Response** - -An trade order JSON object is returned with the following parameters - -| Name | Type | Description | -|-------------------|----------|-----------------------------------| -| uuid | UUID | Trade order identifier | -| amount | Decimal | Remaining Bitcoin amount to trade | -| instructed_amount | Decimal | Amount of Bitcoins to trade | -| currency | String | Currency to trade against | -| price | Decimal | Price _(null for a market order)_ | -| type | String | Either `buy` or `sell` | -| created_at | Datetime | Creation timestamp | -| updated_at | Datetime | Update timestamp | - -**Example request :** `POST /api/v1/trade_orders` - - { - "amount" : 10.0, - "type" : "buy", - "currency" : "EUR" - } - -**Example response :** - - { - "amount": 10.0, - "currency": "EUR", - "type": "buy", - "created_at": "2013-01-21T22:07:15Z", - "created_at_int" : 1363858355, - "instructed_amount": 10.0, - "price": null, - "currency": "EUR", - "state": "pending_execution", - "updated_at": "2013-01-21T22:07:15Z", - "uuid": "8b3c3446-9c5d-48a8-8044-08622cd4607b" - } - -### Cancel an order (A) - -This call will enqueue a cancel order job to remove it from the order book. - -**Request path :** `/api/v1/trade_orders/{uuid}` - -**Request method :** `DELETE` - -**Request parameters** - -| Name | Type | Description | -|------|------|------------------------| -| uuid | UUID | Trade order identifier | - -**Example request :** `DELETE /api/v1/trade_orders/8b3c3446-9c5d-48a8-8044-08622cd4607b` - -**Example response :** - -N/A - -### View trades for an order (A) - -This call will return a collection of trades that were executed for a particular order. - -**Request path :** `/api/v1/trade_orders/{uuid}/trades` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|------|------|------------------------| -| uuid | UUID | Trade order identifier | - -**Response** - -An array of trade JSON objects is returned. - -| Name | Type | Description | -|-----------------|----------|--------------------------------------------------| -| uuid | UUID | Trade identifier | -| traded_currency | Decimal | Amount traded, expressed in `currency` | -| traded_btc | Decimal | Amount of Bitcoins traded | -| currency | String | Currency in which `traded_currency` is expressed | -| price | Decimal | Price at which the exchange was made | -| created_at | Datetime | Creation timestamp | - - - -**Example request :** `GET /api/v1/trade_orders/8b32ddf1-1675-4ed3-b1bb-b4efc4ecd98c/trades` - -**Example response :** - - [ - { - "created_at": "2013-01-22T08:19:41Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "price": 5.0, - "traded_btc": 980.0, - "traded_currency": 4940.0, - "uuid": "1c86abf0-170a-4101-84d1-cdad913c95dd" - }, - { - "created_at": "2013-01-22T08:19:41Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "price": 6.0, - "traded_btc": 10.0, - "traded_currency": 60.0, - "uuid": "170aabf0-1c86-4101-84d1-cdad913c95dd" - } - ] - -### View an order (A) - -This call will return a trade order JSON object. - -**Request path :** `/api/v1/trade_orders/{uuid}` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|------|------|------------------| -| uuid | UUID | Order identifier | - -**Response** - -A JSON object with the following parameters is returned. - -| Name | Type | Description | -|-------------------|----------|-----------------------------------| -| uuid | UUID | Trade order identifier | -| amount | Decimal | Remaining Bitcoin amount to trade | -| instructed_amount | Decimal | Amount of Bitcoins to trade | -| currency | String | Currency to trade against | -| price | Decimal | Price _(null for a market order)_ | -| type | String | Either `buy` or `sell` | -| created_at | Datetime | Creation timestamp | -| updated_at | Datetime | Update timestamp | - -**Example request :** `GET /api/v1/trade_orders/8b32ddf1-1675-4ed3-b1bb-b4efc4ecd98c` - -**Example response :** - - { - "amount": 10.0, - "type": "buy", - "created_at": "2013-01-22T08:19:37Z", - "created_at_int" : 1363858355, - "instructed_amount": 1000.0, - "currency": "EUR", - "price": 11.0, - "state": "active", - "updated_at": "2013-01-22T08:19:41Z", - "uuid": "8b32ddf1-1675-4ed3-b1bb-b4efc4ecd98c" - } - -### List active orders (A,P) - -This call will return a paginated list of the client's executable trade orders (`pending_execution`, `active` or `insufficient_funds` states). - -**Request path :** `/api/v1/trade_orders/active` - -**Request method :** `GET` - -**Request parameters** - -N/A - -**Example request :** `GET /api/v1/trade_orders/active` - -**Example response :** - - [ - { - "amount": 10.0, - "currency": "EUR", - "type": "buy", - "created_at": "2013-01-21T22:15:38Z", - "created_at_int" : 1363858355, - "instructed_amount": 10.0, - "price": null, - "state": "pending_execution", - "updated_at": "2013-01-21T22:15:38Z", - "uuid": "52823408-972f-4551-acc5-e7d3f032c6d5" - } - ] - -### List all orders (A,P) - -This call will return a paginated list of the client's trade orders. - -**Request path :** `/api/v1/trade_orders` - -**Request method :** `GET` - -**Request parameters** - -N/A - -**Example request :** `GET /api/v1/trade_orders` - -**Example response :** - - [ - { - "amount": 10.0, - "currency": "EUR", - "type": "buy", - "created_at": "2013-01-21T22:15:38Z", - "created_at_int" : 1363858355, - "instructed_amount": 10.0, - "price": null, - "state": "pending_execution", - "updated_at": "2013-01-21T22:15:38Z", - "uuid": "52823408-972f-4551-acc5-e7d3f032c6d5" - }, - { - "amount": 10.0, - "currency": "EUR", - "type": "buy", - "created_at": "2013-01-21T22:15:40Z", - "created_at_int" : 1363858355, - "instructed_amount": 10.0, - "price": null, - "state": "canceled", - "updated_at": "2013-01-21T22:15:40Z", - "uuid": "6e3ea778-9ef7-4e4f-9910-85e735f7b42a" - } - ] - -### Read the ticker - -This call will return the ticker. - -**Request path :** `/api/v1/ticker/{currency}` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|----------|--------|----------------------------------------------------------------------| -| currency | String | Show the ticker for the given currency, default to `EUR`if ommitted | - -**Example request :** `GET /api/v1/ticker/eur` - -**Alternate example :** `GET /api/v1/ticker` - -**Example response :** - - { - "ask": 20.4, - "at": 1361056527, - "bid": 20.1, - "currency": "EUR", - "high": 20.74, - "low": 20.2, - "midpoint": 20.25, - "price": 20.2, - "variation": -1.4634, - "volume": 148.80193218 - } - -### Read the market depth - -This call will return the full sorted market depth. If the `currency` parameter is omitted, the currency defaults to EUR. - -The asks are sorted by ascending price and the bids by descending price. - -**Request path :** `/api/v1/depth` or `/api/v1/depth/{currency}` - -**Request method :** `GET` - -**Request parameters** - -N/A - -**Example request :** `GET /api/v1/depth/eur` - -**Example response :** - - { - "asks": [ - { - "amount": 0.48762, - "currency": "EUR", - "price": 24.48996, - "timestamp": 1361925287 - }, - { - "amount": 12.96657232, - "currency": "EUR", - "price": 24.49, - "timestamp": 1361924964 - } - ], - "bids": [ - { - "amount": 0.77372456, - "currency": "EUR", - "price": 24.05, - "timestamp": 1361902889 - }, - { - "amount": 0.40491093, - "currency": "EUR", - "price": 24.001, - "timestamp": 1361887469 - } - ] - } - -### Read historical trades (P) - -This call will return the most recent trades - -**Request path :** `/api/v1/trades/{currency}` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|----------|--------|-----------------------------------------------| -| currency | String | Currency filter, defaults to `EUR` if omitted | - -**Response** - -An array of trade JSON objects is returned. - -| Name | Type | Description | -|-----------------|----------|--------------------------------------------------| -| uuid | UUID | Trade identifier | -| traded_currency | Decimal | Amount traded, expressed in `currency` | -| traded_btc | Decimal | Amount of Bitcoins traded | -| currency | String | Currency in which `traded_currency` is expressed | -| price | Decimal | Price at which the exchange was made | -| created_at | Datetime | Creation timestamp | - -**Example request :** `GET /api/v1/trades/eur` - -**Example response :** - - [ - { - "created_at": "2013-01-22T08:19:41Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "price": 5.0, - "traded_btc": 980.0, - "traded_currency": 4940.0, - "uuid": "1c86abf0-170a-4101-84d1-cdad913c95dd" - }, - { - "created_at": "2013-01-22T08:19:41Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "price": 6.0, - "traded_btc": 10.0, - "traded_currency": 60.0, - "uuid": "170aabf0-1c86-4101-84d1-cdad913c95dd" - } - ] - -## Coupons - -Coupons are a way to easily move money between accounts, they are debited from the issuer's account upon creation and may be redeemed at anytime against any account (including the issuer). - -They are materialized by a unique redemption code. This code should be kept private as anyone having knowledge of it can redeem the funds. - -Creating a coupon requires the `withdraw` OAuth2 scope, other actions require the `read` scope. - -### Create a coupon (A) - -This call issues a coupon - -**Request path :** `/api/v1/coupons` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|---------------------|---------|-------------------------------------------| -| amount | Decimal | Currency value for the issued coupon | -| currency | String | Currency in which the amount is expressed | - -**Response** - -A coupon code is returned - -**Example request :** `POST /api/v1/coupons` - - { - "amount" : 12.0, - "currency" : "EUR" - } - -**Example response :** - - { - "code": "BP-EUR-9660407B43799CCED320" - } - -### View a coupon - -This call will return a JSON object representing a coupon - -**Request path :** `/api/v1/coupons/{code}` - -**Request method :** `GET` - -**Request parameters** - -| Name | Type | Description | -|------|--------|------------------| -| code | String | Coupon code | - - -**Response** - -A JSON object with the following parameters is returned. - -| Name | Type | Description | -|-----------------------|----------|-------------------------------------------| -| uuid | UUID | Coupon account operation identifier | -| code | String | Coupon code | -| state | String | Coupon state _(see appendix)_ | -| amount | Decimal | Coupon value | -| currency | String | Currency in which the amount is expressed | -| created\_at | Datetime | Creation timestamp | - - -**Example request :** `GET /api/v1/coupons/BP-EUR-9660407B43799CCED320` - -**Example response :** - - { - "amount": -12.0, - "code": "BP-EUR-9660407B43799CCED320", - "created_at": "2013-01-30T11:52:36Z", - "created_at_int" : 1363858355, - "currency": "EUR", - "state": "pending", - "uuid": "c21adaf6-f5a2-4d93-a762-a63b89b52265" - } - -### Redeem a coupon (A) - -This call will a redeem a coupon to the client's account. It returns an `UUID`, this identifier can be used to request details about the account operation created for the client's account by the redemption of the coupon (credit of the coupon value). - -This call may be used to void a coupon by redeeming it against the account that issued it. - -**Request path :** `/api/v1/coupons/redeem` - -**Request method :** `POST` - -**Request parameters** - -| Name | Type | Description | -|------|--------|------------------| -| code | String | Coupon code | - -**Response** - -A JSON object with the following parameters is returned. - -| Name | Type | Description | -|-----------------------|----------|-------------------------------------------| -| uuid | UUID | Redemption account operation identifier | - -**Example request :** `POST /api/v1/coupons` - - { - "code": "BP-EUR-9660407B43799CCED320" - } - -**Example response :** - - { - "uuid": "3e0004cd-158c-40d6-b8f9-f4b672e86308" - } - -# Appendix - -## Codes and types tables - -### Currencies - -The following currencies are available : - -| Symbol | Currency | -|--------|----------------| -| BTC | Bitcoin | -| EUR | Euro | -| GBP | Pound Sterling | -| USD | US Dollar | - - -### Operation types - -| Type | Description | -|-----------------------------|---------------------------------------------------------| -| fee | Trading fee | -| coupon | Issue of a redeemable code | -| bitcoin_transfer | Bitcoin withdrawal | -| wire_transfer | Wire transfer withdrawal | -| email_transfer | Transfer of funds to an e-mail address | -| coupon_redemption | Redemption of a redeemable code | -| email\_transfer\_redemption | Redemption of an e-mail transfer | -| charge | Generic charge | -| bank_charge | Bank charge | -| invoice_credit | Payment of an invoice you issued (credits your account) | -| invoice_payment | Payment for an invoice (debits your account) | -| wire_deposit | Deposit by bank wire | -| trade | Trade | -| reversal | Reversal | - -### States - -#### Transfer (Bitcoin transfer, Wire transfer) statuses - -The state of a transfer lets you check whether it has been sent out to the underlying network (banking network or Bitcoin network). - -| State | Description | -|-----------|---------------------------------------| -| pending | The transfer hasn't been sent out yet | -| processed | The transfer has been sent out | - -#### Coupon statuses - -| State | Description | -|----------|-----------------------------------------| -| pending | The coupon is valid and may be redeemed | -| redeemed | The coupon has already been redeemed | -| canceled | The coupon was redeemed to the issuer | - -#### E-mail transfer statuses - -| State | Description | -|----------------------|--------------------------------------------------------------------------| -| pending_collection | The recipient hasn't claimed the e-mail transfer amount yet | -| canceled | The e-mail transfer was canceled | -| expired | The transfer has expired | -| unreachable_receiver | An error occurred while sending the e-mail notification to its recipient | -| processed | The recipient has collected the sent amount | - -#### Invoice statuses - -| State | Description | -|----------------|-------------------------------------------------| -| pending | The invoice is pending payment | -| partially_paid | The invoice has a partially confirmed payment | -| confirming | A full or over-payment is confirming | -| paid | The invoice has a confirmed payment | -| overpaid | The invoice has a confirmed over-payment | -| error | The payment could not be converted as requested | - -#### Trade order statuses - -| State | Description | -|--------------------|--------------------------------------------------------------------------------| -| pending_execution | The order has been queued for execution | -| active | The order has been executed but not filled it is visible in the order book (1) | -| filled | The order has been filled | -| canceled | The order has been canceled | -| insufficient_funds | The order cannot execute further due to lack of funds (2) | - - 1. The amount shown in the order book is the amount that is actually executable given your balance, not necessarily the instructed amount - 2. Order execution resumes as soon as more funds are available +client.auth_code.authorize_url(redirect_uri: 'https://bitcoin-central.net/page/oauth/test', scope: 'basic activity trade withdraw') + => "https://staging.bitcoin-central.net/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.bitcoin-central.net%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" -# Left TODO +# Visit this URL in your browser, approve the request and copy the authorization code -## Websockets +authorization_code = '9b55e27c840f59d927284fdc438ee3d8fac94b00e24d331162ddff76c1a6bcc0' - * Document the socket.io API - -## Misc +token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://bitcoin-central.net/page/oauth/test') - * Get an estimate (unsaved quote) - * Add a `/me` API call - * Add a call for account balances - * Add order lag +token.get('/api/v1/user').body +=> {"name":"BC-U123456","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} +``` From 151db255926694f247cfad8bf8557e1c3a9f2195 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 11:12:42 +0100 Subject: [PATCH 003/110] Tweaks --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 25dd441a..511d13d5 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,7 @@ Before you can access your own data or other users data, you must register an ap 1. Verify your account and log in 2. Visit [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps) -3. Create an application (set redirect URI to https://bitcoin-central.net/page/oauth/test when testing) +3. Create an application (set redirect URI to `https://bitcoin-central.net/page/oauth/test when testing`) ### Authentication @@ -264,12 +264,12 @@ Before you request authorization to access a user's account, you must decide whi The following scopes are available: -| name | description | -|----------------|---------------------------------------------------------------------------| -| basic (default)| Read account number, language, and balances | -| activity | Read trade orders, deposits, widthdrawals | -| trade | Create and cancel trade orders | -| withdraw | Request EUR and BTC withdrawals (requires email confirmations from users) | +| name | description | +|----------------|-------------------------------------------------------------------------------------------| +| basic | Read account number, language, and balances (default) | +| activity | Read trade orders, deposits, withdrawals, and other operations | +| trade | Create and cancel trade orders | +| withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | ##### Requesting user authorization @@ -285,9 +285,9 @@ The user will then be prompted to authorize your application with the specified ##### Receiving the authorization code -If you specified the test redirection URI `https://bitcoin-central.net/page/oauth/test ` the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. +If you specified the test redirection URI `https://bitcoin-central.net/page/oauth/test`, the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. -Otherwise the code or error will be send to the redirection URI so that your application can retrieve it (in this case https://example.com/callback): +Otherwise the code or error will be sent to the redirection URI so that your application can retrieve it (in this case `https://example.com/callback`): https://example.com/callback?code=AUTHORIZATION_CODE @@ -324,7 +324,7 @@ An access token can be used to authorize user requests for the approved scopes a ##### Refreshing the access token -Since an access token is valid only 30 minutes, your application may need to fetch a new access token using your refresh token: +Since an access token is only valid 30 minutes, your application may need to fetch a new access token using the refresh token: ```bash $ curl "https://bitcoin-central.net/api/oauth/token" \ From c31230a2cace684c2c36068bd7779ebccfd3fffa Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 15:33:15 +0100 Subject: [PATCH 004/110] Node.js sample app --- README.md | 2 +- examples/node.js/index.js | 329 ++++++++++++++++++++++++++++++++++ examples/node.js/package.json | 17 ++ 3 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 examples/node.js/index.js create mode 100644 examples/node.js/package.json diff --git a/README.md b/README.md index 511d13d5..5cd7b3f5 100644 --- a/README.md +++ b/README.md @@ -398,7 +398,7 @@ Read user activity. | method | path | authorization | |--------|-------------------------|--------------------------| -| GET | /api/v1/orders | oauth2 (scope: activity) | +| GET | /api/v1/user/orders | oauth2 (scope: activity) | ##### Example diff --git a/examples/node.js/index.js b/examples/node.js/index.js new file mode 100644 index 00000000..079fe76e --- /dev/null +++ b/examples/node.js/index.js @@ -0,0 +1,329 @@ +// Node.js cli example + +var express = require('express'), + app = express(), + request = require('request'), + cli = require('cline')(); + +// App configuration +var OAuth2 = require('simple-oauth2')({ + clientID: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', + clientSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', + site: 'http://lvh.me/api', + tokenPath: '/oauth/token' +}); + +// Authorization uri definition +var authorization_uri = OAuth2.AuthCode.authorizeURL({ + redirect_uri: 'http://localhost:8000/callback', + scope: 'basic activity trade' +}); + +// Authorization page redirecting to Bitcoin-Central +app.get('/auth', function (req, res) { + res.redirect(authorization_uri); +}); + +// Callback service parsing the authorization token and asking for the access token +app.get('/callback', function (req, res) { + var code = req.query.code; + OAuth2.AuthCode.getToken({ + code: code, + redirect_uri: 'http://localhost:8000/callback' + }, saveToken); + + function saveToken(error, token) { + if (error) { + console.error(error.message); + return res.send(error.message); + } + + start(token); + + res.send('ok'); + } +}); + +app.get('/activity', function (req, res) { + if(!req.session.token) return res.status(401).send({error: 'unauthorized'}); + + request('http://lvh.me/api/v1/user/orders', { + headers: {'Authorization': 'Bearer ' + req.session.token.access_token} + }, function(error, resp, body) { + if (error) return res.status(503).send({error: error.message}); + res.send(body); + }); +}); + +app.get('/', function (req, res) { + res.send('Bitcoin-Central API example'); +}); + +function start(token) { + var headers = { + 'Authorization': 'Bearer ' + token.access_token + }; + + cli.command('ticker', 'show ticker', function () { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/data/eur/ticker', function(error, resp, body) { + if (error) return console.error(error.message); + + var data = JSON.parse(body); + var output = showObject(data); + + cli.stream.print(output); + cli.interact('> '); + }); + }); + + cli.command('balances', 'show account balances', function () { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user', { + headers: headers + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + var output = ''; + + output += '\nCurrency\tAccount\t\tBalance\n'; + output += 'BTC\t\tavailable\t' + data.balance_btc + '\n'; + output += 'BTC\t\ttrading\t\t' + data.locked_btc + '\n'; + output += 'EUR\t\tavailable\t' + data.balance_eur + '\n'; + output += 'EUR\t\ttrading\t\t' + data.locked_eur; + + cli.stream.print(output); + cli.interact('> '); + }); + }); + + cli.command('active', 'show active trade orders', function () { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders', { + headers: headers, + qs: { + 'types[]': 'LimitOrder', + active: true + } + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + var output = ''; + + data.forEach(function(order) { + output += '\n' + order.uuid + '\t'; + output += order.direction + '\t'; + output += order.amount.toFixed(8) + ' BTC for '; + output += order.price.toFixed(2) + ' ' + order.currency; + output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' + output += '\t' + order.state + }); + + cli.stream.print(output); + cli.interact('> '); + }); + }); + + cli.command('orders', 'show all trade orders', function () { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders', { + headers: headers, + qs: { + 'types[]': 'LimitOrder' + } + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + var output = ''; + + data.forEach(function(order) { + output += '\n' + order.uuid + '\t'; + output += order.direction + '\t'; + output += order.amount.toFixed(8) + ' BTC for '; + output += order.price.toFixed(2) + ' ' + order.currency; + output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' + output += '\t' + order.state + }); + + cli.stream.print(output); + cli.interact('> '); + }); + }); + + cli.command('show {uuid}', 'show order by uuid', {uuid: '[0-9a-z\-]+'}, function (input, args) { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders/' + args.uuid, { + headers: headers + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + var output = showObject(data); + + cli.stream.print(output); + cli.interact('> '); + }); + }); + + cli.command('buy {amount} {price}', 'place a buy order', {amount: '[0-9\.]+', price: '[0-9\.]+'}, function (input, args) { + amount = parseFloat(args.amount); + price = parseFloat(args.price); + console.log('Buy ' + amount + ' BTC for ' + price + ' EUR each?') + + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders', { + headers: headers, + method: 'POST', + form: { + 'type': 'LimitOrder', + currency: 'EUR', + direction: 'buy', + amount: amount, + price: price + } + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + cli.stream.print(data.uuid); + cli.interact('> '); + }); + }); + + cli.command('sell {amount} {price}', 'place a sell order', {amount: '[0-9\.]+', price: '[0-9\.]+'}, function (input, args) { + amount = parseFloat(args.amount); + price = parseFloat(args.price); + console.log('Sell ' + amount + ' BTC for ' + price + ' EUR each?') + + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders', { + headers: headers, + method: 'POST', + form: { + 'type': 'LimitOrder', + currency: 'EUR', + direction: 'sell', + amount: amount, + price: price + } + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + var data = JSON.parse(body); + cli.stream.print(data.uuid); + cli.interact('> '); + }); + }); + + cli.command('cancel {uuid}', 'cancel order by uuid', {uuid: '[0-9a-z\-]+'}, function (input, args) { + delete cli._nextTick; + cli.stream.print('loading...'); + + request('http://lvh.me/api/v1/user/orders/' + args.uuid + '/cancel', { + headers: headers, + method: 'DELETE' + }, function(error, resp, body) { + if (error) return console.error(error.message); + + if (resp.statusCode === 401) { + cli.stream.print('Unauthorized. You might need to refresh tokens.'); + return cli.interact('> '); + } + + cli.stream.print('Order cancelling.'); + cli.interact('> '); + }); + }); + + cli.command('refresh_tokens', 'refresh access tokens', function () { + delete cli._nextTick; + cli.stream.print('loading...'); + + OAuth2.AccessToken.create(token).refresh(function(error, result) { + if (error) return console.error(error.message); + + token = result.token; + headers = { + 'Authorization': 'Bearer ' + token.access_token + }; + + cli.stream.print('Ok.'); + cli.interact('> '); + }); + }); + + cli.interact('> '); + + cli.on('close', function () { + process.exit(); + }); +} + +function showObject(data) { + output = ''; + + for(key in data) { + switch(key) { + case 'created_at': + output += '\n' + key + ': ' + new Date(data[key]); + case 'updated_at': + output += '\n' + key + ': ' + new Date(data[key]); + case 'account_operations': + break; + default: + output += '\n' + key + ': ' + data[key]; + } + } + + return output; +} + +app.listen(8000); +console.log('Open http://localhost:8000/auth in your browser to authorize the application.') diff --git a/examples/node.js/package.json b/examples/node.js/package.json new file mode 100644 index 00000000..73203a1f --- /dev/null +++ b/examples/node.js/package.json @@ -0,0 +1,17 @@ +{ + "name": "bitcoin_central_example", + "version": "0.0.0", + "description": "Bitcoin-Central API Example", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Paymium", + "license": "MIT", + "dependencies": { + "simple-oauth2": "~0.1.8", + "express": "~3.4.7", + "request": "~2.31.0", + "cline": "~0.7.0" + } +} From 95331cca038dc782d20359a89fe5c254bd8d927f Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 15:35:13 +0100 Subject: [PATCH 005/110] Tweak --- examples/node.js/index.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 079fe76e..2997fd19 100644 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -44,21 +44,6 @@ app.get('/callback', function (req, res) { } }); -app.get('/activity', function (req, res) { - if(!req.session.token) return res.status(401).send({error: 'unauthorized'}); - - request('http://lvh.me/api/v1/user/orders', { - headers: {'Authorization': 'Bearer ' + req.session.token.access_token} - }, function(error, resp, body) { - if (error) return res.status(503).send({error: error.message}); - res.send(body); - }); -}); - -app.get('/', function (req, res) { - res.send('Bitcoin-Central API example'); -}); - function start(token) { var headers = { 'Authorization': 'Bearer ' + token.access_token From b9e7c89de1bbdff6c918ac1bce057c11f3d39ef1 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 16:47:34 +0100 Subject: [PATCH 006/110] tweak --- examples/node.js/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 2997fd19..98db7f5a 100644 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -298,6 +298,7 @@ function showObject(data) { switch(key) { case 'created_at': output += '\n' + key + ': ' + new Date(data[key]); + break; case 'updated_at': output += '\n' + key + ': ' + new Date(data[key]); case 'account_operations': From 31c203b6369ba27a6ff941ba4c9e336f0bd54285 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:12:19 +0100 Subject: [PATCH 007/110] Getting my groove on. --- README.md | 270 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 255 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 5cd7b3f5..ecea5566 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,14 @@ _* Authenticating users is only available to developers that have a fully verifi * [Authentication](#authentication) * [User info](#user-info) * [User activity](#user-activity) + * [Order details](#order-details) * [Trading](#trading) * [Withdrawing](#withdrawing) + * [Canceling orders](#canceling-orders) * [**Appendix**](#appendix) + * [Order properties](#order-properties) + * [Account operation properties](#account-operation-properties) * [Currencies](#currencies) * [States](#states) * [Ruby example](#ruby-example) @@ -400,38 +404,274 @@ Read user activity. |--------|-------------------------|--------------------------| | GET | /api/v1/user/orders | oauth2 (scope: activity) | +##### Parameters + +| name | description | example value | +|--------------|----------------------------------------------|---------------------------| +| offset | pagination offset (optional) | 20 | +| limit | pagination limit (optional) | 20 | +| types[] | filter by types (optinal) | LimitOrder | +| active | only show active orders (optional) | true | + ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/orders" \ +$ curl "https://bitcoin-central.net/api/v1/orders&offset=20" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +```json +[ + { + "uuid": "968f4580-e26c-4ad8-8bcd-874d23d55296", + "amount": 1.0, + "state": "executed", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2013-10-24T10:34:37.000Z", + "created_at": "2013-10-22T19:12:02.000Z", + "currency": "BTC", + "type": "Transfer", + "account_operations": [ + { + "uuid": "94b42d0f-9c2d-43f3-978b-aba28533d1f9", + "name": "bitcoin_transfer", + "amount": -1.0, + "currency": "BTC", + "created_at": "2013-10-22T19:12:02.000Z", + "created_at_int": 1382469122, + "is_trading_account": false + } + ] + }, + { + "uuid": "1953cd1b-3903-4812-9590-42c3ebcc08c2", + "amount": 49.38727114, + "state": "executed", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2013-10-22T14:30:06.000Z", + "created_at": "2013-10-22T14:30:06.000Z", + "currency": "BTC", + "type": "AdminOrder", + "account_operations": [ + { + "uuid": "a940393b-4d2f-4a5a-8a0a-3470d7419bad", + "name": "account_operation", + "amount": 49.38727114, + "currency": "BTC", + "created_at": "2013-10-22T14:30:06.000Z", + "created_at_int": 1382452206, + "is_trading_account": false + } + ] + } +] +``` + +##### Properties + +The response is an array of orders. See [order properties](#order-properties). + +### Order details + +##### Description + +Read details from a specific order. + +##### Endpoint + +| method | path | authorization | +|--------|----------------------------|--------------------------| +| GET | /api/v1/user/orders/{UUID} | oauth2 (scope: activity) | + +##### Example + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` ```json { - "name": "BC-U123456", - "locale": "en", - "balance_btc": 25.78866278, - "locked_btc": 1.0, - "balance_eur": 1893.96, - "locked_eur": 300.00743886 + "uuid": "968f4580-e26c-4ad8-8bcd-874d23d55296", + "amount": 1.0, + "state": "executed", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2013-10-24T10:34:37.000Z", + "created_at": "2013-10-22T19:12:02.000Z", + "currency": "BTC", + "type": "Transfer", + "account_operations": [ + { + "uuid": "94b42d0f-9c2d-43f3-978b-aba28533d1f9", + "name": "bitcoin_transfer", + "amount": -1.0, + "currency": "BTC", + "created_at": "2013-10-22T19:12:02.000Z", + "created_at_int": 1382469122, + "is_trading_account": false + } + ] } ``` ##### Properties -| name | description | example value | -|--------------|----------------------------------------------|---------------------------| -| name | account number / name | "BC-U123456" | -| locale | locale code | "en" | -| balance_eur | available EUR balance | 1893.96 | -| locked_eur | EUR balance locked in trading | 300.00743886 | -| balance_btc | available BTC balance | 25.78866278 | -| locked_btc | BTC balance locked in trading | 1.0 | +See [order properties](#order-properties). + +### Trading + +##### Description + +Create trade orders. +##### Endpoint + +| method | path | authorization | +|--------|----------------------------|--------------------------| +| POST | /api/v1/user/orders | oauth2 (scope: trade) | + +##### Example + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/orders \ + --header "Authorization: Bearer ACCESS_TOKEN" \ + -d "type=LimitOrder" \ + -d "currency=EUR" \ + -d "direction=buy" \ + -d "price=300.0" \ + -d "amount=1.0" +``` + +```json +{ + "uuid": "4924ee0f-f60e-40b4-b63e-61637ef253ac", + "amount": 1.0, + "state": "pending_execution", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2013-11-21T15:27:04.000Z", + "created_at": "2013-11-21T15:27:04.000Z", + "currency": "EUR", + "type": "LimitOrder", + "traded_btc": 0.0, + "traded_currency": 0.0, + "direction": "buy", + "price": 300.0, + "account_operations": [ + { + "uuid": "63e1d9c4-dff2-42bc-910b-c5b585b625cc", + "name": "lock", + "amount": -300.0, + "currency": "EUR", + "created_at": "2013-11-21T15:27:04.000Z", + "created_at_int": 1385047624, + "is_trading_account": false + }, + { + "uuid": "c9d3e824-b29a-4630-8396-3864a0704336", + "name": "lock", + "amount": 300.0, + "currency": "EUR", + "created_at": "2013-11-21T15:27:04.000Z", + "created_at_int": 1385047624, + "is_trading_account": true + } + ] +} +``` + +##### Properties + +See [order properties](#order-properties). + +### Withdrawing + +TODO + +### Canceling orders + +##### Description + +Cancel an order. Only active trade orders may be canceled. + +##### Endpoint + +| method | path | authorization | +|--------|-----------------------------------|--------------------------| +| DELETE | /api/v1/user/orders/{UUID}/cancel | oauth2 (scope: trading) | + +##### Example + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +### Web sockets + +TODO ## Appendix +### Order properties + +All order types share generic properties. + +Each type may have additional properties as described below. + +##### Generic order properties + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| uuid | unique id | "968f4580-e26c-4ad8-8bcd-874d23d55296" | +| type | order type | "Transfer" | +| currency | currency | "BTC" | +| created_at | date created | "2013-10-24T10:34:37.000Z" | +| updated_at | date updated | "2013-10-22T19:12:02.000Z" | +| amount | currency amount | 1.0 | +| state | order state | "executed" | +| currency_fee | currency fee collected | 0.0 | +| btc_fee | BTC fee collected | 0.0 | +| comment | optional comment | | +| account_operations | an array of account operations executed | | + +##### Market order specific properties + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| direction | trade direction ("buy" or "sell") | "buy" | +| price | price per BTC | 620.0 | +| traded_currency | currency exchanged | 310.0 | +| traded_btc | BTC echanged | 0.5 | + +### Account operation properties + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| uuid | unique id | "a940393b-4d2f-4a5a-8a0a-3470d7419bad" | +| currency | currency | "BTC" | +| name | name of operation | "account_operation" | +| created_at | date created | "2013-10-22T14:30:06.000Z" | +| created_at_int | timestamp | 1382452206 | +| amount | currency amount | 49.38727114 | +| is_trading_account | whether the trading account is targeted | false | + +### Currencies + +The following currencies are available : + +| symbol | currency | +|--------|----------| +| EUR | Euro | +| BTC | Bitcoin | + +### States + +TODO + ### Ruby example This example uses the OAuth2 Ruby gem. From f5e60b948e3c7ee53d977e9ff64a03f1325db51e Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:14:09 +0100 Subject: [PATCH 008/110] Tweaks --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ecea5566..8ef53e82 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,11 @@ _* Authenticating users is only available to developers that have a fully verifi ## General information -## Formats and required HTTP request headers +### Formats and required HTTP request headers The API will only answer with JSON or empty responses. It expects parameters to be passed in JSON with the correct `Content-Type: application/json` being set. -## Rate-limiting +### Rate-limiting API calls are rate-limited by IP to 5000 calls per day. Information about the status of the limit can be found in the `X-RateLimit-Limit` and `X-RateLimit-Remaining` HTTP headers. From b36e11049634d5090372a784b842f166358e9e7b Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:21:30 +0100 Subject: [PATCH 009/110] Tweak --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 8ef53e82..2d2f5ccd 100644 --- a/README.md +++ b/README.md @@ -533,6 +533,16 @@ Create trade orders. |--------|----------------------------|--------------------------| | POST | /api/v1/user/orders | oauth2 (scope: trade) | +##### Payload + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| type | Must be "LimitOrder" | "LimitOrder" | +| currency | Must be "EUR" | "EUR" | +| direction | trade direction, must be "buy" or "sell"| "buy" | +| price | price per BTC | 300.0 | +| amount | BTC amount to trade | 1.0 | + ##### Example ```bash From 976a27b7558087befcee749c5cb8cd6e7922016f Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:34:06 +0100 Subject: [PATCH 010/110] Adding logo --- README.md | 2 ++ logo.png | Bin 0 -> 4802 bytes 2 files changed, 2 insertions(+) create mode 100644 logo.png diff --git a/README.md b/README.md index 2d2f5ccd..70cbf832 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Bitcoin-Central logo](https://raw2.github.com/Paymium/api-documentation/master/logo.png) + The Bitcoin-Central API allows developers to extend the capabilities of Bitcoin-Central, from reading the latest ticker to automating trades with bots. Is is possible to, among other things: diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3dadc626953ad55c65f3cfb19c3702891b8aed GIT binary patch literal 4802 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 aIhejjg?z&9Eyf-ERnpSXg_o(D2mA-%cvcSp literal 0 HcmV?d00001 From ae00bed1c868695255551e6869a504cea22f0e8a Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:35:48 +0100 Subject: [PATCH 011/110] Tweak --- examples/node.js/index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 98db7f5a..b5e13c16 100644 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -9,7 +9,7 @@ var express = require('express'), var OAuth2 = require('simple-oauth2')({ clientID: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', clientSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', - site: 'http://lvh.me/api', + site: 'https://bitcoin-central.net/api', tokenPath: '/oauth/token' }); @@ -53,7 +53,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/data/eur/ticker', function(error, resp, body) { + request('https://bitcoin-central.net/api/v1/data/eur/ticker', function(error, resp, body) { if (error) return console.error(error.message); var data = JSON.parse(body); @@ -68,7 +68,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user', { + request('https://bitcoin-central.net/api/v1/user', { headers: headers }, function(error, resp, body) { if (error) return console.error(error.message); @@ -96,7 +96,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders', { + request('https://bitcoin-central.net/api/v1/user/orders', { headers: headers, qs: { 'types[]': 'LimitOrder', @@ -131,7 +131,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders', { + request('https://bitcoin-central.net/api/v1/user/orders', { headers: headers, qs: { 'types[]': 'LimitOrder' @@ -165,7 +165,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders/' + args.uuid, { + request('https://bitcoin-central.net/api/v1/user/orders/' + args.uuid, { headers: headers }, function(error, resp, body) { if (error) return console.error(error.message); @@ -191,7 +191,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders', { + request('https://bitcoin-central.net/api/v1/user/orders', { headers: headers, method: 'POST', form: { @@ -223,7 +223,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders', { + request('https://bitcoin-central.net/api/v1/user/orders', { headers: headers, method: 'POST', form: { @@ -251,7 +251,7 @@ function start(token) { delete cli._nextTick; cli.stream.print('loading...'); - request('http://lvh.me/api/v1/user/orders/' + args.uuid + '/cancel', { + request('https://bitcoin-central.net/api/v1/user/orders/' + args.uuid + '/cancel', { headers: headers, method: 'DELETE' }, function(error, resp, body) { From d29e02168e153197d70b18f011db8d28942bbbfd Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:48:06 +0100 Subject: [PATCH 012/110] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 70cbf832..c17ea424 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ $ curl "https://bitcoin-central.net/api/oauth/token" \ } ``` -An access token can be used to authorize user requests for the approved scopes and is valid 5 minutes. +An access token can be used to authorize user requests for the approved scopes and is valid 30 minutes. ##### Refreshing the access token From be89c5ad996f48f764022d257480558972f4692f Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 8 Jan 2014 18:49:23 +0100 Subject: [PATCH 013/110] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c17ea424..57dda870 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ Read user activity. |--------------|----------------------------------------------|---------------------------| | offset | pagination offset (optional) | 20 | | limit | pagination limit (optional) | 20 | -| types[] | filter by types (optinal) | LimitOrder | +| types[] | filter by types (optional) | LimitOrder | | active | only show active orders (optional) | true | ##### Example From a1cb9e35a67480c2e2228982c040b5a6afb41a1f Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 11:06:04 +0100 Subject: [PATCH 014/110] Order types and states, tweaks --- README.md | 54 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 57dda870..9be90270 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,11 @@ _* Authenticating users is only available to developers that have a fully verifi * [Canceling orders](#canceling-orders) * [**Appendix**](#appendix) + * [Currencies](#currencies) + * [Order types](#order-types) * [Order properties](#order-properties) + * [Order states](#order-states) * [Account operation properties](#account-operation-properties) - * [Currencies](#currencies) - * [States](#states) * [Ruby example](#ruby-example) ## General information @@ -628,6 +629,27 @@ TODO ## Appendix +### Currencies + +The following currencies are available: + +| symbol | currency | +|--------|----------| +| EUR | Euro | +| BTC | Bitcoin | + +### Order types + +Orders can have the following types: + +| type | description | +|----------------|------------------------------------| +| WireDeposit | wire (FIAT) deposit | +| BitcoinDeposit | BTC deposit | +| LimitOrder | limit trade order | +| Transfer | BTC or fiat transfer or withdraw | +| AdminOrder | special order executed by an admin | + ### Order properties All order types share generic properties. @@ -659,6 +681,19 @@ Each type may have additional properties as described below. | traded_currency | currency exchanged | 310.0 | | traded_btc | BTC echanged | 0.5 | +### Order states + +| name | description | +|--------------------|----------------------------------------------------------------------------------| +| pending_execution | order is queued and pending execution | +| pending | order is pending, such as an unconfirmed withdrawal | +| processin | order is processing | +| authorized | order has been authorized, such as a confirmed withdrawal | +| active | order is active, such as a trade order in the order book | +| filled | order has been completely filled | +| executed | order has been executed | +| canceled | order has been canceled | + ### Account operation properties | name | description | example value | @@ -669,20 +704,7 @@ Each type may have additional properties as described below. | created_at | date created | "2013-10-22T14:30:06.000Z" | | created_at_int | timestamp | 1382452206 | | amount | currency amount | 49.38727114 | -| is_trading_account | whether the trading account is targeted | false | - -### Currencies - -The following currencies are available : - -| symbol | currency | -|--------|----------| -| EUR | Euro | -| BTC | Bitcoin | - -### States - -TODO +| is_trading_account | whether the trading account is targeted | false | ### Ruby example From 8d608fb57a666af57c44f2a485742ac8aff791dd Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 11:10:13 +0100 Subject: [PATCH 015/110] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9be90270..c308414f 100644 --- a/README.md +++ b/README.md @@ -644,7 +644,7 @@ Orders can have the following types: | type | description | |----------------|------------------------------------| -| WireDeposit | wire (FIAT) deposit | +| WireDeposit | wire (fiat) deposit | | BitcoinDeposit | BTC deposit | | LimitOrder | limit trade order | | Transfer | BTC or fiat transfer or withdraw | From e8c40d3301f660da5de9e73ecb057785b6e1ec13 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 11:11:20 +0100 Subject: [PATCH 016/110] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c308414f..8ea3f3ef 100644 --- a/README.md +++ b/README.md @@ -687,7 +687,7 @@ Each type may have additional properties as described below. |--------------------|----------------------------------------------------------------------------------| | pending_execution | order is queued and pending execution | | pending | order is pending, such as an unconfirmed withdrawal | -| processin | order is processing | +| processing | order is processing | | authorized | order has been authorized, such as a confirmed withdrawal | | active | order is active, such as a trade order in the order book | | filled | order has been completely filled | From 181c8d946eb95f2ed181034344417f48bf10899c Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 11:26:50 +0100 Subject: [PATCH 017/110] withdrawals --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ea3f3ef..5347e127 100644 --- a/README.md +++ b/README.md @@ -540,8 +540,8 @@ Create trade orders. | name | description | example value | |--------------------|-----------------------------------------|----------------------------------------| -| type | Must be "LimitOrder" | "LimitOrder" | -| currency | Must be "EUR" | "EUR" | +| type | must be "LimitOrder" | "LimitOrder" | +| currency | must be "EUR" | "EUR" | | direction | trade direction, must be "buy" or "sell"| "buy" | | price | price per BTC | 300.0 | | amount | BTC amount to trade | 1.0 | @@ -602,7 +602,62 @@ See [order properties](#order-properties). ### Withdrawing -TODO +Request BTC or fiat withdrawals. A confirmation is sent by email to the user before it can be executed. + +##### Endpoint + +| method | path | authorization | +|--------|----------------------------|--------------------------| +| POST | /api/v1/user/orders | oauth2 (scope: withdraw) | + +##### Payload + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| type | must be "Transfer" | "Transfer" | +| currency | currency code | "BTC" | +| amount | amount to transfer | 0.5 | +| address | BTC address is withdrawing BTC | "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" | + +##### Example + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/orders \ + --header "Authorization: Bearer ACCESS_TOKEN" \ + -d "type=Transfer" \ + -d "currency=BTC" \ + -d "amount=0.5" \ + -d "address=1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" +``` + +```json +{ + "uuid": "9229fd6e-0aad-45d6-8090-a400f37a0129", + "amount": 0.5, + "state": "pending", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2014-01-09T10:22:00.858Z", + "created_at": "2014-01-09T10:22:00.858Z", + "currency": "BTC", + "type": "Transfer", + "account_operations": [ + { + "uuid": "4c4f4682-354f-46d1-a916-72d88d5584e3", + "name": "bitcoin_transfer", + "amount": -0.5, + "currency": "BTC", + "created_at": "2014-01-09T10:22:02.171Z", + "created_at_int": 1389262922, + "is_trading_account": false + } + ] +} +``` + +##### Properties + +See [order properties](#order-properties). ### Canceling orders @@ -625,7 +680,7 @@ $ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-8 ### Web sockets -TODO +Web sockets are available to get real-time notifications and will be documented in the future. ## Appendix From 6c8717732bdf40cb40a32b9996b1ede0544946d4 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 11:40:08 +0100 Subject: [PATCH 018/110] General docs --- README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5347e127..2e527c24 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ _* Authenticating users is only available to developers that have a fully verifi * [**General information**](#general-information) * [Formats and required HTTP request headers](#formats-and-required-http-request-headers) + * [Localization](#localization) + * [Error handling](#error-handling) + * [Successful calls](#sucessful-calls) * [Rate-limiting](#rate-limiting) * [**Public data**](#public-data) @@ -45,6 +48,39 @@ _* Authenticating users is only available to developers that have a fully verifi The API will only answer with JSON or empty responses. It expects parameters to be passed in JSON with the correct `Content-Type: application/json` being set. +## Localization + +The relevant results and error messages will be localized to the language associated to the user, currently English and French are supported. + +## Datetime formats + +Datetime values will be returned as regular JSON format and Unix timestamps, the timestamps are suffixed with `_int`. + +## Error handling + +Whenever an error is encountered, the answer to a JSON API call will have: + + * An HTTP 422 status (Unprocessable entity) or HTTP 400 (Bad request) + * A JSON array of localized error messages in the `errors` attribute of the response body + +##### Example: + +```json +{ + "errors": [ + "Operations account operations amount is greater than your available balance (1781.96 EUR)" + "Amount can't be greater than your limit (1781.96 EUR)" + ] +} +``` + +## Successful calls + +If the API call was successful, the platform will answer with: + + * An HTTP 200 status (OK) or HTTP 201 (Created), + * A JSON representation of the entity being created or updated if relevant + ### Rate-limiting API calls are rate-limited by IP to 5000 calls per day. Information about the status of the limit can be found in the `X-RateLimit-Limit` and `X-RateLimit-Remaining` HTTP headers. @@ -254,7 +290,7 @@ Before you can access your own data or other users data, you must register an ap To access and manipulate user data, you must first request permission from the user. -Authorizations are granted using the standard [OAuth2 protocol](http://oauth.net/2/). +Authorizations are granted using the standard [OAuth2](http://oauth.net/2/) Authorization Code Grant. Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). From 5fb9ee7fa81a947030bb3ec4305e6130ced9cf8a Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 13:27:48 +0100 Subject: [PATCH 019/110] Cleaned node.js example --- examples/node.js/index.js | 430 ++++++++++++++++------------------ examples/node.js/package.json | 3 +- 2 files changed, 198 insertions(+), 235 deletions(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index b5e13c16..ffeda466 100644 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -1,21 +1,33 @@ // Node.js cli example +// Configuration +var config = { + appKey: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', + appSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', + + apiBaseUrl: 'http://lvh.me/api', + + serverBaseUrl: 'http://localhost:8000', + serverPort: 8000 +}; + var express = require('express'), app = express(), request = require('request'), - cli = require('cline')(); + cli = require('cline')(), + open = require('open'); -// App configuration +// OAuth2 configuration var OAuth2 = require('simple-oauth2')({ - clientID: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', - clientSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', - site: 'https://bitcoin-central.net/api', + clientID: config.appKey, + clientSecret: config.appSecret, + site: config.apiBaseUrl, tokenPath: '/oauth/token' }); // Authorization uri definition var authorization_uri = OAuth2.AuthCode.authorizeURL({ - redirect_uri: 'http://localhost:8000/callback', + redirect_uri: config.serverBaseUrl + '/callback', scope: 'basic activity trade' }); @@ -27,289 +39,239 @@ app.get('/auth', function (req, res) { // Callback service parsing the authorization token and asking for the access token app.get('/callback', function (req, res) { var code = req.query.code; + OAuth2.AuthCode.getToken({ code: code, - redirect_uri: 'http://localhost:8000/callback' + redirect_uri: config.serverBaseUrl + '/callback' }, saveToken); - function saveToken(error, token) { + function saveToken(error, resp) { if (error) { console.error(error.message); return res.send(error.message); } - start(token); + token = resp; res.send('ok'); } }); -function start(token) { - var headers = { - 'Authorization': 'Bearer ' + token.access_token - }; - - cli.command('ticker', 'show ticker', function () { - delete cli._nextTick; - cli.stream.print('loading...'); - - request('https://bitcoin-central.net/api/v1/data/eur/ticker', function(error, resp, body) { - if (error) return console.error(error.message); - - var data = JSON.parse(body); - var output = showObject(data); +// Convert trade orders to string +function tradeOrdersToString(data) { + output = ''; - cli.stream.print(output); - cli.interact('> '); - }); + data.forEach(function(order) { + output += '\n' + order.uuid + '\t'; + output += order.direction + '\t'; + output += order.amount.toFixed(8) + ' BTC for '; + output += order.price.toFixed(2) + ' ' + order.currency; + output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' + output += '\t' + order.state }); - cli.command('balances', 'show account balances', function () { - delete cli._nextTick; - cli.stream.print('loading...'); - - request('https://bitcoin-central.net/api/v1/user', { - headers: headers - }, function(error, resp, body) { - if (error) return console.error(error.message); - - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); - return cli.interact('> '); - } - - var data = JSON.parse(body); - var output = ''; - - output += '\nCurrency\tAccount\t\tBalance\n'; - output += 'BTC\t\tavailable\t' + data.balance_btc + '\n'; - output += 'BTC\t\ttrading\t\t' + data.locked_btc + '\n'; - output += 'EUR\t\tavailable\t' + data.balance_eur + '\n'; - output += 'EUR\t\ttrading\t\t' + data.locked_eur; + return output; +} - cli.stream.print(output); - cli.interact('> '); - }); - }); +// Register an API command +var token; +function addApiCommand(cmd, path, options, cb) { + options = options || {}; + + cli.command(cmd, cmd.desc, options.args, function (input, args) { + if(options.restricted && !token) { + var url = config.serverBaseUrl + '/auth'; + cli.stream.print('opening ' + url + ' in your browser...'); + open(url); + return; + } - cli.command('active', 'show active trade orders', function () { delete cli._nextTick; cli.stream.print('loading...'); - request('https://bitcoin-central.net/api/v1/user/orders', { - headers: headers, - qs: { - 'types[]': 'LimitOrder', - active: true - } - }, function(error, resp, body) { - if (error) return console.error(error.message); - - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); - return cli.interact('> '); - } - - var data = JSON.parse(body); - var output = ''; + options.headers = options.headers || {}; - data.forEach(function(order) { - output += '\n' + order.uuid + '\t'; - output += order.direction + '\t'; - output += order.amount.toFixed(8) + ' BTC for '; - output += order.price.toFixed(2) + ' ' + order.currency; - output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' - output += '\t' + order.state - }); + if(options.restricted) { + options.headers['Authorization'] = 'Bearer ' + token.access_token; + } - cli.stream.print(output); - cli.interact('> '); - }); - }); + var pathStr = path; - cli.command('orders', 'show all trade orders', function () { - delete cli._nextTick; - cli.stream.print('loading...'); + if (typeof path === 'function') { + pathStr = path(input, args); + } - request('https://bitcoin-central.net/api/v1/user/orders', { - headers: headers, - qs: { - 'types[]': 'LimitOrder' - } - }, function(error, resp, body) { - if (error) return console.error(error.message); + if (typeof options.payload === 'function') { + options.form = options.payload(input, args); + } - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); + request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { + if (error) { + cli.stream.print(error.message); return cli.interact('> '); } - var data = JSON.parse(body); - var output = ''; - - data.forEach(function(order) { - output += '\n' + order.uuid + '\t'; - output += order.direction + '\t'; - output += order.amount.toFixed(8) + ' BTC for '; - output += order.price.toFixed(2) + ' ' + order.currency; - output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' - output += '\t' + order.state - }); - - cli.stream.print(output); - cli.interact('> '); - }); - }); - - cli.command('show {uuid}', 'show order by uuid', {uuid: '[0-9a-z\-]+'}, function (input, args) { - delete cli._nextTick; - cli.stream.print('loading...'); - - request('https://bitcoin-central.net/api/v1/user/orders/' + args.uuid, { - headers: headers - }, function(error, resp, body) { - if (error) return console.error(error.message); - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); + cli.stream.print('unauthorized, use refresh_tokens to refresh access tokens'); return cli.interact('> '); } - var data = JSON.parse(body); - var output = showObject(data); - - cli.stream.print(output); - cli.interact('> '); - }); - }); - - cli.command('buy {amount} {price}', 'place a buy order', {amount: '[0-9\.]+', price: '[0-9\.]+'}, function (input, args) { - amount = parseFloat(args.amount); - price = parseFloat(args.price); - console.log('Buy ' + amount + ' BTC for ' + price + ' EUR each?') - - delete cli._nextTick; - cli.stream.print('loading...'); + if (resp.statusCode === 422) { + cli.stream.print('unprocessable entity'); + return cli.interact('> '); + } - request('https://bitcoin-central.net/api/v1/user/orders', { - headers: headers, - method: 'POST', - form: { - 'type': 'LimitOrder', - currency: 'EUR', - direction: 'buy', - amount: amount, - price: price - } - }, function(error, resp, body) { - if (error) return console.error(error.message); + var data = {}; - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); - return cli.interact('> '); - } + try { + var data = JSON.parse(body); + } catch(e) {} - var data = JSON.parse(body); - cli.stream.print(data.uuid); + cli.stream.print(cb(data)); cli.interact('> '); }); }); +} - cli.command('sell {amount} {price}', 'place a sell order', {amount: '[0-9\.]+', price: '[0-9\.]+'}, function (input, args) { - amount = parseFloat(args.amount); - price = parseFloat(args.price); - console.log('Sell ' + amount + ' BTC for ' + price + ' EUR each?') +// Ticker command +addApiCommand('ticker', '/v1/data/eur/ticker', { + desc: 'show ticker' +}, function(data) { + return JSON.stringify(data, true, '\t'); +}); - delete cli._nextTick; - cli.stream.print('loading...'); +// Balances command +addApiCommand('balances', '/v1/user', { + desc: 'show account balances', + restricted: true +}, function(data) { + var output = ''; - request('https://bitcoin-central.net/api/v1/user/orders', { - headers: headers, - method: 'POST', - form: { - 'type': 'LimitOrder', - currency: 'EUR', - direction: 'sell', - amount: amount, - price: price - } - }, function(error, resp, body) { - if (error) return console.error(error.message); + output += '\nCurrency\tAccount\t\tBalance\n'; + output += 'BTC\t\tavailable\t' + data.balance_btc + '\n'; + output += 'BTC\t\ttrading\t\t' + data.locked_btc + '\n'; + output += 'EUR\t\tavailable\t' + data.balance_eur + '\n'; + output += 'EUR\t\ttrading\t\t' + data.locked_eur; - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); - return cli.interact('> '); - } + return output; +}); - var data = JSON.parse(body); - cli.stream.print(data.uuid); - cli.interact('> '); - }); - }); +// Active command +addApiCommand('active', '/v1/user/orders', { + desc: 'show active trade orders', + restricted: true, + qs: { + 'types[]': 'LimitOrder', + active: true + } +}, function(data) { + return tradeOrdersToString(data); +}); - cli.command('cancel {uuid}', 'cancel order by uuid', {uuid: '[0-9a-z\-]+'}, function (input, args) { - delete cli._nextTick; - cli.stream.print('loading...'); +// Orders command +addApiCommand('orders', '/v1/user/orders', { + desc: 'show all tade orders', + restricted: true, + qs: { + 'types[]': 'LimitOrder' + } +}, function(data) { + return tradeOrdersToString(data); +}); - request('https://bitcoin-central.net/api/v1/user/orders/' + args.uuid + '/cancel', { - headers: headers, - method: 'DELETE' - }, function(error, resp, body) { - if (error) return console.error(error.message); +// Order command +addApiCommand('show {uuid}', function(input, args) {return '/v1/user/orders/' + args.uuid;}, { + desc: 'show all orders', + restricted: true, + args: { + uuid: '[0-9a-z\-]+' + } +}, function(data) { + return JSON.stringify(data, true, '\t'); +}); - if (resp.statusCode === 401) { - cli.stream.print('Unauthorized. You might need to refresh tokens.'); - return cli.interact('> '); - } +// Buy command +addApiCommand('buy {amount} {price}', '/v1/user/orders', { + desc: 'place a buy order', + restricted: true, + method: 'POST', + args: { + amount: '[0-9\.]+', + price: '[0-9\.]+' + }, + payload: function(input, args) { + return { + 'type': 'LimitOrder', + currency: 'EUR', + direction: 'buy', + amount: args.amount, + price: args.price + } + } +}, function(data) { + return data.uuid; +}); - cli.stream.print('Order cancelling.'); - cli.interact('> '); - }); - }); +// Sell command +addApiCommand('sell {amount} {price}', '/v1/user/orders', { + desc: 'place a sell order', + restricted: true, + method: 'POST', + args: { + amount: '[0-9\.]+', + price: '[0-9\.]+' + }, + payload: function(input, args) { + return { + 'type': 'LimitOrder', + currency: 'EUR', + direction: 'sell', + amount: args.amount, + price: args.price + } + } +}, function(data) { + return data.uuid; +}); - cli.command('refresh_tokens', 'refresh access tokens', function () { - delete cli._nextTick; - cli.stream.print('loading...'); +// Cancel command +addApiCommand('cancel {uuid}', function(input, args) {return '/v1/user/orders/' + args.uuid + '/cancel';}, { + desc: 'cancel a trade order', + restricted: true, + method: 'DELETE', + args: { + uuid: '[0-9a-z\-]+' + } +}, function(data) { + return 'cancel requested'; +}); - OAuth2.AccessToken.create(token).refresh(function(error, result) { - if (error) return console.error(error.message); +// Refresh tokens command +cli.command('refresh_tokens', 'refresh access tokens', function () { + if (!token) { + cli.stream.print('no tokens yet'); + return cli.interact('> '); + } - token = result.token; - headers = { - 'Authorization': 'Bearer ' + token.access_token - }; + delete cli._nextTick; + cli.stream.print('loading...'); - cli.stream.print('Ok.'); - cli.interact('> '); - }); - }); + OAuth2.AccessToken.create(token).refresh(function(error, result) { + if (error) { + cli.stream.print(error.message); + return cli.interact('> '); + } - cli.interact('> '); + token = result.token; - cli.on('close', function () { - process.exit(); + cli.stream.print('refreshed'); + cli.interact('> '); }); -} - -function showObject(data) { - output = ''; +}); - for(key in data) { - switch(key) { - case 'created_at': - output += '\n' + key + ': ' + new Date(data[key]); - break; - case 'updated_at': - output += '\n' + key + ': ' + new Date(data[key]); - case 'account_operations': - break; - default: - output += '\n' + key + ': ' + data[key]; - } - } +app.listen(config.serverPort); +cli.interact('> '); - return output; -} - -app.listen(8000); -console.log('Open http://localhost:8000/auth in your browser to authorize the application.') +cli.on('close', function () { + process.exit(); +}); diff --git a/examples/node.js/package.json b/examples/node.js/package.json index 73203a1f..bf7cbaeb 100644 --- a/examples/node.js/package.json +++ b/examples/node.js/package.json @@ -12,6 +12,7 @@ "simple-oauth2": "~0.1.8", "express": "~3.4.7", "request": "~2.31.0", - "cline": "~0.7.0" + "cline": "~0.7.0", + "open": "0.0.4" } } From bbebc363d793bef0d50b32b1dbf1e3a40c1aba99 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:20:51 +0100 Subject: [PATCH 020/110] Node.js example --- examples/node.js/README.md | 18 ++++ examples/node.js/config.js | 13 +++ examples/node.js/index.js | 156 +++++++++++++++++++--------------- examples/node.js/package.json | 4 + 4 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 examples/node.js/README.md create mode 100644 examples/node.js/config.js mode change 100644 => 100755 examples/node.js/index.js diff --git a/examples/node.js/README.md b/examples/node.js/README.md new file mode 100644 index 00000000..7d0f5a69 --- /dev/null +++ b/examples/node.js/README.md @@ -0,0 +1,18 @@ +## bcjs + +This is an example of how to use the Bicoin-Central API using Node.js, including handling OAuth2 callbacks and refresh tokens. + +### Configuration + +To use, you must register an application on Bitcoin-Central with redirection URI set to `http://localhost:8000/callback`. + +Configuration is stored in `config.js`. You must set `appKey` and `appSecret` to your application's key and secret. + +### Installation + +1. install node.js +2. downloads this package +3. run `npm install` +4. run `npm link` +5. launch the app using `bcjs` +6. type `help` for a list of commands diff --git a/examples/node.js/config.js b/examples/node.js/config.js new file mode 100644 index 00000000..1a865ae4 --- /dev/null +++ b/examples/node.js/config.js @@ -0,0 +1,13 @@ +var path = require('path'); + +module.exports = { + appKey: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', + appSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', + + apiBaseUrl: 'http://lvh.me/api', + + serverBaseUrl: 'http://localhost:8000', + serverPort: 8000, + + tokenFile: path.resolve(__dirname, 'tokens') +}; diff --git a/examples/node.js/index.js b/examples/node.js/index.js old mode 100644 new mode 100755 index ffeda466..774ba830 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -1,20 +1,13 @@ -// Node.js cli example - -// Configuration -var config = { - appKey: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', - appSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', +#! /usr/bin/env node - apiBaseUrl: 'http://lvh.me/api', - - serverBaseUrl: 'http://localhost:8000', - serverPort: 8000 -}; +// Node.js cli example -var express = require('express'), +var config = require('./config'), + express = require('express'), app = express(), request = require('request'), cli = require('cline')(), + fs = require('fs'), open = require('open'); // OAuth2 configuration @@ -37,6 +30,7 @@ app.get('/auth', function (req, res) { }); // Callback service parsing the authorization token and asking for the access token +var afterAuth; app.get('/callback', function (req, res) { var code = req.query.code; @@ -52,11 +46,28 @@ app.get('/callback', function (req, res) { } token = resp; + fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + + res.send('You may close this window.'); - res.send('ok'); + if(afterAuth) afterAuth(); + + afterAuth = null; } }); +// Refresh tokens +function refreshTokens(cb) { + OAuth2.AccessToken.create(token).refresh(function(error, result) { + if (!error) { + token = result.token; + fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + } + + cb(error); + }); +}; + // Convert trade orders to string function tradeOrdersToString(data) { output = ''; @@ -80,56 +91,78 @@ function addApiCommand(cmd, path, options, cb) { cli.command(cmd, cmd.desc, options.args, function (input, args) { if(options.restricted && !token) { + delete cli._nextTick; var url = config.serverBaseUrl + '/auth'; cli.stream.print('opening ' + url + ' in your browser...'); - open(url); - return; + afterAuth = doRequest; + return open(url); } - delete cli._nextTick; - cli.stream.print('loading...'); - - options.headers = options.headers || {}; + var state; - if(options.restricted) { - options.headers['Authorization'] = 'Bearer ' + token.access_token; - } + function doRequest() { + delete cli._nextTick; + cli.stream.print('loading...'); - var pathStr = path; + options.headers = options.headers || {}; - if (typeof path === 'function') { - pathStr = path(input, args); - } + if(options.restricted) { + options.headers['Authorization'] = 'Bearer ' + token.access_token; + } - if (typeof options.payload === 'function') { - options.form = options.payload(input, args); - } + var pathStr = path; - request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { - if (error) { - cli.stream.print(error.message); - return cli.interact('> '); + if (typeof path === 'function') { + pathStr = path(input, args); } - if (resp.statusCode === 401) { - cli.stream.print('unauthorized, use refresh_tokens to refresh access tokens'); - return cli.interact('> '); + if (typeof options.payload === 'function') { + options.form = options.payload(input, args); } - if (resp.statusCode === 422) { - cli.stream.print('unprocessable entity'); - return cli.interact('> '); - } - - var data = {}; - - try { - var data = JSON.parse(body); - } catch(e) {} + request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { + if (error) { + cli.stream.print(error.message); + return cli.interact('> '); + } + + if (resp.statusCode === 401) { + if (token && !state) { + refreshTokens(function(error) { + state = 'refreshed'; + doRequest(); + }); + } + else if (state == 'refreshed') { + state = 'authorizing'; + var url = config.serverBaseUrl + '/auth'; + cli.stream.print('opening ' + url + ' in your browser...'); + afterAuth = doRequest; + return open(url); + } + else { + cli.stream.print('unauthorized'); + return cli.interact('> '); + } + } + + if (resp.statusCode === 422) { + cli.stream.print('unprocessable entity'); + return cli.interact('> '); + } + + var data = {}; + + try { + var data = JSON.parse(body); + } catch(e) {} + + cli.stream.print(cb(data)); + cli.interact('> '); + }); + } - cli.stream.print(cb(data)); - cli.interact('> '); - }); + doRequest(); }); } @@ -246,28 +279,11 @@ addApiCommand('cancel {uuid}', function(input, args) {return '/v1/user/orders/' return 'cancel requested'; }); -// Refresh tokens command -cli.command('refresh_tokens', 'refresh access tokens', function () { - if (!token) { - cli.stream.print('no tokens yet'); - return cli.interact('> '); - } - - delete cli._nextTick; - cli.stream.print('loading...'); - - OAuth2.AccessToken.create(token).refresh(function(error, result) { - if (error) { - cli.stream.print(error.message); - return cli.interact('> '); - } - - token = result.token; +if (fs.existsSync(config.tokenFile)) { + token = JSON.parse(fs.readFileSync(config.tokenFile)); +} - cli.stream.print('refreshed'); - cli.interact('> '); - }); -}); +console.log('Welcome to Bitcoin-Central JS. Type `help` for help.'); app.listen(config.serverPort); cli.interact('> '); diff --git a/examples/node.js/package.json b/examples/node.js/package.json index bf7cbaeb..52d753b0 100644 --- a/examples/node.js/package.json +++ b/examples/node.js/package.json @@ -14,5 +14,9 @@ "request": "~2.31.0", "cline": "~0.7.0", "open": "0.0.4" + }, + "preferGlobal": "true", + "bin": { + "bcjs" : "index.js" } } From d5c366d4915224b7fbda49d832da6a6d90a80a9b Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:22:04 +0100 Subject: [PATCH 021/110] Typo --- examples/node.js/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/node.js/README.md b/examples/node.js/README.md index 7d0f5a69..57caa563 100644 --- a/examples/node.js/README.md +++ b/examples/node.js/README.md @@ -11,7 +11,7 @@ Configuration is stored in `config.js`. You must set `appKey` and `appSecret` to ### Installation 1. install node.js -2. downloads this package +2. download this package 3. run `npm install` 4. run `npm link` 5. launch the app using `bcjs` From 8c7bf851b97cee57eb55ab64669eb0ebaceb80c9 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:44:39 +0100 Subject: [PATCH 022/110] uuid matching --- examples/node.js/index.js | 60 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 774ba830..1f24dbde 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -10,6 +10,9 @@ var config = require('./config'), fs = require('fs'), open = require('open'); +// Known order uuids +var knownUuids = {}; + // OAuth2 configuration var OAuth2 = require('simple-oauth2')({ clientID: config.appKey, @@ -73,6 +76,7 @@ function tradeOrdersToString(data) { output = ''; data.forEach(function(order) { + knownUuids[order.uuid] = true; output += '\n' + order.uuid + '\t'; output += order.direction + '\t'; output += order.amount.toFixed(8) + ' BTC for '; @@ -84,6 +88,23 @@ function tradeOrdersToString(data) { return output; } +// Try to match incomplete uuid to know ones +function matchUuid(uuid) { + if(uuid.length === 36) { + return [uuid]; + } + + matches = []; + + for (key in knownUuids) { + if(key.indexOf(uuid) === 0) { + matches.push(key); + } + } + + return matches; +} + // Register an API command var token; function addApiCommand(cmd, path, options, cb) { @@ -102,7 +123,6 @@ function addApiCommand(cmd, path, options, cb) { function doRequest() { delete cli._nextTick; - cli.stream.print('loading...'); options.headers = options.headers || {}; @@ -114,12 +134,18 @@ function addApiCommand(cmd, path, options, cb) { if (typeof path === 'function') { pathStr = path(input, args); + + if (!pathStr) { + return cli.interact('> '); + } } if (typeof options.payload === 'function') { options.form = options.payload(input, args); } + cli.stream.print('loading...'); + request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { if (error) { cli.stream.print(error.message); @@ -212,8 +238,20 @@ addApiCommand('orders', '/v1/user/orders', { return tradeOrdersToString(data); }); -// Order command -addApiCommand('show {uuid}', function(input, args) {return '/v1/user/orders/' + args.uuid;}, { +// Show command +addApiCommand('show {uuid}', function(input, args) { + var uuids = matchUuid(args.uuid); + + if(uuids.length === 0) { + cli.stream.print('no matching uuid'); + } + else if(uuids.length === 1) { + return '/v1/user/orders/' + uuids[0]; + } + else { + cli.stream.print('multiple matching uuids: ' + uuids); + } +}, { desc: 'show all orders', restricted: true, args: { @@ -242,6 +280,7 @@ addApiCommand('buy {amount} {price}', '/v1/user/orders', { } } }, function(data) { + knownUuids[data.uuid] = true; return data.uuid; }); @@ -264,11 +303,24 @@ addApiCommand('sell {amount} {price}', '/v1/user/orders', { } } }, function(data) { + knownUuids[data.uuid] = true; return data.uuid; }); // Cancel command -addApiCommand('cancel {uuid}', function(input, args) {return '/v1/user/orders/' + args.uuid + '/cancel';}, { +addApiCommand('cancel {uuid}', function(input, args) { + var uuids = matchUuid(args.uuid); + + if(uuids.length === 0) { + cli.stream.print('no matching uuid'); + } + else if(uuids.length === 1) { + return '/v1/user/orders/' + uuids[0] + '/cancel'; + } + else { + cli.stream.print('multiple matching uuids: ' + uuids); + } +}, { desc: 'cancel a trade order', restricted: true, method: 'DELETE', From dafdbf54aa3d7217ee32d91fe4faaf68b5cb5ce9 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:51:15 +0100 Subject: [PATCH 023/110] made token file optional --- examples/node.js/config.js | 1 + examples/node.js/index.js | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/node.js/config.js b/examples/node.js/config.js index 1a865ae4..1620a077 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -9,5 +9,6 @@ module.exports = { serverBaseUrl: 'http://localhost:8000', serverPort: 8000, + // Remove to disable saving tokens to file tokenFile: path.resolve(__dirname, 'tokens') }; diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 1f24dbde..818c5e6f 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -49,7 +49,10 @@ app.get('/callback', function (req, res) { } token = resp; - fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + + if (config.tokenFile) { + fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + } res.send('You may close this window.'); @@ -64,7 +67,10 @@ function refreshTokens(cb) { OAuth2.AccessToken.create(token).refresh(function(error, result) { if (!error) { token = result.token; - fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + + if (config.tokenFile) { + fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + } } cb(error); @@ -331,7 +337,7 @@ addApiCommand('cancel {uuid}', function(input, args) { return 'cancel requested'; }); -if (fs.existsSync(config.tokenFile)) { +if (config.tokenFile && fs.existsSync(config.tokenFile)) { token = JSON.parse(fs.readFileSync(config.tokenFile)); } From 724a1dd99557dea180f6c8616eb56eadb7ebd3ec Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:53:10 +0100 Subject: [PATCH 024/110] Added node.js example warning --- examples/node.js/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/node.js/README.md b/examples/node.js/README.md index 57caa563..6979b1e5 100644 --- a/examples/node.js/README.md +++ b/examples/node.js/README.md @@ -2,6 +2,8 @@ This is an example of how to use the Bicoin-Central API using Node.js, including handling OAuth2 callbacks and refresh tokens. +USE AT YOUR OWN RISK! + ### Configuration To use, you must register an application on Bitcoin-Central with redirection URI set to `http://localhost:8000/callback`. From 8921a5aef30a2d9bd08186bbcbc6c1bd0123d834 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 14:56:29 +0100 Subject: [PATCH 025/110] Added node.js errors --- examples/node.js/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 818c5e6f..05827bfd 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -179,7 +179,7 @@ function addApiCommand(cmd, path, options, cb) { } if (resp.statusCode === 422) { - cli.stream.print('unprocessable entity'); + cli.stream.print(JSON.parse(body).errors); return cli.interact('> '); } From 386f1dc8561516e514bacef2f1bac101ff0360c0 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 15:02:36 +0100 Subject: [PATCH 026/110] bcjs bugfix --- examples/node.js/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 05827bfd..0ef67461 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -83,12 +83,12 @@ function tradeOrdersToString(data) { data.forEach(function(order) { knownUuids[order.uuid] = true; - output += '\n' + order.uuid + '\t'; + output += order.uuid + '\t'; output += order.direction + '\t'; output += order.amount.toFixed(8) + ' BTC for '; output += order.price.toFixed(2) + ' ' + order.currency; output += ' (' + order.traded_btc.toFixed(8) + ' BTC traded)' - output += '\t' + order.state + output += '\t' + order.state + '\n' }); return output; @@ -150,8 +150,6 @@ function addApiCommand(cmd, path, options, cb) { options.form = options.payload(input, args); } - cli.stream.print('loading...'); - request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { if (error) { cli.stream.print(error.message); @@ -170,12 +168,14 @@ function addApiCommand(cmd, path, options, cb) { var url = config.serverBaseUrl + '/auth'; cli.stream.print('opening ' + url + ' in your browser...'); afterAuth = doRequest; - return open(url); + open(url); } else { cli.stream.print('unauthorized'); - return cli.interact('> '); + cli.interact('> '); } + + return; } if (resp.statusCode === 422) { @@ -212,7 +212,7 @@ addApiCommand('balances', '/v1/user', { }, function(data) { var output = ''; - output += '\nCurrency\tAccount\t\tBalance\n'; + output += 'Currency\tAccount\t\tBalance\n'; output += 'BTC\t\tavailable\t' + data.balance_btc + '\n'; output += 'BTC\t\ttrading\t\t' + data.locked_btc + '\n'; output += 'EUR\t\tavailable\t' + data.balance_eur + '\n'; From c706d118d953c67a0432bcb6b055625c7b83e8e9 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 19:51:00 +0100 Subject: [PATCH 027/110] added basic encryption to bcjs example --- examples/node.js/config.js | 9 ++-- examples/node.js/index.js | 98 +++++++++++++++++++++++------------ examples/node.js/package.json | 5 +- 3 files changed, 73 insertions(+), 39 deletions(-) diff --git a/examples/node.js/config.js b/examples/node.js/config.js index 1620a077..01866e11 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -1,14 +1,15 @@ var path = require('path'); module.exports = { - appKey: '4de5809067b745f99bdc1d78c6885d8be63b85fb79578e81010e3e12bf758b72', - appSecret: '088d1aed6ba7062e51b4d15838ca906b0c67194339cbb1aed2324de0c625928c', + appKey: 'YOUR_APP_KEY', + appSecret: 'YOUR_APP_SECRET', - apiBaseUrl: 'http://lvh.me/api', + scopes: 'basic activity trade', + + apiBaseUrl: 'https://bitcoin-central.net/api', serverBaseUrl: 'http://localhost:8000', serverPort: 8000, - // Remove to disable saving tokens to file tokenFile: path.resolve(__dirname, 'tokens') }; diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 0ef67461..b34e4d46 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -8,7 +8,8 @@ var config = require('./config'), request = require('request'), cli = require('cline')(), fs = require('fs'), - open = require('open'); + open = require('open'), + easycrypto = require('easycrypto').getInstance(); // Known order uuids var knownUuids = {}; @@ -24,7 +25,7 @@ var OAuth2 = require('simple-oauth2')({ // Authorization uri definition var authorization_uri = OAuth2.AuthCode.authorizeURL({ redirect_uri: config.serverBaseUrl + '/callback', - scope: 'basic activity trade' + scope: config.scopes }); // Authorization page redirecting to Bitcoin-Central @@ -42,39 +43,55 @@ app.get('/callback', function (req, res) { redirect_uri: config.serverBaseUrl + '/callback' }, saveToken); - function saveToken(error, resp) { + function saveToken(error, tokens) { if (error) { console.error(error.message); return res.send(error.message); } - token = resp; - - if (config.tokenFile) { - fs.writeFileSync(config.tokenFile, JSON.stringify(token)); - } - res.send('You may close this window.'); - if(afterAuth) afterAuth(); + cli.password('choose a password: ', '*', function(pwd) { + var data = easycrypto.encrypt(JSON.stringify(tokens), pwd); + fs.writeFileSync(config.tokenFile, data, {encoding: 'utf8'}); - afterAuth = null; + access_token = tokens.access_token; + expires = new Date(new Date().getTime() + 1000 * tokens.expires_in); + + if(afterAuth) afterAuth(); + afterAuth = null; + }); } }); // Refresh tokens function refreshTokens(cb) { - OAuth2.AccessToken.create(token).refresh(function(error, result) { - if (!error) { - token = result.token; - - if (config.tokenFile) { - fs.writeFileSync(config.tokenFile, JSON.stringify(token)); + function doIt() { + cli.password('enter password: ', '*', function(pwd) { + try { + var tokens = JSON.parse(easycrypto.decrypt(fs.readFileSync(config.tokenFile, { + encoding: 'utf8' + }), pwd)); + } + catch(e) { + doIt(); } - } - cb(error); - }); + OAuth2.AccessToken.create(tokens).refresh(function(error, result) { + if (!error) { + var tokens = result.token; + var data = easycrypto.encrypt(JSON.stringify(tokens), pwd); + fs.writeFileSync(config.tokenFile, data, {encoding: 'utf8'}); + access_token = tokens.access_token; + expires = new Date(new Date().getTime() + 1000 * tokens.expires_in) + } + + if(cb) cb(error); + }); + }); + } + + doIt(); }; // Convert trade orders to string @@ -100,7 +117,7 @@ function matchUuid(uuid) { return [uuid]; } - matches = []; + var matches = []; for (key in knownUuids) { if(key.indexOf(uuid) === 0) { @@ -112,17 +129,25 @@ function matchUuid(uuid) { } // Register an API command -var token; +var access_token; +var expires; + function addApiCommand(cmd, path, options, cb) { options = options || {}; cli.command(cmd, cmd.desc, options.args, function (input, args) { - if(options.restricted && !token) { + if(options.restricted && !access_token) { delete cli._nextTick; - var url = config.serverBaseUrl + '/auth'; - cli.stream.print('opening ' + url + ' in your browser...'); - afterAuth = doRequest; - return open(url); + + if (fs.existsSync(config.tokenFile)) { + return refreshTokens(doRequest); + } + else { + var url = config.serverBaseUrl + '/auth'; + cli.stream.print('opening ' + url + ' in your browser...'); + afterAuth = doRequest; + return open(url); + } } var state; @@ -133,7 +158,7 @@ function addApiCommand(cmd, path, options, cb) { options.headers = options.headers || {}; if(options.restricted) { - options.headers['Authorization'] = 'Bearer ' + token.access_token; + options.headers['Authorization'] = 'Bearer ' + access_token; } var pathStr = path; @@ -157,7 +182,7 @@ function addApiCommand(cmd, path, options, cb) { } if (resp.statusCode === 401) { - if (token && !state) { + if (access_token && !state) { refreshTokens(function(error) { state = 'refreshed'; doRequest(); @@ -337,9 +362,16 @@ addApiCommand('cancel {uuid}', function(input, args) { return 'cancel requested'; }); -if (config.tokenFile && fs.existsSync(config.tokenFile)) { - token = JSON.parse(fs.readFileSync(config.tokenFile)); -} +// TTL command +cli.command('ttl', 'show access token time to live', function () { + if(access_token) { + var time = expires.getTime() - new Date().getTime(); + cli.stream.print(Math.ceil(time / 1000 / 60) + ' min'); + } + else { + cli.stream.print('no access token'); + } +}); console.log('Welcome to Bitcoin-Central JS. Type `help` for help.'); @@ -347,5 +379,5 @@ app.listen(config.serverPort); cli.interact('> '); cli.on('close', function () { - process.exit(); + process.exit(); }); diff --git a/examples/node.js/package.json b/examples/node.js/package.json index 52d753b0..ccc98758 100644 --- a/examples/node.js/package.json +++ b/examples/node.js/package.json @@ -13,10 +13,11 @@ "express": "~3.4.7", "request": "~2.31.0", "cline": "~0.7.0", - "open": "0.0.4" + "open": "0.0.4", + "easycrypto": "~0.1.1" }, "preferGlobal": "true", "bin": { - "bcjs" : "index.js" + "bcjs": "index.js" } } From f9db038dfc7b86f3c52d2c3760351bff47fae896 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 19:52:52 +0100 Subject: [PATCH 028/110] bcjs example bugfix --- examples/node.js/config.js | 4 ++-- examples/node.js/index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/node.js/config.js b/examples/node.js/config.js index 01866e11..ef6ca63d 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -1,8 +1,8 @@ var path = require('path'); module.exports = { - appKey: 'YOUR_APP_KEY', - appSecret: 'YOUR_APP_SECRET', + appKey: '33be5e031fbe0f72827609503a2f7d100d62d7e6f31375bb7ba54a9abc2475c0', + appSecret: 'd0c9527d343c43de642d57acb5303b6b5e036a329341b799431dd7cb7f740e50', scopes: 'basic activity trade', diff --git a/examples/node.js/index.js b/examples/node.js/index.js index b34e4d46..2717e5e2 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -74,7 +74,7 @@ function refreshTokens(cb) { }), pwd)); } catch(e) { - doIt(); + return doIt(); } OAuth2.AccessToken.create(tokens).refresh(function(error, result) { From 56a190dbbd9377459c9d49cdd98ea0dd0e42cc7c Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 9 Jan 2014 19:53:09 +0100 Subject: [PATCH 029/110] bcjs example bugfix --- examples/node.js/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/node.js/config.js b/examples/node.js/config.js index ef6ca63d..01866e11 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -1,8 +1,8 @@ var path = require('path'); module.exports = { - appKey: '33be5e031fbe0f72827609503a2f7d100d62d7e6f31375bb7ba54a9abc2475c0', - appSecret: 'd0c9527d343c43de642d57acb5303b6b5e036a329341b799431dd7cb7f740e50', + appKey: 'YOUR_APP_KEY', + appSecret: 'YOUR_APP_SECRET', scopes: 'basic activity trade', From 9789093faf9564245668b248a5efe84536533f98 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 14 Jan 2014 15:46:20 +0100 Subject: [PATCH 030/110] bcjs: new commands, confirmations --- README.md | 2 +- examples/node.js/config.js | 4 +- examples/node.js/index.js | 208 ++++++++++++++++++++++++++-------- examples/node.js/package.json | 3 +- 4 files changed, 163 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 2e527c24..9aed3542 100644 --- a/README.md +++ b/README.md @@ -653,7 +653,7 @@ Request BTC or fiat withdrawals. A confirmation is sent by email to the user bef | type | must be "Transfer" | "Transfer" | | currency | currency code | "BTC" | | amount | amount to transfer | 0.5 | -| address | BTC address is withdrawing BTC | "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" | +| address | BTC address if withdrawing BTC | "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" | ##### Example diff --git a/examples/node.js/config.js b/examples/node.js/config.js index 01866e11..b5d80087 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -2,9 +2,9 @@ var path = require('path'); module.exports = { appKey: 'YOUR_APP_KEY', - appSecret: 'YOUR_APP_SECRET', + appSecret: 'YOUR_APP_CODE', - scopes: 'basic activity trade', + scopes: 'basic activity trade withdraw', apiBaseUrl: 'https://bitcoin-central.net/api', diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 2717e5e2..6559f23a 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -9,7 +9,8 @@ var config = require('./config'), cli = require('cline')(), fs = require('fs'), open = require('open'), - easycrypto = require('easycrypto').getInstance(); + easycrypto = require('easycrypto').getInstance(), + babar = require('babar'); // Known order uuids var knownUuids = {}; @@ -155,68 +156,85 @@ function addApiCommand(cmd, path, options, cb) { function doRequest() { delete cli._nextTick; - options.headers = options.headers || {}; - - if(options.restricted) { - options.headers['Authorization'] = 'Bearer ' + access_token; + if (options.confirm) { + delete cli._nextTick; + cli.confirm(options.confirm(input, args) + ' (y/n) ', function(ok) { + if (ok) { + runRequest(); + } + else { + cli.interact('> '); + } + }); + } + else { + runRequest(); } - var pathStr = path; - - if (typeof path === 'function') { - pathStr = path(input, args); + function runRequest() { + options.headers = options.headers || {}; - if (!pathStr) { - return cli.interact('> '); + if(options.restricted) { + options.headers['Authorization'] = 'Bearer ' + access_token; } - } - if (typeof options.payload === 'function') { - options.form = options.payload(input, args); - } + var pathStr = path; - request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { - if (error) { - cli.stream.print(error.message); - return cli.interact('> '); - } + if (typeof path === 'function') { + pathStr = path(input, args); - if (resp.statusCode === 401) { - if (access_token && !state) { - refreshTokens(function(error) { - state = 'refreshed'; - doRequest(); - }); - } - else if (state == 'refreshed') { - state = 'authorizing'; - var url = config.serverBaseUrl + '/auth'; - cli.stream.print('opening ' + url + ' in your browser...'); - afterAuth = doRequest; - open(url); - } - else { - cli.stream.print('unauthorized'); - cli.interact('> '); + if (!pathStr) { + return cli.interact('> '); } + } - return; + if (typeof options.payload === 'function') { + options.form = options.payload(input, args); } - if (resp.statusCode === 422) { - cli.stream.print(JSON.parse(body).errors); - return cli.interact('> '); - } + request(config.apiBaseUrl + pathStr, options, function(error, resp, body) { + if (error) { + cli.stream.print(error.message); + return cli.interact('> '); + } + + if (resp.statusCode === 401) { + if (access_token && !state) { + refreshTokens(function(error) { + state = 'refreshed'; + doRequest(); + }); + } + else if (state == 'refreshed') { + state = 'authorizing'; + var url = config.serverBaseUrl + '/auth'; + cli.stream.print('opening ' + url + ' in your browser...'); + afterAuth = doRequest; + open(url); + } + else { + cli.stream.print('unauthorized'); + cli.interact('> '); + } + + return; + } - var data = {}; + if (resp.statusCode === 422) { + cli.stream.print(JSON.parse(body).errors); + return cli.interact('> '); + } - try { - var data = JSON.parse(body); - } catch(e) {} + var data = {}; - cli.stream.print(cb(data)); - cli.interact('> '); - }); + try { + var data = JSON.parse(body); + } catch(e) {} + + cli.stream.print(cb(data)); + cli.interact('> '); + }); + } } doRequest(); @@ -230,6 +248,42 @@ addApiCommand('ticker', '/v1/data/eur/ticker', { return JSON.stringify(data, true, '\t'); }); +// Depth command +addApiCommand('depth', '/v1/data/eur/depth', { + desc: 'show market depth', +}, function(data) { + var bids = data.bids.slice(0).sort(function(a, b) {return b.price - a.price;}); + var asks = data.asks.slice(0).sort(function(a, b) {return a.price - b.price;}); + + var mid = .5 * (bids[0].price + asks[0].price); + var min = Math.floor(mid * .2); + var max = Math.ceil(mid * 1.8); + + bids = bids.filter(function(i) {return i.price >= min;}); + asks = asks.filter(function(i) {return i.price <= max;}); + + var points = []; + + + + for (var i = 0, c = 0; i < bids.length; i++) { + var p = bids[i]; + c += p.amount; + points.unshift([p.price, c]); + }; + + for (var i = 0, c = 0; i < asks.length; i++) { + var p = asks[i]; + c += p.amount; + points.push([p.price, c]); + }; + + return babar(points, { + width: process.stdout.columns, + height: process.stdout.rows - 1 + }); +}); + // Balances command addApiCommand('balances', '/v1/user', { desc: 'show account balances', @@ -301,6 +355,9 @@ addApiCommand('buy {amount} {price}', '/v1/user/orders', { amount: '[0-9\.]+', price: '[0-9\.]+' }, + confirm: function(input, args) { + return "buy " + args.amount + " BTC for " + args.price + " EUR each?"; + }, payload: function(input, args) { return { 'type': 'LimitOrder', @@ -324,6 +381,9 @@ addApiCommand('sell {amount} {price}', '/v1/user/orders', { amount: '[0-9\.]+', price: '[0-9\.]+' }, + confirm: function(input, args) { + return "sell " + args.amount + " BTC for " + args.price + " EUR each?"; + }, payload: function(input, args) { return { 'type': 'LimitOrder', @@ -362,9 +422,57 @@ addApiCommand('cancel {uuid}', function(input, args) { return 'cancel requested'; }); +// Withdraw EUR command +addApiCommand('withdraw_eur {amount}', '/v1/user/orders', { + desc: 'withdraw eur', + restricted: true, + method: 'POST', + args: { + amount: '[0-9\.]+' + }, + confirm: function(input, args) { + return "withdraw " + args.amount + " EUR?"; + }, + payload: function(input, args) { + return { + 'type': 'Transfer', + currency: 'EUR', + amount: args.amount + } + } +}, function(data) { + knownUuids[data.uuid] = true; + return data.uuid; +}); + +// Withdraw BTC command +addApiCommand('withdraw_btc {amount} {address}', '/v1/user/orders', { + desc: 'withdraw eur', + restricted: true, + method: 'POST', + args: { + amount: '[0-9\.]+', + address: '[13][1-9A-HJ-NP-Za-km-z]{26,33}' + }, + confirm: function(input, args) { + return "withdraw " + args.amount + " BTC to " + args.address + " ?"; + }, + payload: function(input, args) { + return { + 'type': 'Transfer', + currency: 'BTC', + amount: args.amount, + address: args.address + } + } +}, function(data) { + knownUuids[data.uuid] = true; + return data.uuid; +}); + // TTL command cli.command('ttl', 'show access token time to live', function () { - if(access_token) { + if (access_token) { var time = expires.getTime() - new Date().getTime(); cli.stream.print(Math.ceil(time / 1000 / 60) + ' min'); } diff --git a/examples/node.js/package.json b/examples/node.js/package.json index ccc98758..7218c710 100644 --- a/examples/node.js/package.json +++ b/examples/node.js/package.json @@ -14,7 +14,8 @@ "request": "~2.31.0", "cline": "~0.7.0", "open": "0.0.4", - "easycrypto": "~0.1.1" + "easycrypto": "~0.1.1", + "babar": "0.0.3" }, "preferGlobal": "true", "bin": { From a929f24d4dad9ad84337ba69266b9e2df0068ea3 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2014 14:35:53 +0100 Subject: [PATCH 031/110] Fixes some mistakes in CURL urls. --- README.md | 8 ++++---- examples/node.js/config.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9aed3542..af55cb62 100644 --- a/README.md +++ b/README.md @@ -284,7 +284,7 @@ Before you can access your own data or other users data, you must register an ap 1. Verify your account and log in 2. Visit [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps) -3. Create an application (set redirect URI to `https://bitcoin-central.net/page/oauth/test when testing`) +3. Create an application (set redirect URI to `https://bitcoin-central.net/page/oauth/test` when testing) ### Authentication @@ -455,7 +455,7 @@ Read user activity. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/orders&offset=20" \ +$ curl "https://bitcoin-central.net/api/v1/user/orders&offset=20" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -585,7 +585,7 @@ Create trade orders. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders \ +$ curl "https://bitcoin-central.net/api/v1/user/orders" \ --header "Authorization: Bearer ACCESS_TOKEN" \ -d "type=LimitOrder" \ -d "currency=EUR" \ @@ -658,7 +658,7 @@ Request BTC or fiat withdrawals. A confirmation is sent by email to the user bef ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders \ +$ curl "https://bitcoin-central.net/api/v1/user/orders" \ --header "Authorization: Bearer ACCESS_TOKEN" \ -d "type=Transfer" \ -d "currency=BTC" \ diff --git a/examples/node.js/config.js b/examples/node.js/config.js index b5d80087..d839bc77 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -1,8 +1,8 @@ var path = require('path'); module.exports = { - appKey: 'YOUR_APP_KEY', - appSecret: 'YOUR_APP_CODE', + appKey: '33be5e031fbe0f72827609503a2f7d100d62d7e6f31375bb7ba54a9abc2475c0', + appSecret: 'd0c9527d343c43de642d57acb5303b6b5e036a329341b799431dd7cb7f740e50', scopes: 'basic activity trade withdraw', From bff120bcbc4c4314706d761be81b73fa1cf439b4 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 10 Feb 2014 12:39:28 +0100 Subject: [PATCH 032/110] Orders URL typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af55cb62..f0d6897b 100644 --- a/README.md +++ b/README.md @@ -455,7 +455,7 @@ Read user activity. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders&offset=20" \ +$ curl "https://bitcoin-central.net/api/v1/user/orders?offset=20" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` From 3c80e73f03df46a7fa92cb2def25a053ae9392db Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 26 Feb 2014 20:13:28 +0100 Subject: [PATCH 033/110] Update on rate-limits and bitcoin charts endpoints --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f0d6897b..86001dce 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Ticker](#ticker) * [Latest trades](#latest-trades) * [Market depth](#market-depth) + * [Bitcoin-Charts endpoints](#bitcoin-charts-endpoints) * [**User data**](#user-data) * [Authentication](#authentication) @@ -83,7 +84,7 @@ If the API call was successful, the platform will answer with: ### Rate-limiting -API calls are rate-limited by IP to 5000 calls per day. Information about the status of the limit can be found in the `X-RateLimit-Limit` and `X-RateLimit-Remaining` HTTP headers. +API calls are rate-limited by IP to 86400 calls per day (one per second on average). Information about the status of the limit can be found in the `X-RateLimit-Limit` and `X-RateLimit-Remaining` HTTP headers. **Example response with rate-limit headers** @@ -278,6 +279,16 @@ $ curl "https://bitcoin-central.net/api/v1/data/eur/depth" | price | price | 665.0 | | amount | amount at price | 0.06 | + +### Bitcoin-Charts endpoints + +Two API endpoints dedicated to [Bitcoin-Charts](bitcoincharts.com) are publicly accessible, they are accessible at: + + * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/trades`, and + * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/depth` + +The data they return is formatted according to the [Bitcoin Charts exchange API specification](http://bitcoincharts.com/about/exchanges/). + ## User data Before you can access your own data or other users data, you must register an application on Bitcoin-Central: From 067da7a228e548a7f09070e800d2fe673461fe36 Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 27 Feb 2014 23:10:49 +0100 Subject: [PATCH 034/110] Fuck you github --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86001dce..22e904c1 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ $ curl "https://bitcoin-central.net/api/v1/data/eur/depth" ### Bitcoin-Charts endpoints -Two API endpoints dedicated to [Bitcoin-Charts](bitcoincharts.com) are publicly accessible, they are accessible at: +Two API endpoints dedicated to [Bitcoin-Charts](http://bitcoincharts.com) are publicly accessible, they are accessible at: * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/trades`, and * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/depth` From cd240550d888f3167c88a21e54c500f856049fd3 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 11 Mar 2014 16:09:35 +0100 Subject: [PATCH 035/110] Market orders --- README.md | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 22e904c1..322e520f 100644 --- a/README.md +++ b/README.md @@ -575,7 +575,15 @@ See [order properties](#order-properties). ##### Description -Create trade orders. +Create trade orders. + +Limit and market orders are supported, the `price` parameter must be omitted for market orders. + +Either one of `amount` or `currency_amount` must be specified. When the `amount` is specified, the +engine will buy or sell this amount of Bitcoins. When the `currency_amount` is specified, the engine +will buy as much Bitcoins as possible for `currency_amount` or sell as much Bitcoins as necessary to +obtain `currency_amount`. + ##### Endpoint @@ -585,13 +593,14 @@ Create trade orders. ##### Payload -| name | description | example value | -|--------------------|-----------------------------------------|----------------------------------------| -| type | must be "LimitOrder" | "LimitOrder" | -| currency | must be "EUR" | "EUR" | -| direction | trade direction, must be "buy" or "sell"| "buy" | -| price | price per BTC | 300.0 | -| amount | BTC amount to trade | 1.0 | +| name | description | example value | +|--------------------|---------------------------------------------------------------|---------------| +| type | must be "LimitOrder" or "MarketOrder" | "LimitOrder" | +| currency | must be "EUR" | "EUR" | +| direction | trade direction, must be "buy" or "sell" | "buy" | +| price | price per BTC, must be omitted for market orders | 300.0 | +| amount | BTC amount to trade (only if no currency_amount is specified) | 1.0 | +| currency_amount | Currency amount to trade (only if no amount is specified) | 1.0 | ##### Example From c00f81deb01e9055214f762ce969ab2bf885e92a Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 12 Mar 2014 16:43:29 +0100 Subject: [PATCH 036/110] Added VWAP to ticker --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 322e520f..3a69330b 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ $ curl "https://bitcoin-central.net/api/v1/data/eur/ticker" "midpoint": 678.00499995, "at": 1389092410, "price": 680.0, + "vwap": 679.87459, "variation": -5.5556, "currency": "EUR" } @@ -145,6 +146,7 @@ $ curl "https://bitcoin-central.net/api/v1/data/eur/ticker" | variation | 24h variation (percentage) | -5.5556 | | high | 24h high price | 720.0 | | low | 24h low price | 640.0001 | +| vwap | 24h volume-weighted average price | 679.87459 | ### Latest trades From 4b7a7eb42760af19430317d3bb9ffff3922ade60 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 12 Mar 2014 17:42:30 +0100 Subject: [PATCH 037/110] Socket.io public stream. --- README.md | 57 ++++++++++++++++++++++++-- examples/public_socket.js/README.md | 12 ++++++ examples/public_socket.js/client.js | 21 ++++++++++ examples/public_socket.js/package.json | 14 +++++++ 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 examples/public_socket.js/README.md create mode 100644 examples/public_socket.js/client.js create mode 100644 examples/public_socket.js/package.json diff --git a/README.md b/README.md index 322e520f..63c7d299 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Latest trades](#latest-trades) * [Market depth](#market-depth) * [Bitcoin-Charts endpoints](#bitcoin-charts-endpoints) + * [WebSocket](#websocket) * [**User data**](#user-data) * [Authentication](#authentication) @@ -289,6 +290,58 @@ Two API endpoints dedicated to [Bitcoin-Charts](http://bitcoincharts.com) are pu The data they return is formatted according to the [Bitcoin Charts exchange API specification](http://bitcoincharts.com/about/exchanges/). +### WebSocket + +A [socket.io](http://socket.io) endpoint is available to receive public data. This allows you to receive new data without having to poll the server. + +The socket.io socket will emit a `stream` event when new data is available. The received JSON data contains one or more of the properties listed below, depending on what was updated. + +#### Socket.io configuration + +Socket.io must connect to `https://bitcoin-central.net/public` and the `resource` option must be set to `ws/socket.io`. + +#### Stream properties + +| name | description | +|-----------------|----------------------------------------------------------------------------| +| ticker | object containing updated ticker data | +| trades | array of newly executed trades | +| bids | array of new or updated bids (a bid is considered gone if amount is 0) | +| asks | array of new or updated asks (an ask is considered gone if amount is 0) | + +#### Node.js example + +Assuming you have node.js installed, you can install the socket.io client library by running `npm install socket.io-client@0.9`. + +The code below shows how to connect to the Bitcoin-Central socket, and outputs any received data to the console. + +The example is available in the `examples/public_socket.js` directory of this repository. + +```javascript + var io = require('socket.io-client'); + + socket = io.connect('https://bitcoin-central.net/public', { + resource: 'ws/socket.io' + }); + + console.log('CONNECTING'); + + socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); + }); + + socket.on('disconnect', function() { + console.log('DISCONNECTED'); + }); + + socket.on('stream', function(data) { + console.log('GOT DATA:'); + console.log(data); + }); + +``` + ## User data Before you can access your own data or other users data, you must register an application on Bitcoin-Central: @@ -734,10 +787,6 @@ $ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-8 --header "Authorization: Bearer ACCESS_TOKEN" ``` -### Web sockets - -Web sockets are available to get real-time notifications and will be documented in the future. - ## Appendix ### Currencies diff --git a/examples/public_socket.js/README.md b/examples/public_socket.js/README.md new file mode 100644 index 00000000..3f1341e5 --- /dev/null +++ b/examples/public_socket.js/README.md @@ -0,0 +1,12 @@ +## WebScoket + +This is an example of how to connect to the Bitcoin-Central WebSocket with node.js . + +It simply prints the data received to the console. + +### Installation + +1. install node.js +2. download this package +3. run `npm install` +4. run `node client.js` diff --git a/examples/public_socket.js/client.js b/examples/public_socket.js/client.js new file mode 100644 index 00000000..cea20829 --- /dev/null +++ b/examples/public_socket.js/client.js @@ -0,0 +1,21 @@ +var io = require('socket.io-client'); + +socket = io.connect('https://bitcoin-central.net/public', { + resource: 'ws/socket.io' +}); + +console.log('CONNECTING'); + +socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); +}); + +socket.on('disconnect', function() { + console.log('DISCONNECTED'); +}); + +socket.on('stream', function(data) { + console.log('GOT DATA:'); + console.log(data); +}); diff --git a/examples/public_socket.js/package.json b/examples/public_socket.js/package.json new file mode 100644 index 00000000..389c4a05 --- /dev/null +++ b/examples/public_socket.js/package.json @@ -0,0 +1,14 @@ +{ + "name": "bitcoin_central_public_socket_client", + "version": "0.0.0", + "description": "Bitcoin-Central Public Socket Example", + "main": "client.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Paymium", + "license": "MIT", + "dependencies": { + "socket.io-client": "^0.9.16" + } +} From d42da836377165f2dc66e1933bfb22f1021ca59e Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 12 Mar 2014 17:49:44 +0100 Subject: [PATCH 038/110] Socket.io amount fix. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f7bd3250..e1a23a7f 100644 --- a/README.md +++ b/README.md @@ -304,12 +304,12 @@ Socket.io must connect to `https://bitcoin-central.net/public` and the `resource #### Stream properties -| name | description | -|-----------------|----------------------------------------------------------------------------| -| ticker | object containing updated ticker data | -| trades | array of newly executed trades | -| bids | array of new or updated bids (a bid is considered gone if amount is 0) | -| asks | array of new or updated asks (an ask is considered gone if amount is 0) | +| name | description | +|-----------------|-------------------------------------------------------------------------------| +| ticker | object containing updated ticker data | +| trades | array of newly executed trades | +| bids | array of new or updated bids (a bid is considered gone if amount is null) | +| asks | array of new or updated asks (an ask is considered gone if amount is null) | #### Node.js example From 36e0adb7c38a3cd0c718a703717c9cb672ca1ec2 Mon Sep 17 00:00:00 2001 From: itkin Date: Mon, 12 May 2014 17:21:09 +0200 Subject: [PATCH 039/110] merchant api --- README.md | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/README.md b/README.md index e1a23a7f..ae9775e5 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ _* Authenticating users is only available to developers that have a fully verifi * [Withdrawing](#withdrawing) * [Canceling orders](#canceling-orders) +* [**Merchant API**](#merchant-api) + * [**Appendix**](#appendix) * [Currencies](#currencies) * [Order types](#order-types) @@ -889,3 +891,113 @@ token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://bi token.get('/api/v1/user').body => {"name":"BC-U123456","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} ``` + +## Merchant API + +The Merchant API allow _Bitcoin Central users_ to securely sell services online and get paid in bitcoin, chosing the percentage of their revenues they want in both BTC and FIAT currency. + +The _Payment API_ provide all the requested features to allow _Bitcoin Central users_ to integrate bitcoin payments with **standard e-comerce plugins**. + +If you need a simpler solution to display payment buttons on your personal website, please refer to the merchant section of bitcoin-central.net. + +### Payment creation + +#####Authentication + +User authentication is realized thanks to a _merchant secret token_ you have pass as a parameter in your create query + + +**Note: Before using the merchant payment feature, please log us a ticket to get your _merchant token_.** + +##### Description + +A payment is created by a BC user (the _merchant_) when his _buyer_ choose bitcoin as his desired payment option. + +The _merchant_ can then + +* display the payment receptional bitcoin address on his own web interface +* include the _Bitcoin Central_ web interface url in an iframe +* redirect the _buyer_ to the _Bitcoin Central_ payment url + +The _buyer_ has then to send the required amount of bitcoin to the receptional address provided within the next 15 minutes after the payment creation. + +_Bitcoin Central_ informs the _merchant_ of the completion of his _payment_ via the associated callback url provided, one confirmation after the required amount of bitcoins are received. + +_Bitcoin Central_ also exchanges the requested percentage of the bitcoin received in FIAT currency if requested by the _merchant_, bearing the exchange risk and/or profits. + + +##### Endpoint + +| method | path | +|--------|--------------------------------------------------------------| +| POST | /api/v1/merchant/create_payment | + + +##### Parameters + +| name | description | example value | +|--------------|----------------------------------------------|--------------------| +| token | merchant token | 37d669e6d381c53ba3f6| +| amount | btc amount asked by the _merchant_ to his _buyer_ (required)| 20 | +| payment_split | Percentage of the payment the _merchant_ will get in FIAT currency| 0.6| +| Currency | Currency the payment stand again | EUR | +| callback_url | url called on payment change | http://myonlineshop/payments/order-987978/callback | +| redirect_url | redirection url after a payment has been proceeded on Bitcoin central (optional) | http://myonlineshop/payments/order-987978/success | +| merchant_reference | string associated to the payment (optional) | order-987978 + +#####Response + +cf [Payment properties](#payment-properties) + +#####Payment Callbacks + +When a payment is created or updated and if a callback url is provided, the callback url will be triggered every time the payment is changed. + +The _merchant_ can check the **X-Payment-Signature** header of each callback query to ensure their authenticity. It displays the SHA-2 hexadigest hash of the (secret) merchant token concatenated with the properties json representation of the payment displayed in the query body. + +**Note :** The callback url may be hit several time without any payment state change + +#####Payment states + +| name | description | +|--------------|-------------------| +|pending_payment| Waiting for payment| +|processing| Receiving bitcoin waiting for confirmation or amount completion| +|paid| Bitcoin received and eventually transformed in euro as required| +|error| An error occured| +|expired| Payment expired| + +#####Payment redirection on success + +todo + +### Payment properties display + +##### Endpoint + +| method | path | +|--------|--------------------------------------------------------------| +| POST | /api/v1/merchant/get_payment + +##### Payment properties + +| name | description | example value | +|--------------|----------------------------------------------|----------------| +|uuid| payment unique id| 375d5cb8-1dc3-4b31-9b8d-9cb9f3d9e1b9| +|currency| currency the payment stand again | EUR +|payment_split| Percentage of the payment the _merchant_ will get in FIAT| 0.6| +|state| payment state | pending_payment| +|comment| +|callback_url|url called on payment change +|redirect_url|redirection url after a payment has been proceeded on Bitcoin central| +|merchant_name|_seller_ id| BC-KJH76571 +|expires_at| expiration date of the payment +|merchant_reference| reference string associated to the payment +|currency_amount| FIAT amount associated to the payment (when payment_split > 0)| 150 +|amount| BTC amount associated to the payment +|payment_address| receptional address of the payment +|created_at| creation date of the payment +|updated_at| last update date of the payment +|account_operations| account operations explaining the payment split + + From 7de54b4c4cc5b0aba3a4f3f4a146ced0e4b686be Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 15 May 2014 13:57:07 +0200 Subject: [PATCH 040/110] Review --- README.md | 271 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 161 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index ae9775e5..db7175dc 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ _* Authenticating users is only available to developers that have a fully verifi * [Canceling orders](#canceling-orders) * [**Merchant API**](#merchant-api) + * E-commerce plugins + * [**Appendix**](#appendix) * [Currencies](#currencies) @@ -671,6 +673,8 @@ $ curl "https://bitcoin-central.net/api/v1/user/orders" \ -d "amount=1.0" ``` +Would return: + ```json { "uuid": "4924ee0f-f60e-40b4-b63e-61637ef253ac", @@ -743,6 +747,8 @@ $ curl "https://bitcoin-central.net/api/v1/user/orders" \ -d "address=1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" ``` +Would return: + ```json { "uuid": "9229fd6e-0aad-45d6-8090-a400f37a0129", @@ -791,6 +797,161 @@ $ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-8 --header "Authorization: Bearer ACCESS_TOKEN" ``` +## Merchant API + +The Merchant API enables merchants to securely sell goods and services and get paid in Bitcoin. The API makes it possible for the merchant to completely eliminate the risk of market fluctuations when requesting to receive fiat currency in their account. It is also possible to keep a part of the payment in Bitcoin without having it converted at a guaranteed rate. + +The API allows developers to integrate Bitcoin payments very tightly into their platforms, pre-packaged plugins are also available for a growing list of popular e-commerce frameworks. + +For merchants that have very simple needs payment buttons are also available, these buttons remove the integration completely by allowing merchants to simply include a code snippet on a static HTML page, or on a blog to receive fixed-amount payments. + +### Payment creation + +##### Authentication + +The authentication used for the merchant API calls does not use OAuth2 but instead is base on static tokens. These tokens allow only the creation of invoices (payments) and do not allow withdrawals or trading to take place against the merchant's account. + +**Note: The tokens are provided by the Bitcoin-Central support, upon request.** + + +##### Description + +A payment is created by a merchant platform when the customer chooses Bitcoin as his desired checkout option. + +The merchant platform can then : +* display the payment Bitcoin address on his own web interface, +* include the Bitcoin-Central web interface url in an iframe in order to display a payment pop-up as an overlay, +* redirect the buyer to the payement's URL, in this case the payment is displayed on a separate screen + +Once the payment request is displayed, the customer has 15 minutes to send the appropriate amount. + +Bitcoin-Central notifies the merchant of the completion of his payment via the associated callback (for which an URL may be provided when creating the payment request), once one Bitcoin confirmation for the payment is received the funds are credited to the merchant's account, a callback notification is then made. + + +##### Endpoint + +| method | path | +|--------|------| +| POST | /api/v1/merchant/create_payment | + + +##### Parameters + +| name | description | example value | +|--------------|----------------------------------------------|--------------------| +| token | Merchant token (required) | 37d669e6d381c53ba3f6 | +| amount | Amount requested for the payment (required) | 20 | +| payment_split | Percentage of the payment the _merchant_ will get in `currency` expressed as a two-decimal places float between 0 and 1 (required) | 1.0 | +| currency | Currency in which the merchant wishes to be credited and in which the `amount` is expressed (required) | EUR | +| callback_url | Merchant callback URL, it is called when the state of the payment changes (optional) | http://myonlineshop/payments/order-987978/callback | +| redirect_url | URL to which the customer should be redirected at upon payment (optional) | http://myonlineshop/payments/order-987978/success | +| merchant_reference | Arbitrary merchant data associated to the payment (optional) | order-987978 | + +##### Response + +See [Payment properties](#payment-properties) + +##### Payment Callbacks + +When a payment is created or updated, and if a callback URL was provided, a notification is made. + +The merchant platform must check the `X-Payment-Signature` header of each request to ensure their authenticity. It is populated with the SHA-2 digest of the with the request body concatenated with merchant token. + + +**PHP code example** + +```php +$req_body = file_get_contents("php://input"); +$signature = $_SERVER['HTTP_X_PAYMENT_SIGNATURE']; +$token = Configuration::get('paymium_token'); +$hash = hash('sha256', $token . $req_body); + +if ($hash === $signature) { + // Callback is authentic +} +``` + +**Note :** The callback notifications are not guaranteed to be unique, it must have idempotent results on the merchant side if the payment has not actually changed. + + +##### Payment states + +| Name | Description | +|----------------|------------------------------------------------------------------------------------| +| pending_payment| Waiting for payment | +| processing | The correct amount has been received, waiting for a Bitcoin network confirmation | +| paid | Payment completed, the requested amount has been credited to the merchant account | +| error | An error has occurred, the merchant must get in touch with the support | +| expired | Payment expired, no Bitcoins were received | + + +### Payment properties display + +This endpoint returns the payment request as a JSON object given an ID + + +##### Endpoint + +| Method | Path | +|--------|-------------------------------------| +| POST | /api/v1/merchant/get_payment/{UUID} | + + +##### Returned JSON object properties + +| Name | Description | +|--------------------|-----------------------------------------------------------------------| +| uuid | Payment UUID | +| currency | Currency in which the `currency_amount` is expressed | +| payment_split | Percentage of the payment the merchant will get in `currency` | +| state | See [Payment states](#payment-states) | +| callback_url | Merchant notification URL | +| redirect_url | Redirection url to which the customer is redirected on success | +| merchant_name | Name of the merchant that is displayed to the customer | +| expires_at | Expiration timestamp | +| merchant_reference | Reference string associated to the payment | +| currency_amount | Amount associated to the payment | +| amount | BTC amount to pay | +| payment_address | Payment address | +| created_at | Creation timestamp | +| updated_at | Last update timestamp | +| account_operations | Account operations made against the merchant account | + + +** Example ** +```json +{ + "account_operations": [ + { + "amount": 25.0, + "created_at": "2014-05-15T10:19:21.000Z", + "created_at_int": 1400149161, + "currency": "EUR", + "is_trading_account": false, + "name": "merchant_currency_payment", + "uuid": "afca953b-dfa6-40b6-b856-c04d548baefb" + } + ], + "amount": 25.0, + "btc_amount": 0.079945, + "callback_url": "http://mysite.com/wc-api/WC_Paymium/", + "cancel_url": "http://mysite.com/commande/panier/", + "comment": null, + "created_at": 1400147834, + "currency": "EUR", + "expires_at": 1400148734, + "merchant_name": "Demo SAS", + "merchant_reference": "888", + "payment_address": "1NHRnMn1831D84owh7powxtAbqfzA9aaL5", + "payment_split": 1.0, + "redirect_url": "http://mysite.com/order/checkout/order-received/888?key=wc_order_53784&order=888", + "state": "paid", + "updated_at": 1400149161, + "uuid": "f8e7c539-7b7b-4b63-9ccf-5fc2ca91bf0b" +} +``` + + ## Appendix ### Currencies @@ -891,113 +1052,3 @@ token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://bi token.get('/api/v1/user').body => {"name":"BC-U123456","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} ``` - -## Merchant API - -The Merchant API allow _Bitcoin Central users_ to securely sell services online and get paid in bitcoin, chosing the percentage of their revenues they want in both BTC and FIAT currency. - -The _Payment API_ provide all the requested features to allow _Bitcoin Central users_ to integrate bitcoin payments with **standard e-comerce plugins**. - -If you need a simpler solution to display payment buttons on your personal website, please refer to the merchant section of bitcoin-central.net. - -### Payment creation - -#####Authentication - -User authentication is realized thanks to a _merchant secret token_ you have pass as a parameter in your create query - - -**Note: Before using the merchant payment feature, please log us a ticket to get your _merchant token_.** - -##### Description - -A payment is created by a BC user (the _merchant_) when his _buyer_ choose bitcoin as his desired payment option. - -The _merchant_ can then - -* display the payment receptional bitcoin address on his own web interface -* include the _Bitcoin Central_ web interface url in an iframe -* redirect the _buyer_ to the _Bitcoin Central_ payment url - -The _buyer_ has then to send the required amount of bitcoin to the receptional address provided within the next 15 minutes after the payment creation. - -_Bitcoin Central_ informs the _merchant_ of the completion of his _payment_ via the associated callback url provided, one confirmation after the required amount of bitcoins are received. - -_Bitcoin Central_ also exchanges the requested percentage of the bitcoin received in FIAT currency if requested by the _merchant_, bearing the exchange risk and/or profits. - - -##### Endpoint - -| method | path | -|--------|--------------------------------------------------------------| -| POST | /api/v1/merchant/create_payment | - - -##### Parameters - -| name | description | example value | -|--------------|----------------------------------------------|--------------------| -| token | merchant token | 37d669e6d381c53ba3f6| -| amount | btc amount asked by the _merchant_ to his _buyer_ (required)| 20 | -| payment_split | Percentage of the payment the _merchant_ will get in FIAT currency| 0.6| -| Currency | Currency the payment stand again | EUR | -| callback_url | url called on payment change | http://myonlineshop/payments/order-987978/callback | -| redirect_url | redirection url after a payment has been proceeded on Bitcoin central (optional) | http://myonlineshop/payments/order-987978/success | -| merchant_reference | string associated to the payment (optional) | order-987978 - -#####Response - -cf [Payment properties](#payment-properties) - -#####Payment Callbacks - -When a payment is created or updated and if a callback url is provided, the callback url will be triggered every time the payment is changed. - -The _merchant_ can check the **X-Payment-Signature** header of each callback query to ensure their authenticity. It displays the SHA-2 hexadigest hash of the (secret) merchant token concatenated with the properties json representation of the payment displayed in the query body. - -**Note :** The callback url may be hit several time without any payment state change - -#####Payment states - -| name | description | -|--------------|-------------------| -|pending_payment| Waiting for payment| -|processing| Receiving bitcoin waiting for confirmation or amount completion| -|paid| Bitcoin received and eventually transformed in euro as required| -|error| An error occured| -|expired| Payment expired| - -#####Payment redirection on success - -todo - -### Payment properties display - -##### Endpoint - -| method | path | -|--------|--------------------------------------------------------------| -| POST | /api/v1/merchant/get_payment - -##### Payment properties - -| name | description | example value | -|--------------|----------------------------------------------|----------------| -|uuid| payment unique id| 375d5cb8-1dc3-4b31-9b8d-9cb9f3d9e1b9| -|currency| currency the payment stand again | EUR -|payment_split| Percentage of the payment the _merchant_ will get in FIAT| 0.6| -|state| payment state | pending_payment| -|comment| -|callback_url|url called on payment change -|redirect_url|redirection url after a payment has been proceeded on Bitcoin central| -|merchant_name|_seller_ id| BC-KJH76571 -|expires_at| expiration date of the payment -|merchant_reference| reference string associated to the payment -|currency_amount| FIAT amount associated to the payment (when payment_split > 0)| 150 -|amount| BTC amount associated to the payment -|payment_address| receptional address of the payment -|created_at| creation date of the payment -|updated_at| last update date of the payment -|account_operations| account operations explaining the payment split - - From 704cc75d57cfaf8b5ba9ebacd74b0f947259c51b Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 15 May 2014 14:11:12 +0200 Subject: [PATCH 041/110] Payments --- README.md | 60 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index db7175dc..53c0e688 100644 --- a/README.md +++ b/README.md @@ -37,14 +37,17 @@ _* Authenticating users is only available to developers that have a fully verifi * [Canceling orders](#canceling-orders) * [**Merchant API**](#merchant-api) - * E-commerce plugins - + * [Payment creation](#payment-creation) + * [Payment callbacks](#payment-callbacks) + * [Get payment information](#get-payment-information) + * [E-commerce frameworks plugins](#ecommerce-frameworks-plugins) * [**Appendix**](#appendix) * [Currencies](#currencies) * [Order types](#order-types) * [Order properties](#order-properties) * [Order states](#order-states) + * [Payment states](#payment-states) * [Account operation properties](#account-operation-properties) * [Ruby example](#ruby-example) @@ -809,9 +812,9 @@ For merchants that have very simple needs payment buttons are also available, th ##### Authentication -The authentication used for the merchant API calls does not use OAuth2 but instead is base on static tokens. These tokens allow only the creation of invoices (payments) and do not allow withdrawals or trading to take place against the merchant's account. +The authentication used for this call does not use OAuth2 but instead is base on static tokens. These tokens allow only the creation of invoices (payments) and do not allow withdrawals or trading to take place against the merchant's account. -**Note: The tokens are provided by the Bitcoin-Central support, upon request.** +**Note:** The tokens are provided by the Bitcoin-Central support, upon request. ##### Description @@ -821,7 +824,9 @@ A payment is created by a merchant platform when the customer chooses Bitcoin as The merchant platform can then : * display the payment Bitcoin address on his own web interface, * include the Bitcoin-Central web interface url in an iframe in order to display a payment pop-up as an overlay, -* redirect the buyer to the payement's URL, in this case the payment is displayed on a separate screen +* redirect the buyer to the payement's URL (see below), in this case the payment is displayed on a separate screen + +To display the payment request to the user, the `https://bitcoin-central.net/invoice/{UUID}` can be used, this is used by the e-commerce framework plugins. Once the payment request is displayed, the customer has 15 minutes to send the appropriate amount. @@ -849,15 +854,16 @@ Bitcoin-Central notifies the merchant of the completion of his payment via the a ##### Response -See [Payment properties](#payment-properties) +See [Payment properties](#returned-json-object-properties) -##### Payment Callbacks +### Payment callbacks When a payment is created or updated, and if a callback URL was provided, a notification is made. -The merchant platform must check the `X-Payment-Signature` header of each request to ensure their authenticity. It is populated with the SHA-2 digest of the with the request body concatenated with merchant token. - +When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see [payment properties](#payment-properties-display) and is authenticated with a special `X-Payment-Signature` hash. +The merchant platform must check the `X-Payment-Signature` header of each request to ensure their authenticity. It is populated with the SHA-2 digest of the with the request body concatenated with merchant token. + **PHP code example** ```php @@ -874,20 +880,9 @@ if ($hash === $signature) { **Note :** The callback notifications are not guaranteed to be unique, it must have idempotent results on the merchant side if the payment has not actually changed. -##### Payment states - -| Name | Description | -|----------------|------------------------------------------------------------------------------------| -| pending_payment| Waiting for payment | -| processing | The correct amount has been received, waiting for a Bitcoin network confirmation | -| paid | Payment completed, the requested amount has been credited to the merchant account | -| error | An error has occurred, the merchant must get in touch with the support | -| expired | Payment expired, no Bitcoins were received | - - -### Payment properties display +### Get payment information -This endpoint returns the payment request as a JSON object given an ID +This endpoint returns the payment request as a JSON object given a payment UUID ##### Endpoint @@ -918,7 +913,7 @@ This endpoint returns the payment request as a JSON object given an ID | account_operations | Account operations made against the merchant account | -** Example ** +**Example** ```json { "account_operations": [ @@ -951,6 +946,14 @@ This endpoint returns the payment request as a JSON object given an ID } ``` +### E-commerce frameworks plugins + +The currently available plugins are available + +| Framework | Plugin URL | +|----------------|----------------------------------------| +| PrestaShop 1.5 | https://github.com/Paymium/prestashop | +| WooCommerce | https://github.com/Paymium/woocommerce | ## Appendix @@ -1019,6 +1022,17 @@ Each type may have additional properties as described below. | executed | order has been executed | | canceled | order has been canceled | + +### Payment states + +| Name | Description | +|----------------|------------------------------------------------------------------------------------| +| pending_payment| Waiting for payment | +| processing | The correct amount has been received, waiting for a Bitcoin network confirmation | +| paid | Payment completed, the requested amount has been credited to the merchant account | +| error | An error has occurred, the merchant must get in touch with the support | +| expired | Payment expired, no Bitcoins were received | + ### Account operation properties | name | description | example value | From 7940bbc2ea1d5f7d5355772896562c41cdb6ee2a Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 15 May 2014 14:12:44 +0200 Subject: [PATCH 042/110] Payments --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 53c0e688..32b26548 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Payment creation](#payment-creation) * [Payment callbacks](#payment-callbacks) * [Get payment information](#get-payment-information) - * [E-commerce frameworks plugins](#ecommerce-frameworks-plugins) + * [E-commerce frameworks plugins](#e-commerce-frameworks-plugins) * [**Appendix**](#appendix) * [Currencies](#currencies) @@ -1022,7 +1022,6 @@ Each type may have additional properties as described below. | executed | order has been executed | | canceled | order has been canceled | - ### Payment states | Name | Description | From 2d353ccdf20fab2b33bea5ce4f902e0378212aca Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 15 May 2014 14:14:30 +0200 Subject: [PATCH 043/110] Payments --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 32b26548..6225ab13 100644 --- a/README.md +++ b/README.md @@ -860,7 +860,7 @@ See [Payment properties](#returned-json-object-properties) When a payment is created or updated, and if a callback URL was provided, a notification is made. -When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see [payment properties](#payment-properties-display) and is authenticated with a special `X-Payment-Signature` hash. +When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information) and is authenticated with a special `X-Payment-Signature` hash. The merchant platform must check the `X-Payment-Signature` header of each request to ensure their authenticity. It is populated with the SHA-2 digest of the with the request body concatenated with merchant token. @@ -899,7 +899,7 @@ This endpoint returns the payment request as a JSON object given a payment UUID | uuid | Payment UUID | | currency | Currency in which the `currency_amount` is expressed | | payment_split | Percentage of the payment the merchant will get in `currency` | -| state | See [Payment states](#payment-states) | +| state | See [payment states](#payment-states) | | callback_url | Merchant notification URL | | redirect_url | Redirection url to which the customer is redirected on success | | merchant_name | Name of the merchant that is displayed to the customer | From 5160614901c7873894e19737e2aa0dcd26b515ba Mon Sep 17 00:00:00 2001 From: davout Date: Mon, 26 May 2014 13:17:46 +0200 Subject: [PATCH 044/110] AutoRefreshToken link --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6225ab13..1efb2236 100644 --- a/README.md +++ b/README.md @@ -1048,6 +1048,8 @@ Each type may have additional properties as described below. This example uses the OAuth2 Ruby gem. +The [`AutoRefreshToken`](https://gist.github.com/davout/edb4db0315dc417fa78d) class encapsulates this logic, it is available as a [Gist](https://gist.github.com/davout/edb4db0315dc417fa78d). + ```ruby require 'oauth2' From 9e21919235af7975639cc89c9c82913e99d6b647 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 4 Jun 2014 08:54:25 +0200 Subject: [PATCH 045/110] Add SNI mention --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1efb2236..75f40c42 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ The Bitcoin-Central API allows developers to extend the capabilities of Bitcoin-Central, from reading the latest ticker to automating trades with bots. +**IMPORTANT NOTE**: Your API client must support [SNI](http://en.wikipedia.org/wiki/Server_Name_Indication) in order to not receive certificate name mismatch warnings. + Is is possible to, among other things: * Access public data (ticker, asks, bids, trades, etc...) From 52538c974ad9637c65e543fc35e3a72805071009 Mon Sep 17 00:00:00 2001 From: itkin Date: Thu, 12 Jun 2014 15:33:51 +0200 Subject: [PATCH 046/110] btc addresses --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae9775e5..415f5fb5 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Trading](#trading) * [Withdrawing](#withdrawing) * [Canceling orders](#canceling-orders) + * [Bitcoin address](#bitcoin-address) * [**Merchant API**](#merchant-api) @@ -790,6 +791,61 @@ Cancel an order. Only active trade orders may be canceled. $ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` +### Bitcoin addresses + +##### Description + +List and create addresses + +##### Endpoint + +| method | path | authorization | +|--------|-----------------------------------|--------------------------| +| GET | /api/v1/user/addresses/ | oauth2 (scope: deposit) | +| GET | /api/v1/user/addresses/:btc_address| oauth2 (scope: deposit) | +| POST | /api/v1/user/addresses | oauth2 (scope: deposit) | + +##### Example + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/addresses" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +```json +[ + { + address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + valid_until: 1402579836 + } +] +``` + +```bash +$ curl "https://bitcoin-central.net/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +```json +{ + address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + valid_until: 1402579836 +} +``` + +```bash +$ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +```json +{ + address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + valid_until: 1402579836 +} +``` + + ## Appendix @@ -902,11 +958,10 @@ If you need a simpler solution to display payment buttons on your personal websi ### Payment creation -#####Authentication +##### Authentication User authentication is realized thanks to a _merchant secret token_ you have pass as a parameter in your create query - **Note: Before using the merchant payment feature, please log us a ticket to get your _merchant token_.** ##### Description From eedcb9e1386668853f613c69b509620b5d17994d Mon Sep 17 00:00:00 2001 From: itkin Date: Fri, 13 Jun 2014 15:30:48 +0200 Subject: [PATCH 047/110] added scopes --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 415f5fb5..122a6916 100644 --- a/README.md +++ b/README.md @@ -382,6 +382,8 @@ The following scopes are available: | activity | Read trade orders, deposits, withdrawals, and other operations | | trade | Create and cancel trade orders | | withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | +| deposit | List bitcoin deposit addresses and create a new one if needed | + ##### Requesting user authorization From fb736fe111618ee173968241d0fae4504a9127e6 Mon Sep 17 00:00:00 2001 From: itkin Date: Fri, 13 Jun 2014 15:36:12 +0200 Subject: [PATCH 048/110] coquilles --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54241f66..264b761f 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Trading](#trading) * [Withdrawing](#withdrawing) * [Canceling orders](#canceling-orders) - * [Bitcoin address](#bitcoin-address) + * [Bitcoin addresses](#bitcoin-addresses) * [**Merchant API**](#merchant-api) * [Payment creation](#payment-creation) From e0aaae7199c223788f1c05c618aa605043aaa77d Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 1 Jul 2014 11:49:07 +0200 Subject: [PATCH 049/110] Bitcoin-Central -> Paymium --- README.md | 82 +++++++++++++++++++++++++++--------------------------- logo.png | Bin 4802 -> 4422 bytes 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 264b761f..744f194c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -![Bitcoin-Central logo](https://raw2.github.com/Paymium/api-documentation/master/logo.png) +![Paymium logo](https://raw2.github.com/Paymium/api-documentation/master/logo.png) -The Bitcoin-Central API allows developers to extend the capabilities of Bitcoin-Central, from reading the latest ticker to automating trades with bots. +The Paymium API allows developers to extend the capabilities of the Paymium platform, from reading the latest ticker to automating trades with bots. **IMPORTANT NOTE**: Your API client must support [SNI](http://en.wikipedia.org/wiki/Server_Name_Indication) in order to not receive certificate name mismatch warnings. @@ -11,7 +11,7 @@ Is is possible to, among other things: * Access authenticated user balances, trades, and other data * * Automate trading * -_* Authenticating users is only available to developers that have a fully verified and approved Bitcoin-Central account. On the other hand, public data is available to everyone_ +_* Authenticating users is only available to developers that have a fully verified and approved Paymium account. On the other hand, public data is available to everyone_ ## Table of contents @@ -124,7 +124,7 @@ Read the latest ticker data. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/data/eur/ticker" +$ curl "https://paymium.com/api/v1/data/eur/ticker" ``` ```json @@ -174,7 +174,7 @@ Read the latest executed trades. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/data/eur/trades" +$ curl "https://paymium.com/api/v1/data/eur/trades" ``` ```json @@ -240,7 +240,7 @@ Read the market depth. Bids and asks are grouped by price. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/data/eur/depth" +$ curl "https://paymium.com/api/v1/data/eur/depth" ``` ```json @@ -297,8 +297,8 @@ $ curl "https://bitcoin-central.net/api/v1/data/eur/depth" Two API endpoints dedicated to [Bitcoin-Charts](http://bitcoincharts.com) are publicly accessible, they are accessible at: - * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/trades`, and - * `https://bitcoin-central.net/api/v1/bitcoin_charts/eur/depth` + * `https://paymium.com/api/v1/bitcoin_charts/eur/trades`, and + * `https://paymium.com/api/v1/bitcoin_charts/eur/depth` The data they return is formatted according to the [Bitcoin Charts exchange API specification](http://bitcoincharts.com/about/exchanges/). @@ -310,7 +310,7 @@ The socket.io socket will emit a `stream` event when new data is available. The #### Socket.io configuration -Socket.io must connect to `https://bitcoin-central.net/public` and the `resource` option must be set to `ws/socket.io`. +Socket.io must connect to `https://paymium.com/public` and the `resource` option must be set to `ws/socket.io`. #### Stream properties @@ -325,14 +325,14 @@ Socket.io must connect to `https://bitcoin-central.net/public` and the `resource Assuming you have node.js installed, you can install the socket.io client library by running `npm install socket.io-client@0.9`. -The code below shows how to connect to the Bitcoin-Central socket, and outputs any received data to the console. +The code below shows how to connect to the Paymium socket, and outputs any received data to the console. The example is available in the `examples/public_socket.js` directory of this repository. ```javascript var io = require('socket.io-client'); - socket = io.connect('https://bitcoin-central.net/public', { + socket = io.connect('https://paymium.com/public', { resource: 'ws/socket.io' }); @@ -356,11 +356,11 @@ The example is available in the `examples/public_socket.js` directory of this re ## User data -Before you can access your own data or other users data, you must register an application on Bitcoin-Central: +Before you can access your own data or other users data, you must register an application on Paymium: 1. Verify your account and log in -2. Visit [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps) -3. Create an application (set redirect URI to `https://bitcoin-central.net/page/oauth/test` when testing) +2. Visit [https://paymium.com/page/developers/apps](https://paymium.com/page/developers/apps) +3. Create an application (set redirect URI to `https://paymium.com/page/oauth/test` when testing) ### Authentication @@ -394,19 +394,19 @@ The following scopes are available: ##### Requesting user authorization -To get user's permission to use his/her account, you must send him/her to your application's redirect URI. You can see this URI by visiting your application's page: [https://bitcoin-central.net/page/developers/apps](https://bitcoin-central.net/page/developers/apps). +To get user's permission to use his/her account, you must send him/her to your application's redirect URI. You can see this URI by visiting your application's page: [https://paymium.com/page/developers/apps](https://paymium.com/page/developers/apps). By default, the `basic` scope will be requested. If your application requires specific access scopes, you must append a scope GET parameter to the authorization URI: - https://bitcoin-central.net/...&scope=basic+activity+trade + https://paymium.com/...&scope=basic+activity+trade The user will then be prompted to authorize your application with the specified scopes. ##### Receiving the authorization code -If you specified the test redirection URI `https://bitcoin-central.net/page/oauth/test`, the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. +If you specified the test redirection URI `https://paymium.com/page/oauth/test`, the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. Otherwise the code or error will be sent to the redirection URI so that your application can retrieve it (in this case `https://example.com/callback`): @@ -423,7 +423,7 @@ The authorization code is valid 5 minutes. Once your application received the authorization code, it can request an access token and a refresh token: ```bash -$ curl "https://bitcoin-central.net/api/oauth/token" \ +$ curl "https://paymium.com/api/oauth/token" \ -d "client_id=APPLICATION_KEY" \ -d "client_secret=APPLICATION_SECRET" \ -d "grant_type=authorization_code" \ @@ -448,7 +448,7 @@ An access token can be used to authorize user requests for the approved scopes a Since an access token is only valid 30 minutes, your application may need to fetch a new access token using the refresh token: ```bash -$ curl "https://bitcoin-central.net/api/oauth/token" \ +$ curl "https://paymium.com/api/oauth/token" \ -d "client_id=APPLICATION_KEY" \ -d "client_secret=APPLICATION_SECRET" \ -d "grant_type=refresh_token" \ @@ -483,7 +483,7 @@ Read the latest user info. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user" \ +$ curl "https://paymium.com/api/v1/user" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -533,7 +533,7 @@ Read user activity. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders?offset=20" \ +$ curl "https://paymium.com/api/v1/user/orders?offset=20" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -605,7 +605,7 @@ Read details from a specific order. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ +$ curl "https://paymium.com/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -672,7 +672,7 @@ obtain `currency_amount`. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders" \ +$ curl "https://paymium.com/api/v1/user/orders" \ --header "Authorization: Bearer ACCESS_TOKEN" \ -d "type=LimitOrder" \ -d "currency=EUR" \ @@ -747,7 +747,7 @@ Request BTC or fiat withdrawals. A confirmation is sent by email to the user bef ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders" \ +$ curl "https://paymium.com/api/v1/user/orders" \ --header "Authorization: Bearer ACCESS_TOKEN" \ -d "type=Transfer" \ -d "currency=BTC" \ @@ -801,7 +801,7 @@ Cancel an order. Only active trade orders may be canceled. ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ +$ curl "https://paymium.com/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` ### Bitcoin addresses @@ -812,16 +812,16 @@ List and create bitcoin deposit addresses ##### Endpoint -| method | path | authorization | -|--------|-----------------------------------|--------------------------| -| GET | /api/v1/user/addresses/ | oauth2 (scope: deposit) | -| GET | /api/v1/user/addresses/:btc_address| oauth2 (scope: deposit) | -| POST | /api/v1/user/addresses | oauth2 (scope: deposit) | +| method | path | authorization | +|--------|-------------------------------------|--------------------------| +| GET | /api/v1/user/addresses/ | oauth2 (scope: deposit) | +| GET | /api/v1/user/addresses/:btc_address | oauth2 (scope: deposit) | +| POST | /api/v1/user/addresses | oauth2 (scope: deposit) | ##### Example ```bash -$ curl "https://bitcoin-central.net/api/v1/user/addresses" \ +$ curl "https://paymium.com/api/v1/user/addresses" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -835,7 +835,7 @@ $ curl "https://bitcoin-central.net/api/v1/user/addresses" \ ``` ```bash -$ curl "https://bitcoin-central.net/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ +$ curl "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -847,7 +847,7 @@ $ curl "https://bitcoin-central.net/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3ww ``` ```bash -$ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ +$ curl -X POST "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` @@ -874,7 +874,7 @@ For merchants that have very simple needs payment buttons are also available, th The authentication used for this call does not use OAuth2 but instead is base on static tokens. These tokens allow only the creation of invoices (payments) and do not allow withdrawals or trading to take place against the merchant's account. -**Note:** The tokens are provided by the Bitcoin-Central support, upon request. +**Note:** The tokens are provided by the Paymium support, upon request. ##### Description @@ -883,14 +883,14 @@ A payment is created by a merchant platform when the customer chooses Bitcoin as The merchant platform can then : * display the payment Bitcoin address on his own web interface, -* include the Bitcoin-Central web interface url in an iframe in order to display a payment pop-up as an overlay, +* include the Paymium web interface url in an iframe in order to display a payment pop-up as an overlay, * redirect the buyer to the payement's URL (see below), in this case the payment is displayed on a separate screen -To display the payment request to the user, the `https://bitcoin-central.net/invoice/{UUID}` can be used, this is used by the e-commerce framework plugins. +To display the payment request to the user, the `https://paymium.com/invoice/{UUID}` can be used, this is used by the e-commerce framework plugins. Once the payment request is displayed, the customer has 15 minutes to send the appropriate amount. -Bitcoin-Central notifies the merchant of the completion of his payment via the associated callback (for which an URL may be provided when creating the payment request), once one Bitcoin confirmation for the payment is received the funds are credited to the merchant's account, a callback notification is then made. +Paymium notifies the merchant of the completion of his payment via the associated callback (for which an URL may be provided when creating the payment request), once one Bitcoin confirmation for the payment is received the funds are credited to the merchant's account, a callback notification is then made. ##### Endpoint @@ -1113,16 +1113,16 @@ The [`AutoRefreshToken`](https://gist.github.com/davout/edb4db0315dc417fa78d) cl ```ruby require 'oauth2' -client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://bitcoin-central.net', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') +client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://paymium.com', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') -client.auth_code.authorize_url(redirect_uri: 'https://bitcoin-central.net/page/oauth/test', scope: 'basic activity trade withdraw') - => "https://staging.bitcoin-central.net/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.bitcoin-central.net%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" +client.auth_code.authorize_url(redirect_uri: 'https://paymium.com/page/oauth/test', scope: 'basic activity trade withdraw') + => "https://staging.paymium.com/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.paymium.com%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" # Visit this URL in your browser, approve the request and copy the authorization code authorization_code = '9b55e27c840f59d927284fdc438ee3d8fac94b00e24d331162ddff76c1a6bcc0' -token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://bitcoin-central.net/page/oauth/test') +token = client.auth_code.get_token(authorization_code, redirect_uri: 'https://paymium.com/page/oauth/test') token.get('/api/v1/user').body => {"name":"BC-U123456","locale":"en","balance_btc":117.56672217,"locked_btc":0.0,"balance_eur":0.0,"locked_eur":0.00995186} diff --git a/logo.png b/logo.png index fb3dadc626953ad55c65f3cfb19c3702891b8aed..34d2a1f267590e2c37fb85e71210f01b9084e574 100644 GIT binary patch literal 4422 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 aIhejjg?z&9Eyf-ERnpSXg_o(D2mA-%cvcSp From 83e05b945fbaa739c67eac384a48f9900fbfb16d Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 1 Jul 2014 11:50:40 +0200 Subject: [PATCH 050/110] Paymium logo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 744f194c..e8c6675e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Paymium logo](https://raw2.github.com/Paymium/api-documentation/master/logo.png) +![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) The Paymium API allows developers to extend the capabilities of the Paymium platform, from reading the latest ticker to automating trades with bots. From a89f245520601bdab657c765cc575278f2e26c10 Mon Sep 17 00:00:00 2001 From: itkin Date: Tue, 1 Jul 2014 17:07:39 +0200 Subject: [PATCH 051/110] coquilles --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e8c6675e..7729d144 100644 --- a/README.md +++ b/README.md @@ -828,8 +828,8 @@ $ curl "https://paymium.com/api/v1/user/addresses" \ ```json [ { - address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", - valid_until: 1402579836 + "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + "valid_until": 1402579836 } ] ``` @@ -841,20 +841,20 @@ $ curl "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwU ```json { - address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", - valid_until: 1402579836 + "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + "valid_until": 1402579836 } ``` ```bash -$ curl -X POST "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ +$ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses" \ --header "Authorization: Bearer ACCESS_TOKEN" ``` ```json { - address: "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", - valid_until: 1402579836 + "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", + "valid_until": 1402579836 } ``` From 10209da50e17791267ce319e7c8543efbd969c25 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 1 Jul 2014 17:30:06 +0200 Subject: [PATCH 052/110] Bitcoin addresses --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7729d144..6797b995 100644 --- a/README.md +++ b/README.md @@ -814,11 +814,13 @@ List and create bitcoin deposit addresses | method | path | authorization | |--------|-------------------------------------|--------------------------| -| GET | /api/v1/user/addresses/ | oauth2 (scope: deposit) | +| GET | /api/v1/user/addresses | oauth2 (scope: deposit) | | GET | /api/v1/user/addresses/:btc_address | oauth2 (scope: deposit) | | POST | /api/v1/user/addresses | oauth2 (scope: deposit) | -##### Example +##### Exampleis + +Retrieve your Bitcoin deposit addresses along with their expiration timestamp. ```bash $ curl "https://paymium.com/api/v1/user/addresses" \ @@ -834,6 +836,8 @@ $ curl "https://paymium.com/api/v1/user/addresses" \ ] ``` +Retrieve details for a single address. + ```bash $ curl "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn" \ --header "Authorization: Bearer ACCESS_TOKEN" @@ -846,6 +850,8 @@ $ curl "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwU } ``` +Create a new Bitcoin deposit address unless another one is already active. + ```bash $ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses" \ --header "Authorization: Bearer ACCESS_TOKEN" From accece25a23ef662b4964f4b82ec9a8ce4972190 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Fri, 8 Aug 2014 11:09:27 +0200 Subject: [PATCH 053/110] Starting token authentication documentation --- README.md | 221 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 113 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index 6797b995..934f6af5 100644 --- a/README.md +++ b/README.md @@ -22,15 +22,18 @@ _* Authenticating users is only available to developers that have a fully verifi * [Successful calls](#sucessful-calls) * [Rate-limiting](#rate-limiting) +* [**Authentication**](#authentication) + * [OAuth2 authentication](#oauth2-authentication) + * [Token authentication](#token-authentication) + * [**Public data**](#public-data) * [Ticker](#ticker) * [Latest trades](#latest-trades) * [Market depth](#market-depth) * [Bitcoin-Charts endpoints](#bitcoin-charts-endpoints) * [WebSocket](#websocket) - + * [**User data**](#user-data) - * [Authentication](#authentication) * [User info](#user-info) * [User activity](#user-activity) * [Order details](#order-details) @@ -105,6 +108,114 @@ API calls are rate-limited by IP to 86400 calls per day (one per second on avera X-Ratelimit-Remaining: 4982 Date: Wed, 30 Jan 2013 12:08:58 GMT +## Authentication +### Token authentication +### OAuth2 authentication + +To access and manipulate user data, you must first request permission from the user. + +Authorizations are granted using the standard [OAuth2](http://oauth.net/2/) Authorization Code Grant. + +Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). + +The process of authenticating a user can be summarized as follows: + +1. Send the user to your application's authorization URL +2. Receive the authorization code if the user accepted the request +3. Get an access token and a refresh token from the authorization code +4. Refresh the access token when needed + +##### Scopes + +Before you request authorization to access a user's account, you must decide which scopes you would like to access. + +The following scopes are available: + +| name | description | +|----------------|-------------------------------------------------------------------------------------------| +| basic | Read account number, language, and balances (default) | +| activity | Read trade orders, deposits, withdrawals, and other operations | +| trade | Create and cancel trade orders | +| withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | +| deposit | List bitcoin deposit addresses and create a new one if needed | + + +##### Requesting user authorization + +To get user's permission to use his/her account, you must send him/her to your application's redirect URI. You can see this URI by visiting your application's page: [https://paymium.com/page/developers/apps](https://paymium.com/page/developers/apps). + +By default, the `basic` scope will be requested. + +If your application requires specific access scopes, you must append a scope GET parameter to the authorization URI: + + https://paymium.com/...&scope=basic+activity+trade + +The user will then be prompted to authorize your application with the specified scopes. + +##### Receiving the authorization code + +If you specified the test redirection URI `https://paymium.com/page/oauth/test`, the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. + +Otherwise the code or error will be sent to the redirection URI so that your application can retrieve it (in this case `https://example.com/callback`): + + https://example.com/callback?code=AUTHORIZATION_CODE + +Or if the request was denied by the user: + + https://example.com/callback?error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request. + +The authorization code is valid 5 minutes. + +##### Fetching an access token and a refresh token + +Once your application received the authorization code, it can request an access token and a refresh token: + +```bash +$ curl "https://paymium.com/api/oauth/token" \ + -d "client_id=APPLICATION_KEY" \ + -d "client_secret=APPLICATION_SECRET" \ + -d "grant_type=authorization_code" \ + -d "redirect_uri=REDIRECT_URI" \ + -d "code=AUTHORIZATION_CODE" +``` + +```json +{ + "access_token": "ACCESS_TOKEN", + "token_type": "bearer", + "expires_in": 1800, + "refresh_token": "REFRESH_TOKEN", + "scope": "basic" +} +``` + +An access token can be used to authorize user requests for the approved scopes and is valid 30 minutes. + +##### Refreshing the access token + +Since an access token is only valid 30 minutes, your application may need to fetch a new access token using the refresh token: + +```bash +$ curl "https://paymium.com/api/oauth/token" \ + -d "client_id=APPLICATION_KEY" \ + -d "client_secret=APPLICATION_SECRET" \ + -d "grant_type=refresh_token" \ + -d "redirect_uri=REDIRECT_URI" \ + -d "refresh_token=REFRESH_TOKEN" +``` + +```json +{ + "access_token": "NEW_ACCESS_TOKEN", + "token_type": "bearer", + "expires_in": 1800, + "refresh_token": "NEW_REFRESH_TOKEN", + "scope": "basic" +} +``` + +After refreshing the access token, the previous tokens (access and refresh) are no longer valid. + ## Public data Public data (ticker, asks, bids, trades) can be accessed without registering an application. @@ -362,112 +473,6 @@ Before you can access your own data or other users data, you must register an ap 2. Visit [https://paymium.com/page/developers/apps](https://paymium.com/page/developers/apps) 3. Create an application (set redirect URI to `https://paymium.com/page/oauth/test` when testing) -### Authentication - -To access and manipulate user data, you must first request permission from the user. - -Authorizations are granted using the standard [OAuth2](http://oauth.net/2/) Authorization Code Grant. - -Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). - -The process of authenticating a user can be summarized as follows: - -1. Send the user to your application's authorization URL -2. Receive the authorization code if the user accepted the request -3. Get an access token and a refresh token from the authorization code -4. Refresh the access token when needed - -##### Scopes - -Before you request authorization to access a user's account, you must decide which scopes you would like to access. - -The following scopes are available: - -| name | description | -|----------------|-------------------------------------------------------------------------------------------| -| basic | Read account number, language, and balances (default) | -| activity | Read trade orders, deposits, withdrawals, and other operations | -| trade | Create and cancel trade orders | -| withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | -| deposit | List bitcoin deposit addresses and create a new one if needed | - - -##### Requesting user authorization - -To get user's permission to use his/her account, you must send him/her to your application's redirect URI. You can see this URI by visiting your application's page: [https://paymium.com/page/developers/apps](https://paymium.com/page/developers/apps). - -By default, the `basic` scope will be requested. - -If your application requires specific access scopes, you must append a scope GET parameter to the authorization URI: - - https://paymium.com/...&scope=basic+activity+trade - -The user will then be prompted to authorize your application with the specified scopes. - -##### Receiving the authorization code - -If you specified the test redirection URI `https://paymium.com/page/oauth/test`, the user will be presented the autorization code upon accepting your request which can be used by the application to fetch access tokens. - -Otherwise the code or error will be sent to the redirection URI so that your application can retrieve it (in this case `https://example.com/callback`): - - https://example.com/callback?code=AUTHORIZATION_CODE - -Or if the request was denied by the user: - - https://example.com/callback?error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request. - -The authorization code is valid 5 minutes. - -##### Fetching an access token and a refresh token - -Once your application received the authorization code, it can request an access token and a refresh token: - -```bash -$ curl "https://paymium.com/api/oauth/token" \ - -d "client_id=APPLICATION_KEY" \ - -d "client_secret=APPLICATION_SECRET" \ - -d "grant_type=authorization_code" \ - -d "redirect_uri=REDIRECT_URI" \ - -d "code=AUTHORIZATION_CODE" -``` - -```json -{ - "access_token": "ACCESS_TOKEN", - "token_type": "bearer", - "expires_in": 1800, - "refresh_token": "REFRESH_TOKEN", - "scope": "basic" -} -``` - -An access token can be used to authorize user requests for the approved scopes and is valid 30 minutes. - -##### Refreshing the access token - -Since an access token is only valid 30 minutes, your application may need to fetch a new access token using the refresh token: - -```bash -$ curl "https://paymium.com/api/oauth/token" \ - -d "client_id=APPLICATION_KEY" \ - -d "client_secret=APPLICATION_SECRET" \ - -d "grant_type=refresh_token" \ - -d "redirect_uri=REDIRECT_URI" \ - -d "refresh_token=REFRESH_TOKEN" -``` - -```json -{ - "access_token": "NEW_ACCESS_TOKEN", - "token_type": "bearer", - "expires_in": 1800, - "refresh_token": "NEW_REFRESH_TOKEN", - "scope": "basic" -} -``` - -After refreshing the access token, the previous tokens (access and refresh) are no longer valid. - ### User info ##### Description From 31429b4156b3bc495d9fe1e9a7de0d1369af9a45 Mon Sep 17 00:00:00 2001 From: davout Date: Fri, 8 Aug 2014 12:24:53 +0200 Subject: [PATCH 054/110] API token authentication documentation --- README.md | 59 +++++++++++++++++++++++++++++++++-------------- create-token.png | Bin 0 -> 188460 bytes 2 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 create-token.png diff --git a/README.md b/README.md index 934f6af5..a633e1e5 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Rate-limiting](#rate-limiting) * [**Authentication**](#authentication) + * [Permissions](#permissions) * [OAuth2 authentication](#oauth2-authentication) * [Token authentication](#token-authentication) @@ -109,25 +110,10 @@ API calls are rate-limited by IP to 86400 calls per day (one per second on avera Date: Wed, 30 Jan 2013 12:08:58 GMT ## Authentication -### Token authentication -### OAuth2 authentication - -To access and manipulate user data, you must first request permission from the user. - -Authorizations are granted using the standard [OAuth2](http://oauth.net/2/) Authorization Code Grant. - -Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). - -The process of authenticating a user can be summarized as follows: - -1. Send the user to your application's authorization URL -2. Receive the authorization code if the user accepted the request -3. Get an access token and a refresh token from the authorization code -4. Refresh the access token when needed -##### Scopes +### Permissions -Before you request authorization to access a user's account, you must decide which scopes you would like to access. +Before you request authorization to access a user's account, you must decide which permissions, or scopes you would like to access. The following scopes are available: @@ -139,6 +125,45 @@ The following scopes are available: | withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | | deposit | List bitcoin deposit addresses and create a new one if needed | +### Token authentication + +This authentication mechanism is the recommended method if you need to access your own account data and is also referred to as **HMAC authentication**, if you need to access other users accounts on their behalf you'll need to use the OAuth2 authentication method. + +##### Generating a token + +For this authentication method you need to generate a token/secret pair that you will use to make requests against our API. In order to do so visit the "API tokens" menu in your account profile and click on "Create token". You will be presented with the following screen that will enable you to select the desired access permissions for this token. For security reasons you will need to confirm your access credentials. + +![Create an API token](https://raw.githubusercontent.com/Paymium/api-documentation/master/create-token.png) + +Once your token is created you'll be presented **once** with the matching secret key, this secret key is only displayed once, you need to record it carefully. If the secret key is lost the token becomes useless. + +##### Making requests + +Once you have an API token and its matching secret key you can use them to make requests against our API. In order to do so you must include three HTTP headers that will authenticate your request. + +```bash +$ curl "https://paymium.com/api/v1/user" \ + --header "Api-Key: " \ + --header "Api-Signature: " \ + --header "Api-Nonce: " \ +``` + + * The **API key** is the token that is displayed when listing your currently active tokens, + * The **API signature** is a HMAC-SHA256 hash of the nonce concatenated with the full URL and body of the HTTP request, encoded using your API secret key, + * The **nonce** is a positive integer number that must increase with every request you make + +### OAuth2 authentication + +This authentication mechanism is best suited to cases where a developer publishes an app that requires access its users Paymium accounts. + +Many programming languages already have libraries to develop clients that connect to OAuth2 APIs, hence the following steps may not be necessary. For instance, if you are a Ruby developer, you can use [this example to get started](#ruby-example). + +The process can be summarized as follows: + +1. Send the user to your application's authorization URL +2. Receive the authorization code if the user accepted the request +3. Get an access token and a refresh token from the authorization code +4. Refresh the access token when needed ##### Requesting user authorization diff --git a/create-token.png b/create-token.png new file mode 100644 index 0000000000000000000000000000000000000000..794b9c2a6646af557643527ea4998538f127465b GIT binary patch literal 188460 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 z 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 z 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 literal 0 HcmV?d00001 From d91221970f31a7dcdb6d433729300178ebc82cf5 Mon Sep 17 00:00:00 2001 From: davout Date: Fri, 8 Aug 2014 12:30:54 +0200 Subject: [PATCH 055/110] Update image name --- README.md | 2 +- create-token.png => create-api-token.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename create-token.png => create-api-token.png (100%) diff --git a/README.md b/README.md index a633e1e5..5c8db09b 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ This authentication mechanism is the recommended method if you need to access yo For this authentication method you need to generate a token/secret pair that you will use to make requests against our API. In order to do so visit the "API tokens" menu in your account profile and click on "Create token". You will be presented with the following screen that will enable you to select the desired access permissions for this token. For security reasons you will need to confirm your access credentials. -![Create an API token](https://raw.githubusercontent.com/Paymium/api-documentation/master/create-token.png) +![Create an API token](https://raw.githubusercontent.com/Paymium/api-documentation/master/create-api-token.png) Once your token is created you'll be presented **once** with the matching secret key, this secret key is only displayed once, you need to record it carefully. If the secret key is lost the token becomes useless. diff --git a/create-token.png b/create-api-token.png similarity index 100% rename from create-token.png rename to create-api-token.png From 1aaf8950b8c21c1fda52e5afbad7c82f6051ee5b Mon Sep 17 00:00:00 2001 From: davout Date: Mon, 18 Aug 2014 13:32:13 +0200 Subject: [PATCH 056/110] Bitcoin addresses and TXIDs in API responses --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5c8db09b..9af47251 100644 --- a/README.md +++ b/README.md @@ -1138,6 +1138,8 @@ Each type may have additional properties as described below. | created_at | date created | "2013-10-22T14:30:06.000Z" | | created_at_int | timestamp | 1382452206 | | amount | currency amount | 49.38727114 | +| address | bitcoin address if any | "1FPDBXNqSkZMsw1kSkkajcj8berxDQkUoc" | +| tx_hash | bitcoin transaction hash if any | "86e6e72aa559428524e035cd6b2997004..." | | is_trading_account | whether the trading account is targeted | false | ### Ruby example From 1e6c6095a6026a0e9068b7326ef67b51f9f843ee Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 28 Aug 2014 00:06:05 +0200 Subject: [PATCH 057/110] Recent API changes on authentication and callback signature --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5c8db09b..6df823c5 100644 --- a/README.md +++ b/README.md @@ -908,10 +908,7 @@ For merchants that have very simple needs payment buttons are also available, th ##### Authentication -The authentication used for this call does not use OAuth2 but instead is base on static tokens. These tokens allow only the creation of invoices (payments) and do not allow withdrawals or trading to take place against the merchant's account. - -**Note:** The tokens are provided by the Paymium support, upon request. - +_The "merchant token" authentication mechanism has been removed please use an [API token](#token-authentication) or an [OAuth2 token](#oauth2-authentication) instead with the "merchant" scope._ ##### Description @@ -940,7 +937,6 @@ Paymium notifies the merchant of the completion of his payment via the associate | name | description | example value | |--------------|----------------------------------------------|--------------------| -| token | Merchant token (required) | 37d669e6d381c53ba3f6 | | amount | Amount requested for the payment (required) | 20 | | payment_split | Percentage of the payment the _merchant_ will get in `currency` expressed as a two-decimal places float between 0 and 1 (required) | 1.0 | | currency | Currency in which the merchant wishes to be credited and in which the `amount` is expressed (required) | EUR | @@ -956,9 +952,9 @@ See [Payment properties](#returned-json-object-properties) When a payment is created or updated, and if a callback URL was provided, a notification is made. -When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information) and is authenticated with a special `X-Payment-Signature` hash. +When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information). -The merchant platform must check the `X-Payment-Signature` header of each request to ensure their authenticity. It is populated with the SHA-2 digest of the with the request body concatenated with merchant token. +The merchant should ensure the callback is legitimate by requesting confirmation from the Paymium API for the invoice data. **PHP code example** From 9d673785f6c7f73021c700fc4073048b7a0b2d79 Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 28 Aug 2014 09:17:17 +0200 Subject: [PATCH 058/110] Recent API changes on authentication and callback signature --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index 57eca08e..647ccaf4 100644 --- a/README.md +++ b/README.md @@ -894,8 +894,6 @@ $ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses" \ } ``` - - ## Merchant API The Merchant API enables merchants to securely sell goods and services and get paid in Bitcoin. The API makes it possible for the merchant to completely eliminate the risk of market fluctuations when requesting to receive fiat currency in their account. It is also possible to keep a part of the payment in Bitcoin without having it converted at a guaranteed rate. @@ -955,19 +953,6 @@ When a payment is created or updated, and if a callback URL was provided, a noti When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information). The merchant should ensure the callback is legitimate by requesting confirmation from the Paymium API for the invoice data. - -**PHP code example** - -```php -$req_body = file_get_contents("php://input"); -$signature = $_SERVER['HTTP_X_PAYMENT_SIGNATURE']; -$token = Configuration::get('paymium_token'); -$hash = hash('sha256', $token . $req_body); - -if ($hash === $signature) { - // Callback is authentic -} -``` **Note :** The callback notifications are not guaranteed to be unique, it must have idempotent results on the merchant side if the payment has not actually changed. From f554191727c35ab02860ebf4b061f027d01bfd11 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 8 Sep 2014 15:34:33 +0200 Subject: [PATCH 059/110] Updated examples endpoint. --- examples/node.js/config.js | 2 +- examples/public_socket.js/client.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/node.js/config.js b/examples/node.js/config.js index d839bc77..98d6566a 100644 --- a/examples/node.js/config.js +++ b/examples/node.js/config.js @@ -6,7 +6,7 @@ module.exports = { scopes: 'basic activity trade withdraw', - apiBaseUrl: 'https://bitcoin-central.net/api', + apiBaseUrl: 'https://paymium.com/api', serverBaseUrl: 'http://localhost:8000', serverPort: 8000, diff --git a/examples/public_socket.js/client.js b/examples/public_socket.js/client.js index cea20829..04dfe488 100644 --- a/examples/public_socket.js/client.js +++ b/examples/public_socket.js/client.js @@ -1,6 +1,6 @@ var io = require('socket.io-client'); -socket = io.connect('https://bitcoin-central.net/public', { +socket = io.connect('https://paymium.com/public', { resource: 'ws/socket.io' }); From f6818a5209f39989cccf40e6348500ed9a7d7576 Mon Sep 17 00:00:00 2001 From: davout Date: Mon, 6 Oct 2014 15:43:50 +0200 Subject: [PATCH 060/110] Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 647ccaf4..e59a5a9f 100644 --- a/README.md +++ b/README.md @@ -950,7 +950,7 @@ See [Payment properties](#returned-json-object-properties) When a payment is created or updated, and if a callback URL was provided, a notification is made. -When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information). +When the notification is made a `POST` request is made to the callback URL, it contains the JSON representation of the payment (see the [payment properties](#get-payment-information)). The merchant should ensure the callback is legitimate by requesting confirmation from the Paymium API for the invoice data. From 28c72ad9e9e05a12cbaa006679949c7c93a056e4 Mon Sep 17 00:00:00 2001 From: davout Date: Mon, 27 Oct 2014 18:42:35 +0100 Subject: [PATCH 061/110] FIX API documentation --- FIX-4.4.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 3 +++ 2 files changed, 60 insertions(+) create mode 100644 FIX-4.4.md diff --git a/FIX-4.4.md b/FIX-4.4.md new file mode 100644 index 00000000..98e45356 --- /dev/null +++ b/FIX-4.4.md @@ -0,0 +1,57 @@ +![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) + +The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. **This API is currently in alpha-testing phase.** + +Do not hesitate to contact the support for any issues or suggestions. We're also available on IRC at Freenode on the #paymium channel, ring davout for assistance. + +## Currently supported + - Subscription to the real-time depth + +## On the roadmap + - Ability to place orders and receive execution reports + +# Using the FIX API + +## Obtaining access +The API is not publicly available, you must request access to it through a support ticket. You will receive further instructions on how to establish a connection to our FIX acceptor. + +## Managing the session +Once connected, your client is expected to issue a `Logon` message containing `PAYMIUM` as the `TARGET_COMP_ID`, a non-blank `Username` (553) field. Encryption is not supported, the `EncryptMethod` (98) field must be set to `0`. + +The acceptor will then reply with a `Logon` message. From there on, `Heartbeat` messages are expected at regular intervals. + +The acceptor will correctly handle `TestRequest` messages by replying with a matching `Heartbeat`. It will also handle a `ResendRequest` by resending the requested message range. + +## Obtaining market data + +Clients may issue a `MarketDataRequest` to subscribe to the depth feed. Typically it will allow a client to receive a snapshot of the current state of the order book once, followed by real-time incremental updates whenever the data changes. See the example session. + + +# Example FIX session +This session shows the message exchange between a client and the Paymium acceptor for the purpose of receiving market data updates. + +Messages sent by the client are indicated by a `>>>` while received messages are prepended with a `<<<`. Separator bytes are replaces with pipe characters for clarity. + +```` +# The client connects and sends a Logon message, immediately followed by a Heartbeat (not really necessary at this point) +>>> 8=FIX.4.4|9=75|35=A|49=DAVID_SND|56=PAYMIUM|34=1|52=20141027-17:10:37|98=0|108=30|553=DVE|10=192| +>>> 8=FIX.4.4|9=55|35=0|49=DAVID_SND|56=PAYMIUM|34=2|52=20141027-17:10:37|10=219| + +# The acceptor replies with a Logon +<<< 8=FIX.4.4|9=75|35=A|49=PAYMIUM|56=DAVID_SND|34=1|52=20141027-17:10:37|98=0|108=30|553=DVE|10=192| + +# The client then sends a MarketDataRequest asking for the bids, asks, trades, open, close and VWAP of the EUR/XBT instrument +# The entry types are currently ignored, only bids and asks are returned, the instrument symbol value must however be correctly set to 'EUR/XBT' +>>> 8=FIX.4.4|9=138|35=V|49=DAVID_SND|56=PAYMIUM|34=3|52=20141027-17:10:40|262=X|263=2|264=0|265=1|267=6|269=0|269=1|269=2|269=4|269=5|269=9|146=1|55=EUR/XBT|10=188| + +# The acceptor starts by returning a MarketDataSnapshot message (shortened for clarity) +<<< 8=FIX.4.4|9=13159|35=W|49=PAYMIUM|56=DAVID_SND|34=2|52=20141027-17:10:40|262=X|55=EUR/XBT|268=477|269=0|270=0.0001|271=65300.0|269=0|270=0.001|271=1000.0|269=0|270=0.01|271=100.0|269=0|270=0.1|271=1010.0|269=0|270=1.0|271=101.002308|269=0|270=2.94|271=1.0|269=0|270=5.0|271=0.01|270=1000000.0|271=0.2|10=171| + +# The client regularly sends out Hearbeats +>>> 8=FIX.4.4|9=55|35=0|49=DAVID_SND|56=PAYMIUM|34=4|52=20141027-17:10:52|10=218| + +# Whenever new data is available it is sent to the client by the acceptor +<<< 8=FIX.4.4|9=104|35=X|49=PAYMIUM|56=DAVID_SND|34=6|52=20141027-17:12:18|262=X|268=1|279=1|269=0|270=288.999|15=EUR|271=0|10=124| +<<< 8=FIX.4.4|9=104|35=X|49=PAYMIUM|56=DAVID_SND|34=7|52=20141027-17:12:19|262=X|268=1|279=1|269=0|270=288.999|15=EUR|271=0|10=126| +<<< 8=FIX.4.4|9=111|35=X|49=PAYMIUM|56=DAVID_SND|34=8|52=20141027-17:12:20|262=X|268=1|279=1|269=1|270=288.999|15=EUR|271=0.011361|10=208| +```` diff --git a/README.md b/README.md index e59a5a9f..53901f67 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ ![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) + +**NEW: Check-out our FIX API for real-time market data ([documentation](https://github.com/Paymium/api-documentation/blob/master/FIX-4.4.md))** + The Paymium API allows developers to extend the capabilities of the Paymium platform, from reading the latest ticker to automating trades with bots. **IMPORTANT NOTE**: Your API client must support [SNI](http://en.wikipedia.org/wiki/Server_Name_Indication) in order to not receive certificate name mismatch warnings. From 6508e9ac66e2407bc0204478687384ef20144f09 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 4 Nov 2014 16:41:23 +0100 Subject: [PATCH 062/110] FIX Java connector example --- FIX-4.4.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FIX-4.4.md b/FIX-4.4.md index 98e45356..bd77f5c3 100644 --- a/FIX-4.4.md +++ b/FIX-4.4.md @@ -1,5 +1,7 @@ ![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) +### NEW : Java example connector now avaible [here](https://github.com/Paymium/fix-connector-example) + The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. **This API is currently in alpha-testing phase.** Do not hesitate to contact the support for any issues or suggestions. We're also available on IRC at Freenode on the #paymium channel, ring davout for assistance. From 56913e7d3d63347217ee53686c5eff5d10c15630 Mon Sep 17 00:00:00 2001 From: davout Date: Fri, 7 Nov 2014 15:29:37 +0100 Subject: [PATCH 063/110] Added Python FIX connector example --- FIX-4.4.md | 2 + contrib/quickfixtest.py | 133 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 contrib/quickfixtest.py diff --git a/FIX-4.4.md b/FIX-4.4.md index bd77f5c3..0d0b0efc 100644 --- a/FIX-4.4.md +++ b/FIX-4.4.md @@ -2,6 +2,8 @@ ### NEW : Java example connector now avaible [here](https://github.com/Paymium/fix-connector-example) +### NEW : Python example connector now avaible in the `contrib/` directory, kindly provided by one of our users + The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. **This API is currently in alpha-testing phase.** Do not hesitate to contact the support for any issues or suggestions. We're also available on IRC at Freenode on the #paymium channel, ring davout for assistance. diff --git a/contrib/quickfixtest.py b/contrib/quickfixtest.py new file mode 100644 index 00000000..8af637c5 --- /dev/null +++ b/contrib/quickfixtest.py @@ -0,0 +1,133 @@ +import time +import quickfix as fix +import quickfix44 as fixMsg + +USERNAME = 'PYTHON_TESTS' +SENDERCOMPID = 'TEST_CLIENT' +FIX44FILE = './FIX44.xml' +DEBUG = False + + +class MyApplication(fix.Application): + + def onCreate(self, sessionID): + pass + + def onLogon(self, sessionID): + pass + + def onLogout(self, sessionID): + pass + + def toAdmin(self, message, sessionID): + msg_type = message.getHeader().getField(fix.MsgType()).getString() + if msg_type == fix.MsgType_Logon: + message.setField(fix.Username(USERNAME)) + message.setField(fix.ResetSeqNumFlag(True)) + + def toApp(self, message, sessionID): + pass + + def fromAdmin(self, message, sessionID): + passr + + def fromApp(self, message, sessionID): + msg_type = message.getHeader().getField(fix.MsgType()).getString() + depth = {} + if msg_type == fix.MsgType_MarketDataSnapshotFullRefresh: + group = fixMsg.MarketDataSnapshotFullRefresh.NoMDEntries() + nb_entries = int(message.getField(fix.NoMDEntries()).getString()) + for i in range(1, nb_entries + 1): + message.getGroup(i, group) + md_type = group.getField(fix.MDEntryType()).getString() + md_price = group.getField(fix.MDEntryPx()).getString() + md_amount = group.getField(fix.MDEntrySize()).getString() + if not md_amount: + md_amount = 0 + order = {'price': float(md_price), 'amount': float(md_amount)} + if md_type == fix.MDEntryType_OFFER: + if 'asks' not in depth: + depth['asks'] = [] + depth['asks'].append(order) + if md_type == fix.MDEntryType_BID: + if 'bids' not in depth: + depth['bids'] = [] + depth['bids'].append(order) + print("Received a full market data snapshot: %s" % (depth)) + elif msg_type == fix.MsgType_MarketDataIncrementalRefresh: + group = fixMsg.MarketDataIncrementalRefresh.NoMDEntries() + nb_entries = int(message.getField(fix.NoMDEntries()).getString()) + for i in range(1, nb_entries + 1): + message.getGroup(i, group) + md_type = group.getField(fix.MDEntryType()).getString() + md_price = group.getField(fix.MDEntryPx()).getString() + md_amount = group.getField(fix.MDEntrySize()).getString() + if not md_amount: + md_amount = 0 + order = {'price': float(md_price), 'amount': float(md_amount)} + if md_type == fix.MDEntryType_OFFER: + if 'asks' not in depth: + depth['asks'] = [] + depth['asks'].append(order) + if md_type == fix.MDEntryType_BID: + if 'bids' not in depth: + depth['bids'] = [] + depth['bids'].append(order) + print("Received an incremental market data update: %s" % (depth)) + +def main(): + sessionID = fix.SessionID('FIX.4.4', SENDERCOMPID, 'PAYMIUM') + + params = fix.Dictionary() + params.setString('ConnectionType', 'initiator') + params.setString('StartTime', '00:00:00') + params.setString('EndTime', '00:00:00') + params.setString('HeartBtInt', '30') + params.setString('CheckLatency', 'Y') + params.setString('SocketConnectHost', '195.154.171.115') + params.setString('SocketConnectPort', '8359') + params.setString('DataDictionary', FIX44FILE) + params.setString('EncryptMethod', '0') + + settings = fix.SessionSettings() + settings.set(sessionID, params) + + application = MyApplication() + factory = fix.FileStoreFactory("store") + acceptor = fix.SocketInitiator(application, factory, settings, fix.ScreenLogFactory(DEBUG, DEBUG, DEBUG)) + acceptor.start() + + time.sleep(2) + + mdr = fixMsg.MarketDataRequest() + mdr.setField(fix.MDReqID("MDRQ-%d" % (time.time() * 1000000))) + # We want the full book here, not just the top + mdr.setField(fix.MarketDepth(1)) + # We want to get a snapshot and also subscribe to the market depth updates + mdr.setField(fix.SubscriptionRequestType( + fix.SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES)) + # We'll want only incremental refreshes when new data is available + mdr.setField(fix.MDUpdateType(fix.MDUpdateType_INCREMENTAL_REFRESH)) + # Specify the currency + instruments = fixMsg.MarketDataRequest().NoRelatedSym() + instruments.setField(fix.Symbol("EUR/XBT")) + mdr.addGroup(instruments) + # Specify that we'll want the bids and asks + mdr.setField(fix.NoMDEntryTypes(2)) + group = fixMsg.MarketDataRequest().NoMDEntryTypes() + group.setField(fix.MDEntryType(fix.MDEntryType_BID)) + group.setField(fix.MDEntryType(fix.MDEntryType_OFFER)) + mdr.addGroup(group) + + fix.Session.sendToTarget(mdr, sessionID) + + while True: + time.sleep(10) + msg = fixMsg.Heartbeat() + fix.Session.sendToTarget(msg, sessionID) + + acceptor.stop() + +if __name__ == '__main__': + + main() From 4aa17dc926c504893ead68f72c99b6ebdb6a9209 Mon Sep 17 00:00:00 2001 From: davout Date: Fri, 7 Nov 2014 17:03:40 +0100 Subject: [PATCH 064/110] Removed useless heartbeat --- contrib/quickfixtest.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/contrib/quickfixtest.py b/contrib/quickfixtest.py index 8af637c5..87a56424 100644 --- a/contrib/quickfixtest.py +++ b/contrib/quickfixtest.py @@ -123,8 +123,6 @@ def main(): while True: time.sleep(10) - msg = fixMsg.Heartbeat() - fix.Session.sendToTarget(msg, sessionID) acceptor.stop() From d23bfb7f45be26c448704387d713c48955a60677 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Mon, 10 Nov 2014 16:26:43 +0100 Subject: [PATCH 065/110] Update FIX-4.4.md --- FIX-4.4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FIX-4.4.md b/FIX-4.4.md index 0d0b0efc..d69abbb3 100644 --- a/FIX-4.4.md +++ b/FIX-4.4.md @@ -4,7 +4,7 @@ ### NEW : Python example connector now avaible in the `contrib/` directory, kindly provided by one of our users -The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. **This API is currently in alpha-testing phase.** +The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. This API is currently in beta-testing phase. Do not hesitate to contact the support for any issues or suggestions. We're also available on IRC at Freenode on the #paymium channel, ring davout for assistance. From 92318b36dd3ec4e4126f9d3d767115f0e5a71c28 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 3 Dec 2014 16:13:42 +0100 Subject: [PATCH 066/110] Documentation update wrt Prestashop plugin --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53901f67..c38d57ac 100644 --- a/README.md +++ b/README.md @@ -1032,7 +1032,7 @@ The currently available plugins are available | Framework | Plugin URL | |----------------|----------------------------------------| -| PrestaShop 1.5 | https://github.com/Paymium/prestashop | +| PrestaShop 1.6 | https://github.com/Paymium/prestashop | | WooCommerce | https://github.com/Paymium/woocommerce | ## Appendix From 3e3bdcf06811d195d9abd0975dd48662e8b0d509 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 6 Jan 2015 12:45:18 +0100 Subject: [PATCH 067/110] Documentation update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c38d57ac..044ae04f 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,12 @@ The following scopes are available: | name | description | |----------------|-------------------------------------------------------------------------------------------| -| basic | Read account number, language, and balances (default) | +| basic | Read account number, language, and balances (default) | | activity | Read trade orders, deposits, withdrawals, and other operations | | trade | Create and cancel trade orders | | withdraw | Request EUR and BTC withdrawals (requires email confirmation from users upon withdrawing) | -| deposit | List bitcoin deposit addresses and create a new one if needed | +| deposit | List bitcoin deposit addresses and create a new one if needed | +| merchant | Create and manage an account's invoices | ### Token authentication From dd337b214d0325e297459c97e0c5b3d53db4f050 Mon Sep 17 00:00:00 2001 From: davout Date: Thu, 15 Jan 2015 15:27:38 +0100 Subject: [PATCH 068/110] Doc update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 044ae04f..2161f090 100644 --- a/README.md +++ b/README.md @@ -986,8 +986,8 @@ This endpoint returns the payment request as a JSON object given a payment UUID | merchant_name | Name of the merchant that is displayed to the customer | | expires_at | Expiration timestamp | | merchant_reference | Reference string associated to the payment | -| currency_amount | Amount associated to the payment | -| amount | BTC amount to pay | +| amount | Amount associated to the payment | +| btc_amount | BTC amount to pay | | payment_address | Payment address | | created_at | Creation timestamp | | updated_at | Last update timestamp | From b14863bcc80bba49cf709f3ce48f46a620e22013 Mon Sep 17 00:00:00 2001 From: davout Date: Mon, 26 Jan 2015 16:21:31 +0100 Subject: [PATCH 069/110] Update FIX docs --- FIX-4.4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FIX-4.4.md b/FIX-4.4.md index d69abbb3..61ffde8e 100644 --- a/FIX-4.4.md +++ b/FIX-4.4.md @@ -17,7 +17,7 @@ Do not hesitate to contact the support for any issues or suggestions. We're also # Using the FIX API ## Obtaining access -The API is not publicly available, you must request access to it through a support ticket. You will receive further instructions on how to establish a connection to our FIX acceptor. +Our FIX acceptor is available at fix.paymium.com on port 8359. ## Managing the session Once connected, your client is expected to issue a `Logon` message containing `PAYMIUM` as the `TARGET_COMP_ID`, a non-blank `Username` (553) field. Encryption is not supported, the `EncryptMethod` (98) field must be set to `0`. From 45141a53ff7c0aaacc8432871f64aedebb26bd66 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 31 Mar 2015 15:38:16 +0200 Subject: [PATCH 070/110] Added sandbox environment --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2161f090..13a1004f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) -**NEW: Check-out our FIX API for real-time market data ([documentation](https://github.com/Paymium/api-documentation/blob/master/FIX-4.4.md))** +**NEW: Our sandbox environment is now available, visit [sandbox.paymium.com](https://sandbox.paymium.com) (you may have to add a security exception for the SSL certificate to validate).** The Paymium API allows developers to extend the capabilities of the Paymium platform, from reading the latest ticker to automating trades with bots. @@ -36,6 +36,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Market depth](#market-depth) * [Bitcoin-Charts endpoints](#bitcoin-charts-endpoints) * [WebSocket](#websocket) + * [FIX streaming API](#fix-streaming-api) * [**User data**](#user-data) * [User info](#user-info) @@ -494,6 +495,11 @@ The example is available in the `examples/public_socket.js` directory of this re ``` +### FIX streaming API + +The FIX API is documented separately: [documentation](https://github.com/Paymium/api-documentation/blob/master/FIX-4.4.md). + + ## User data Before you can access your own data or other users data, you must register an application on Paymium: From c8f5bc3a314f590e3ea80bf461497f5d4026e088 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Tue, 9 Jun 2015 13:06:37 +0200 Subject: [PATCH 071/110] Incorrect method for invoice information method --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13a1004f..4a11cc89 100644 --- a/README.md +++ b/README.md @@ -976,7 +976,7 @@ This endpoint returns the payment request as a JSON object given a payment UUID | Method | Path | |--------|-------------------------------------| -| POST | /api/v1/merchant/get_payment/{UUID} | +| GET | /api/v1/merchant/get_payment/{UUID} | ##### Returned JSON object properties From 27ab990b779afcac5a69b73b78d983373e6308d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bouy=C3=A9?= Date: Thu, 9 Jul 2015 09:49:40 +0200 Subject: [PATCH 072/110] Start to add Email Transfer API endpoints --- README.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/README.md b/README.md index 4a11cc89..e1553861 100644 --- a/README.md +++ b/README.md @@ -826,6 +826,72 @@ Would return: See [order properties](#order-properties). +### Sending money + +Send money to an e-mail address. + +Executed strait away if the user have a valid account + +Sends an e-mail with a registration invitation if the user doesn't have avy account. + +The a new user have 30 days to register and validate his account. + +If the transfer has expired, the order will be cancelled + +#### Endpoint + +| method | path | authorization | +|--------|----------------------------|--------------------------| +| POST | /api/v1/user/orders | oauth2 (scope: send) | + +##### Payload + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| type | must be "EmailTransfer" | "EmailTransfer" | +| currency | currency code | "BTC" | +| amount | amount to transfer | 0.5 | +| email | an e-mail address | "user@example.com" | + +##### Example + +```bash +$ curl "https://paymium.com/api/v1/user/orders" \ + --header "Authorization: Bearer ACCESS_TOKEN" \ + -d "type=EmailTransfer" \ + -d "currency=BTC" \ + -d "amount=0.5" \ + -d "email=user@example.com" +``` + +Would return: + +```json +{ + "uuid": "9229fd6e-0aad-45d6-8090-a400f37a0129", + "amount": 0.5, + "state": "pending", + "btc_fee": 0.0, + "currency_fee": 0.0, + "updated_at": "2014-01-09T10:22:00.858Z", + "created_at": "2014-01-09T10:22:00.858Z", + "currency": "BTC", + "type": "EmailTransfer", + "account_operations": [ + { + "uuid": "4c4f4682-354f-46d1-a916-72d88d5584e3", + "name": "email_transfer", + "amount": -0.5, + "currency": "BTC", + "created_at": "2014-01-09T10:22:02.171Z", + "created_at_int": 1389262922, + "is_trading_account": false + } + ] +} +``` + + ### Canceling orders ##### Description From a279c9cf942a0b44a45a511c02e9136703280c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bouy=C3=A9?= Date: Mon, 10 Aug 2015 11:37:46 +0200 Subject: [PATCH 073/110] Add comments to email tranfers --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e1553861..df26bdb4 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Bitcoin-Charts endpoints](#bitcoin-charts-endpoints) * [WebSocket](#websocket) * [FIX streaming API](#fix-streaming-api) - + * [**User data**](#user-data) * [User info](#user-info) * [User activity](#user-activity) @@ -682,13 +682,13 @@ See [order properties](#order-properties). ##### Description -Create trade orders. +Create trade orders. Limit and market orders are supported, the `price` parameter must be omitted for market orders. -Either one of `amount` or `currency_amount` must be specified. When the `amount` is specified, the +Either one of `amount` or `currency_amount` must be specified. When the `amount` is specified, the engine will buy or sell this amount of Bitcoins. When the `currency_amount` is specified, the engine -will buy as much Bitcoins as possible for `currency_amount` or sell as much Bitcoins as necessary to +will buy as much Bitcoins as possible for `currency_amount` or sell as much Bitcoins as necessary to obtain `currency_amount`. @@ -834,9 +834,9 @@ Executed strait away if the user have a valid account Sends an e-mail with a registration invitation if the user doesn't have avy account. -The a new user have 30 days to register and validate his account. +The a new user have 1 month to register and validate his account. -If the transfer has expired, the order will be cancelled +If the transfer has expired, the order will be cancelled. #### Endpoint @@ -852,6 +852,7 @@ If the transfer has expired, the order will be cancelled | currency | currency code | "BTC" | | amount | amount to transfer | 0.5 | | email | an e-mail address | "user@example.com" | +| comment | a small note explaining the transfer | "Hi, refund for that thing" | ##### Example @@ -861,7 +862,8 @@ $ curl "https://paymium.com/api/v1/user/orders" \ -d "type=EmailTransfer" \ -d "currency=BTC" \ -d "amount=0.5" \ - -d "email=user@example.com" + -d "email=user@example.com" \ + -d "comment=Hi, refund for that thing" ``` Would return: @@ -938,7 +940,7 @@ $ curl "https://paymium.com/api/v1/user/addresses" \ { "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", "valid_until": 1402579836 - } + } ] ``` @@ -953,7 +955,7 @@ $ curl "https://paymium.com/api/v1/user/addresses/1PzU1ERAnHJmtU8J3qq3wwJhyLepwU { "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", "valid_until": 1402579836 -} +} ``` Create a new Bitcoin deposit address unless another one is already active. @@ -967,7 +969,7 @@ $ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses" \ { "address": "1PzU1ERAnHJmtU8J3qq3wwJhyLepwUYzHn", "valid_until": 1402579836 -} +} ``` ## Merchant API @@ -1030,7 +1032,7 @@ When the notification is made a `POST` request is made to the callback URL, it c The merchant should ensure the callback is legitimate by requesting confirmation from the Paymium API for the invoice data. -**Note :** The callback notifications are not guaranteed to be unique, it must have idempotent results on the merchant side if the payment has not actually changed. +**Note :** The callback notifications are not guaranteed to be unique, it must have idempotent results on the merchant side if the payment has not actually changed. ### Get payment information @@ -1209,9 +1211,9 @@ The [`AutoRefreshToken`](https://gist.github.com/davout/edb4db0315dc417fa78d) cl require 'oauth2' client = OAuth2::Client.new('6fcf1c32f6e14cd773a7a6640832bdbf83a5b2b8d4382e839c6aff83a8f1bb3b', '55554ecad5627f0465034c4a116e59a38d9c3ab272487a18404078ccc0b64798', site: 'https://paymium.com', authorize_url: '/api/oauth/authorize', token_url: '/api/oauth/token') - + client.auth_code.authorize_url(redirect_uri: 'https://paymium.com/page/oauth/test', scope: 'basic activity trade withdraw') - => "https://staging.paymium.com/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.paymium.com%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" + => "https://staging.paymium.com/api/oauth/authorize?response_type=code&client_id=71a28131e16a0d6756a41aa391f1aa28b2f5a2ed4a6b911cf2bf640c8a0cc2cd&redirect_uri=https%3A%2F%2Fstaging.paymium.com%2Fpage%2Foauth%2Ftest&scope=basic+activity+trade+withdraw" # Visit this URL in your browser, approve the request and copy the authorization code From bad976d79ce48a3a7893abc053c80a5e218a443b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bouy=C3=A9?= Date: Mon, 10 Aug 2015 12:03:56 +0200 Subject: [PATCH 074/110] Update email transfer documentation --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index df26bdb4..d6176414 100644 --- a/README.md +++ b/README.md @@ -828,15 +828,13 @@ See [order properties](#order-properties). ### Sending money -Send money to an e-mail address. - -Executed strait away if the user have a valid account +##### Description -Sends an e-mail with a registration invitation if the user doesn't have avy account. +Initiate a money transfer to an e-mail address. -The a new user have 1 month to register and validate his account. +The transfer is immediately executed if the user have a valid account. Otherwise, an e-mail is sent with a registration invitation. -If the transfer has expired, the order will be cancelled. +This transfer expire after 1 month if it is not collected. In this case, the order is cancelled and the sender re-credited. #### Endpoint @@ -898,7 +896,7 @@ Would return: ##### Description -Cancel an order. Only active trade orders may be canceled. +Cancel an order. Only active trade orders and email tranfers may be canceled. ##### Endpoint From 63ed0719eda76447caf780d2c7d7e569d65a68e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bouy=C3=A9?= Date: Mon, 10 Aug 2015 12:10:16 +0200 Subject: [PATCH 075/110] Update table of contents --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d6176414..056667c4 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Order details](#order-details) * [Trading](#trading) * [Withdrawing](#withdrawing) + * [Sending money](#sending-money) * [Canceling orders](#canceling-orders) * [Bitcoin addresses](#bitcoin-addresses) From 729495756828cbf2ff29498ec091fa0b9d349c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bouy=C3=A9?= Date: Mon, 10 Aug 2015 14:16:26 +0200 Subject: [PATCH 076/110] Add email transfer specitic properties and states --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 056667c4..7b1470a0 100644 --- a/README.md +++ b/README.md @@ -1130,6 +1130,7 @@ Orders can have the following types: | BitcoinDeposit | BTC deposit | | LimitOrder | limit trade order | | Transfer | BTC or fiat transfer or withdraw | +| EmailTransfer | BTC or fiat transfer by e-mail | | AdminOrder | special order executed by an admin | ### Order properties @@ -1163,6 +1164,13 @@ Each type may have additional properties as described below. | traded_currency | currency exchanged | 310.0 | | traded_btc | BTC echanged | 0.5 | +##### EmailTransfer specific properties + +| name | description | example value | +|--------------------|-----------------------------------------|----------------------------------------| +| email_address | email address of the receiver | "user@example.com" | + + ### Order states | name | description | @@ -1176,6 +1184,16 @@ Each type may have additional properties as described below. | executed | order has been executed | | canceled | order has been canceled | +### Email Transfer states + +| Name | Description | +|--------------------|----------------------------------------------------------------------------------------| +| pending | Email Transfer is pending the email confirmation | +| pending_collection | Email Transfer queued and pending for the receiver registration and profile completion | +| executed | Email Transfer has been executed | +| expired | Email Transfer has expired | +| canceled | Email Transfer has been canceled | + ### Payment states | Name | Description | From 8c0b2661743b074d867fb5d8b2ee5216c7fe0c72 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Mon, 7 Sep 2015 10:57:54 +0200 Subject: [PATCH 077/110] Correct curl example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b1470a0..88f55fe0 100644 --- a/README.md +++ b/README.md @@ -909,7 +909,7 @@ Cancel an order. Only active trade orders and email tranfers may be canceled. ```bash $ curl "https://paymium.com/api/v1/user/orders/968f4580-e26c-4ad8-8bcd-874d23d55296" \ - --header "Authorization: Bearer ACCESS_TOKEN" + -X DELETE --header "Authorization: Bearer ACCESS_TOKEN" ``` ### Bitcoin addresses From e6760d8452fa1e82bef2040a5a6200133fbbe7ba Mon Sep 17 00:00:00 2001 From: Cyril Wack Date: Fri, 25 Sep 2015 10:24:39 +0200 Subject: [PATCH 078/110] remove trailing white spaces :scissors: --- FIX-4.4.md | 2 +- examples/node.js/index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FIX-4.4.md b/FIX-4.4.md index 61ffde8e..8b46833d 100644 --- a/FIX-4.4.md +++ b/FIX-4.4.md @@ -13,7 +13,7 @@ Do not hesitate to contact the support for any issues or suggestions. We're also ## On the roadmap - Ability to place orders and receive execution reports - + # Using the FIX API ## Obtaining access diff --git a/examples/node.js/index.js b/examples/node.js/index.js index 6559f23a..345dd221 100755 --- a/examples/node.js/index.js +++ b/examples/node.js/index.js @@ -184,7 +184,7 @@ function addApiCommand(cmd, path, options, cb) { pathStr = path(input, args); if (!pathStr) { - return cli.interact('> '); + return cli.interact('> '); } } @@ -223,7 +223,7 @@ function addApiCommand(cmd, path, options, cb) { if (resp.statusCode === 422) { cli.stream.print(JSON.parse(body).errors); return cli.interact('> '); - } + } var data = {}; From 0e0e475a43e91a09a72d0b226454bd2e4c52f87f Mon Sep 17 00:00:00 2001 From: Cyril Wack Date: Fri, 25 Sep 2015 12:32:46 +0200 Subject: [PATCH 079/110] add payment-request-by-email's documentation --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index 88f55fe0..528e3049 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Trading](#trading) * [Withdrawing](#withdrawing) * [Sending money](#sending-money) + * [Receiving money](#receiving-money) * [Canceling orders](#canceling-orders) * [Bitcoin addresses](#bitcoin-addresses) @@ -892,6 +893,45 @@ Would return: } ``` +### Receiving money + +##### Description + +Allow to send a payment request by email to an e-mail address. + +Thus, by following the link in the sent email, the related invoice is displayed. + +#### Endpoint + +| method | path | authorization | +|--------|-------------------------------|-------------------------| +| POST | /api/v1/user/payment_requests | oauth2 (scope: receive) | + +##### Payload + +| name | description | example value | +|-------------- |-----------------------------------------|-----------------------------| +| type | must be "PaymentRequest" | "PaymentRequest" | +| currency | currency code | "BTC" | +| amount | amount to transfer | 0.5 | +| email | an e-mail address | "user@example.com" | +| payment_split | Percentage of the payment the _merchant_ will get in `currency` expressed as a two-decimal places float between 0 and 1 (required) | 1.0 | +| label | a small note explaining the transfer | "Hi, refund for that thing" | + +##### Example + +```bash +$ curl "https://paymium.com/api/v1/user/payment_requests" \ + --header "Authorization: Bearer ACCESS_TOKEN" \ + -d "type=PaymentRequest" \ + -d "currency=BTC" \ + -d "amount=0.5" \ + -d "email=user@example.com" \ + -d "payment_split=1" \ + -d "label=Hi, refund for that thing" +``` + +If successful, responds `HTTP/1.1 204 No Content`. ### Canceling orders From b3e673ba1c102711de75b9a0d3ebb4b1b75c89de Mon Sep 17 00:00:00 2001 From: Cyril Wack Date: Tue, 29 Sep 2015 16:44:12 +0200 Subject: [PATCH 080/110] rename label into comment to keep things consistent --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 528e3049..a71a8737 100644 --- a/README.md +++ b/README.md @@ -916,7 +916,7 @@ Thus, by following the link in the sent email, the related invoice is displayed. | amount | amount to transfer | 0.5 | | email | an e-mail address | "user@example.com" | | payment_split | Percentage of the payment the _merchant_ will get in `currency` expressed as a two-decimal places float between 0 and 1 (required) | 1.0 | -| label | a small note explaining the transfer | "Hi, refund for that thing" | +| comment | a small note explaining the transfer | "Hi, refund for that thing" | ##### Example @@ -928,7 +928,7 @@ $ curl "https://paymium.com/api/v1/user/payment_requests" \ -d "amount=0.5" \ -d "email=user@example.com" \ -d "payment_split=1" \ - -d "label=Hi, refund for that thing" + -d "comment=Hi, refund for that thing" ``` If successful, responds `HTTP/1.1 204 No Content`. From 5b83205bddf001b617bbd48a090929a5c409ef91 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 20 Oct 2015 15:36:07 +0200 Subject: [PATCH 081/110] Document websockets --- README.md | 11 ++-- WEBSOCKETS.md | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 WEBSOCKETS.md diff --git a/README.md b/README.md index a71a8737..a1f56455 100644 --- a/README.md +++ b/README.md @@ -455,14 +455,9 @@ The socket.io socket will emit a `stream` event when new data is available. The Socket.io must connect to `https://paymium.com/public` and the `resource` option must be set to `ws/socket.io`. -#### Stream properties - -| name | description | -|-----------------|-------------------------------------------------------------------------------| -| ticker | object containing updated ticker data | -| trades | array of newly executed trades | -| bids | array of new or updated bids (a bid is considered gone if amount is null) | -| asks | array of new or updated asks (an ask is considered gone if amount is null) | +#### Message descriptions + +The Websocket messages are documented separately: [documentation](https://github.com/Paymium/api-documentation/blob/master/WEBSOCKETS.md). #### Node.js example diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md new file mode 100644 index 00000000..306a433a --- /dev/null +++ b/WEBSOCKETS.md @@ -0,0 +1,139 @@ +# WebSocket API + +## Private messages (user details, payment updates) + +### Channel subscription + +These messages are broadcast on specific channels, and not publicly. Knowledge of the channel identifier is required in order to subscribe to these messages. + +There are two types of channels: + * User channels: they broadcast messages relevant to a particular user + * Payment channels: they broadcast messages relevant to a specific payment + +Clients will typically subscribe to the relevant user channel if authenticated, and to every payment-specific channel of interest to them. + +The user channel ID is returned in the "channel" key in response to sign-in POSTs or user GETs. The payment channel ID is the payment's UUID, as returned by the REST API calls. + +All the messages in the "Private messages" section are sent on user channels, with the exception of payment updates, which are sent on the specific payment's channel. + + +### Balance changes + +These messages are emitted when an account balance is updated, when the updated balance is the locked for trading balance, the "trading" key is set to true. + +**Message structure** +````json +{ + "event": "balance", + "payload": { + "balance": , + "currency": <"EUR"|"BTC">, + "trading": +} +```` + + +### Order update/creation + +Emitted whenever an order is persisted. See the REST API documentation for details on order serialization. + +**Message structure** +````json +{ + "event": "order", + "payload": +} +```` + +### Text notification + +Emitted whenever a text notification is issued to the user. + +**Message structure** +````json +{ + "event": "notice", + "payload": { + "message": + } +} +```` + +### User state update + +Emitted whenever the user state is updated (for example due to KYC steps being completed). See the REST API documentation for details on the different possible states. + +**Message structure** +````json +{ + "event": "state", + "payload": { + "state": + } +} +```` + +### Payments updates + +Emitted whenever a payment is updated. See the REST API documentation for details on payment serialization. These messages are only emitted on the specific payment channels. + +**Message structure** +````json +{ + "event": "payment", + "payload": +} +```` + + +## Public messages + +These messages are publicly broadcast, each type is broadcast on a separate channel and requires a separate subscribtion. + +### Trades + +These messages are broadcast on the "trade" channel. + +**Message structure** +````json +{ + "event": "new-trade", + "payload": { + "price": , + "traded_btc": , + "timestamp": , + "currency": "EUR" + } +} +```` + + +### Ticker updates + +These messages are broadcast on the "ticker" channel. + +**Message structure** +````json +{ + "event": "tick", + "payload": +} +```` + +### Market depth updates + +These messages are broadcast on the "market-depth" channel. + +**Message structure** +````json +{ + "event": "update-market-depth", + "payload": { + "category": <"buy"|"sell">, + "timestamp": , + "amount": + "price": , + "currency": "EUR" + } +} +```` From 0b3a5980e9e379ef65988e0bb5715d424e25413b Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 20 Oct 2015 15:39:49 +0200 Subject: [PATCH 082/110] JSON validity --- WEBSOCKETS.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 306a433a..a4add456 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -26,9 +26,9 @@ These messages are emitted when an account balance is updated, when the updated { "event": "balance", "payload": { - "balance": , - "currency": <"EUR"|"BTC">, - "trading": + "balance": 10.0, + "currency": "", + "trading": "" } ```` @@ -41,7 +41,7 @@ Emitted whenever an order is persisted. See the REST API documentation for detai ````json { "event": "order", - "payload": + "payload": "" } ```` @@ -54,7 +54,7 @@ Emitted whenever a text notification is issued to the user. { "event": "notice", "payload": { - "message": + "message": "" } } ```` @@ -68,7 +68,7 @@ Emitted whenever the user state is updated (for example due to KYC steps being c { "event": "state", "payload": { - "state": + "state": "" } } ```` @@ -81,7 +81,7 @@ Emitted whenever a payment is updated. See the REST API documentation for detail ````json { "event": "payment", - "payload": + "payload": "" } ```` @@ -92,16 +92,16 @@ These messages are publicly broadcast, each type is broadcast on a separate chan ### Trades -These messages are broadcast on the "trade" channel. +These messages are broadcast on the "trade" channel. Its timestamp is expressed in milliseconds. **Message structure** ````json { "event": "new-trade", "payload": { - "price": , - "traded_btc": , - "timestamp": , + "price": 201.28, + "traded_btc": 12.4, + "timestamp": 1445348298584, "currency": "EUR" } } @@ -129,10 +129,10 @@ These messages are broadcast on the "market-depth" channel. { "event": "update-market-depth", "payload": { - "category": <"buy"|"sell">, - "timestamp": , - "amount": - "price": , + "category": "", + "timestamp": 1445348298, + "amount": 4.8, + "price": 201.87, "currency": "EUR" } } From a6f601b88a092136b9e1931adeb42e37a5a26c93 Mon Sep 17 00:00:00 2001 From: davout Date: Tue, 20 Oct 2015 15:40:39 +0200 Subject: [PATCH 083/110] JSON validity --- WEBSOCKETS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index a4add456..d98b268b 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -116,7 +116,7 @@ These messages are broadcast on the "ticker" channel. ````json { "event": "tick", - "payload": + "payload": "" } ```` From b7c48576b24b6ee1f30dd107c064b51fe8f37c2c Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Wed, 21 Oct 2015 10:14:59 +0200 Subject: [PATCH 084/110] Update public socket doc --- README.md | 35 +++++++++++++------------- examples/public_socket.js/client.js | 4 +-- examples/public_socket.js/package.json | 2 +- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a1f56455..ec9844a2 100644 --- a/README.md +++ b/README.md @@ -461,35 +461,34 @@ The Websocket messages are documented separately: [documentation](https://github #### Node.js example -Assuming you have node.js installed, you can install the socket.io client library by running `npm install socket.io-client@0.9`. +Assuming you have node.js installed, you can install the socket.io client library by running `npm install socket.io-client`. The code below shows how to connect to the Paymium socket, and outputs any received data to the console. The example is available in the `examples/public_socket.js` directory of this repository. ```javascript - var io = require('socket.io-client'); +var io = require('socket.io-client'); - socket = io.connect('https://paymium.com/public', { - resource: 'ws/socket.io' - }); +var socket = io.connect('paymium.com/public', { + path: '/ws/socket.io' +}); - console.log('CONNECTING'); +console.log('CONNECTING'); - socket.on('connect', function() { - console.log('CONNECTED'); - console.log('WAITING FOR DATA...'); - }); +socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); +}); - socket.on('disconnect', function() { - console.log('DISCONNECTED'); - }); - - socket.on('stream', function(data) { - console.log('GOT DATA:'); - console.log(data); - }); +socket.on('disconnect', function() { + console.log('DISCONNECTED'); +}); +socket.on('stream', function(data) { + console.log('GOT DATA:'); + console.log(data); +}); ``` ### FIX streaming API diff --git a/examples/public_socket.js/client.js b/examples/public_socket.js/client.js index 04dfe488..26a81c09 100644 --- a/examples/public_socket.js/client.js +++ b/examples/public_socket.js/client.js @@ -1,7 +1,7 @@ var io = require('socket.io-client'); -socket = io.connect('https://paymium.com/public', { - resource: 'ws/socket.io' +var socket = io.connect('paymium.com/public', { + path: '/ws/socket.io' }); console.log('CONNECTING'); diff --git a/examples/public_socket.js/package.json b/examples/public_socket.js/package.json index 389c4a05..6f25df7a 100644 --- a/examples/public_socket.js/package.json +++ b/examples/public_socket.js/package.json @@ -9,6 +9,6 @@ "author": "Paymium", "license": "MIT", "dependencies": { - "socket.io-client": "^0.9.16" + "socket.io-client": "1.3.x" } } From b36d73c7fee365a8574ef2c561988333915c2899 Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Wed, 21 Oct 2015 10:20:38 +0200 Subject: [PATCH 085/110] Private socket example --- WEBSOCKETS.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index d98b268b..084788a3 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -137,3 +137,32 @@ These messages are broadcast on the "market-depth" channel. } } ```` + +### Example + +```javascript +var io = require('socket.io-client'); + +var socket = io.connect('paymium.com/user', { + path: '/ws/socket.io' +}); + +console.log('CONNECTING'); + +socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); +}); + +// Replace USER_CHANNEL_ID with the channel id of the user +socket.emit('channel', 'USER_CHANNEL_ID'); + +socket.on('disconnect', function() { + console.log('DISCONNECTED'); +}); + +socket.on('stream', function(data) { + console.log('GOT DATA:'); + console.log(data); +}); +``` From 0565d5429254ff8412d8c4d4ef49b02d8bc4536e Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Wed, 21 Oct 2015 10:22:36 +0200 Subject: [PATCH 086/110] Update socket configuration doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec9844a2..039a4a1c 100644 --- a/README.md +++ b/README.md @@ -453,7 +453,7 @@ The socket.io socket will emit a `stream` event when new data is available. The #### Socket.io configuration -Socket.io must connect to `https://paymium.com/public` and the `resource` option must be set to `ws/socket.io`. +Socket.io must connect to `paymium.com/` and the `path` option must be set to `/ws/socket.io`. #### Message descriptions From 0fe50784a738852094fdbda04d242865a6c4af48 Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Wed, 21 Oct 2015 10:33:43 +0200 Subject: [PATCH 087/110] Public and user socket examples --- WEBSOCKETS.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 084788a3..39203d0f 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -140,6 +140,34 @@ These messages are broadcast on the "market-depth" channel. ### Example +#### Public socket + +```javascript +var io = require('socket.io-client'); + +var socket = io.connect('paymium.com/public', { + path: '/ws/socket.io' +}); + +console.log('CONNECTING'); + +socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); +}); + +socket.on('disconnect', function() { + console.log('DISCONNECTED'); +}); + +socket.on('stream', function(data) { + console.log('GOT DATA:'); + console.log(data); +}); +``` + +#### User socket + ```javascript var io = require('socket.io-client'); From ddc797a6be5e8d114e6ee9c6732b6d7ec1ac9be0 Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Wed, 21 Oct 2015 10:36:21 +0200 Subject: [PATCH 088/110] notice event is public, not per user --- WEBSOCKETS.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 39203d0f..8259b833 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -45,20 +45,6 @@ Emitted whenever an order is persisted. See the REST API documentation for detai } ```` -### Text notification - -Emitted whenever a text notification is issued to the user. - -**Message structure** -````json -{ - "event": "notice", - "payload": { - "message": "" - } -} -```` - ### User state update Emitted whenever the user state is updated (for example due to KYC steps being completed). See the REST API documentation for details on the different possible states. @@ -138,6 +124,20 @@ These messages are broadcast on the "market-depth" channel. } ```` +### Text notification + +Emitted whenever a text notification is issued to all users. + +**Message structure** +````json +{ + "event": "notice", + "payload": { + "message": "" + } +} +```` + ### Example #### Public socket From 0201b0874f1d128bd5f340a78360725a149dcc37 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 21 Oct 2015 10:48:13 +0200 Subject: [PATCH 089/110] WebSockets --- WEBSOCKETS.md | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 8259b833..b7b4808a 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -1,6 +1,24 @@ # WebSocket API -## Private messages (user details, payment updates) +* [Private messages](#private_messages) + * [Channel subscription](#channel_subscribtion) + * [Balance changes](#balance_changes) + * [Order update & creation](#order_update_creation) + * [User state update](#user_state_update) + * [Payments updates](#payments_updates) + +* [Public messages](#public_messages) + * [Trades](#trades) + * [Ticker updates](#ticker_updates) + * [Market depth updates](#market_depth_updates) + * [Text notifications](#text_notifications) + +* [Connection examples](#connection_examples) + * [Public socket](#public_socket) + * [User socket](#user_socket) + + +## Private messages ### Channel subscription @@ -33,7 +51,7 @@ These messages are emitted when an account balance is updated, when the updated ```` -### Order update/creation +### Order update & creation Emitted whenever an order is persisted. See the REST API documentation for details on order serialization. @@ -124,7 +142,7 @@ These messages are broadcast on the "market-depth" channel. } ```` -### Text notification +### Text notifications Emitted whenever a text notification is issued to all users. @@ -138,9 +156,9 @@ Emitted whenever a text notification is issued to all users. } ```` -### Example +## Connection examples -#### Public socket +### Public socket ```javascript var io = require('socket.io-client'); @@ -166,7 +184,7 @@ socket.on('stream', function(data) { }); ``` -#### User socket +### User socket ```javascript var io = require('socket.io-client'); From f49294ad005e05040425406992800b605d0a6681 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 21 Oct 2015 10:49:25 +0200 Subject: [PATCH 090/110] WebSockets --- WEBSOCKETS.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index b7b4808a..5c6e22ca 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -1,23 +1,23 @@ # WebSocket API -* [Private messages](#private_messages) - * [Channel subscription](#channel_subscribtion) - * [Balance changes](#balance_changes) - * [Order update & creation](#order_update_creation) - * [User state update](#user_state_update) - * [Payments updates](#payments_updates) - -* [Public messages](#public_messages) +* [Private messages](#private-messages) + * [Channel subscription](#channel-subscribtion) + * [Balance changes](#balance-changes) + * [Order update & creation](#order-update-creation) + * [User state update](#user-state-update) + * [Payments updates](#payments-updates) + +* [Public messages](#public-messages) * [Trades](#trades) - * [Ticker updates](#ticker_updates) - * [Market depth updates](#market_depth_updates) - * [Text notifications](#text_notifications) - -* [Connection examples](#connection_examples) - * [Public socket](#public_socket) - * [User socket](#user_socket) - - + * [Ticker updates](#ticker-updates) + * [Market depth updates](#market-depth-updates) + * [Text notifications](#text-notifications) + +* [Connection examples](#connection-examples) + * [Public socket](#public-socket) + * [User socket](#user-socket) + + ## Private messages ### Channel subscription From 656baed5a3c154c5c2789ef7e21e09449b83045c Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 21 Oct 2015 10:51:00 +0200 Subject: [PATCH 091/110] WebSockets --- WEBSOCKETS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 5c6e22ca..2079856a 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -1,9 +1,9 @@ # WebSocket API * [Private messages](#private-messages) - * [Channel subscription](#channel-subscribtion) + * [Channel subscribtion](#channel-subscribtion) * [Balance changes](#balance-changes) - * [Order update & creation](#order-update-creation) + * [Order update & creation](#order-update--creation) * [User state update](#user-state-update) * [Payments updates](#payments-updates) @@ -20,7 +20,7 @@ ## Private messages -### Channel subscription +### Channel subscribtion These messages are broadcast on specific channels, and not publicly. Knowledge of the channel identifier is required in order to subscribe to these messages. From 62b836fdb5a18ab2641503025fffc57bbb215355 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 21 Oct 2015 12:10:39 +0200 Subject: [PATCH 092/110] Rephrase --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 039a4a1c..c29360cc 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Trading](#trading) * [Withdrawing](#withdrawing) * [Sending money](#sending-money) - * [Receiving money](#receiving-money) + * [Requesting money by e-mail](#requesting-money-by-e-mail) * [Canceling orders](#canceling-orders) * [Bitcoin addresses](#bitcoin-addresses) @@ -887,13 +887,14 @@ Would return: } ``` -### Receiving money +### Receiving money by e-mail ##### Description -Allow to send a payment request by email to an e-mail address. +This functionality allows one to create a payment request that is sent by e-mail to the designated recipient, when the link contained in the e-mail is clicked, +the recipient is presented with a Bitcoin address to which he is instructed to direct his payment. -Thus, by following the link in the sent email, the related invoice is displayed. +Once the Bitcoin payment is confirmed, the payee is credited in the originally requested currency. #### Endpoint From 4a84221b226c143b251b4f1867548c6a03115a55 Mon Sep 17 00:00:00 2001 From: davout Date: Wed, 21 Oct 2015 12:11:21 +0200 Subject: [PATCH 093/110] Rephrase --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c29360cc..e6cbae49 100644 --- a/README.md +++ b/README.md @@ -887,7 +887,7 @@ Would return: } ``` -### Receiving money by e-mail +### Requesting money by e-mail ##### Description From 12a03c6cd422453766c7b59a6a58d11c1a5b5f8b Mon Sep 17 00:00:00 2001 From: davout Date: Fri, 23 Oct 2015 16:28:28 +0200 Subject: [PATCH 094/110] Price alerts --- README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e6cbae49..ffd1a24d 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Formats and required HTTP request headers](#formats-and-required-http-request-headers) * [Localization](#localization) * [Error handling](#error-handling) - * [Successful calls](#sucessful-calls) + * [Successful calls](#successful-calls) * [Rate-limiting](#rate-limiting) * [**Authentication**](#authentication) @@ -48,6 +48,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Requesting money by e-mail](#requesting-money-by-e-mail) * [Canceling orders](#canceling-orders) * [Bitcoin addresses](#bitcoin-addresses) + * [Price alerts](#price-alerts) * [**Merchant API**](#merchant-api) * [Payment creation](#payment-creation) @@ -926,7 +927,7 @@ $ curl "https://paymium.com/api/v1/user/payment_requests" \ -d "comment=Hi, refund for that thing" ``` -If successful, responds `HTTP/1.1 204 No Content`. +If successful, responds with a `HTTP/1.1 201 Created` status code. ### Canceling orders @@ -960,7 +961,7 @@ List and create bitcoin deposit addresses | GET | /api/v1/user/addresses/:btc_address | oauth2 (scope: deposit) | | POST | /api/v1/user/addresses | oauth2 (scope: deposit) | -##### Exampleis +##### Examples Retrieve your Bitcoin deposit addresses along with their expiration timestamp. @@ -1006,6 +1007,55 @@ $ curl -X POST "https://bitcoin-central.net/api/v1/user/addresses" \ } ``` +### Price alerts + +##### Description + +Register a mobile device for alerts on price movements. + +##### Endpoint + +| method | path | authorization | +|--------|-------------------------------------|--------------------------| +| GET | /api/v1/user/price_alerts | oauth2 (scope: activity) | +| POST | /api/v1/user/price_alerts | oauth2 (scope: activity) | +| DELETE | /api/v1/user/price_alerts/:id | oauth2 (scope: activity) | + +##### Examples + +Retrieve currently active price alerts. + +```bash +$ curl "https://paymium.com/api/v1/user/price_alerts" \ + --header "Authorization: Bearer ACCESS_TOKEN" +``` + +```json +[ + { + "id": 42, + "token": "0ff2f39d-cd9f-4710-9eb5-3f8385f5e059", + "notify_above": 220.5, + "notify_below": 180.0, + "last_sent_at": 1445610041 + } +] +``` + +Create a new price alert. + +```bash +$ curl "https://paymium.com/api/v1/user/price_alerts" \ + -X POST \ + --header "Authorization: Bearer ACCESS_TOKEN" \ + -d "token=0ff2f39d-cd9f-4710-9eb5-3f8385f5e059" \ + -d "notify_below=100" \ + -d "notify_above=110" \ +``` + +If successful, it responds with a `HTTP/1.1 201 Created` status code. + + ## Merchant API The Merchant API enables merchants to securely sell goods and services and get paid in Bitcoin. The API makes it possible for the merchant to completely eliminate the risk of market fluctuations when requesting to receive fiat currency in their account. It is also possible to keep a part of the payment in Bitcoin without having it converted at a guaranteed rate. From fc590b7d6ae7a487a008db48387c3592e834a7e6 Mon Sep 17 00:00:00 2001 From: Stephan Florquin Date: Mon, 2 Nov 2015 13:06:17 +0100 Subject: [PATCH 095/110] Update websockets doc --- WEBSOCKETS.md | 348 +++++++++++++++++++++++++++++--------------------- 1 file changed, 204 insertions(+), 144 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 2079856a..04ac4adb 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -1,169 +1,173 @@ # WebSocket API -* [Private messages](#private-messages) - * [Channel subscribtion](#channel-subscribtion) - * [Balance changes](#balance-changes) - * [Order update & creation](#order-update--creation) - * [User state update](#user-state-update) - * [Payments updates](#payments-updates) +* [Public socket](#public-socket) + * [Subscribing](#subscribing) + * [NodeJS example](#nodejs-example) + * [Public Data](#public-data) + * [publicData.ticker](#publicdataticker) + * [publicData.trades](#publicdatatrades) + * [publicData.bids](#publicdatabids) + * [publicData.asks](#publicdataasks) +* [User socket](#user-socket) + * [Subscribing](#subscribing-1) + * [NodeJS example](#nodejs-example-1) + * [User Data](#user-data) + * [userData.balance_eur](#userdatabalance_eur) + * [userData.locked_eur](#userdatalocked_eur) + * [userData.balance_btc](#userdatabalance_btc) + * [userData.locked_btc](#userdatalocked_btc) + * [userData.orders](#userdataorders) + +Websockets are implemented using **socket.io v1.3**. + +## Public socket + +### Subscribing + +You must connect your socket.io client to `paymium.com/public`, setting the path +option to `/ws/socket.io`. When new data is available, a `stream` event is +triggered. + +### NodeJS example -* [Public messages](#public-messages) - * [Trades](#trades) - * [Ticker updates](#ticker-updates) - * [Market depth updates](#market-depth-updates) - * [Text notifications](#text-notifications) - -* [Connection examples](#connection-examples) - * [Public socket](#public-socket) - * [User socket](#user-socket) - - -## Private messages - -### Channel subscribtion - -These messages are broadcast on specific channels, and not publicly. Knowledge of the channel identifier is required in order to subscribe to these messages. - -There are two types of channels: - * User channels: they broadcast messages relevant to a particular user - * Payment channels: they broadcast messages relevant to a specific payment - -Clients will typically subscribe to the relevant user channel if authenticated, and to every payment-specific channel of interest to them. - -The user channel ID is returned in the "channel" key in response to sign-in POSTs or user GETs. The payment channel ID is the payment's UUID, as returned by the REST API calls. - -All the messages in the "Private messages" section are sent on user channels, with the exception of payment updates, which are sent on the specific payment's channel. +```javascript +var io = require('socket.io-client'); +var socket = io.connect('paymium.com/public', { + path: '/ws/socket.io' +}); -### Balance changes +console.log('CONNECTING'); -These messages are emitted when an account balance is updated, when the updated balance is the locked for trading balance, the "trading" key is set to true. +socket.on('connect', function() { + console.log('CONNECTED'); + console.log('WAITING FOR DATA...'); +}); -**Message structure** -````json -{ - "event": "balance", - "payload": { - "balance": 10.0, - "currency": "", - "trading": "" -} -```` +socket.on('disconnect', function() { + console.log('DISCONNECTED'); +}); +socket.on('stream', function(publicData) { + console.log('GOT DATA:'); + console.log(publicData); +}); +``` -### Order update & creation +### Public data -Emitted whenever an order is persisted. See the REST API documentation for details on order serialization. +The `stream` event will emit an object when new data is available. The object +will have properties **only for the data that changed**. -**Message structure** -````json -{ - "event": "order", - "payload": "" -} -```` +#### publicData.ticker -### User state update +If the ticker changed, `publicData.ticker` will contains the new ticker +information. -Emitted whenever the user state is updated (for example due to KYC steps being completed). See the REST API documentation for details on the different possible states. +Example: -**Message structure** -````json +```javascript { - "event": "state", - "payload": { - "state": "" + ticker: { + high: 275, + low: 275, + volume: 0.10909089, + bid: 205, + ask: 275, + midpoint: 240, + vwap: 275, + at: 1446464202, + price: 275, + open: 270, + variation: 1.8519, + currency: 'EUR', + trade_id: '460aff60-8fff-4fb0-8be5-2f8dc67758c2', + size: 0.03636363 } } -```` - -### Payments updates - -Emitted whenever a payment is updated. See the REST API documentation for details on payment serialization. These messages are only emitted on the specific payment channels. - -**Message structure** -````json -{ - "event": "payment", - "payload": "" -} -```` - - -## Public messages +``` -These messages are publicly broadcast, each type is broadcast on a separate channel and requires a separate subscribtion. +#### publicData.trades -### Trades +If new trades are executed, `publicData.trades` will be an array containing the +new trades. -These messages are broadcast on the "trade" channel. Its timestamp is expressed in milliseconds. +Example: -**Message structure** -````json +```javascript { - "event": "new-trade", - "payload": { - "price": 201.28, - "traded_btc": 12.4, - "timestamp": 1445348298584, - "currency": "EUR" - } + trades: [ + { + price: 275, + traded_btc: 0.03636363, + timestamp: 1446464202000, + currency: 'EUR' + } + ] } -```` +``` +#### publicData.bids -### Ticker updates +If buy orders have changed (created, changed, or deleted), `publicData.bids` +will be an array containing the modified orders. Orders are aggregated by price. +If `amount` is `0`, there are no more orders at this price. -These messages are broadcast on the "ticker" channel. +Example: -**Message structure** -````json +```javascript { - "event": "tick", - "payload": "" + bids: [ + { + timestamp: 1424208720, + amount: 17.43992373, + price: 265, + currency: 'EUR', + category: 'buy' + } + ] } -```` +``` + +#### publicData.asks -### Market depth updates +If sell orders have changed (created, changed, or deleted), `publicData.asks` +will be an array containing the modified orders. Orders are aggregated by price. +If `amount` is `0`, there are no more orders at this price. -These messages are broadcast on the "market-depth" channel. +Example: -**Message structure** -````json +```javascript { - "event": "update-market-depth", - "payload": { - "category": "", - "timestamp": 1445348298, - "amount": 4.8, - "price": 201.87, - "currency": "EUR" - } + asks: [ + { + timestamp: 1424208720, + amount: 17.43992373, + price: 275, + currency: 'EUR', + category: 'sell' + } + ] } -```` +``` -### Text notifications +## User socket -Emitted whenever a text notification is issued to all users. +### Subscribing -**Message structure** -````json -{ - "event": "notice", - "payload": { - "message": "" - } -} -```` +You must connect your socket.io client to `paymium.com/user`, setting the path +option to `/ws/socket.io`. -## Connection examples +You must emit a `channel` event with the user channel id. This channel id is +available in the user's json (`/api/v1/user`). -### Public socket +When new data is available, a `stream` event is triggered. +### NodeJS example ```javascript var io = require('socket.io-client'); -var socket = io.connect('paymium.com/public', { +var socket = io.connect('paymium.com/user', { path: '/ws/socket.io' }); @@ -174,41 +178,97 @@ socket.on('connect', function() { console.log('WAITING FOR DATA...'); }); +// Replace USER_CHANNEL_ID with the channel id of the user +socket.emit('channel', 'USER_CHANNEL_ID'); + socket.on('disconnect', function() { console.log('DISCONNECTED'); }); -socket.on('stream', function(data) { +socket.on('stream', function(userData) { console.log('GOT DATA:'); - console.log(data); + console.log(userData); }); ``` -### User socket +### User data + +The `stream` event will emit an object when new data is available. The object +will have properties **only for the data that changed**. + +#### userData.balance_eur + +If the available EUR balance changed, `userData.balance_eur` will contain the +new balance. ```javascript -var io = require('socket.io-client'); +{ + balance_eur: 410.04 +} +``` -var socket = io.connect('paymium.com/user', { - path: '/ws/socket.io' -}); +#### userData.locked_eur -console.log('CONNECTING'); +If the locked EUR balance changed, `userData.locked_eur` will contain the +new balance. -socket.on('connect', function() { - console.log('CONNECTED'); - console.log('WAITING FOR DATA...'); -}); +```javascript +{ + locked_eur: 20.24 +} +``` -// Replace USER_CHANNEL_ID with the channel id of the user -socket.emit('channel', 'USER_CHANNEL_ID'); +#### userData.balance_btc -socket.on('disconnect', function() { - console.log('DISCONNECTED'); -}); +If the available BTC balance changed, `userData.balance_btc` will contain the +new balance. -socket.on('stream', function(data) { - console.log('GOT DATA:'); - console.log(data); -}); +```javascript +{ + balance_btc: 53.29811458 +} +``` + +#### userData.locked_btc + +If the locked BTC balance changed, `userData.locked_btc` will contain the +new balance. + +```javascript +{ + locked_btc: 0 +} +``` + +#### userData.orders + +If user orders have changed (created, filled, cancelled, etc...), +`userData.orders` will be an array containing the modified orders. You can check +the state of the orders to handle them properly. + +Example: + +```javascript +{ + orders: [ + { + uuid: '89d4b612-5e6a-4154-94f3-120d03f4e891', + amount: null, + currency_amount: 10, + state: 'pending_execution', + btc_fee: 0, + currency_fee: 0, + updated_at: '2015-11-02T11:36:41.000Z', + created_at: '2015-11-02T11:36:41.000Z', + currency: 'EUR', + comment: null, + type: 'MarketOrder', + traded_btc: 0, + traded_currency: 0, + direction: 'buy', + price: null, + account_operations: [] + } + ] +} ``` From 15cc3786ab5939a74c9bbdebae557a931c800e9d Mon Sep 17 00:00:00 2001 From: Cyril Wack Date: Fri, 13 Nov 2015 14:59:52 +0100 Subject: [PATCH 096/110] add 'since' param in to the trade action --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index ffd1a24d..95a53faf 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,12 @@ Read the latest executed trades. |--------|-------------------------|---------------| | GET | /api/v1/data/eur/trades | not required | +##### Parameters + +| name | description | required | type | default | example | +|-------|---------------------------------------------|----------|---------|---------|------------| +| since | The timestamp of the oldest trade to fetch. | false | Integer | null | 1447420700 | + ##### Example ```bash From 7b56f483571d886fbb87996b2d39252de33aed4b Mon Sep 17 00:00:00 2001 From: Cyril Wack Date: Fri, 13 Nov 2015 15:07:57 +0100 Subject: [PATCH 097/110] fix since example value --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 95a53faf..fb264b4e 100644 --- a/README.md +++ b/README.md @@ -317,14 +317,14 @@ Read the latest executed trades. ##### Parameters -| name | description | required | type | default | example | -|-------|---------------------------------------------|----------|---------|---------|------------| -| since | The timestamp of the oldest trade to fetch. | false | Integer | null | 1447420700 | +| name | description | required | type | default | example | +|-------|---------------------------------------------|----------|---------|------------|--------------| +| since | The timestamp of the oldest trade to fetch. | false | Integer | 1 week ago | `1389094259` | ##### Example ```bash -$ curl "https://paymium.com/api/v1/data/eur/trades" +$ curl "https://paymium.com/api/v1/data/eur/trades?since=1389094259" ``` ```json From 3ba4c53792ebf7429f2ad54c7e3b08662766c8f2 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Thu, 10 Dec 2015 13:10:19 +0100 Subject: [PATCH 098/110] Extra payment state --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fb264b4e..21c9e580 100644 --- a/README.md +++ b/README.md @@ -1287,13 +1287,14 @@ Each type may have additional properties as described below. ### Payment states -| Name | Description | -|----------------|------------------------------------------------------------------------------------| -| pending_payment| Waiting for payment | -| processing | The correct amount has been received, waiting for a Bitcoin network confirmation | -| paid | Payment completed, the requested amount has been credited to the merchant account | -| error | An error has occurred, the merchant must get in touch with the support | -| expired | Payment expired, no Bitcoins were received | +| Name | Description | +|----------------|---------------------------------------------------------------------------------------------------------------------| +| pending_payment| Waiting for payment | +| processing | The correct amount has been received, waiting for a Bitcoin network confirmation | +| paid | Payment completed, the requested amount has been credited to the merchant account | +| error | An error has occurred, the merchant must get in touch with the support | +| btc_forwarded | Due to an incorrect paid, the received funds could not be converted and have been credited directly to the merchant | +| expired | Payment expired, no Bitcoins were received | ### Account operation properties From 932c98111eb8e3d3c0d5e12e3361cfccdad6c548 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Tue, 9 Feb 2016 12:17:23 +0100 Subject: [PATCH 099/110] Added countries end-point --- README.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 21c9e580..7f4ee701 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Token authentication](#token-authentication) * [**Public data**](#public-data) + * [Available countries](#available-countries) * [Ticker](#ticker) * [Latest trades](#latest-trades) * [Market depth](#market-depth) @@ -253,6 +254,47 @@ After refreshing the access token, the previous tokens (access and refresh) are Public data (ticker, asks, bids, trades) can be accessed without registering an application. +### Available countries + +##### Description + +Read the list of countries we currently serve. + +##### Endpoint + +| method | path | authorization | +|--------|-------------------------|---------------| +| GET | /api/v1/countries | not required | + +##### Example + +```bash +$ curl "https://paymium.com/api/v1/countries +``` + +```json +[ + { + "id": 76, + "iso_alpha2": "FR", + "iso_alpha3": "FRA", + "iso_numeric": 250, + "name_en": "France", + "name_fr": "France", + "telephone_code": 33 + }, + { + "id": 157, + "iso_alpha2": "NL", + "iso_alpha3": "NLD", + "iso_numeric": 528, + "name_en": "Netherlands", + "name_fr": "Pays-Bas", + "telephone_code": 31 + } +] +``` + ### Ticker ##### Description @@ -268,7 +310,7 @@ Read the latest ticker data. ##### Example ```bash -$ curl "https://paymium.com/api/v1/data/eur/ticker" +$ curl "https://paymium.com/api/v1/data/eur/ticker ``` ```json From 2c2852c3fa847231e67df05a43a753c388d08866 Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Tue, 9 Feb 2016 12:21:48 +0100 Subject: [PATCH 100/110] Accepted flag for countries --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7f4ee701..b08b0fa5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ _* Authenticating users is only available to developers that have a fully verifi * [Token authentication](#token-authentication) * [**Public data**](#public-data) - * [Available countries](#available-countries) + * [Countries](#countries) * [Ticker](#ticker) * [Latest trades](#latest-trades) * [Market depth](#market-depth) @@ -254,11 +254,11 @@ After refreshing the access token, the previous tokens (access and refresh) are Public data (ticker, asks, bids, trades) can be accessed without registering an application. -### Available countries +### Countries ##### Description -Read the list of countries we currently serve. +Read the list of countries, we currently serve the residents of countries for which the `accepted` flag is set to `true`. ##### Endpoint @@ -276,6 +276,7 @@ $ curl "https://paymium.com/api/v1/countries [ { "id": 76, + "accepted": true, "iso_alpha2": "FR", "iso_alpha3": "FRA", "iso_numeric": 250, @@ -285,6 +286,7 @@ $ curl "https://paymium.com/api/v1/countries }, { "id": 157, + "accepted": true, "iso_alpha2": "NL", "iso_alpha3": "NLD", "iso_numeric": 528, From e12331c82959c5a5d30623700107f15fd013964a Mon Sep 17 00:00:00 2001 From: David FRANCOIS Date: Tue, 9 Feb 2016 12:23:57 +0100 Subject: [PATCH 101/110] Quotes. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b08b0fa5..d7eb201f 100644 --- a/README.md +++ b/README.md @@ -269,7 +269,7 @@ Read the list of countries, we currently serve the residents of countries for wh ##### Example ```bash -$ curl "https://paymium.com/api/v1/countries +$ curl https://paymium.com/api/v1/countries ``` ```json @@ -312,7 +312,7 @@ Read the latest ticker data. ##### Example ```bash -$ curl "https://paymium.com/api/v1/data/eur/ticker +$ curl https://paymium.com/api/v1/data/eur/ticker ``` ```json From ae0b71bcafcc8b9dd6b2f9eb2a554581d6bed6d3 Mon Sep 17 00:00:00 2001 From: AK Date: Tue, 28 Jun 2016 18:44:51 +0200 Subject: [PATCH 102/110] update some pictures --- create-api-token.png | Bin 188460 -> 100029 bytes display-invoice.png | Bin 0 -> 46002 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 display-invoice.png diff --git a/create-api-token.png b/create-api-token.png index 794b9c2a6646af557643527ea4998538f127465b..41d502597c069cbd8492e78b620718640951a9a1 100644 GIT binary patch literal 100029 zcmeFYWl&sA)Gj)>hZqD27A&~C1`F=)1PIRH?m^y!!QBb&u7d{1;O;UI+=t)}XCQUX zzgzX)U#IHUovML7y}NsNFL~C}t9yS}R{V^ENrVXi0B~faB~$?bWHa~|105A!5yaFKo_91CD4IfMqHfS!3p@)%GMkJ@K`8M zv{0YaA%bK*iX=pjy?z<}S^`Wi36=&11-VqcdM!&H{1WkEBs<9TlO)R2E0R|#4vYaH zlvlsG=e!A{KS>&(xmNwGA=B=HWkPYiN7}cSoc*@>E`=|BkM2(Z2cHpBJ(aAj)f(Rrx$|$%m5KS_Nc-YzBKh_H`As_&F>`>TKkRSD|eyE-X172Z}OUBa< zq5hW(7^jc##{-x%119+}QxLP&5&!hRc^wBBpa8Uov8`5`f!}fWdhG6Pd?%qi^#I zMWZV=e(C@KLjcE2`47oqkM8DjCt*jd2%RI*VG;kUJ4^XV zAFyJb-o=ILP@$s}Z{3w?ubANXeIEIN_mi!garC?DjU2UFcfv#QPg%ubED-4yr=#)? z>*(lz-^sQR9has|Mh1VpAf8{ZoZ7rr8OWU6_%uLRdn)Di22%>AYSt6{aa$G#UHyVG zLIV~k5P(z>;P^8<{{*mxHD0+T`LJ>;)y$t6&0D0<&B_OQSGiM(G;xH z7t{AD03nE+06FZ>Yp-B76REkEk-@}l-_fbMzJL4>BTX}bK^LRMNTvCbT7phR@!*5? ze@6eU_YkgqaLi~@a(UI(Bd~@gLorVk#Yr{Xf1F3WD;FBWwjs}+F+{x`7qX%2#GoTd zN>1Fzv0;9~JulP#;g&ADNY&*d&0D=6#J{s%f0D_`Q`w0B9sfm^F#m_@XRCrbHG5Tl zx=OmNVi)?Pfx-n#MxsXID~gqcjboLQExY&FsNzv3 z-G9GGup(oliBKE`>IFXoQQ)Y<<vIXzD|5vxyspQrN3AEe22N>A4Nv(_TNICKv8ajU_-WkNhyDm{4($jPHLaEkfjCCA z5Z$NhE1(Ud58DoNrQUL}ShtUTu}rZ+vHo6%S?^|(F}=5?+Ek$LUlH9B)Dq?$x!9e1 z%INX4Ro)Qeh`jRKY+-r6&?f;!?+Uk&3z{eC*m;jJj3^fa{kj1j)h48)*mZyR3u+rff8BLnmzKrle^#@=*Cnd7hMp z)Qbo%QUUXWuIhSIvgG3A<`nZ}J2o4hTT6QrQegW;>-b$rNQGq4Z=Z18@Xv|w<$#0w zgY<)Xnl21HrHrMAnzLmxHWvHX`m?9qz4_wJ0{-00 zg4_J=T*x9*qfMPRhu^_f-Z3$xG3wF&$d;vg#q@FP)1XOBw^P{HF!#urNU>hbUOmP4 zh2(|QiVBKA+BtdYj4IPEA&ZLBx7!ILq<&`ql}~XnJhHA^70u?7GD}?30MMWnJY(R?qvGo{8FcO z?bew7R-E|lneI`Z%wje3qEfX0GukMT1kIK&pcnb?|u9=jalFztZfb9|$L)lJ()+jDNxVc)^i ztw+4Sb8{(^mK2s1h9{;so7d7*-pyO7&FUYmRQ z+5f-eaGiIjtTXJ~A`M)MLiSSn3QN6L0ap`OBf-ZQ;jfu#_h^5-NsA?rag_0nyD3Cd zToG)u2t5Vm5W0WW9ZDBCU1Pl0iPfRCC>_Ng5{{LZi&R?9y3=?`QS|z(Ft|Xy;0)tF zL@&5fLO4euXIZ^+YGP{J%Frs`ie;j0f~Vl}tA|Crc`N>H_~36Khd8_YSHGbjeI+AA z@jY^TwJG!c^S$}H6O2}Rkt!og>HF-&Ix%G&vy|@6_F01R?L1L^X(_XLf9TA9FkB~I zi)^^#${&ebZC~82iKL#E%TdfH(2={q+s4LH? zsIvs_agkY#&CLHLcgbYRG^l&A=ybc8KlrHosw1a)tjfX4Z3mdA)OO}W7t%SP@Yain}zFRdX0+Tgc1djdLH#Ph>D zPe4s5We~A{XV+2PZSfhZ*quQw&~Zogu)AFG#{frTOT)Znw*|{hWbsX7;k`v;md(Z9 z5!3u_xvnm>nZ?>jFTzG)*zeo@zIFe?-NG^w#|wP{0*9*Nkp_FMHbviliuVH|XD3M; zMzHrU1eUyd4yBoLFW za(aKSCoM5^8M-wuIsCpJs9s6;7noU{7v>BeIH575}zJ;WuA@Gc@V79ql zUra5|9`!6YySqc6Bi=dQEHF7(hp+Nq<3FntpX)yVj^ZLs5@PdEJ#U#lI?rIvplv|} zR|rP<-Bjt#-S0)UinL$66-l@Z1z<1!R;?J_0sF8^fC3XmW{vJV;t^08LBY8|HN(GQSIXP1|P4U{n6tzxIgU7S1~5v#2_~IK6%!2ep3( zA0_-FMhl|T;@Ss2cv_u@;E>zbx6%JuODE2c&dMZpU zRHH6p&5+#&+6TV-!H)P;rW>m)qPLLt>zd~_8Zx9X$2j;@3J_KEfYtK^vU3kQK$g1f zgSQ@4b>`5ya9Ag<%B$g+$q(Pv$`9|{Jr9&At}Sph83%($QB!%+wkxFo zzb`qp-y%76?E0xK;N_5oYVM~XQk1DR;wH*de|3xzud=Udqv-y-1@Aw&uy?1>OzJ|GcXp#1ZHJ?8Tr8W7QqIP_f47cR$d4@O$+pDJ5|0QG}G+k#U(8-8+hbxa7_wPvEkE$0IUPBZ72VR zYT~7tEY}Ov%%q_D4w38cuYO{hiLqUkkCQ|CPK<+j1Jij{v7hRb&mG__2@|aT==e0& zkN&k4w)h??1@gi)2(O1zGhiJ^l1$XB_)l5igrpYK!~)64~enlYA@f1-bpkEm^uijhBC8hS9alcNIKdEv%0+EGz%yhJiN%TOzXGh=h&@ZJdMT*EVsHJ;35Mnq|e zUYGEr(3o0#@kWmnxR0UtGzq}3*JX*+4-K}}JQEF4gX^Pw#0!PZbsxDVcSWS zP09~#_XGb#2&Y5uJ!vS9IX!cgf9gSW@XdjRFz{DM$EM>8RUe^7?}Zs?dmt*uGMJ5U zw`(d7%)%v=lyBU=$ERKXS@Aj>#-&nxBT?Sug$<=XDV=HEBWGNeC-QcOy^E5D;C>6F7=7 z188g4t!q+TB(AEg9Odz{57b9$d3%S?PRkLEK?TC7(*PB}nz>ff^k2^F(Mx)IJ|OU9 zyIfWZ5g)jZh+~APv%TwlFN8~ZzUH==__~i%lVF{RlkIgwGWL4`?e!6Y@-X8mo~LHn zn^imx0=d7!PkqSC^$vs^*lMC;Mo+nbxKcvgo1z89A#4xG%)iiqpu|ZvlH?%$tfy81 ziL_&^1=V00l-D(!R8?%cigbNH<>iQ{W;2XK*#enyIfL2wKUTGzp41J^^8W)$URMGf zd{C>`0@S7u+SafzSzBaqj@Hjb__46R*9mBTdOqKd`e?^41{H&76&X{3jvK>c8%6Fh zzT8;}ty{HKI@@A?yL*O=)GSf7V^^M|(){m*GxY7c;5lDLj+4U56Ayvj(7ITw8YVOO zPjihwO+e%1zjxRv7m1j{8c#WEK&(%x7Qi14&cCd78wrz{hJ<#PC#`#j)06Fq-ZpJ( zOE?pIkj9fHD?0qI9+bwP^FpOY#$j{GvGAid!Ehp=`pY0BWDp3d)5WOMi&OUp5dfLYQ$fne><@L3Y+xX3H-SGAG2LHHj?6^D;x~xTVUySO z+Kc84Z_WeDM6jG^g1X<}%7hc($m6Dv{S(x3;!*Nh3F$7Bvz3i!JdHsc>D((7m!ryn z^&4UC_O{hxs1MygJPU(Hoo6nqstX;K=7Sn%SYe5tSYMawBa1m5n17K1n))pdL?M>@ z1eB{1rlD*K)XB#h7MU~uB&x8CNYH;zKu=5gpQBbJE1wu)T#_?7XMBvHyMguVax)?# zxI^$7=gGyzutL((s?Ki?6>H0u8tU+L_ z*Yy*-go_4)gp@x)g%+ktCUR9LKeFHROc^AC>LQOVmI!7=kTCSS-g*SATP>@lKr>9U ze}NF^p3QDd5ak4wJQt{X!s!NTF|RnC9vy%MrR-T~Y`bO#5p1)2+VHLKD!FeTmG7&X zqVWiGeI+-w{&Uf;o7S`l$zp}{MKzkr;Os*-yhd<*Z=bR1&(!+9o$LwwA)U+dv`{~^ zwa~c0D+3B2WFIdt4u*NFs{wne5~r8+n*n_Gb}@9NK*_4!|Bf%#l}d>y&8?(u2$fv7 ziVgqCJPX>%-;(5eaPoeHzz%P{7>;09s`o>>gnv9yZ9s%Z>jUZWn(PXjOmZ~eetv5K zzD^dQpvq{XYho&(IEDKpOh*lr4As=pk>b{T95-3RykHd0e=Z_>p( z`bk~jm0S_IZ{=B*i9-51Yug)+-?sBAd3$p;RN}Lmpw7xcdQ&j!u;Mma>Otc-&pNI1 z$plk+>K*}03AU}2R>RdrEFEzSO7!}g-1M9bjt&K(Z4(Qg85>5@>$`_?nGIHNaWLQ* zurQM~CU&wMQcO{90z&456%cd8s{l@)^c#>kNZRQm-c2y;xy?#5G+1YYMQAZHxKw`W z_RtQdy!H}mD75Xe1iXo_+A;%CtSkLz>|%?bYa&lRh)8H!P%Tafbd?r;9vstWaU*vq zfeEN3(8mCYVEd5XmobhAf1pXvo(lMPTDCwX!|( zit5O8pegOL?pbVOHH0{(OZPfLhfF>(*4?j^m`wHc`aLl1N@l%nDAw(CTnXic_qwEK z^J%ye-*D zEiS8v`WEB$(f+!=FfQqhJEjF;IO{M^;}{bX+)$6gRUPVt$ft?KxE*i0WjmpPwJDVPO(Ks?8VU9Sa`rin*x6O1W(~f$YFz7{z5Yh7YcVAtHh^hma*|X&HQ2hee;X8eS2^Ba&!G8fk!L$XoRah zh}j9-A)Wql;bLr~Dd)!~D|&;(*80ff={*VSxwNFNx7xhxO6XMAm)5rZ+8@`go);R~ z<|h}S)Gc9$pmw-jFH=2&X`34o9p82FhOuP^5w;{*m>MyC-EhKI0vcPtCgO-bp33Q_ zS}7L>)pf#q?vZZHW5u0(cma6d=fN(8#>K76BUSP2<=MMfX4r(eCZJPxqspcWc<_qR zvS=Z$q#3eW;7fL#jp#Q>qMCI+n-2P|mP7?KND-T`E2gWDjtO(q0>LbL^^r#R>iQo;w?Boxe}!A%ZkD#2<5Of*L>h z_}=UI$}7R)CLG`0-^&}7dqNf>{c&;w?c5HXa{Z?VCL@UP)Pme-oBRnVrNaq}SHIm2 zbSiAy{fljzRm9q`^2O-NPd?om#5KH1w?sX&eOV(BcpG0cVz$4yoA!C=ZZQR0y{?43 zfWt0()kxMSD_@jX52&p0XlhOI#*%^1eUR!=oN#tiYLDp2m>jGfX2l?VdWo%Yj)c9& za81er(ZV8(3p0$%sWR%Th`g2g?_>xA)caSDjCMn%P>18z7`2{|;QJ`G7&!8%~0dT4Q{qbAH zCM@`~sWKta$9NFr^HKS;MXYW`0h2W;WhT`fR1%tids&bV%*s43Tbc~8$1soh5> z5}e3tu87`1EblYowe(xw{D22*xhP|trNuEVwcEXcw`IywB?1K?Gsa{JvnRWR!*SNO zkdkR%lMUW_>k!}BUs@0wzei=iF<@PZhsKC6s1m`yErg%eJle?lP0OlJeQ*q@BcktI zds(*&IX6Te&Mrj0-4b0py`Fg*oamqlPt!8o3^R3mf=eB{2$Y!24oYqlsaw)E@$55W zd{OAzQBTgN?RN7psiHCJ_T{q|iF~>0TB=P2+d>y6wb^j&DAs`=DY?6$o;>>*wd*ZP3L*|M(z2h)=%Hw081xOnXq z7u)F2eV)@#{a=h=#}oOjy7wh<6F2;JXm7~QohV;bf$`LLwpB2bRMyc_1j#y)d{gA$ zS}|M+mCYB^Vvt!@(h(E+kVz+Z(|!-@ywzPC`OLjKnN}-0^~yHxlajsA_KA5t-gWSD z7MnTTP#!|r=|6td?mT+-rOx7y%*?Pao_@piEiVgxBK&Ci1DPaF@gZTb>>_H;y!XY5 zj!C3g)*b8{k z=735&A%g=}LT{9Ym~$!Jfid6bY=r~8v)|VW*1wEL_6|lsXi_T5sZ5c}wuq3yTeX09 zle5{)nWz)zZ_^1dEJ4Wp6t34cnKg`0m1Q@;Z2kKOx}xQmPYDjGKm5aXqbPcPzhmw=&(%;b2w((`!Kr?Jw$vK%4kN&ID^!vjKDo_82x<)N? zVo!nC4y0Q!vE1`i0@M;3w_Sjvmzfvm)7sr;tV!s_RWG#~#y2zR`}GFQH*yHzDix`$ z=04H2bw|Q_9+?BZldmE74I>bfl?Po)_?3%EgmQ6UW_-tbFM&emoy-y#yDN;;=eT+{)0$ZtV~(i$xc+}LF5jZEv@o(HOUEij`)Dgta_+W z@9hBKuK!JHd=|D%q-wSC$mf+KL}dpjXh9vt^; zqnBF>ZuoAmpa$=OlTwBWhrr}FG>^CcqQjW#lf_mhvPhv`*;z7=7Y)(=>>_qLd7v_B zmomSY3F%)^mSX2_0_Gb14S(nNQA2aUzERGthO8Z@j|0Jh?N(*mFpc=bOjQ~?)3tys8z-S|n@nbeC&(ClZ z7g5q&gY>($xeA2v7){n?@JCO*Wsj0Bf|fQ_CrtSg@p!M*aJA$$4p6a6t?#g#V(&j2 z>UiI|!^>Q8dyA==ehE~?Ei<7g*$}-v#_#d4IbO4BYhg139hjQASQxGMH3@`ep9+AA zvA+_ioi{(L&SUgLD-QLSGrkoy&9O1Y4`vBtQ^|-$5|qCpD(&uZ%)9Pdb;Q__o~j0`e&m~dzP99geU?~aaYeOOO}<7gOz6BeTneR2N0vDBiTbqxf;mg-Q? z&tF3N>u#D{SP}`iYF+4>qj=WCC?g` zcG6M=U6nAMi+TJZ3CCyGpDf(pLDao4;UE<3m{NK67BUA7=5Wz@UK=BwJF^#mI;6D!y>BnyC9=EL!AjLW}s2D>jeQQ62-ViR`!bG+U z@aZ(r?zyAR+tap~vENzmJMI5EZ`K^jcn_*-qcgOyMXoD7vZ?{zt+?vtBHd=zH8OHB z!Zq;*qJD!1854VUHRC_?%R5)B?U}d43_wd4li>|9&lV3FvUiMQJY3h-+?!U}hDNuX zPFN|S!EA0kCZIHXnFPbGWLe$5XI)^69NiN6_4L)YH{NCUV`4c;5)}uFqAsuznGx)I z({M4yJC^epm79o7Y83ydW-XW)4roh&bQ83su@-#w|CewGFd_^R89fa&Lk-+|Db;|L z+>D{_BfdgtU)K^lKEob+=>X{?ZqJ=<8(P-!-DhxZU}}`%yh#PoM%hT zN)cr>yjyQ=GjQzJds9_uB7g4vi&2YHW3+-i_7yn;09rb z*D}ofCa*F0xMvA;G%SjGb$r=%%OP4>2vd0AF1Mb0mp9R?%>oZ|^g;(m3pvk|7&G?t z^!yPKp;4+?ZdM7KcZk(UqGn-H%HVgk-r;EL7(E=>PxG}2C^$>Z4{ZexyzTVLRmcU^ zEga)_2HT1n$xz^$9weM^Kl=)fmaeYun*dHcw-$qP-Fj6kD=XHlMJEsXY6MWwR z{=xB(x~y;8xKEfL4&_5m@Me$N->;u)-$J^6PdOO@F(ojClhG;vebw`7><~5(#WUQX zA2cs#ZErz_h{Yz(yO)BPvl~D8!;zW>Da*uVQF-a(xr?pAbjO%gr-7bih##K{m0rFY z!TQ8&8up>Q$+a)$rA1S#>nMt=AQ!L2nb-q*=K4MDPd^ub`K;?o($Ub1+3EHUn6Yye z3r9YUF@WZlk%esZxZThnYMY|;Ws}E@F;RI5SxR^K%9}J|S$3=K7Uydl)V1aXjV-_?E=e(E)@m*n)4F@$Bk31WnPlIZw|c|5b3nC8!ZKFny8e>|sc(?#|E!`SQp_JKMZfnW(+#-xJ_k%TW*Ez0B$xPH)O~xlC z(#XgvDb40chEM$zM{7Hqkc(B{ZaQketyo--AQLf+J?o>4`pCz}_tE^B<`pnJD-xGAWlVeUwu!~pRfL`YFR)64Coks%CFfUZkv8^wFP)*) zb1hv4sW)UrGHkgfW+hvyUaLu(YTlsM93)kud z)|tPJNcnE!8FV?TZm+}0W-0$0*ZJOH-C6gjOHPr*#enQ@Dak#abt&oC8NY`F?!&8J zcAo85Ygp8@w6l8cCf%XYvkGeT&$%b$ZY?9<{Ggy9R1!*NX2tuPa~q7&`{5ipHD>~G zh%^sbu4xDIIx6dRwZhJF#m0y2zby2O)ia>W8pd^-2>yBBQ*gQ?2GhZa{Yg^wJ-Yi}a9EB)WU>n0wFh2&2Y@8xQ=toL?I z_?ehBsb|>luj}3SBS@U#YNrGr|=;w=r8t5{3ZEky`G%@tp>#C}Pz}M_-10>_6Ul+0wC7G&EoukPIkl zI)6K}+(|EF`SwfcjNj_c2nU6$Lk15AiI8S?N4Xm^K97-W@j`EJiLZ|h)N2?oHt$jI z`sa%+k{J5^<=c>u5Lr1nH5C<=wrJD+nR0%gtE$i!Bt)_NRpFt%f;CIvf^)A^)4fUfSqkPKB;Y@XqSUL1>1l4X0 z!gi7AViSMhNa>Mp4w-XQQ3AEE^w~!{hSG_}@my`Wpf%QAp#)xp6#{9Fxerj%bx^*1^OQ+vNOQK;s0G za)ypMpZCg8o^9Yzo=rtip2NO1(lPVP!f{eg_(80sEMCUV!2S3-HqYPgO3KYU-)}&u zgsJ6{PEb&OorOey`+RPu#!0BnEQHFct16uHcp#iwMycZ>QdX{Xqs?#|A6*5VU81o7M<}?xmh|*Ubc~d`?$2;ddS4ubi9*%jvmz8EZEeejwnBy07Hu1p&j~DF zcz(+55EfwUp`Fs_8m;k0HytveiBKSs)?!9>ZB8Mq#*Qn)34U!`u-D z&npN^%+%HF_QE?35rf3k@!uzM3LdIFpcrTc1KPP-i%0MNkmmg*Lm_KEzf1Lg=PKnw zOs&zj%YM$WR^HCFc_}>l7QF-4{Qx=4cTCt+PfSeIS&o0m&(BBkv4*y|&vu1i)x$A4 z6`y&UMk%wbu8vc@(gsUP=SdCObe3Ci_elK})QFFB&dr_D>U!$vC(_hE?2|lL*S|?S zG@Lae0!s|hV#0M##dS`3;eNx$e*`0-Npj5`Fn3C+aBoLJLAi9?f9681*Q;S zDS3D_DGD5N;*bhz)LYh}qW1I4YahnCi!Bn#kFsIIOi;|kOOY?2QA^y4 zWS0AP(?o#|Kmo!a{XZu!atBqhPCJosE#X0kNWiU(%Ie9VnjCZCTqPydt|UojBALz9 z1#alFu};p;=RI$fc2X=dRp6GJ$ZYWBad3@Kzi+9ks@me6UKIMh+J`4Z}$wRrMm{!cL38%e@tx4=nFLn9jt1Mf2rr*g@`t)-H#SB|A^Yj1#9f??s{#d zSe)(TMp^Gp~G+Z0Hb(Si_)#;bR!^6{MI<;_m#j=~9WT*5CV*T#-jbA?|pX=#c76#gu(UcELi*No?kK7f-OF$KSYx^mNDP#)rWwUFA@xp~TFg$!tu-EjYf6a2;{DXso)T-X1 z78qF09qO6{0THe@ls+f&01+WitJt2nE>$hPq|gO8WgVtE^w}Wme#*w@a0R%*C8UxEIlE^ zkrIv4v)}KGuJA-PqEw!j38F=>;1hu_%qpx*Ccv)y{QFN>V=+o9bh+eAPftGqHu47$4lEW)?-@>VwboNpzxFgS@Oyf(qE` z+87n+QJ{(Ica4FgkNJY9@DTh@8f(%nYm$}wsYz^CX=0eba9Fc^n7}=16*;gK~Yauu|D3^pzV0c2Rnd!0tvs%UxJb* zhPakdS1nSjvoK2*_cVcd5-;|EdB4Q}z;NqO@zjmy)G5Vn zS&DfQ4pz`C;}Fq;P1Jw6GEQ@3_7~WD&tVqu@(c36QUHb2zjG)5cZnW7mizyI(f^kvF{J)!P}$J10?zdl z5)xDhMWZF9r0C(RT6iW${V7utkWC(Kg)lHU=z1{6CMhBDk)B?bChof|LQs!=V`)u| zDm;p)EjHL;m_Hd7GD@I4mNFb&`}(AxDl;;|tq475PZVOtUJS=yyTyil)u)P_1Wy$; zH4BoH2~vi?hJ>&&zI;s5mX?h)eF2CL(zPIT$!P8`^tDEq&xSYC@LoEV|G0Llp&x)k@OsZK_83Xxb?|vg%em7S%hy~LEA5FUN=@5LacB5G zgb>YB!t&BDSvuZYx*MJ^nUK`WLUWtp;X>5mX%OM+KbgoXr#En&mdY4rV6C}c0vvL5 z;>_b5Z${M83N(Fe0^0}qN={1VcP9DwY`b#fzAjqqpI;9DR+OvZ`m5#ZYNh8s3u{U= zhfUcVp$+%NPAMuW+}1>U;AidvW#H25LcSx zM3>{LXE0Wow%}oXX0oAAFMH-}7-Ji27N<*Fr$sDx$am*c)LG5kngFJnGOX+}{p?c4 zf99aGJ={qAuK#NGXZ5`@bb(-*zy_CFmlKa~O{uMl#tz_PeW&VlLTXytI_=e7tM{y#| zAPvmzx035B>H7x`b{4P765ldV+dfK6uP4BSJ*4yZig>nJrh`%wF&$<1)pO2}B0WBs z7^kxr@PY&H?x6mz+YD(-ZgMhmGLvMz=Ne^`HCYW0TDZ*fc}%bYTbZfaNhupMRgikC zmfCi^)=`t^A_vzO?*g;k!m{RW>&QbOpCFsQaHZ>Gu6^chvS{*jNbw3U|Yi3$r|WI&(J;xgE@&&&KP9?yZ_<*DDb zl}+eZ#`(2|$T#5gNfCRpueM{$t-u8K%Q*gUuYx<>N21x`j@z2RC$U*B@6;dzm}Dd+ z75dgZA_ermE#b5hK^3*Ad+74j1oB;eOa@5T+Q#Z?MP*pWBSznlAPYBACvrVGHanNma2Oe4+EY z8R2vgz=JJUa4DY7Mz!m^^F~yrrPSxb?zf_9PRN)3LXMIieeWuyJkU+4=zvFV2B&}1 z7S^aKo#LA$DtRYKHU!}yX|M5@WYD%_<`^R-dL;-aSgE9>w+jx|`gnsYRM*HId^K7j2%Xs<3K-dJeQ;F$s&S?IH`l3bB4916Zo!;! z`>gV!$VHo$L?Bv^R}_gKM!9oNe$nY@VoifO6XR?R3$EpcCCj1R ziPKrXdqx8JXRM-=u6r-La~kuR;!EBP|F59OOG^)L@yo%`sP>}8*xusEqyC3VReXCV zOgZkoT=9M)og)<0^0z8~a~}>~H-Sin6e$Hl(cFyOUL0h?`8P7V<*)Xob~z>HM`biQ zg%WI2s!yC`CJA`_lmiu?X+dLu{Mw45QNK^VY1A)kS44vNRh8Pi{}}%^qH1Fk6PXmU zTbIX?ke!~2w!-uoe!lWXkSWVMX=qD2MdPQKP0G*=djh@wmKz2UIiD*Y`|Mr5y6)=4 zUe1zdyZquEQy91zl&f}sx5$xwLKr*tIcXMjJucf_aZnnDZ|BHY*g2AK(E(HadR~oL zCsZkx@#0Ro<5qbYcR|OoI^KDXk6QULvfaOuY~{XfB4bM}G<_32H+DodwPC7kvF6x& zGeWp_IW5kbWct4HZgAfsKjM7_mM)rKp;w2|k2>eiP(NuUg{G#0Ry!~KvUgs-r70~X z-=drj2U+6wP}rMqx(99c-6Z!oC2;fIY&(7DxdWbD?`2>1W+>ar;RG9`OwD4T=-fBC5la zTO|f{?5T{VH_q^N5oGgiqnmsk_O!{E8R7elL>L~H_!3X@#(sO0o_mnZ?Xx;D&cSNw zpmft0Q%ZHAy5b|zE}CMA(s%dbxQFz(YceRRFO-OKeJFU7b|S$aJ}sywkov|Y6hD#_ z3rhv7zWxxOvTccXvKqFJ=bd-)Qv5b^^_IndKT7vdmG)BPv?jCInkm7eyakp~hD0>k zoYvcYeh^G=7)$vCrHSgn^y?@l}g(KyGaSF}zpy#t2` z>3NTvf6r(#*CSNhmDA-IaCR3J2YBga77hiax-aB*Z=S?}Gj zd#r$If7CD^K4qmDPps^i99;)D13lwdMF)@M&gaC6$3uDE&F_7hh6yfEIjM8* z2UR3Z`^!79mBp)79QrU?J^@_RLLUUIJALrQq3WAHUSbDBch}t|-C3Kq<%(I|+_)Rs zs~f|3I_GZtN5yWi-eW)AWQ2@8m`P`|eo#C2KlDniP+gRpt-{whJJTgwJ{`9|?S&w} z!TWv*MU7en$US-{5h9XMz7vFa@bOai;AKzK8tht&{*dz*6N4=Uz!3zubg~ z$7dz8gM{2)${~I?_PH?qOf`$N;44kkNRkRa-+fd8n;FJg5pI%_J&@|pbx*W9uj{m% z^BkZ$JzdwPT?aL_xdv`dZ=F|vm}~coZB6V3FqE&s=d{hQCb4)*_mwiApl~CaZhJPy zo&FaAca0xuln*zpk+BQ(cGCClq8Rt!((uX;c#lQydmG3Z=a((C)`!qpD~;*V1#jS# z4ds6OhnHayx+-RJ=lLJvAUy)Qqf9cMjdr??g*f85ZUSM1(HMC4ejjcL!5Pr|xD~($&_5qR6h!w?$IWZDU z^=V+J)SD?x6Q{x(2H2ie6VRWTwRoSK)i`a3H|1)PXY4=BwUAM7 zAfm9dEAZC}xgC~N%c7_}S>E#hl(954|xAJPxYJj=# z?Oj|_KdSDL6$dA@BeIG4cMk*bmwqeEbI@*f1~? z?wjwG-OJ)K#l2?r2j?;^=*mYH&<*CGT8PRykA84t>aRp|ckQrp(K685CLL7qYM`8Q zE)SC;YoD3D|H7v>Do>_*G`(~V>DlEJWdW6vq&E#6hK1N{Fi{%l(vnPXXtk>r!{_kl zDP+_kKe4sfI{emK2Q7663x1@CVdxQx%@SmzZ3>hbhFb4+EOtPeKinsYdeX%2ipqB{e(%n=04Hte99>CO{crMbUhzsbLfy;l zOD>UpCD0fUKR!g;6(Me|GI(NEEE7pCDCtm1c_SU<=Eul8RnuF80PHh_*6FUIDF z-CPri6s*0otC;jHtX1{)+8ddXO)}KKJnewqhUYm<@BW=!ShH|m0-MYK$8*AOw{j_$ zMk;=OOxZC*0?mQ?k=YaR$)>^N%AIixI&is?h9(r0pa&DKR=@(`C8MpCdfQGRcs4Ut z1paa)PkVL0nUlc=yB$2QmkHn9a9gGsGUtcq9HBni(~tEjB@funHylIeI!#%put*ap zo$Ydc8Xo_dyZD3z=)0ltz(om(Zj|^8S3)8ZDM=DTYI)j{Muq0V++ikEjC0WhiV`!$c zhQb%h9;?=q4dn}*T`|Ln1g^U~mbl{u^_O<0iw!tCTpdyaFeSbqgZ4O`Li7W_@75%R z%;n9A@E4CZat8mU4@Lib_3xk)Aei9aQ9Z!_Ls9mFf=Ole>&~|41A`IQtzvkc8igPC z084{UX`QiTbTj4A+&7;;w#Fu+ST1)lFr4l5yi$MKgbASOm&fazM%hj;M^PI%zp^QH z%^oX}brRsDG$~Op)D9=@Fb6U7Zrjp7)fSDDAV+Ep&0N&l-@45I@YFfL5}DKY`2z4i zecko{Y|Z??eNXoPM#FSnTS@*@Z}sbI&7@6Do$`jx7gqKEi@5g=XM6qQ#@o}=_Io-w z9cb0)pf<-|MO#&y3PEC>*4{N@#A>UmC@My3rX@x~I7X-tPOGRrlT@stMiQY&jF5Pu z-{<=M@%-`oJH5a7|OENl@N&?qWcsb$wBULjvI}Zl&@Bu!a$`?D=GCpvm#0v7s&!)76-#$?44a%s?*X*oM59UU z_r3Je84_(V+}4{gDxlI>$=JSBLwoj|X`mNZbKj}B^Ux7ln(id$&bG8QHY6P)JO-m} zCT!P2k4mMH%Y8ar=EZSQ_NTpkjPyt7NAWv>Tl`!*IK)NCzlP+Arvx){)I#6YYvBG##8 zb2|Mm*R*wHES`m0&&5zNGUWZ#FcTanXT(IsG?{{yc_?N|Mzu!I(n^htEnFwRbQv}J z4MfG_Vdd<5c-g6?qb7N(bm8m2n6m)~sW=lbZr55^=Vvazn{jQ&8i}v4AGXO{npSQI zWm`A}vsKJnVqb?<#{t6!!B%`#S-ydfKP311#=joz&@)O%w0ROzrNk3Y2d^wXy zxOJ-KO(39JKXJ#KP#GvAO}CwnfYhA{kF7fGDQiD%<;~aPbRfh17py znm8~X+9YB#raD~{U;ZS!RJ+`4EY-5LhNqqSUV&eyy0F%j*>b_D`O^`m^61GM`e@^zD4rj_PfrC8xvR4ncI)OzrGP*w8-F01V7Y2DI!+c!Kodq7X(QY z-_DcvS(F5sQY{iLHJA=^E=zuxXaJd|o2b!Ea){Xe1DmPaW9 zL)Jt)JtN`$3cJc0$Z~uFYq~F%2mEVt@w(jb_PHUxx)A*XO{pdw+6vg{^uTj8$e+%w zOw@Wz4#o_@#Q3tWL>&)JLh3FRL3z>dK~##xmzJ2Uf^%wWiHu5Mm4BcJiY`C99}_13Kn-Kaxon5&nLx5$+sQ*kzuFGzRLao8vw!KC6}>`r$c@1(sa^ zuX)VRAa)2rJ5TY!D3KRi^0j?PE&rA{mzyM21q$<;REOcvQHCi)OjTx1i!-nMba}1i zY#Fi`Kl;zC*OzB!v%=i%yxBZEC-{D0*Mh>&&mDMBAW8BWj12_mJ)eua%zh=k7*RuNW;)iNRPe3E8+_Q}UE=bq?%^g*~FModP#^*`%l}AKIx6J{NO<+U8sI-QnFw{;-fJmH9=Lc_wfAv(vu`VZox$cO&)g zd?<~}D=meM&s`kY8&m0i*0fZOa~(`&t!0#ge?G`TR^wPyH~b-IBk$HO)y(E5N`KuJ z%CzLQm7~1(w$xjRaH_|0I5{E<4c|F8b#_;!briQ^i~;MFo-1?tEW%#Dnm=_d5^VN> zPF`Ux?`+qnuh7v$?a(go029GENz<2N*fFHQ8Yx3hhi0=@je`uziq_-?03lt2WJ->} z(#jW65tNQCsZw4j*4`-P-#vsYfEI zC!p!t>^C>1X8GV;wPrKzAubg_JMhwylJJreJwVqC5JA{{TE5363_L9tE%|?6vnM7V zoRaPxf)DuFM!(5#mUyf00y1i*R)>^pbv@x zxg}37yLv}VJ+k?+;_H@_v?0?fDcuV<_vqYhMl8D;Na=Q69EQTr0IXs&`V}|o-gfPl z78l>&+uJiSGeaIho6kF)>Lv_eyulGJd5!?BA3S;T+mwRtYxmc@^PahQ z7v-ae^sW(iX`lE0KaiAEpxN({H;%5ocb`uZFi$UqiySQLp?)#V@1_|1mvw*ae=&o( zyJdwl-$@rNwJLe&J%3BIq9KVda7R1c%LceNGXeU-Ja@17X>jde1nU_dO2_(@8Qi0U*GpkGP|bpG??dyc(afBB#_R_X0_ZuJGv7!b>Q~9 z;G#Ho%)Rj^Kajoj_1I2G+TXEK0F7{NZ`@5Wgo~@hTu3{-(hR~hJ2XVo({Z7rUXaue z)MLivU3k0KWWo@-o$HKb<=)Dw<1`191fLb}ye$pcy*#ZY4y5-Ru>PJ|V5!&v@-OQg z3}5LqB_rC5EDwG2$=e8IcUkFI+59%pwkO-QFUZ)_XQ^NoT^K5=`XeUZb820w;J!%QG zuv)K(j=_eN1fLO?va+fMJ?vCqHE3B?n2R<<(&a(rr9OwJExngaulc52H*U_yx~-jy z(THy3XRDRYxPbYMCpmi!wtj;su#(N#pt;IZi?Pd5tIyPySD%g#rwN0X9nr!x#tQu; z_#f5{@n&}ZXjy;zOmVZS=%b2)RNrjtz?PeswzwDk>lH03o`$bDN;3LUA~6O6Yb=|D zYAmcCq#ai)Er_*ZPZhh(&6EM@WDn}r@|lDon$VI9;{wWqI~EUEkuiz8yI(#Q+p!qWNsgt z4nWSho=R&mtS{rKIWI{ZAOw?|_zU??FL@({rZsJn%+$t$reQi(LxUZby_&L$OcJ?ojA@1LOUkb`(4H z8FXc)w%79h5Uu7=^O5I1a8JOCjBzF0+izebX)_Tg*6wFUW8Oi^ot@gP;f{Ld>O3?I zrm~21BBeGg)n(!zCG1}ctlTwVo?gFQ&y z8|cqF=GN13IBu2Symm!ddbEt!H{Zn!e|XP{8_ybeXM63{>O|cAq?o~)Kcw4+bdd+^ z?dUPVA6w`3Dpnqa4b)|Q(3!q0>5M;}K3r-s(J|a`L8~U*lRji-2RWCoabPvjtZI&O zjje>Q8)H%p)z(l^9}&95vzCXYYL9YR_X*cZ-xOxnfAK9EFL3CV^zT>E(Ut1)B&^Ns zBJynIxbAnf4?VY3gE#e|n}YBdhn=z2iFE3Sp(kx5l2@AE$`Op*GKbtpy&J@ z&Y?9lVRa35X>U*EL!SR`s`l; z@~S^xBU>*UgWCh!{m|FGenX3Z>t^E~TF*%36ql5Cz!;cVSr}L70*Av*>WqjNg<;4J z3N9RsOHL^PV&jwjLLKh+d1hy+c)Y5Pq=jMRvec^W=U}pzsojq2-A_YjA8B+#AYQRJ>wRrWvqadr&-s{JQTyGV`KJQ{ATQS?E zxMedH60PJ7Sn7IsCDvs65Q!}VB{NXhd&J-YP5Y^ zdPjcbI!4l?5;<({-uwl*QQkNnS~=LHMiDd@Zg5DkTYYO&(Wxxp^)D4^ehgY0*teG%hx zFG74B=01L8P-!XwqhjW0ReVrec=>hf z<=62FD{~kzsEY(s|GTzodTYD{IG z2r|Ls4h_27Yq5P2?5Jjkl$jb|(nlq_FjL%D6kg(e3jxjMc4m z-&xKT$QxSeA9mqy>-bmF1FK1GF%AtsKS+eyj}qWoIMM8rn;#Nqi7vB_HLI&~;DcQR z)^hY@j}uj|mx+4-H-a8o@~#Y=pTq`|`08x7s0Jgn8ZCe!7Q6F6MBxK6q|K$tHrD=4wj~6sb_ZQe{5+ zebNJc8z41R)!tu(x~lByI|GAA%T84ohyryu-8(s3*K!h_Bis66&@#uR&@W<6!?$L9 zFD#IWYP4^y^9oP~%F^B3Y^;Q2Bii~%W@%vb&4dEs6mLub@yjQ9dVoo<&4&jA@4`a{ zil-o!R6^ipD#H5N6KMMI$2{Cu0<5`SC2H+r^LCccp6tF#Nk5}+wi)9Uma!+S-6+owHnWYc3*eb$K znZ-O*e#Imbn-HY_T+5Y(m|7f%b5d}cFv7fE=6ng-t+&zWy*PTa)4gSVCf2#$L+8Uz zIKT8BOK&CTESV5+#R(6TV25qE;*cGW@$A)Gd3)b4fw8J!0fz3t#)PL6`f=?j5tzbQ zW+23jPXs_8Dp#*z3M=`&i2WdF7zN4{AsW_t^w>h}_s@h=pGqBez2U#v3Z%#5Y2k`X zcLsu?z8MxN83wQ?EZW4Pg4fht((?#c)u+2Q=9Z|~=MZhDr&a*-pRlkZ*Je%cx3BEf z+l&RJMI+xp({P5FEDbDC>Q2R-e3c0D&4EHK$7*`SDQ9KVz9M{eY)bQ(kpE^e)TLaa zo6tB4+UR%C^7&ryc|ftcy-a9%VLV29)OBbk3M6@_92aJ7e!md2_k=T2qwnmDU#5caFqJ8Fg=ULR@W$(`ZYgij~AIjMUH~C)p zfKbVm6Q^aRgAeNe5x?EFn9);K99=290fA3e8Pt)*>Pv4dcB0V#&;HqOWElj`Qm7o* zI9dCJ#M3x^C3!O)ZR64T<%?wRDxi8&Lv8aA4#pI+U^q#OsL>zbV;&EL`X%npJ+zw(}Qy#aCy5sJ{ zrrn*G>C=6!)7~>{9?nNC^VJQ7;TpLp;s(rS9I@-J}TOvj#{(K&xYBHO_3VC|&S zy6T)ydH2P0y?Q<<~`MC z91^76xgzOSk6cWvV|G}N+ZpSR6IFj@Zrrl{=7-L5Q_FYvVQl^i@cnt`ccq^n0OAP= z(oKevWe^#lp;Y#wxU{T%rlz#*NY2yQ#M&mpo?WS=aU%0E%TC%VAvsRdyqz9;wUc4{{8*$4Syjs+qLFxUN2y=s+`4!DgyGG#rM5&jCnU~ zQug-x%ncyf2H*oUD0P~{n6HK{_MQ>2p(Bu0+}Z{7}6ge|5(*k5_k3 z=?aZ>=e9uRR*I;)Kca!0s8q9Zwh5bTI(odcX1cOhlxk?RqjB_;zY) zYT}egy-IJjNPC;1@+(9M>_l^N$~^U`y^rNd{C0J>f!$G)t%ob09}+1JS@pGfy74DA z!v?p1Hl|3$%9L~GUM+AkY*oX!=5{BgaoIHV@up_7N!afShAEjUe#4r{b-9dB+xH>9 z3m=*N{#^H!VNIJWlfvycpEkSr%(^sBIfPT6{iwC`n1zTs|}JAs}uQw$5<)+D)Q5|Qnm?<{+8IvK#G7G zhZJ3WtY-{|sOmNTnPPkaQTpl!9@Pbj&o)B)72&*Z#TEl1j7cts4Z$YODo6QocT9Ir zox1Ehy{rlA*V@UG5}Xn@0i@~ft-QW@OUR+YxD9j&R&z=Vlc7VP(S+*K)6DfZbglV| zMGfepr(+NMwiE|oe&h{<9ApQpvn%`8Q>0?a4NKf;Ijp~D*v+(orx+T+lEVVVZyUSb z5^5UG2%H_uN6>+84;qSZrTejWpzL}8nL_g&tAO}^5c^KAjTiI$(A_G7W1E+U-28~6r_Yc zo~;k%EVdKB_3c+w92Z@rygSr>t6;3<`Pp#*aaasfK>dyq!6BL;-Jxlixy6pb_2HHT(C?3@$YnwXt=zfGU4{J8r%Ii>mb zGwqBdz!T=*X0g&4$p4(p{tq{86(ue;?vk)D=1JUG+WalD=<2gC9g68fn)CGs$L{pl zEosM*T;OgMj{tt7kES(!%K({AxElPgt9z^FI?UBG{{7icGGEa)%3~{M2qz$u!B|#8 zB)FhfAExqjN_GIJ3f!=f<>vEU02=kaC@br7FK@%6mf1+75N@I|RI%w0k_L8Yq9Rhc zh`5HnQ4BUFw}vI8@wS1iyUzn34{8nMH5wU;8}C6qm*_|7qB7S;2Rin>wvr=p;Unt* zO9!F}Nm-d4C>3(iz|c@eT)edG;21T9s%5qipsR0PeNDC=8FGtZ;vW!fFkW9 zbwEo@d%d{7&Eq67y78UH&_{atNcsf>_tT;yin180oskO@@X^^9w*!sE_rb@Mmo5Px%cA1 zJ2|DrelZ{QNB;$Ze?CHsNvX57@hI}$vTS60)FyH!?Rpoh&yvX#GNF12GX0&^v3v0s zX{L+Iow<89t0kmFsr?Rmb3VBHMKH=WSO5ag+Sf1B{rV<{(`2iF`6er6Wq8&f(0c3b z#O~-hx#S1{yz8*yq-AyXxS{?~vYpv@sRO2{diBZhnz|+&(EkWB8t`rTo~-mRG(DrZmRrR4VM0&nVIczvuC4TST5a#gxFm zJU_vtxQGzI-34WXQTF%}F;u;Wd?Wz+-3qT6-Z)bQjvLS^2gcl&k$S~C0u_=8}!LNDP;8^x3hj!?A37Akp|t4OnDNMU;!ztT9|eXQma+z(q=M!=!~ z$UP~^E-ODZIXPL(IOp9J*b%{JSNv!NXUu1zmo2g+<5VUiHsM4B9)833PZloG1C|z* z=&h-aWs6F3Eqb4lFLCq)k6Ea47lG-U%qIP;dA#4{OZwJF^T7KXpDTXN%Ez7!|4-%k z|2cI?+4|(M;X3Z#n=3grlCUUv6VS)CPsO2V1r$KF3b>YkIe zU`+4eplu76snZq{m5?y<=f%5EZES7PT>0F@!~|ESeEI_y;6BggHyxAv$~7@Kx~(vb z?0trpSK{sQKUI!IboR1Jxn^3SD{paObdyqUw4NIoIyU^GKqKhBuy&Y@n;Y_TM+fT9 zWA}hoRv)oJu)ZVzzffJ(Ytc=6udqx|Rs+S6Ib zerliM`ph4OO9Q!$#QppU=BEDZ^S`Zj9lQUH9wvSKf2#L#k2HoiZ`}eqJ9G7YsTEu; zKG)&tzqGGk`a`ai83+cWVX%upTU)@5yMJ>3pt-7kuHc<3VlKUZl=<%oxzb*on>TNc zH~Ks9@$*x;ehW7L`O}S?lFwu#hWkauFJi#GdtCPmo5cT?_&ufM|Cq$~->Uw9QQeN+ zHD#5G@ZZiKcxZ6UOGPc;{PE)h1u<^VapJxB_$9Q5k=K_AumNHwYUrotJ#n z2fu~^Pu4MO}W20Bm%*J&g%^yl|` zM=c|D?8Qy49mSDz7FX8pR%>7J=dojguenNI@RgL#;%cWBz|sEU?xlxt@n6;WUr@iJ zYyX!nJ+lTRY_F5itF2Gg9SXnIU}hJ;Qb`{yy+}kSEvpMgwFTQu6*{;LGa=0b-1|O~ z#BO0Yh0Pc%bP$~qZ7ysMP1P)gYM*4_bx+cImf3BGzq>>qyBp6%3r4<~n7Y@iZf;zA z?C{=Q(zdI(8O&JsP^s?lEnC2@MdocnQl4%m~EAkBRg7jw`jXy=U0~E zXR+!wi~4kZJl0+!*;i)cZ=x^MeNI9vNU85_vymx(%#zF9WzJV=d3m+VB0~L8b5nlz zQ*+At-5Yr4AG15S=XtI=kvfQe1L)$I=pJ{w=Jn@qxz^whVeYZWY#BQ$K3yrh&`xmN zwH<0+P+Z=`eyr?qG`s*6=FkAMII{R>`kmWzjS7-|t zu=DTKVi*}}(d{l7{zCw&Y6n5)gH}SVPha^V(Nnw4&MH4dWt&ww-t0rDU6sY}d|KA3 zY7|rou9ByY5IauWV<7`R!mChJwaJDp|9b`tDjA2Z7S2BBu zY`~&Uf(hqSn-sY$0LkovnO9$s7G5)^U*A;1Ga?R&dV__1lljuGQ2R_1C-IgRZeF zm7y&IdctgI^+Z~Q%L#M)?6y0m^!*50)ENEtK|_S_Oi?K?R})BRF_uxT54G_q{DyrP!jG}xLfGd`q{mL17LDlD@fZ`M zF|!3IdV3a-uhxh2GzgEIg=eEw`(}W~`^tPFp)EP>8ipbK9J_J}MCoTb1-cO^+9yr< z5+3NqfvHMs-2yE)XqNHj+$l-laR6qtTY^9ouI)^wg=KYhJRvQl;w$l>IVG!B4;+80 z@WU#@9U9OX4wKGerfY(Wnw<)VjBPi%7QvYrsDfz2$R>G2r5(3O%CJnn%))8`QRiyc zLC8gdiTg>|I9Tz58Xrhp3NR{D%lf;#S5{H0PSZ3H=%g$>S>}EfB>k5|bWZ0*c*WQxSPXP| zqAa_(A0{2#uu>}^?0zLQr%pMCQoF2Mt$ZrQfUkFVGNt!hv?JFBj2Uql+2Wk28)tqN zUS4UwdA-o8&7jYvphT9Gycul1UW2oq;D$B2p>aH@Enb1R3oq{Vz2`TJuGKzdEU zU|uPmu^2l8!wIE^;Khfi4ob2jom8B-Op6!3AedEvloM?&Zm;UG^4sHam)$o?yAW^T z#de_dYTX3Au(yQtVI4sEzHtf~L(9v4R;*3C2I>!M=6~yQZX$+{t)(TX+CG~qx0V1DT78L zNSuBuo!#$Uxz&U-TsWT!KN%WloS*0ENfQZ#@y z?06;d#NzJ8j|PmqIGHY~qy#vtrp-xzx*s(pC8q@7E*J$v`$EVCcG^mPpZeQLRV|Ad z%;o@5~v=NeC2CSHEJ8WcaunCi`j`a~0I$2=%wqGyHYMx3Pb z+RR5ADJDr~V-786N=KcbVse1`88Q&UaAh%=hAI^}zXeZ9$?APx)ko+78G-RERVBJS zW-9vawG(n(Nrk!O$^cwd;0u;BG$Hi5{$$L#)r`=+fjr%)#)su))K^ls#MxERzVut; z1C~?em9J8X_^~nMi*x?uI5PykP#$73c9^dOE-9ZXyPVQc%{u-qH9(-u_rE4m2^U->(zwstf3me9W5rh}8J zUxCQG9O*@OFWQar2aB5Y=wQ8meMtrdd|W7RFkZt=PRMdIIySKlT#lzADfNNYRD%-L zC}^In;dVuV&iL4AkRcWBR2c_a|d=?MoFYtwrB_D$-%zU_`s zCr64~YxG9s#l6U@lUaFM;QDooOrGfXsfp5JATiVC#yHL^qR`uiv-^kRx5$0$}J-!u3dYflG&0!!Ury!cZcm!%5$yU0kDt-uXPfZZ+kcz=0B}K z`Er=$o&B(!$rGSM*e}w8)CT9N8`_JTCX2jNv#?8TGbe>*rU_w*vCC7jr~7OiuXh&4 zWxOhNF5MT&Ez9VLlAKz=gR9I%-GDJ9LmFDDUbPuv^Ic1$5Yj{pX!Q9$5I6ksF)Hur ztlxQ?qM1FFmhG0cC6>_Sd|Q!agtSE5!122&_u!@0kG$80V8}U?CjoyII{kj?gq>8e zzXSVc@Tza%v>S*T-*cv zhH&Xw>DGkFBV2GwFTn)HgQV3)jTIJO7%I*j1WLHCOwt`10^tU?BwUJlb7D}KS*A^q z7G(3W32T65Ayss*5oPyxSsrg?X`r`HI~04w_L&ksM*-5c_S^99wx7$f5r+d&du z#uqNE;V3IUPBb=X#-axc35`j9W4iaq?<${&U(qTm-|AD~fReQ>%kB7vM;D|A3Tf{K z!yHZ}4#vx8xDQwWwi<2+7$B z7?_;Q1=j%przG)_o39_p-QHQnZ1?722A3)1rb@#PP}(Gk`6jA-*d@y;){ z%#zv(H;h)mh(a@L(GOBdgRn(!t}L>~eNf$GGFCA6dJMgk@(3E{x248 z$bP7`lPLBF~flN6;{L+Mo( zbBanTJ|#{`LdV|Mwv!+C9Hb?>dmB#uiHEi6UnvOLJG_DXlZ{ap!@b5$pRmpV=+Nc9U!Dd7@}KHwS~j z6Q{~kUNP#t7Gdr%af7CFtn9S5{A%%<)oiF!rTiS=kxQb-$LJjLz2`C}!0S@-Wo!D5 z5#4U3U6}FS&J^)V0}_vU@B=|2j(%=4ZbkuBKkv{@Gc)dNM3>*MpZKnyH9)U?J%Apz z3&a;!l}O=sk`$>^xVthQLnCS~O&x>j4R@3cOUm_%$3^_HzMTtT287<>Gm!tYAb-uq zNJ8v%r zdR?|;#K@E3|Jdgg!D;CsHC7`-QP^0z3|M97{aVbt3GYrKaNR-NV0U+R=}dP_oW`s) z7Hf1S{C5k8vnFWHP)DG0+({F`#%PV1al=x-<76}XBSy@pwSeqv&fc}bVw8G2RW<*& zr_P&<{nO&9T@=}yPNBtNGUV~V6GIg<>K0BoprrsczlLN)F0&$?8-0H-UPaO!P1Ml) zVx(2>A^{&tuaSO?>P2&wXU6Kuxl*oK*9aZ1vr}!3wwU5G*eg54``}5=MGv|8&uSDsFdz%f9T^p;2uB_-z?K*TmD>O(r zs1bY0g?L|HqjY1I#e-8I(15gT< z){X$CHa-4+pQ!rYT&2Wb#V=W}R|_QvJUp2k)tm znejkT%A=s#V6}h>IhWAW%vvLmXyABkrH$3wk{!E4yOV2085l#xmZIo7uX^a6p=G$r z&nLzpaJCgBHD_Sta{}V4;9BK5{_}zvHy4H9UX-^wZ0s5uxHxM8cpf{0D1TBpzIc!# z?oXV&I#FjUWZk752%MJ4$y=539{$~YMciGUrAL=e(qeUJbTaoOv->Ry*FH*$E!MZK+ztd|-uy;6IPM9> z>x$4OtTp`)oK7E;J1OU8@t6tzdUmNH6Mz@f1E?cb;~QtZGhD4K#^Jr(h?22PMZ zzcvMS5SN;{xs&?7&t2y_>hOGCoMo~s;c(Uui)Q{C21~Q`w-x!GD>O!H67!*68(nEx z_F;$@y6IfU*LJb5C@m@104Ef*8#b{dMpvcfN|^xSZD_piP>gx}WU$M7P3iLg#6#qe%*%WepJ3k561`2p+hv)B2FA_VoQcj~}t9qtoO}_#49e zz?_xZbKUY%nd>%ykH|_7FGj{m@ZP+TCU{4}>+|31mS_H0J_j?HgnW7{)*b)#{aIxH zkm^dozpS&b5)D7*hTl10{w#^kC&`X4p|dm=mndmlAtM_FZpM=Y-*4aZnz|TQbo5Ko z@04e6iH1Z!EVt2lx^>-n)WG_o5BoE(N_ZG9YuL2#PJ#YQs`|O)^rWgwrwkGdX$Kin zCN6akLqwc!L4t*9`ptzky0!lBEU$pOXXM=3dWY12(A=zMl7c}5t4rnSMCG%jmE6QJ zT9$!NzgT-WYcdXViOe_v~^%iP2myjPMSUitk+6Xf1H* zP6^$?Mlt7m6Y}s6VOkV2g@nS0rI=p*T;f2I(x=VnkDKNuf82~VOgSIF%wII@a6-pC8!fJNi?OtwuhTa^RPezt0DIH5J^{*dJ?^;=Jb=5=Y~3 zwxaQ}I6u|^SurkYNv~k>^<`)&1y%%^wfeD_hnq6xPay*lmfb0kD5@I1F8G6pvlM7v z_Enpu$w#9di$TJHdkW*{=`;iUXc_80;A3gxtMd(BJ##k904JxwPn8nOXD=50Wusp1 z;oY+-kd1Y$vlo+UMEe4#_Xk%m_d*YNz)){8R-ZB7Yp2pe-4>0YPgC8!D~m+d(%VYP ze7+to`A#UO8`nt=`XdRp3+s4L;xgBP5O{h`H8`(};UkCow!qx59}?;7nGHKO40y*i z>fT7@y0_A9!o80?osTS}x74^?GVagXQU{vTs0L(TU1E5?>#KXJw>&M}@uP0gq1h~e zQ?(~0Bh#{ubY_kY;KT!7&s@PjYHy87L{BCN?Qd#|JF7T^=nWBmV!~HiDFC9vy3gNL z$Wb~@eC-Zi5mMUgEVu~0ix0OesCJ5uZx`_&w;Hf{^S~7OZr?f6+(Bnkc8G8w=D6)56b%L}}dkMO4)FU1pk zBda~$e*JF4lhUe5XHcJgvitcH z1meoOMWYO2%5*;bfiLI+)M`C!{wD&Rb*8dPO@ZdLe&a;^1YNUwf)%&$vym&DS4wpb705ED% zLFbbVkVu@!pQ%Da3wx2^WzVbU;0ANaX*_{X*{3(z|Lh+8xkGAD?7cV~sSeONX~Vg@ zCZ({GSPSJ{Wks}fm*j6MfR5e$_djkHRwvf&tA-rHM-0@>32)J)8_f2{)oqa+5oR*1 zQN|W9Ew2~v*^0>~&Qi!xHH2$BS~=4{zd0l;oBkoSLmAsU9Xf&Ep%!!70e?^3Q5tV0 z9M8ZRw~#=P{ht)vYO93MSp~d>@c z)gxrZawUZYKE;{xBzk5P?VRY)l0OWlS~vC|rwFTA{*bjGc9#!}-ov6Sy8>uq+0n5s z*hQCFE)V1WD|yrMCvb7kMu4!kRq^ZBwp?Ub>7(ff6Mq<&{%0khQH1&Dk%SmFHI=y= znNZ3l=G*$&WW~A5$=Q4uSZyvSP0+Hvi4C~sE9u>k%};%4?z6ab=NCwt8ZU3kbLUkN zwcpBTQmuE$>B%BWE=g0();}iN+3)>%tJdfMCN$2XQ)scI>eqj$Ty&25b>PzfUEAj) z@9F<&Ie4S|K54!+G4;2RK@t&I<&5&n~5K8GWt!+ak?^UG32 zYp%IW6Tj>G?=Q;<>TwXg%b&R{i1!JKM@$BoJ@ZpXeM9j-oIKqH58pwIRI(4F9Ym&X zemDUnVj%In1l;7)^Z2rSSx0+rZVi8NPp=7xcFpYhf&1!C{-H#_!{vU^Tg~6~g>ol{ zmc74>=YV}3g-cv|NJnApo52?CS3T~9O~JWS2cRu$TiY>#temk6*ol#v&RVAl3Dz`~{ zU~;;@kLx9VjVr2k2ZzP|58mE7sIIPg7d*I2a3=(JcMT8-?(Xgo++7mf-QC?Cg1fs0 zcXz#qeDC|+-%Q=9nyRUqe@?M?ZT7NWy}O@&R<|EIIk3u@4+aHU4G>8;2Ih>Xr0S>@ zc{6T7A@!`W1!k>x@Gi(mVFVt44WBLwX1*Cue8%TaIGa^KwOPn0Y21=?LF79`YQf@{2E~p)}l3H9#O4vZB3Y8sC-^QB~{$uc~N3bxVz{)dm4G* zZ`I6dG`5kR?K)?K?by249;-I<&FucDkmWLZj;dt6$)R&SS>-i3*WtZwZnzvrpN#!l zNhT@nq$UISHv4uC8av;E7auW{;AJnBIWul&c_uI- zh&LRWYD>P3v&{>&?${>?$E7d=9=~usjQBC2TqhdHk5|eS>Oq_8RhVFSB75|o!+*=s z)vApX9-`l35Z`TLVd2=1$4E1ea*CbJRwspl2TT zkyKD8Oj$1DcjkTKxl2eLljAkTC{~>)1xzQkFJ`t+c@;fyW8ZxJxi>mO|K#nv&7Qc> zKSyswj!u#aS?n)SJgeOEoJ9#^BMgWIWC>bpABO}$nNj7Bb*$zfg4P~ z^e+<(bxC}B4?U%^*-6b(zQlNB5t0t*LGz&xA{AL zmRfmO?YW4|8n@_AqIPy26lPIvszM&tt9pg37s+ zNWR$+((5|?As&Rx*ATDN7}b4_e275c39dD&s?L_SME_@C8Z$ulx6l4$-OB1z-@e%j zfris*n;?9Tn~$e(-7!qxUq;ElN$TE?!&|94fHz2!KWlZnDQqH zc5qNz;x-S;N3ps9EMV!B-+?pg^E^TYU+W{Q!E$QyyD4zFtpM!ekPj5g15)H+_G zMqrgQy>ZOVs=(~;w{6n&6Ld2M_8YUYwey@9WQcP~^AVjW>di}q@vWrN*x#F$IFW;Y zSe|2r0+ZLc$|~IRmiO6=&-An7k3dShDFPXigJsmL=M|YZ4-yu)J7x7Td5e4t2Z0-T zO^<2gDa|`#hrXiqJ44CpU&MloQ=Ug{;wTQ2)Q7A_(v>?#J{Xk&DgR%SJUGi&x*a-& zM{>(pSSM9lO>7ivTa8h@Fe*gew@K0;G496k<}phfKU%KDV|ZqGC1>VKF+*O_Lg1XX zDwlk*2t*^ONGd8q_Rx$Dp&|(-6_GP$H=?W&HxAX;_ejjA;MZZRRl8(l?56#gYaFe= zIoH}SbDj#Pdpz<-90EyNNB)+#ac!MxTN`WBEJ$wzmb1_-FuEsKwG{-0Ij)F+=Rx~zK?K@gbK_x8~bJHv2X1$v@Ozj9yFk`XB z6CdB6=UW|fx>?v#u>YgIsh|_1(nF$?-zvO7dtTu^v;8?Tv}6?b{hbL4D^1S&WhyRN zPFe73vLUW;BS9zl zJ=Uw1tEsaQxJ@}y#!fQ%G+e}BVaNB8*t$M?0@NeBuO2*;$(;L|`&{S8X~~@D&Et;Z zGOE7xgOQh_joZ+;aENj(p6Gq4G07c!$jX~-)d|E;o!nX+lYLN-V3@5Z!CBY+>LKjq zhEk*l%4XODMk(fh{ORd)Gb)T;ozgw4f8ZZpn`EW&_`4%i3EdN>*~hsYA@!l*>h{y{ zo5>IbAPYhRf7tQG2E&9y%wB5pVYLKklVOl-2bvhc=|{8bvKyf!ud~x>Rh3|5Rrv3c=*3!hG=M1;Vri!3oQkx=PJ>`a36gx*s(;vZKsSzZG zA{4u`&`#~n(FM+>6w4hEm!eKlFOv=l9n*j$&bvfnAK!x{T|a++7{nRd-fGL|-B1Ad zcw2p8Thxsmou*4{)}KAm{*B>>?gBM>1IT5r7B}sb%WYC{0Mv$c(EPoc0vw#v_`B0U z%csAS0Q{+l)%?njqSm=NTX?$4Xhk&xN}Pm&_4Rj%3B~kdw#K7{JgQFiw!&v!#+8|# zi=!Vj3sc>TT`-zYKVhH+%6}|-qKVI%1MDXx+7Ho?JUYzN$zOfyLx~>4sUjj?;eGPu zK&BJ^ZOd9bCJNhk)SLGAd$yz#LF-_RS_B9SdMpeywDahnk=NxPi-u$**4RX^Ztbd( zG7#`sd@a2Ov7R6t_71ofAw=%?oikI$nU(u&&50eG!~)!_u**N|x(7xcbI4iw)oVWG zFa=jYV4RRxmYj6_w^3=kp=s#6j(a@}0JXpVU}e#EZ!zj@oV8G*8XUM?Dvlo}9|Yc? z>`WsC=NIsSW5nv&nOGGZ4Y~2O5vtG3`q=r717>BE`ce*LqVU^ILWjV90*bVT8m4g~ z*cGGPMA0A%Z=KYp^pOHGJ3uiiH6S#cZ^}%{a7^thqM*zV2oSL1W>n*9ef&lx zb3%?eoi0Du#`)M`gt9@(R+;hehbEDoQvBPW0@kCWxze6Y*V!VuSDmAK7sbwj@d=y5 z`$g9bjVIoY{0#$@2^$a*Zf(NTo0kNyNKx)rg!|@FCXw6Jy$bDI&6kbqg{7s(Rc9lp zDz!1ymDVnI8uR?$bMQ&!Y_b%x)bX$6`qu5>1nWg}!yut48X8da&RAu8%9gPEyE4&# z4kr+`C^4P;vg5W@K6WK=(X6>LGBRwt&o5*=4NT~Qs>rK-D;`xfL z25hl|MKFf(zhZHAZ42Z3aK?N+(8j@r?r&{^KrLu^gY{qiz%DlUE7d0@K!sb(Md{1G zx3_fsSB=E}>1qJ-7G!Kd*gqQ>ny43n3`F}N z<*ERH}l_YChX# ze@Y)&P4|d7n_+EW>@&eIY?XV*e+0r1|4v{aj_h>>b4@=ksiww>;q_2XYKWGxF3`#n z_;=C7nSy}x5JsW$Fd#N5nc5G0BS@3m?U7IC6zWTIuJ87k4q~a|$`Y4&7;+H;#8L5+ zg~kSUnFyj`;U|22DF+7@3mv{uHH(R9EW}PpKLd3^bv8#4iSrzj<3VYOD*Du@e&3+l z_FeTbJTK1D!qvJHPnO1|pp3n|e5S;M1D2BT`Sk_F6`h&P`sHJl=AUSZx3#j#>4M86 zZf*$;Y_aK4UB1Sl+qSUoh5RWg zko+RBkE_h?{i&7db5z_M^)D5n$5h9gjD-x7jbRqp<8WbGF>+SExPlT;WkVHx2z5lm z7&X~IDwgQ58`4#?GIDY&bcFqG;}V125WJ&s=Nb}T^zz~FfA-Mvtg9DF|1?f0$j<#@ zV~n2_rtN=XVw&#^cKl^FUa-oK&u~S^O74F2oSE;o>GWc)Fm308n%p{E4c;G{(Gd_F z@idp-Xrp&*LKb%JEi5V%td+)=%ILi0L&wLQN1!H6N=`WRk-c zeKYGqhI2e5^^8v2kZoYXtsymi#DgQ{d%!du3{xlDK^^PS4r6NYK8%ibl#0g)oiC;% zFnk0Su@h|1i_aN1A>;GNOsA9Gc-HD$Hb8!GaXN*%rEdm-_%I19QMReoe zWz!@-l%)giF`v?ib!MuQL>5PWXV1Nr->JJ~vvMPs3X+?DT)c;2M>yu$GLZ?Z*gB<> zVd}73U6r{Ze(f}jqp`&$Uh1uQwy7jkLJ~gxd8cMBJ+iaG%==89a^FVRR+Mb=9TqCzIUN7?=xaH z+)6;|HDs8fj^+oNbZQ$B*EXYh06yMi$$e68*4`rrDPeyh^ruA$&aIs5i5<1_zFm96 z8o9n??~zo?KdKMM{%z5F8oGD187_6KKd*~{f+nl2 z|NHkcLj1%rz$(9|{shxkN^aNJA!--flnqd?4WxrZ&YX+T-Oc0ZO^97m5rEwc>f&jV zH6#n*fx*3kkd!n$Pq;8EJb8qe-!0{35e8sgc+2Yh>p@`HN$E1<5Zk!(UKFrJY$7Cz zTJA&U;$$NO9nP<3UgXw^Z84oL)L)4Yjo4u_d8i<`_i6bSgWjmT&k$mnAB1cReiytYHyOIL<$Gce1q<5&w)(ZDKSo3Htb?`Cr2z5CosMpbpg z3}T(L6N3E;Ef$}{LdKbaZQndhm*@Sh^#n(K6ei#o zw*x`>&7sQ+N3(;o?=S!hXQY&aur=*2bRUG(fG3U54ozGURyT?|CyokzQe+=O;8e!r z<^J--LGt88_?A}(02*_(#9tUOy|9r}&<5_=?Af*Dud&yfKL5_LOiu$jRv}{kCM$IO z9G(?HZW-ct<|{{Iyr1WfQV(m|cynkqle%@$)%p&J;8vKyhFB(*Qw8%PXaJ2gKWSEy zJ7hWmt7(VHT_~rK#y^TKjt<-9FlDJT?|u>KX456bXY{KDNnzrufoOTglcpt>EY?$t z^s6GxsCO`-<9!r1chLK~{J2ksM8^6;^Cv!@7Fh`~Ykbk;g3AV&m&5?(uj>GyR6$>& z|3{T)(Fl$Gc$0g`jxxxG_T205*ZR$_lPSj@;1`kaL<^364RY`9H8Hoa4o!N#aZ?M5RpWYp`d&d8$ zuCL4(EQ%pCo|!1G9JH>6nl`NS()iew>v-czWWiHnTPb1;yUq zO%uQ+7(>dr5S7szrxWN=h?GoZ|0`S`q)bJXK(pgB5DKm_QRDeJJh1Z9G(Atgsg2gD zaj((qC$`H`v8o@aA2bXM5e3Ds!2$0eNQ&229XV+vVl;}4wu~NxF{~rRi_%rQu*{<7 zH50PX9G1zZ&~m6FQ!{Jb33}!!+*B;)`Oqc)3@EInsv{$u6b)1BB10<&mS+U3tegDW zj_8^+T0Cphg1!qxghG%uZ07#4x~Yl=VX?)DoEDk(2oirBNzyjErieX*IYZi^Zk|=hOPmQ_0QqrInMIbJ4hE&`tpNA_7~6fd z0@cG;2lz>0r+L1JdKQItZ(P?WGRgF;H0%hBqU9HRM3%bA=^sAvoJs;{k&s1Q7Br1u z{Z~vSk*qVa%|FAKwlACurq&-o`|mA^nX!JxZ~j=x5b70lobZ1D*~Rr5`V(Xvp>#$x zBd4R1?%`*!4MLoZ?apCr`L&Zi)sO5V)I05P;o3fKI5X1}A5-OVY#R#aQA*;kSsLz< z3N$P~eG7coWbNy7=k!qdqM)VK{Rbp5WussbJkkX3ykmHz94^?ouf6nuj?awaI?ctfH~s#EIf9Zfb{6s7gU4 zG;4Q7?EHn)m9#l89#AAUI!Zdv==FWD^F5{rwX~ROFdOz_A;_I%RFc-sxy_u1UEgVuu3Qb`Kt0jeUtR%msyBi!0B$p=~!DlZOT=4TRKPWh}K_ zxVnm+=pe%mRm>bGcJ*OF1z*3~2tLnDf;f+$e7HAF%DELrJ_B-K-emZ5=a)rZk?ENm z)92OKJdHQ*K)`39B4fkvm3&n$;@!sf={>=#GQ6XIzhW3`&L*YRE!^(XdqT&=WZ%B# z7>1~$p8aj4aPhwMy{FrNtnoUKZvDH6Jhb)#BXX4m8;uo)tV^~$!f1#pEe4lm)|DK> zOMRDd-?S}+NTf(UUQ=1$bPxgr)m)d+n$$6KrXIhHVM5l}s)R_AvF<4?1`XSVe6ef` z#o+Wjq&Ah}@bN==k9l^vL6jAt$Vru&S*=6X#Z~v5p@ar5TOcT5ym^#S<>qegmRnF! zz4~$!(-ThPik3SfI@~~mTd@b$Je9k?eY(|l-q|jiT}j*0i`!e5M8${tWwiWoDi`T} z&fcE)KTo_bonNAFns=J5d8@4PbRONjl!WfzxS#MKy%NlvGpbZ-Z(tgW4SuL>#%UC$ zh{mh46*VL$v1wp2_2#E~QiF~jnz0k_+=TnmVKXMEtLbi9$;8xsXmaHl#^Ln`UQ(so ztg);wLeyVBa267x>v&WqyP+7MreatVOFEkf{}kvzAuPtO_<1t% zk|Vk2fs0a>a&Y0l8w>7`h?w`oEcvVMfGNA(1{a6468^mb^p+VuJi>pkS9N2e{)_Ac zGNP9_6}S=oMH6`o)(~YEe}Qxgd0eEZL`-@^sniK;qI#@{@bzCgw;DY zVe@>JTe%oGcu(!M$MHfMxMY^LFFe+k;pO`{6cn6ek%{CCQm^=Mg^90(NPs?Y0-gNa z?G9U=cFh%R#8W;2lg%$EzY9Pa&N>R!;_V67Yf$0-GqPSODYwBefq4Zb5=<=Bs`jAJ z^mK=mh-x~3as_{wYmyNKZ=1DcKD|d*%BZ22_w>seVue1{h@Erv-C|v3c2($$u@o6S zTgJJo(XxTr4&ObN_)_>^zZK}g7m&duM-OgGH`uHWJ(2%DA;0UWO+wYnoP|g$9U|wj zqkMc+b8&Nv*;s^4;%uQsmywa-;U%6bUqDcQX-=^crdty+lf&rF$oP0DMaO^6EQ1*# zKTl-2&=r#2P@@kBD^eRH8VT31JfmOLVr(5YM_p~v^h1<`>yD*e=3(IP_h!@Z@M6l_ zmNd?y=HD$uWK<&-%|soqC<}XuFP2QL#m%R6GNB(3KmeRHo$jh z8K&pyiGQFhTI#;$eDXxtH0V6(zhUPMTGpR0TN>71qausE+hjq5sY76E3DucM63v8h#@=(YO-BYqlY*>bI$E`S~@^fYGMUcfk9w zvb`#@mU)AMq9l0iyhXCfKYa8lef{!)!VLnAL6#BXR-nH&aADzav#DOvinnh zrm|b3Bh~9&9`Voy)bURaNRM*1{cL52o+?hs1?mr*BO`z`ifKl2SJZ8l)4VNN5D-x( z3PKG`ICoVX*oh@J2V9@3QS%Tgx@%|MxIV1@>H54ZXTIs0a}TCT^DDG z5%Kj`;-d}@8lh^9wQo5z(uf8hipc8D~9+27djscRXec;gdg|JW#{Is4u0eQPRqYAS_mjz-HAI zM>LsG?guC%mq$F{3zw$$Qh?msKMa=D9fHKuvs8 z)Dr0@s|6KjBF5m3{dtU;&&6pZbNPn074H0#-NVh?eiAs%gD;`|%eG5>N%Db_myl#8 z>%%7_?yngYSQwZW#udB`_NhFScQShug!L$Fcc9KYJF-tdm~4q+eOzUA!p{6V?ZqCk zY|Rd7v=w|FFBM~Q(-#anHAmfY(&Fo@j$~0aatc9gvHArCY9fTlx4w6b@HJKpc2xvm z14eU#v*O*xQx=%_RPh0+UYB@Nu|zGqY~LvhZvC*yigyA3D7;@bQ8!W8-7j8Oph~Q) zifEQ3fbS2xM1>&jwHD3BRDE;2bj%crwGKr4F|wFkKdk-cILPM0hJR&#n}moNG#S^K z*?1I-YFu;0jxhaE^nB0DeFo%a0n3oWN_KoTKhE21`m zG`q(g!XCC3ppSZ6RSmwSp8xE$dwVBk!Gu?A?h|w-=2lG`QQ`fC00N%bi@S|X%DhMo z2Hox?4D&o3nYphctGBL%Iui_x#8i;M`Mf?7E`U$F;+&DsYr5RW_x-Ji-5;1jl>CkZ z!BxkOnzhm}x_TcCZo1*eMZ0tu`mv8bjQTTeitfc~T;+$38*7 zQ{K0uEHRiEm%Z8<`{cAk`Hgvyb8mgCzl zhUKKwOm$aa@kM=H-;dA!$T(vksL`xoAwt0L=qUCCZ#!B(zwcGuerG(Y7Pr*8dt;Td ziC0i?j&sO^7Lr~2Pv3-hjBxnVWAGBCDpGzCRx;N(XkNtpF8i-R(tKU+?|4;faH zIT?yvzfg;E+8%Luzt}tjhO`ZMc0T`i2PVNEaiidRs^dv1t*Cvf5Bf!%3V>Ek>#2TE z4WhrGH1As7-{C!5fMoL`=qiYxIssrDVEAWaH4+bbsE-PPB;O6d*)hCaF{1gr`_aL30>)_B;| zKw=Fj)o&q(G#v4kU_nal7K^Bj6}n;g>bv20Sul2KvOY7%7HzpjXz?uCXelf`9CBAZ z5IKB`2(9|PaA|$XMRq@5hJ;kP-jIIz;1nV)XxDk_W}Xm6^Z~bjY|xE5IiN|2|27JA zQ;*)|I|p)~c%8hwfR_09_3HHbCG9IgtD6@b!}8^mY2iN5NatBTv}u~qif1g@U~#_1 z+1+~2=o}v(-|xU3v*}rNgW+kDD~<0_|Gl~lyKW#y4K=a5biSUqx7eqW9Ee>j^(V(; zprzdtd#?n4L{;vo#GNU4uU`d=--PtIB+N26iRY#PQ8hC;Cvba8t}D=gh+?#S5p8^h zefH*0b;?+sbGK??%YAYX=*Cx2J^X&IvGQ^USC`GwjyuDUG4s6`gtqvIYO8<7wuQTM zc!&+9Y5Vm5%CIJ_-V&DX6k&ld*V(X8*MGQ9ZMFoPHJ{a)X*nI?5N9Ubk5?%zT1kXC zaA9(|ajBEAlDP<9t zNk@X_%!P^-wS}UUWhvwa3zu2h`kaZar@cPjjTO8TlmE#RXua#_)nu?={TaYq9c2tM zt2NnT?uD^iSu!41^}NiiI2^jrkfcqsR@&mX7vEUmQ~6=zLr8v48l{HO_ZCtJ6=n}U zX~z)?ER?qR@}%vj*t3KK_pFeSW!M(sPv4&tw})SFF20)g3Y^zp(IRweHL)8xKnOX& zjJqK-4}r8Ni8*R@p^;%mN`A-143g80-wtVyS;36IneU}jML}P_R?nM~h!3D_Zm&{X zN*T9?evIwzjF!#lyfV4e>PyNvUs?|#cOR-^D2*mZTuk-a`0cs**= z%!Sn5c7ATCKFQ89Y2+k^po?!m`^f}w`>lKgpIMIU*GQ9q6!L-JNbV?1Ydmd1tx~zb zoGmRLDqCcyaV4IXibP7If-R3bj$@^)u(;&80LjF<2VFF%;K>%#B(x2Gx zqcQ#lnarAhGA_9-SeP%$gcvL@uX>n=NAy(z14X}=6Yp#3*~5XMBzO!Twj;!ym`znO zB3j(`DNxnoaVcV=V}Mme&BT!o85dEiap`MweSS>b0U9EUh9*?^vZRwZ&NJdUId!+( z+j63r^>KQiQ%ADrl9{mc!lTji-J+ypnba?`X94^3HnR5D`kpZ`WmZ*AKtYQq35j9# zdsjxrB0Rq}SbhD$kd(xaGU~upFh>q6l(D(?V=>iMs2*1h8y*z-MTNhir$fr6+4Oo% zQC_^$=6%4kJ^o61RR0?!aes>^?`gABWXAfm6&6+cQ9^=L`qXq`TbXA(-g<3=$;zGL zeRzGTRqK4iUk@T4ez@QohDuEx!2P4ht z&SF;WI{JIM8jw<^N-+GHh*88(A@h_$fzG;RMwL<`jeCUv74paC#!*KsBQKPl5Vrbq zSbQnTG9R0IN3Cute%3aEYrn0LW?GwBwLn+~YR_9wxIBYof@{G5;=IPUSg)bwVaz12 zEbGT4J`j^6Fe;^FNaKwi%Uj>QPKq5j=PedSmrly~#-fBCRilKIawy3vCBScZL^pDszBnOU;xJV{_LJK79NK-e<7RM#EL|1?a9n9VyCj7^L{0rkXMLG2>tXM z&#v?|xUqI_$#5s$049u_mlZN)cu4aK#iVsxk4>(_0@DOEAxmP`uQ($Oy|d4u{Pw_l z;!03_8T9*HUltoKDUv(!GyWS1_1M+|%Q8Mr~rl5O(at1k1 zNg@9oIhHobxpcHB*Gp2<5Y^}jB}LL~)u{~;dUt&#jo*&vD`()N41IP%S@d1A7)?mp zVbVNe(GZYkt_;>Yp3STWvupDn*pLSppH<{4=rqmb<43CuKr2~x7l(92Yn8~%fBsTb z>&z?u5;Me8PXP|Wu(FLu=~~#l2vX~f3=-IC%A-eQcn9NdgOIg%x=n+W(sLO^Hc4{D zOL)%+CpBjB>cRgxA^E7@FhTKheaUDvb1{UBENGUH#?WgL{4*$gHCo0SG@QCuTW@B` zZ>pp43FKpwKQcC~AaXp*-WLR=&vrZ~xYAE&@1i?s5WSEF(%-X>PVcKo#&&LyZI5%e zLCbx(zC?eE{)&tpU@|YlcUZL+u4d1R)@Cn`9qt~pJ;hnZx}g8qx_J&J~Y zAs7QHF*fP>buk2AXM)>Joe9r#<06!AMtMtb2oLY_%^D9bCxjPUXu{%L8s97DVi_6+ zi=WOH_Xd(bV8Y`W!h+&-q&D@)2@Zw1ZCJ4PbS9w4o;u{!r4kHUM}QTz#uc`c|FPeo zRe}>L?UN6Y_@JN2jyB2*5usC=5i$=69^`;{UuLo;gODz?f~Mz|>WUfEGI#5fRMH^0 z6z#(KM#`y6!hjvJr0tSKFtpTg2K=X7YP4m4$RsonWv`T?~dsN_Di znvBz}rf8PeABx)g{yf}Kv~|S_*GU8B!vXqFY=zy*?;WgYN+C)C@bHPP2MX;T`3xx# zq8Uh$>byUG?Yg`Jeta(LY;~XFZ<1S!3&tZ zyRl$L>>jjsg>gXEkY0kc!xf|tL&|IKhaS1)6Lxe3!`b*Ubaj|drTW)L9LPK}!M!P5 zS~1#(`HUxIdS0Ot_!T*IELK@~G~AG_963cJI=-pt(E+RN2pgU4F6oNm^u2%G3tB~t zkUBjHfI9mjuHm@UQE+#B9AXfdPB(nsJl3+r*h1@ zW4yog{-e6Tss&wt&AHtF%6c&7qr<`M0Z@GT{3Yslfe1kGywj?x)?(oC@rR8aZ;A#v zSoryMFl}%$ECAQoxt*G((4`axdi3*#tvk8G?FNPIQ4Hg8G{t11oDry1zojB-T(3n| zSry*oRaWNnjW4^db>kLR7Szf&`w13{W6UJLX%G;Yd;nmmkBl4)L1l0KS)_oq8y=zs zyr96?PNkb3*mZO?sfD{WoU&eQhXK#>G(*!s)?^IkmFz^mxc~6+bdN`hs-u|h`>kXD ztOX}(*XMD`({M)5nV`^S04nuz^3|R5wqm{KwILfz`9I4H{}cX*Isln?ut+ZVL=9si zTl&kX76e%_8l6q(+JY4ivTkR`AU{vlexCF2iR?hGz*#EOcR_ zfEU2jg+vzY0hw!I{rYP;f)VVboi6Q^8I&ejahq?+7%u1Pq@+ZT-n=Cp)C)}e!cS_p zXOw<^g8YiF6B+d~H^uZ_0h{0PdT>#>_~BK0=HLs{Dp4Bw%%J*=j&MsCFGhG-SQ>wv zbiVx-19T1*#W9P8EeIG8Sllbk=v!u=3D8YVHDg)n*zjsL6s~NU#9-z6KJl=fE*P*7 zZ0|baGJr6Cx<}MnXK1kEup$M@2Q(wzRc*uvABXB?zl4%*edJFoO7hVW$s!mXYo}B- z3+bsGouxmZ8c`y@Lp+)K<1f@|`=4z9C)&SW-=X!_DlxtR9H<(rWC z8GTYQxbe6U<`Wyllc3#A7GgLNRaH=l2yy0;Zp-fs=p@Yif@<+^hDn*n3Aj0Fl{k%j zv|PK4b_)D|0=0H6$0-`g3tkLd4wD%Gei`f1Zu|5@)FTFt$)4EnMT-4YfR(P*kl(e9 z)(i4TiKk|S379%Ifg`8z>Ssk7VsvJt0CN;(``}vzPz=o7+w#g4D+8B*r}Y1qsLDls z%|~QIJy4wUWdp_%0}i80G#}?o-1Ha#OsmZ070w}HeFGa7+`L0RcA`?@8yA>7>UsEC zY$m(B9E_eY6T~3zBNl@d9yzRJLqxnZWi|^{VE1Fhqj9^miGJTAB6TdJZyE%aUXgCz zq*nc)2{gA|kpg`~m$$;1+iEkv<*uc9qv20u{DR^yS0y5yR%oJx_-9~I4od-_Kpjt@| zfh0rCc90<~K>pD({flgo;(}B2FZsZU+YDZfvCT?STCcsVT89Q_0N(?A4NAWF?$yqk zVbNZAPWvp_B|jYQ6}WemT}N~iWn9rJxKy^H);(shg>@&cX2<`wW`8_;3JHD&ss{;Y zlmhN0yWAK$cGg`idC6>iMd~_Z9 zWV zyygECvDr{lE=5lb`1;Qiy`7%}19Ssw>+N2WqA%~EnAFxxK=-9t430pN2B@{P81#l6 z3Z&)lMjg+DiOKrVKntag6v}Qx6NZviYA6Eo;o4J`E9cW+Z>-2l(@D_u(s-$Cs!$17uSl zAq$_h2zOWsK<&(%TppP)>9u!qiUX$||DaU{Z`E%b1Nzqx0^FxMi6sTx@GHN3bpCnM2h?7nw5vU`5tk*EZ9p@xv{cB5n&xs>$f z+LPa59ubYhrmX)+29Y&hv!NL{x6>xOPsBc3#rE4Uewk~1&`nfR2X~;#Mh89HjF~ye zS})^5waETRq`E7qF&DLk-rBf4=p#LfGMU2a><|!#xj{7921#<=O@@Xw&!*tVVJ$}^ zeaPn4*STAth|JPJ9UF>pF7i6_`iPG#%1L~E;0h6kd)T&dFzko0b)NaQRX|xh;-0o6 z1v%h`E2i2UMBHzy$&(Z&@AOX~4M=L* zl57}dPMBz7l2d6{-S1E`MKK74-wJ=?8n~u~VfNve&BTa}QX6aDKO2Di{Q0L$X{G^6 z)rC7g8hF{xYM)b9I?^qqzyR~eR?>;;`BP`{ZiMuIXB7)b(U;X})A$M!mD`RBWMY-u z?|}@RRC0Y&{mlYs^YHOw6~?@w!>rQ9SJGHOW;`q{?|i-b2JkxY7M-wgh8Tz3+%j^P z!C{pxOYQmOZUJB;pd|&YCWeWm}pTHdC#=}s$5tGdeZ+(sX5g!S8y%s}< zz{3M%7GrbYHO7%Ml9}EO9SW6fNcvwf-wKKj82x3q%day8{+aoAq+}r_gga6#W%qh* zUM|A##!d-G_00us|2ywG5RjtwpNkMZjx+^6TgzN;%PnDi?8Yt51c$!c2LP8BTdt<` z*7zUhUD{{9kux)0Mo^5r@;x>>oC3Cc;tj?X;D71SL!=V_ofPPga|=2z(U_q`9$KH4 zZ0{!>o8gd1c^2&B)0m8 zgfaG>QtVZBMi2|rw*LHgL)v7l8kvD}c{O2yRox|n3xWzk!@&`gkOUm$OTa*B^E|9q zjU4@W*>DVZlpPPz$FHK)XZ+?!&LOAL+g2piCE|s$n2K)J>hh^?ha&==CWx5&@jWCW z*NG+-`;wz_mc{PK1?;i7TiAHvwm9|}J+jb16vQG&Sx((K4K>^*_Z=WGh9xEgdx=o3 zSMSxD%d%9aTxgrq@%q#h8GlQLJ9D)1YrhefJQWxLha^A+&S9?#2~6^*eYhJNv>rcD zFOKF75=Z32(yppQDQSf3&;m@KNKAsBB@LVWy8_CD{;+>qFD4ZKXr5|sr&Rcd0ixn&1 zpNzs(I>l_Z<#-tt7k-P-FfLggoB6s+ z&qQHwTc73aL8g&`cSI5q&3R_Jn&Ci<2 zh2Yl+OV`$I@BGY!TaCIN&Efwr-(7@In6zOhysKZw`rTXMD2bzc7qh&hIl>d@<^ImL z`k*t=DaDejxQL9+N@fqYRjCC1F?Z>msW1-nHaaC>b)Co{EC?yEdl)XC4G08{Q%HIr z6(7FAb!mNLsm^}gx6VE5qHfbH8h|f)6;z9^#wpLtrH+^z^tEb6o5uyYh@6h@ph=*N zsDK`ub9Z5^#6!)xi`09)rUaM7dK*Zt-({dydG~#I(cF8c?AG78u(_9)orCt#G37Bc zld;`5v5AS1GbN;Iqlpce;kvU9&iDSAT|0nSYhnTtP9|_FDk+Xb8O<#B0Z!(1dZZ*h zP_}8AR@P=Ji_RaZvcLl1o_IUIG`4-3+&nkI$+Tv;6NkgVc9nu)1W>;p9kJ{| zneLo^9O1yyGlc&zR=)zpB9J$CvJc4afqM0)b^z5;4dN6JGTE^BZmE;j4K8_iOTb_; z;(NP;c9dKsMZ(LP5!~-)H{z0t4^x2$>`Pz`2K zN5cWs^UF!-C+!^@MFtlK*D&$E`DUB8p$pA=7IDN>(gJdxD}7t;h^6;{(Evbsk! z7b)OAt5jr7GTNByQ%F65$}1Cgt?Nf{pkvs%wed4v?{6BFkr>&-kiDqIlnBk_4J?`v z7X6>j8??|w?lCbr$Lqm_5%GG$ycLKz85JlvYp-X1?CNMB;ptHN71 zLuy1Sav@n4HXETs=lCy6HQ3(l4k<+a*4(i`NGRMP9*Q_^mON+4Js+Wlz;@jBfoY?S z$!2@wZ3VE>v;gm(lZH*2-?^=1{eN)U!uyafg>1cke}squ&4(~2PNRB38N#v~SGsPd z;Am{oi6~=JlN7(}qAi!6bKntafI|Nl%nWE^OFzvDp3pm=0qIF<4F|J`rLY9;oW%O= z&+3qJWXiPMimTb;LLkfB-*dPvmMxs`bLI|T`bubMJ$Sm=@G- z8ke|^cWBBL%FXWG*GMGmWd0qoD>Y9#YP;JkL=rwecpbh!s0MQv%B%LT3JX=n&bX;W zTgwJfy>lud?#GUhZ^IXN!FmH`cF>p1b8B4;Gx@ zuE7Ze*G58cOK^90ch}(V?%H_cGEMS6&-cFH_skr#k7LjNGyE#LyQ-_}?y9@`T5FwG zY_|-oH>$n-v`78*J$}B$uFtI`3}_Tt^B%rWYWd0IatB_cj?ed2-c)~LH!`wl*H`Ha zjO1?%3GS!Q3VQ#Vfs98hUC?48>e9~T6lt_quc@E zK#*w8(k#+t4q?+93McNqiHy5imNTNC?e!dKYk{S|HrzEmrE>C)fu_$>E!UvrUUvun zn?{<*l_&o&9RH#&HJ*o4U4<>lENRg>*2Zxv((^0S_?6t^MxQF|MfMZ$*&@l#M#!Mh z>WX@Qh=Q9GQNcv#6CFnYXPsxXQaCKQD`O8{q<+Q5P0+hXB$7Q3#!T5p6Q~k#{5#Y!Krd-&)KP?;po^{b1$`A!c&_fMpC#r z6Sa5)YAT$IQ9_4_jL*->79EvH(;BmQaIrpttIe^=)wlNt2)F&Qr2ktjvBu~~>vt_N zeKWI#^Fv+;>N(u0!zU6C7goV2rn;@mQglHF?oqHf@5RT|8_|1iXUB@VMLgu(Z0&5b zrF0Xwt*G)t0xLZ%D6^$`z+7i#tuQXQ?s3cG>4M4DV%efl%C3M3vQ5a#%&K$yBP$YT z#V6|JzUjPoUSnFxc}mM~z;iltN3G{${B)A@K_uv&W`3!cpe7R&7a8~Kf z_ncgswu}yWc7NjGoI1^`${BU}gh`|a_XQ+1c z9*|)F#RUDg>71~o%cN!u>@;^TP~bu0s(t5!y8Zf%D!pl^qjJBYd6z#_jD>zmaV$q^ zsA`5HEnHbq9D3m)VZ!u_+1xkA3$+4|wNx+TNO(hF>8e&64_G;5S#YmlTd983lGUs% zV$+sWf|~TfC&I!d=v7kBH(0o|)&H`#yGfL5FsPS$&(`!RzWm0*Sp(Z(0sx{7$N#T# z%RF8k(ceQ~>Vo79q?;~uC#@+U{WuDp7B`UPA<@Nfm15mHf=zVQs5kG0@ioA2@ah8w z>+0?I&<85;1WPUhE^*%5Z|+Do)@M;z-C}oUyZ-hwcguob1}^_YJz7#2fY$-9SnvA3 zW*Gmo7I@YF@9Lc|yY*+^UL5Lh23;04D{t6qG)v}M*U$gu%l;5p76mRkHl8Gmm;6kM$Q0ZdNaGE^^r)QRPG6Q!O~(r7-Sfe_$XMa%c$xa_&5zr5_8oQ(3* z$Vs-xFW#0Bp(*%zWuDrBJg;iI#1b2lAcFTZdxs>`VNvnkVf16I3ZZkMUrgcyN?)~p zr7jJb<@$%<@M~QHhh{^9pW%-1Ov~b%IHeN7XOIHLv~RmU#jW|x6FN73>%Z!;J!iw_ znc422I9dU6sYS_u{YqQ*22@(~?8L(h<}3V6?f6W@vutX04E{Ot#kO9 zU+hzxTe2;FYA#4r%m(azpLfdtnc6?Y_Qse2s58?LJ_B}=!(Rt27X(}J`Lc0Y17FIe zA_2d2_wuzq!?BwV#Yf=0=A#PKY%e!K>nOsLzva;_Fb=aO$q>u2(!(10S<+v;Fl#1nmt3TOC({3>JUCM%r?}}JA;DJo$esfB zr5>stC3LRktf;K%&Db0}RKK#q`7T)XRgDQeWQaXAgIl6t*;EDS*K0;6$9YT=EIgPV zV>{ux6pEQ9^#z-N28If&M`g1scm;pA5IT%!9|DsOD0Ozsjz)FBrWklsVuzL`3p zF60soKZZ&`wErdGhGw=M6TiP#i(O@HN|VE@_Nkd2ukAaT#CdiII*Nbl9AvfE3<4Z^ z+?T6;aS<@b1Th(fA>C}3Cx2OZ>XMI9Zno01X{1%*w~Kv?NBpld4{~eClEMxpaAMs7 zYPE&;MlNy7#R?88pSiWqD9Y!1z1It-Pz48p=9%GpG=7_l@L^#l$TcFkOpz z6u1bvzF4pvG?h8pk(XeKiSBG z`cBK$qD2@^F!)s<5uZb9@dY_rK1I0B7pF!?1OSnPQ-d;NA!r9?S*Ck_Zt{O2T||Bo zRHX>WfcS=n$Bl6f`9-xH-)l5cQ(bMm^R6!!YP@;!3=-Y=$-nK1C%hEeRftO^?U>9E z<5d0CGxe!a(K`L%iG_(VLov@(ckG_I5TSp?s~^RiV?kVzC-{{GkYiYQb20kz6vKaf z>I*ZNaj_#C?6C19@|4_ev4kWWdTGPK)44(g54nO+U(`#Myg?q5i~1rN%ARz3xK^rk z)X~&ii&7-2MIbH9D4W`pqx&Sq0*5Bxaqeoo(T0g&Dfo)$q4p6SuYaiCmNTjsluZ!t z!0C-c>}_WOBUy2+lor=9kt3~fx8-J0p(ik9^uX09;q+L7^!kO$-i`kgz|ih!yhg5^8@2jt_Th_Tr(meg4Xo$=SyaA8`<8eO_Di z0BnZWN%THOSlisL207dJ-5fKiZq{E|?@mk$u?TOT2sy*361he7Q8hhbaIn*315?t< zX&h;!;~2NS+B8M3z1x9tObbzBY&O6IL5h}SWSkX>k6(5$MHs#dj$AiEcYfy3ZEp9A z5#}F!8hb{YUF1Uf(*9U=ymwt_RBm`^JS3zg5l4tYzW@EW`KM7|c*Ct_E->-|4bS7kJ$V99lLGsk*jT({VF%uRzR^_=~#_rD@hI<@87*|@h z>*AHW2t9^=(P$d3i`cGaZOEEHBlK~~)^U;D|sck?DVVvdQn@e&>LmG{E!u81E-4gOdB znjUVkTrdI!diQDE#V*NS+n%mlVzT}on?*IZLOg{rB?_k zZU-V>Y!~R%RfV%zdk=sP@N-o))Qa!1lZY%1_!4i;@xuF=nk4zm^5gc?~_JPD*`AD%Zpb7(?W z<<=f)T^~I2)AIMn1sXHK=T9d%gMYjEjkbztG`NubxXd-T-zKh`esxYFvkpN>-!Cs~nX?GBB9DW>s1THX(B zV}l4jrFFmfw_3(`! zFRI>vQ<7AvTw~;XN1A|!{#W|>J$%B+HG7&=9mgkCT`0lOt$lCH(O);_X(laKNfFf( z@`HB_3rTJ^XNoSKA(kWzda7{aXk4WYk9Rs3XCP4Bq(aipItbXKyS~4?3x@gxiN(^qzJ)i#9}hH+LIq*|1*6sxx51%4N0#9>t8aS-D(%T z8OHvZ|Dd|r4!dBnE8}f=&Mj6lm*cm@OmKFsifelV1Btzyydw=v79lL7GoBYoXg92W zYMpCjgdDq6?2c3=E zRnq>mk=6oV-XMy6OK%D5$rj`NWG)MMz#vL>TX@!NE@8ZO%+_2k;;f~s5}ra{BG99x zG@pY3af-6*rt(A3Yf;EV@dsBwe^kZ-?(KrY!%fmQ6+?Co__IYN!2P3TI~VwIN3M?n zrV&I`bUk2~3TYVs^za;nkuf7O+fj@A0BhRYLm~T7*5d*D89T0|@5No}?Yec}>90uk zbT}BUnW+f$zfkd#CKf}>omhW?tHj9c7g#csm%syk&ZC$+#7pT+Jy^L@*FuZJNDy`dn?p6zcO75HWwf2$RGPO3Ntm}(>v*Bu=4u- zF$d2Wr*wStlvf?C9*RSP|8jq5uC{n+U=`To-LA`g6)k#W{FL~`&3UDmkTt9k) zF>}1@Ve_5qN6d#0Gm!4u#o$VPQ>`<9gWO@oAKcE)3JGlJG!tgZ580|3cej5d?_4(U z^sqc`AMcNkQ)IVr z=A2x1Tti;pH#cn-$uFXh%N@@|^!!?nt8!bQVsIxJ=AV^Vh#~^n9FvzkpUts7O4DBL zTonsi>gl9i**eRh?cS*0pLDB|JMYFsBMjQjGK?>+$<)LkdoL+}d9$SRZhTjalG0DEnSx)nPm*hh4E461HiE zsh~Gfr@y_6lii~C{}wY2GaR%r>Kt&Lz)1l_McW343S|i)pCG~agOx5uZ#Us?ZyB`n zvbc^(zmY|9f8Y}9dt$1JPEW;>9xwbFZZ-WH>$U7zHzCIX6gW~QP=nf%vOEa{NKpOM zRTt)h+n8w zHiq|yJC?cEc|&xeZ4e`ok!7SN6E454sJl3|Td@9}it*l%$=oTfO8XJ$rSU&3X|1fGa|I^$ys?_3w2JlF zBAa+{9^Wa%xIix0z~?9q!THu@fg>=H=%*CDX*jgNuvdtgGj1~j2@Dg$B3}ngcg+!tT^23i|XEAExp-xA<+DTo5DsYp

a}2(RFtHE1h|0U0m#NVMX^cHye!rtUG(0^c4B<;32TBdPd z+TBA(zaw60@B#Z&EuM<52IH(4K9`lk%ksI`@r5BFBp^s84HmHTi8P=5tz>x)zbIK> zp>1Zlv^H& zW3v;6WJ5EV^MdbU-($-L+^y~l6Ll@^OFcF2{=qc;EJqaDvic~Q;V~;bGBVnJt30#t zz+p@^W^%Nn0etf|a*;=APC>UfAoe!2fWG5#$^HPznUqe?6ol3c=tS((paL#;#5-D1h0;9YXJ+BlV-jQ46>k zeWr=tJ_|^U>J}jKu6W9Sta@j{F%xSiCG#pVRbD)sggNbAdA^vDI=j+XAS4&1b(L4I zem^a~D?}2~cZ49ZH3{_ds&?z~9W{&jucazKW|DYkbowFcb(_2egoH=G#YeU|F~TZU zPM>ECr((VDNG^N2=!TO>W)JmYKkk7zL*H|EsytgsAlO(UKb;GtX}0$P1zxQ=rK!E6 zMCEI}Gsn+NSvv9kC;V4?tFZ;^RqVoGc#4Q=C&s|)6Y>{HNC!RI=)|^wTTi4w0Ip)J zg08yHnJHVt*SSX)Zd>&}iI<#*F_QilZlRcY?wN|E?S#%9yIXKn2!Rw_uc_sTABd&D)Rj5B(atY*g2X2Be?I%g|;Lk zq=p=#?kFusY6XpDgy`hdsu!AEe^>l9JI<-pjUF_yNqT@^0jIdovZZ@ zw=rd@Y&Brs{*ju-oPv@E_REkq@$LBJR-fFSQXL{c$%9m{Jj?=r%8J25{YCAuDW+R^ z12Pe|9ICC19Nx?sOY81j%SK=im=Ja>y*agVE=&f#24k>p?3h%A8LSjS1kdixA;HkA zi-}#ikx@xneXqwu-6J(JUvGcD$8>(A_-VUb=9rel(+i<;FZgTe$7090Pf-;nalJ^- z|CA!v=t#glIYqgn)ETyvrzgI0#w%Q$*yo9i=3}J-1V8fYq!sJ@kw3FeQf8Eqyg7K7 zAS}E#Hrpahodaq|%taf~-qWT|NzyFc|*+ z`C%>gcD8kto5;SUB?(TDs*H)lg6dvs_7k{92PSSjOYyE`3#ASMVs`EHV)PNth)nPd z8wYGSo}v|=7Lig>qz-Py+JN0&it4&@L+Bd_B<0cki2AAmLKB(4Ae9bRZjfIM98Z8` zAkB)hs=uyDMwyP5s4m4_s{jPu5ciPhlaX(j*6%SPlx41zd|OjrU|xjI5|+QATeByO z%$PP!M9lUZM#!3B5u00If0M{oDwEyY%6tl)h~v{l71{_Rr}Ir0b)f}ETw*~#L)s1B z9tO!2Nwct)ev^K^Q>vp(&^#-)M83R+- zoVDKMe`%?H{1^I8_G|?I3H++dv!DuvAHo%|7AdN5jserf@~)MaZCP#1?ohrF>S*$` z9q3MYF58+De}2l{nVgF^f6kmSdFu>#eO>11bE~v8yXAHTsm7!ej>1FE~1>ZZ2D24B;NK|Df9j%m3DGn*vz9 zw?w^|W6No;A^c;p!&Od9hyCr|Mw2X`Y{Z%jfI(oE=`0a7_l4#xwF=H}!Sqt?P!8NY zRYGrNrXO!zJQH2V7cgBL|xLY6nncW{Pdh%7mqqR6v{v`RN3+utdsVi(x zXVi|UZdb*CZ>*T%O&8RN!9h@oE(VhV;p_xl$xXfHjYa-vyYDn5&`H}|AB3{LDwBit z;F{ZALNl|BoOK8~`$BJOVpIj6S#@jp&~0O763g5SJ9IqbUYq0erkO`2?kKTO_-0Ez zGtiFJ?>WnN;}Z75WJB?IFCS9__&oh5o^KAc8b}xWfp;;j4l|sJu~mLxl3O+IO2+zo zZ%!lsn8ypap{?Q}aT_!7Ho>H3H@5FjZ@i|*`nGC_NebPGyV0pvPo>c~-`f}4p(lg` za-;?1UIrF5I{-Y<{rB9==h=VD&1~VaLP~O5skU_cfBV1+x>}?tdNlg=D26l{Gj>!T zQ&N?lR~NN%D}6q2t_}pF;{<7ADv;_K&S@S7?ZB|HETpks(Q#efX?`@OLU-~&#kfx@ zwINX{b)OnNzAc_>r%n|l%bzajq+Nr?UNwMYkRJl?e0pj6D+8AkOjzv(=6;xvY)=YO zrQoC<^S&xx5P?JzOkHg9`Ldt%lA-xXCR)Kwx1t-f|8GLBXT|Jy3|>_q!vUkMT+dGA zrh)n7Pb-+KajA#|3PAUO;FOSIkQ2{*>hptivSwXkVWjqfbUV`+34YQk;pLXg4X`kg z8(n8_@y#A`|F|#Dd;k1){6hRN4-?=0e^8N^Jp2$5K=3VyKzWgrNF^n8oq9aaR-ew{ zA{v-6v;JEU+tr!f8_(ij8sA8(el(+kyh&JCzy^W3Mr%+1Iexe!C1%YGd?)Q<#tq!_ zqcTb0+^^D3!ULjveM1v$%`m89=-D!b+i#mIULrtf5#U8>IFl)+zuCL%!?gCO+XRmW z%Dii?c66PQiy^|T7DN5^M}(H^_YDcleV!6X&P%38B~1?-j_HJ8s%04rNfRlZs?hQ6`SrIHt&EmzvXARA zZ_sCL21Xs@&Rl6*Hhr5m%QLaxvq4Gb;FAvgeDZ5tPf*v5_+#GEJWHY|% z#12a(Z6oOl&_;7wsWsF-PFhrq89=MFJ$m3;-UZ)#A8uOS0N-EUF~o9MQ7aTE&w>uq zhYdRnp-D)l*@>fOUlT~U>e8kWT(^Sn2A((g`1v=>^*$~=UXKc=K3A=7(zQ=}PBuQ5 zHoAIF@87C`y_jIMIPo2S?y6C#?q~`dxaI;zW_KgV{Nh>}XtFWopQDrnvof}M1hu~3 zh-=99QM+$mM=MYJa`*5cqXbsz1*AxCPg|lzX5{@KVmR$nB*oVh>D3t!hi=DoP%Holhwd4`J+VtpOU)& z54@poxk1eW#a~nm(r!*6unL`+faxf~?XdR>OX83VqkO2EXp_;ED8?)nZ#VQ>nfoZ*L}b{+IyDOv&S?f8u#j(A{1FSXRk#~ zrUGqS2D&@}SjCFbt8hrdDv~{$9=wfnac{1uDAy=SSIGP^_7XlZ#068@13%}!A5IOO z*O>fZYWgmYsam0&Hkqhjn2^Uf=GC&cDdChU7~!=6kAcMU(B0`u-WN_}e=#eQ^u^^q ztsn=_H^X@BR+a&-Zqf!H8=4M>@pD-QkbtK3k5m)ZaXvl3@<#>Al6ATuAVfwkE7SgH zwPUcQr2I0@U8G>ro6DW2oV*ZS>$uwQK&C0=Wz$D}hi1GEhPol;eIE-_ zytkAXRS(GbebMddhXfYx#pc|SL)Y|!!;{=|nT9?69*X^3+!(XRd#2S*@ueigE{_U! z!P%m@WFv({+0(ZyX8fPVn~F^-7SY&wrngbVG^E`(s@@kx+jFRas(Dp@hM9ha>nmBF z1gr3SujY}74#S7icR~S8Qc7Lw<`5`!h!>&Rm*2HbsFp0j;1ECQiMetE-=sE_NW&^K zVpi_47aRVsA?;zhlX&goVxP&Y(o$+H??|JN8-av8%Iz;gI2gQU(OPbbb#PAn&Q%HW&?#22(Vj@c zshHGEgGII7snkDy|I-l{hENBX3>PN&jnR-N=iQwrf8(Lg38aJz=vp>ht@SVZ8(lzg zm#Yzj#HCjrXUf#?E+Is5Iw_npip}PfmbAikQiEJ#&!Q@@lO$5P-YRd1XpNVbC4Pk> z8>W$evdjF~2Tn|d>eWOAi@?Hg&FEdj&W$LiBL-%rt4e(8A+>YB`6UxCay4!*L|4`= zBT-i~_c{$M+ROGbWgt|AxIz6t>hB{N`n?Z%i0}yNLzA#HL%2*h42X3n5dRX0lvU50 zRv*I$1_mI#B!WGI1jD9Mi5qQv+%g}%9y};r#iwZNqfWG)S37=rh&g@+cjDmqjOdl1PFDE@&&wW&4O=cjjKWY&@>DhhtRlO=V z(%#%hM&Oz;0S;mHiEENexNwo@hT9VognyYmiu_ieoZ+Ozw6Lh`3kTMsy;G)6Yp90B z+PL%0MSXyah*zXBTi=g7I{zNn=7gkB{P@K!$qFx4ucv&hr)c=^N}zp4GAhUj*s};I z!CL&0%BNBj)tSyh5m~FCRJiaP7>YwK2eR<3CVwkh2nR7ZC(0oReQa5nk}3O{=F}g1 zSlRUIB3~A@9r_XNFsS^$`gtY83^$vD88=v9R{QgPvZmarX*irkQrmZkv~{d6^qXxX zPockPmPr_>3I_;?BHW`;YcGbIYkAWu-N+%HKJl=o28m@s6c2x90{jf>KXXt$&Ky9n zkfk2A)|8!lg9QN=e@sS4pzvkA7b4=L-z$=t@(7F-PXQOjzy{46nR+5OsMZ_ z!q9))Fmzo-a+cf3pS@dsdbC3L9;9{K~yYfz_wmRWLvX@=22c*xM>=X1e}W6^YWs8zWY{O}0~-H!!6X z>QDo1YxmQhnbAv7WIEiaLsHt9vB()ua&(k(Vtj`oz+OW~pTfwQae)R2CC1&=JT5EM zGlMT_yhTqle@ItsyFTw1VCH9XB}Y`tCG4@g0aJ*{2jeSRi{9bwr*OA{%O4kR0+5C4 zbxf+{@U`2Ddk!*rOd-a>c6%Il1ik{G>as!gM^>LIukoeAk$`EG8Y(jf##KUUVZbjJAzB$!rZyE7UC!B_Rx4A&7i_pFZ9^M~X>!E1`16?uRz z9N2bYydQN~0DF(>ab zY^3|j0fEDWZZo#UvG%0leCa;jH~vkP2S~%QCBAJ){YT-!dEuB{qL+>#dKlo{?HyRb zx8=J)u_$Ri&aTvj#|kQ1LwyOwcDpOBsc@ErGY08lWJ#M!h6>86z-C)b^Iom~ZUnJf z6T${5Jw|EKp)5ZVylMz#m207DMV>WPM=-`@TUyTX_eC02iqL(|mLdM|S z$Pbs|PQuoq ztVnOygtqujDJ#7XOLiVp$LiFt(jkX~5%i_RSm?uknklwVNgv%T_%OpjTe*+H*aUy6 zMlanrQf`FCaCUxZeTi`Uqm{h=Vn|yM^p{++(lwF&j*=nnci^Py+xM zuA6{+sI)Bi^qKr;*k0dKfkB6AEP|1n4tqwBpMQ+n7Votna)+2&NYLgFQCcCi3+ zdft5WeIB&5{#g>7R8o4u?f?k)CuLe#pO6DAuX_9(~&v zhe#{$OY@$8H`eq)Gw!sF?eMj63T#4NP+AGCRr2oD){2+)HCwEzXD&dAtHS#M)Tdu(v9+$ zLYK~@mV}mDOq8{a!EKTl-N!F&7kwY-&-gi_ABZ=Vgl}lpTDttw!%6P~Hpk<58S%<% zGlPOiLGZ{4B<~>uAw=l?@&r3S*vLl;ElXPkrJ%LTgno{09?io(-NzU4kRi*ErvmqI zLZu12qOw?S7a<_%KuIVajAAZtS z*=zhM@}D2?9}j4Xd%QiObx*32hiB;HQO<1Yu@s zPs0QI7$o2CvKP7N0>jycE+n;JN5=kYUofbKz)M1_2$t#+Xq^6!nJjPQ|E}T;B30X- z1K3{uQj)wFe^FFU6+?pQ+5-agx7FWhI5Sl)4`z@L++Y6pX=Q`(~RMnBQ}E zqh9aB5A6!5a1@Grf2fQhcm^HK zM}9|t#qExPNYfDAJpDm^A|)Kb1??_p6jO+(=Xk<2VdJ1`MD|`&YbAFGW+8N$uP6md z)K1G3iC|#xW{j02DTzZW$!-9El8f>byZPXHc=z~0@<+(az1d5-ca;`&39o_j`RVTM zAUfmW{@M87MyU-SmJ#=X}3YAbMtP>f2`=*V8DyQ|)8M)WKz8 zv0mH_r#Ba~dVRKS9E2PRh(TK7fo_2Vw{RDsjNad4Y~MgPW|AzrccZAlH}07o%1v@< z-+haK05Wgd9kkK;s8lz{S+->t)cE71wB8l?Z1lDn8N~t~OTs=g43ab7Q}(XnLG(B# zS2L22t-vP*7h^RO#P{FbTf?F}TuYSjam=sy?MyVtL-fI_hFdBAHb-SWkFukAF0=sc zghJM-G+U327kFC`6R(x1`?C(>{kDbkXvTfL4&+Y>v`!pMb|sFY1Tz}X-)c}YsGH~Y zBiw*e>1&~1!dZ22Hhd7<(aal}eEBzDINV1cpck0*J8fe={#Iai{3lb6Rb-m0u8|_c zodlqnRVrw6kV3>@!&@0f+S;#&tgEj1504HY`U z4j4F$x~~H2K+PO-Kz{wk!^-IIJ>BI+70GSMI>U1jhs==s5ppMLOvt;MGU<|^Rpp^F=fM>mozyA0{|vo-Pqp<`c4ihq?L9}Oz=aAz zdVc+Lba%5JD(s*183_7h)_5Vz)x4*5uzJH}zF|N3YH?PuV9k2fc6!D7I*#M%F8uZT zvrFBMoSoVrp{7A+^S%h!6z%}zu<>^t zT|XfRd2CtjnPp;)!Hgb1zW%T&ACF(SV$+-GuzQN;Fzw<2pRiR5;ALE_+kD!`bl*Xj zn(sf9*X@ut&ghgSa7=z!!#8C9SnO9)OQD1F=qjH(tFy z4M}-z39UaVRU0F>n|G}~2T~yP7tjk>zUNFk6GAPEQ9Ts_nI45|1wqy?Ry-LKbb(#n z?HA8Q!N$U=%3I>)AOz(j>a_s*V(${V@e-FGtDh}yA0oiWrkeO3u>@*Uu?n=gHx==` zmgfmwP4wXlFjiadd@Rbty3pq;?p0`s)q_vwX~|{?A+b?7dwQWSI!P~3b&KlLsDXsJ zh1+A;oa&~$GA{9=vc#0zHQ)7~UXkN-e3utKlQcc?*ggEH5$TJ_zHsC64KQ5Ii3hKH zFur~F`KVYR4y(aU0Um>d#GfhcG^k=gVB9vr@2pd7_nR9DPwv0Me_W-YtQS>n6TdfR z4}U|{_D^W9XR^O!X?y!_F6F4GxwO*bo2Tg8?T3sj9lkJ?bjhs%{GM`wBP^+y$A)PD z-u*-&&Uh_AWaZ*2A~&K}TO%ZYl zbC^WGQ!0>_V}Uhhy&o00w`|Xk`}At!c=39o=i&-@s=&nwMeD~;vsW4>(-r8$IW`Z% zijV|fU|)pFCW@~bkSC!nQ2~*TL-Q714EnZceNQ$#Y|$+^>)>9C&%JNXmk0%IC+a!C=3!Y6e^nwf=5+Fe-e)K^9(@+uK<2(Na>5SGN=$`iS;!O-j0A=Mu5X?Pan-|N%+p6Zpy_E=`lM-#%g zHztQw8(U}I2h5a%dZIPcNQH6yTBg1_sRDN@`jO(BLvw>e_=sEl1A>9z4t!wOR=BVW zr{^6Sy(fZ>sJGGm9||!vb#BG+GL*&6UZA@fe7ScrAyGm?+Vxb)bB-FZE`TYf@qWF} zC#Egi9KbJy9L%eD>Il6_*WN6r`)f22nPo0whp6%`sX zDjzXY5pCxAX~cN$CtCsoOb<6bd?$^`prG;c28sY3Au~5FXeBA#ha_=S*%SMPL{aao zYh6ccY?7t65p1c(fGx6e++S{FQH7C$=O-OL%@rlDs?F*3+WfZX@<+lc z%UUDR87>lz^56h~v^!4D_mDoJ7x;$vJMwKifIJ)brijtoexc2K4?}6g+|JZv=DMa) z4W4b+f6syfy1`jcH5%$ZsHz}z<*Fiz2&%UVI0nyFxWN3~o{JX#j|_P(eK3hP^ZDhV z;wDr1+GJ-QMt?WVudA*9uC0>a)&%H1qN&R^9g#!_FG}OPiopf6R`#*1V`h_%KAJ`9_*LWfR#&?*$>#u4oV>zdEdo0p!{R$bi z4~4_j)>j$0;*Rw%NQWOXl?)E!S8!u=M4y)V=z`aS`K=y5k--nGZ;0^}*$2h%+}%-D zWuzMFFGot;J)ZBiqUD>GKk2{2k)dMLZXPPqvfDp8qF@-qQHVOVc$YHW5@&|W6_b32 zTjr$eM8Db}yE~(_Jm248yzKlfQFJNRSKFcZ+0K-GkSrHOF9@vIbt&Ub#o=`YHJCM$ zr^mnPjJ0rI2Jh3DMvGs&WQ$(?J6I~-*p~L55nsORB}N`zbc}qs7Y4~ZS`%J>*_9kT zl^=c9#Re>x4n^IMyFT+54DkHyYBEle)(?#@NzSrZo5<>D*5aT>sw+6k z@~Am&$#)HrT%1)|>N5b)$ljWU1}1YZDo`^jt*ZC<>m6rgH24`kgK*@aZe+!C{;@3; z{y#T$3MQ>R(Yzv31M-V{d^61SrqZ3OjxZXAL)$I2tzs%VMIZOx|1wZWz-3vH;ZSWm zy_062p5Yhk4_!P|0F~+TUTB+j9q+0t|Cl_?75yG`Jj;TgKWa4T$uGXiqN`g6iTMiC zmT9f4WmV0$;JX^y?6^m9VlgG4Zuv{NQQ(!zKR4pi*>4T=5B=}*aQNnD7r0&>a54YJ zIwdCLbt^pe8HmU;z|v1MtZ5QZvoH&6oI39P!SbINanN+f>@^(`h6qEMauNJVrhq8l za%_phc}(FkuBdt-sl39@zd;hW#-SM>pO2Q^J>Gyap3Y38C=sog$;`YnMHyq&g(1b1 zzKCgcBP-J?3R}>8prgf-L*~y>wWyHNvggw@4`GPy8Z|uCpGtKRDeR>U6N7}c%v{P; zc)J9xF-MU!bP};F>-4UwsjA-uVQ?2ncML}B40)KEM5P3rrgK9H0v2Yj?}~N zC2iW*WZaNV${O$Lo7tA+;xuPa<_uPsD-ST@7LALnP8FiYECA!+)R#sZ*?8!tSo+#O z)zP%oD-^}@<*G!AhZB`-QWkw{iELy)kO-*;wkFWh&`$Z2(Qq=U6`B*bn$1l~ye~SA zb1S}K8D>Nq8YBV4HEKSvU!pWiWmSdL6y97fXwNFqRtV~=f2L zfo)TJ@+Owkk$#$#G+v*5loyujqVjIZP0kX+?LF-;F0=O3y!5#Art8!z8f}tyzjiL-#s;jfEY8V$GFV|THKCi zGfq|yz6VG3hTjvl$|Rce48Q*Z;*<69>U4x9nd~Hdw&LH;RXRb4|$$bWq6zxadQHw3~eJ>KQ`>h5N8aj zI=~QKZytjRRrd$Zs&nDd+M1_zY1kyjSB|gmDV$>;v{Vmv<_F(^OjJ62wI*fl31Rv*DoIa959J zU02F&7d|IO4_AT-t>{%P9fr0=B4?r%*+Iv_X0ov4>+Buv71r7__m=ZJ=-J?DgL73i z>GAN4FhGQ>r$`^iz-^dwxFIogoBZ?&9C%+fXHDg!H_;%tY*|@ZtrgR4E%x$Q1}?-W z9egReE;aZ10?(EZ+^yC5;>>wG@Dg&36JrgkkCEAYP<&9ll^A{?KGCA1ni7>rMjGI< zE|7+rt4&+7e>o=~AQ9AsW<@K^&KFe~m~J+fhx1>8l@nhe?4D0U&2sH8^ zf1dk_>+@#~?=FPTf1V>0e+&J4X^j~Q@6SU4uYdhn`2X3ayj9Qlx9_PehT>W9*-T0~ zTzNYgRrXq0jG*q{JA=ERw(5WnOLFxRAr!<%m1#`@`^sQi=uspShKZJ}^T_%qI3gZp z%w&PmyKsdqf1?Gg#FbCvUWGO|;I-Z{fDi6R6%_(y#rcP7s~&unhyf)zI@RsP^KaIv zEfl8|UX7`)F3Eh6tevs@Tl(Xfzz9Boey zgF7ouEVI$Qw;eeOtT|D?u2jXsI(!_UrQww~G94P<`sw=9U8O=Z1gAtn!#IY5hSMvX zN-nAJlW(KMk-TY2mTi>3Ibb}kCbwCNeZB#o|I8X-v&0Of0eldwSW0teFB~Q2XE||R z$lRRZ<~(>J2}PPxJp)c552lUUSI58zTFy*S4SvMlo>|r(3fdK%uyjwxIcj zfheB&<1(crYN2+Mu#eSNefWErRc&|WB#!7J#Yi;W>@JB%J&L3L$fQPVs|s)d-rSyLs<*T#0%FgKCRk?vzEtOw-(`f7Rp)pG1ypz)mxbS4I60N z14TGHE18tJC`GLGUW+?|1x#L%Yfb>I%eCPu6%)5nf0e;%gXyBgi!Dt2ghN$ehL@#? zv3}R~_O>RLt%s`lQ#HBfWoOI4CKCq)gpia$G$q7G;cc7NrT34Ziq#2D@h!NjK#Ufh zeM>inEc*-h#5-@vxK5LzXVh!UyS?UeZr4Nso7UD_F(rAL2G~Z+5&E!^LF+`7^XCqjPr4jt|T19BmDR@(&ChK&itx1}ik9%7BAX zSNo}lD_SgpQ;)T|c%D@}9?wP-S(2h1#kl?9a|=cb2ng>tU2S!cLId*!Dm^hB`#&4G zMze_3biwxmu$_LKf;066T~=kolcqmz%HVB1>My7(d) z_eO}oatCNE!nYnBEPl}4bLvS zoXSnwEnq!<`goq;w4zpODs7o~eKspN#vI|GaV^s5D!1m+e7mA5+jI*xoW!Y@!ZR(M zhdL1`yqt5lL);{U z4l_DDzapE6iBATeT_9+FUn)Y&GG%fy-rYh^%^#|KaZ0tLRFN#C^%UXFLsLqFnb9~b zv-AXi7F6uP_p{~uQ<=5Dj)Q}D@Cah}Vp*g!+w>x*G*Xt=M=@5@+IxA6;@%*roFly{ zoQh)K!{)yjs$Y9D8A#cl5z|vIdInsnv|K!WV8}OrwEaPG+r^r=MCTwpIi|}0e$A?& zT04@q#<7lx?8kocxa7DrDtJVcKY%A68k5ZfwWPFYrtxU4p>>IZmH&&q_l#=t>-q+< z^0y!=f)oLjrXV2F1f(be2BZ^^7DPZG2uKMfKq8_jNRb+)mrxQQp(8aS0@7RP9Skkh z&Zoa>z3&i?Ja&$+Na^rPtSQf3I8Y9NXaW4(E1 zjk(lf|KuIy!K0)ZMgLwh%7L<E z`1aQm?+m8K(;~rOm+L~tG=F~JVBZ_9^3vrshqp5S+5C@LSruwmxW1vr>RJ zS+`|3&%C>)SH0%w_>Y$D^^uJFmL%d-{g)E2wJ5l2*Q1XWm^|Z6Z0U|XyTl{>d^KN7 za(|{UGklU!yZO<}(%A%GN#Sy2`WU1V5<|aVx-FEo?cK~EKbZfNU{YaX>ak4BEXjcT zE|+bR`#ty#w1%nEY}t6}%{J4_j|2!tlbKxN+msBhNPV7RV>5)mcQ<`kxa89|w$L@o z@Bpr>e<&s^vdc8+)JNx+catdWoWWJ)j1lxOTp%^BfL-p0ws7UvaN&#r9_lko0-KA? zPRUlxOhkyPg=hJmd&fB+c_Zm-);U$Vs@-R+Yt{fL`pE3O2b~$X^!a*oTJDfrT*cji z>l(l%RHZKi8btQp2A(NdvJ=gO_|Q~RoE)EpTkM&%B!>EMdu5jaGD#atiA&CIU*5a7 zJ-u?wxKmHgHN36i(W%2`yol88Igm@Vv7+rO)0d=Tmr|~=Xe$d4vyhWd2IKU zv}1$~V$gAvS8d;QZxsAS`v_nwuXRZtxkp-@#3MPG#1n@Kb+QDM!EX^-UsM9aDzNtO zo==t0;yY5p2?`HfzZd9BC`gF7XJf*A-o0*5zINs3;<(F;B&SqcOU}+r&&b}z$4p#( z>23|u{n6)|+c~lG>sgp^xzPh)&bGpT!{8NaYhiC))1e8=|g)gfGk1x_GV_%rL-NBNVfahr3lnp`&?D$XzGLmya5 z!bXyE^9T2-=Kzb1bzuv%L|UR+Y?5r^fR|*}C1(LYP#|$l;CEh9*4@rC8A3bXShl{s zjzc9)xaGipJjd4$iK6PQdbG{WN5g+?(7E4Hz+dw6bG0SiX=Iw78DHu3hbE60b9p~9 z&I>u`i&fAO@{HxRX=Y-1#Cxxnwr0rvwL`SL=uvaQ0B+ng51MS@q#fp380mS#x3`zF zM~jrxkdfhs)o#}4!G4#l|S#9Z22Q0 z+*2I#^nJ{IUxCwf&y2ZX9fe(~LBr|Gqr*dMpjg)mTRvL?(+Ib=mZ$eCoQPVfA!@>- z$kjEv9t`-q@9s+&p9I(mJnsJ!K5hzZAHta}o3a4qZoJK`mDM3YNS+2(KXFa^6X3^0 z7@79fWNB}6>t~6`OT1mZOoDZ&4-Mt?iT3C2s$kEx{fSSrWzqcl=@haXBHA(H_a(Uf z8_t%SE9>5+e*lT91Q5f!=*lvj&SbHSU|vvy`Tc60?Jy4F)+V*gu515xuQg+DE;mwR zH2e*Cx8UG|m_T_*d*mfJSm+o$JbZWLrUn~{j&T2D#ouO;+r+c?XJr&K%S|hf75<)% z5``P~&z5X@4C9p}DGgd(*_Nkx8T#&D+6RdwiXP#YOX-Y&$9(Gmi?jokM@u78`NQX! ze$;MlbV)mx8%7pSzs%!pGBw81XK50@iCIa!Zk3QPs7SNt1Utk+r+!n5eMwAlQm;cA zLfF#3e-zDb7WEb~giigC!A2VxOPDg*ihyIv^uo2{vwxw=o>3M^^jY@H(=8>%Z!;T0 zzGF1UCaMGsq280NKcxiPiIkEUtXYu(Q^4>y>QhXWu=?NL3yfMlzsp--DfW;O!!c=1 zrWI2R6hv7fHvcNGEez=znW$0kZkN=yYyC|R?kawjY!`F?{y~r%w~@-gtAkU_CVLaDGfRqNRenubnxdkPvSC)4 zqgg0vuq4V_19RS1D*4l|7zYDk47|rx^M<&Q!xJGa1W#>vPNZz6G8oy+pJdA zKRinT&(#L?Z2WGHfxjJM4gFqj1_6N`P|{2NBfnJOIeL1w3d#W40m%67L+|pa5J>RO z+;y>W`H6Uwnm6BT(i$Psm=<1czV*&~N}Qbdu_*N7 zn#sXW1JX10DH$wVcntJ!Zv9?uwnDeGXlJZTQHkR)ps~zI+(j>d~77wMV~&W za8VM}{kuT<@33B4njq$7-|aTG7=d|s;;gq$5$aw~iz%*u;!oYx0YZCZnC%~7$(T)? z${|zHU87p_FYYUw-jNOVI$J<}vq=U_j*vz6xuLf_P*6dRjEB+kmm_hJQlUMCj>Dwh zXG>!n{=D`>t#T5AM(i=j%$b9IJ}@^$-IyNsOm7PuC1FXtZ%@2$GqUZrgxhW!wf(HB zVNz0R#@?&XaR^}Kt^2NMpURbVPe%q>z{gL;Y=9&+CTG$u<&88CHv#Z{v@dGT2ENLNLQj~xVutCH2$E8mim zT$)c!8ht|kW7xrEnX}rj5gFEB|HEfHA=OEE#ztZZ99~3KkAx?3nl+DV@KDg$5)xJl z#q0Tjp9G4j&%nkS9r~7-HFM?Q|Jq=-yi#VTQcw9v36IadU*`o$HZFxtjwsu1hj2CA zKoKj)ziW2TLu8*s8o;s*o11%nIFF}jnI`x8xy?eCM+Qv{?_%6ia!;MdMe@o^Ifl$A z?EHZ2%OkmOsJbeZupsc?NSsCc@~O(1DjuTB44UE6I*&?|7mt*zqJ;lXK;%S z{Ei}6P}{0u6rEF)VPvtRNb}PSbyc%S7!bS9O>Sok$vh3X6(@m>P3ipFUk2S8bfhAI zwd=9drU2f-7*rs&2+Q$=lp26D9aG<^Du8o^QAEuw8;@3366Ar&F1D-iBf%)f6;@|N z|18qABKa0ZHD191XEdF6exow-R@q3BQ{)!;nLf*;k>>k0S6L0L%$R%rU&Zc6Nk3LP z6~G{NnZt8!-(??9H~4APxiM!)-cIhjCrS)JVu+IZvvys<*EjzrL_{`kPWC}}1vNG& z{E&LI&*v((Cj~aA#4ku1bYs&9EkaG=`AWcSu#pe$9+KH7nz}Nk*TG_t(-|7i0J80<3~&y^>yTd~e%AtfuUr13P>FpDOP)ownPP&)ZH$tI zoT6G?V<^f1I zLD6XN1w?L)Lz!L6P)vo-q#!7LbF-EU$Rqwhv&+}ml}mx&bT|Lv#{N)02R^%S&%XD4 zGWlZ(^HAZ|8QR;&L1ZtJp2Iqx`~S!K#@)<_k{}pWL^FH(PYBgU>&eyRoym` z=*9g4!TmuAhCh)KFW<9tmE>7w}?w2t11_r927bspz?I&Q6>+o$l(sfRn_q}v@KR$aMiKZaG+R_IRgaMOm_LUH2$An=#I`2g2$5-arn+_q#-odz}5yf_EHxV`6_Jf7U*8 zej}f|vLml=@0a1yw}_0hSlxT#^Zy>v%UZ@5BE(<$`A0+6Zr zTRi7eKf8&QYS^PG;Hwz)UT3NaUn&_Fz?T^Ydn8@GOlEztjOrJ{Tl;te*30_OF?xaQ z|35=7$7qt&uBWACNVZtH=?f-<_X+rHJ8+DIYnTly4=5=iVNPY!E4nApFIx^GbXQd)7uKI=$zPj(J;)gX!sN;n;$Lh*KwT z-tF%0CYCrDZ7vS#fB*jd#$`IXq0dKd{WG9zsnaNSd9*S|Eu2eTBmFk-yT5jC-WX_V zh8}%!K%+7>1G=ILc#~hB9F58)51$JWZ`XmtWq}L|+8*fp`gNw62~yrW!nT%2TWaa(QbKpK^nre%p`jnd=!P`m z@CqP_Gnagx?j7&VBPdU;*AnNW+YdWImoj~*Ndl&Q)E<5Trhe4^d!`rnjjvu?jVB1>sQ7t{tN4$ z165EMrrC8*G-qVTELn*nPPUbex^%w;;IV9Xf$m)s1dnBUc7Y`|NvYTDICrht*n|FGmBJj6&;@xEz`V8&g* z!kjyGb->|Jt9qZPfu(jcuuG?Dzl`1fif&){-3v_Z-KF>JfI{e1nRq+j4EZjBEP(i~ zsZ{SQJ{Xmh)sEr20Cq1lXvv0a19urU8CeW|n}~NXFf&VIK9nU+#b|vOsIglPX*bIR zNPjHoQ~144v0!!YC>E$|zQ^an3i96YicSqWT*%`?EHM+6+*y1Kj9E1kc2oKc0zXNv zLALGNy6Gifx3Y$^iR*rBF~Yu`d7hV>f63QZu79rfJJYEa?F3AWgJ;7%wfgZSa41Eh z@TL(sN4=OYcl6(Awzul;zridl#-#LRAY|Zbp69njctN%v`z~i&f`Tp(xGY>&>dE;eC=HUVgyq_61#HC{VJHDh zuCvT@a?_vAzMj3*yMx~{0?;>D5K^ihkoBLi@8GrVZ+o7&zQ2P&46|29Gg(~2>JuDH zp?aGbnDAjtT2_)$Z8AvgGV>y%k{BgYhK7XWR`bit1{sYj-?G3ll7inP%%=%+`rhE3 zp_~%eEeYXsHOS^UU&lKlM8@P79rb{3{dH>Y2z`L^qoONx?oZ`(XND$Y#+G9D5wLk0 zAHzbqX-n*zuN40IAbNfwH2@RZLZ^zKFjrTopvI@d*5R>9#)cxKu-+A}8s$+wb2k_6 z(D=1)BoRmN@@L@Yz61g8zCUIl3mMZG=??v-;dn`>pA#%CKGJ!H7&IuIfX+1|G|Z~k zt2mQ=P~rN9ZdZ8r0-EOT&3gro82h=?hoe0zsE~j|S zMLWjC_WYXI!J}f&%gwp~k-B@d7wCN}qu8{W>WpkW@>x8Yx8ote85u3-`^@cfL_EHw zCv_xTL=o4xf`3HI$wwZYyp6%mdC#zw*p>y+hkl*PN2aT9$ zInZ?pM>(USWIt6;LH&|=#b{mz&VizNPCt={+IruiVbtDEj8>%kn0FgKId*j9)AInu z)xDX>k8wYK33)%#i{bT4>8R4feR5z0%mVlrq@1_8lJr=A6L>c&Xl%2>s`(_W-416o zm3NNuUSaf7g!@QNpckHgm=4VK=;{{SFIs*rXE_DE=o`w7jCio{MDB$^2dbjPtO{Oz zV8RdLkZ`87T@kI`Q2nT?#Y((&@Uo)lk*fw)R*&bdskv<9o?Ber*yvQq)n1fkGB4g1hT(72X2|Fx206SB>SK_oGAV>MQ8>NNCuNuZkO= zepZ543_#`6pZ+kdZ0fY?43B*I0u8q#khn;86DsB1*y)PZy(V^+tOhkw+*PnTyP`vl z$fC$DEppf#FG(=X2DcdIK!4pVmmlSI?2E`;hVEl!xJn~mrd{JwD1l^Zb+pAcD|Ska zTQjsro=p5_Jd3e|pe#;JJjP==eSb!jnAx3sxj?m#31l*F?_7EZ7UsRJVs_0>|0ts#%)csKxI^; zO;I6iLKri~u`&a4nStFV<*?f-gM`IK6`nQ6L_``2?-Ur~M$?2Hj24zZ=J1C0_0#+O zo%bxD@W!+rW--ouPO^$6oF!Z+|ou(P~6sz3C;%C^{%Ng z0DhfV0RN*DwGK1v$B*?U4{gD3ol4L1w*go3`|~T-EqgsJT0meLgU?GA-C5l`s782I>1 z9y&*zPd4Y3>}L$VcF|@3Q!}^(gCebMT#UfLy#svmT)XbuZdn zKy!EW7oI69c^>Ji2AyIjrmq{pFPtHow*U_;-?Xq!hw zo^Gi_6yGn@l=nQm@qz#LQTbEG^KdoeWy7lFZP4<)-LhO_TM^2B|2-*A_MUnV2SIym z=(?K$S-H81;{m`MmYSD^_sYa0C#YBD4kMLyyRGyu{(4@+wDPSJh6Ngx!dUQ5W6{({07 z=y^c=XIhgmEtPI>02@yy_kRLKs{dp8A+beCI`p@pA(N%SBDEt-Vr9ice_BZoosoe7 zobH9eqO1qv;xab@jCSRyXyhx<)p4`}JX+~#6wW0d9jmJHjIOC`U?4j#j{WEh8g*MB z`pEA-Hi?VCsPgcQPBzCMTs0e(vP}DN&zs`*<%b9#wCwUlJ^nh z;ZdHSp9i2AsJF8-B_ZL)(r6_r-~^o#$C`E)fVJ2;IL=wo6~_ZZ+E`n6DgwL$DILXd zw!S33R;SzHJVmF}co^S&3m_2C-m?6+tOt9RVXg4QauXRDGCMup1UvGYtUdH|bGc|@BP?#Cck z#LvA3`oB2>BG)Wg1IPC4zAW#Lo+oY1;ZDple3fhCD>u{2Zg_4tgyDFt94WMuoo{cn z@!*FUE|Xm$b>47%;#0Hw?r_QeL7=Lm!i&5D#z(1&Bl5aNko)g+0Hl8N(vjPLCD3xt zR=XNq1W!m+HL8$W8Ov%=RpF;|IeB88!MEj6EuV6rSuOL2%+QIe!iLV5=vq(s8+W5T zbrJNN&*fA0sko%fh|F5eerl5)g7zWO4s zE1LCm^Xm^_ImZ)C8En;=KeoR z8u~%Eg?vx9FhP{-?c&sS6Gf3$$~@dkz|7*0jS;KrlzH&e({#dn?--=YUD(>B_eJWn zue@5Opv8V{HRKCRN;wvg_Tp#HK*C4q9jg=^?h@8XS+0O9LrALo z{<{x)Q|`yjg0`U6AMmn}s2gmxAAbImQ)DU8KbXIu$LET)LWNW0ED-QeU@`f}HA>I2 z#d|YnQ#q*lr6O(9vwu{XFRB#V2SsteAa;Jv)lKbm?;-m`UNfYZpAEXA8^G%k8Xik3 zO3K{VicJcQS2Io{u_ zR4%#!?-756z18(dHGK1qY^H8(K#!%knd;xI0Lgo|_uhdwmP|u9IJ*KfRsO!jrgpue zMj!r;<_5+&k~MYy2Z2KBCtpGyQNl*^S#2Bh)tN3D;}sFFZmws`N8I)A^6eKbvE#AI z7Gq_X2qZCE`V6OOGLSrL_IZyNcljuwaZXaDV43H)*>o!Dj!b4h&vd{KaT6S&oSQjE z4o=p6pC-yZ_?-WKqs^sXFW0Rfy0Qv&#ogi9qc@7wys$)*Llyi8wkN$H#13_qD zk1v<0|FagPZoxppxf{U{#8RF4VY{H))lHb1BFT7)SNDL)4AD>xsN#PxNq-hEf?6W+ z1U{CM1O>_E7GeTbS{S~aJe$ML9%?Bm@x1Oy{HM@TGmG0)<=x@x{g6T+ZSs=wXmh;p zM)$IBDp1yd^H;AcI;oQ~8Ll^1-4!>%%W}DRpsGAj^@}WzUao@19YC(=0iW?mQ@_5y zy+?P>A?=lSfD>yb$4CLu8|=I``UgECGV0(cRrKeRuWM-Ac?p z%3QtwDzxs6dkBRCw%~lD$I|&a=Un8KjQ!gAhMB1sjt6KVMPPYvZXH=D;)rzv@hM-I zAiIn7weR%5my|Q?5s3?o5)1VDxUN-kxt!&J6V=<>{hL`!=0uE}>QkB9fkB3Lc5|ys zY?l6k-n%b%ITrqI@5U^zoo3N2-e)NB-}YR4T5~OLU!IUlQ1D7zP~1~w@Y|@1C3zZi zGLhH6MN{Ow4}hh;yl^Ba(MnMfnOYXgJ(`l-?>##Lg%;16Svp#`YQDO?GNCNJeI>Cf zuJn4Bb<+d9oq<)qZ#C_Ao~*zkzH`n2*S~b=Yl1qo{LS}D4Ullp@zW!m%A}xd3J&hW-&4%b@X)P;7@fpwF3gRB`iy7}) z*G@dDhd1qh2zUg+``c(RUx|CB;P|jqWK9;k0Y8dA0nGv><6FF|g@eR43vOn71HQ`^k8G2#C09l2@ zJPNI;!;V&)H+ni6IllFqp>WhFTdv@ZXlp}C-WLh`y*|J*FjkeNIk*b`{Jw@*{|`A` z0*AH8oUPB&UN_i@Z{3r_RxT|%S8sdW-?B5Pi;$=IR6{qGd)CZ{NyF6wIw^3%;AzILDLZSKLw+GLveLT7}qgFb9Mc86|D~$ryeaPuC$j(qC?Wtk{ zBD}^EtY`zGaF1mwD(-(kR9Aip3ABonm@$pp44sq}*N7a?2`)Rtu87c{j_=eW7qU>B zK)B>!D*%ps8zkcMraELOU@v^W=sB614*a*qi}{P1MPA5SEAn6Mj$ZLY8jtyqfLf$G z@KP=LohaK4-@wLbD~V=gJ2U){u|Jy}ab9z`Nj)!5&RkobqHKP}ccq3RExCQr3m=Zk zQ522Kx^M}RqAg1z2cO6SVZrtB^%YKouQReFlRxTsOzDLvAhdt(+5+X%baX!1fbQST zE>{iKz~#$KuK%L)h&?%EvkbRXzNtoh8&qY*c!BGQ^jw>`S#3$>`$M(|?prch8j(_j zZP0IpML)9l=mA+k^01^@c4cG?D9f{Zi*V+Y^-`i%HNwcn$qV#Gn^DvWkLs-s&hB~I z294f!z7MWk9?(cejkDv#&FPD05*atV^V9-x6=1?4JnYiaewo4$OyY8!Z;d&JAY)So zTr&xQuisnl%G+ePLQ*VFCs9d?<{k2gGLfaI^bW-X9cP5E(&*krqsgfzb_loB`-m3N z^uD~=83w>)sdzDHn)3L{<8z){> zke#|_9o}l-0t&7E9cn)iRtLF3+2G4o*3CJPU=!t?D;OpVxQ23zk zU5EU!gJt7L=OTVhVPd6fT#X0SjMni3QDOf^I&au0E44Eheu5zU>T%<-vv0_0}^Wct7G2A(CIpM&Mp(S=J z&*$;@UHNQLh~#6`YYl3jLPiU6H|!!xLtDQ5g%QJz+<10Ha5ZoWL(;9`aE`e=+K0qT zo35OlZxw$O8K#od$O5*`-Sc(X*^g=h$OddmbhkM$-{KQaLlr+riw9MuN;6C`m7UXg zX>9a@iCsDHN;&QIfs#N;YP?rEgrPC)t}wZHf~??p7k{p5WutvT5M)f-ARZn-mfZ>H z=ODe=5H0MBB0WYbzAM)Uk;zzT16sal1CnJQSsqLrsl9y1v|FrPYvpQbjbiZ&3pcte zcl6h(m47m<7Us|0qk?v4HAzUn9tdr2N}SZx{?+ms0yG+^*?9v*L6PMMG$ot_s^V;a zuj8MxVp_Rr##!WBps31gr85=NTQjkhqkxIlo>h^t2=00MXLp?uSR#M|9+D&^RqWYe zS>>_n6M^MoFND$x<~ak|dwp9tWTm&FPxRYFSuhpR-)9^Y}rs$?E1< z3@K|2pa9m@2i*vCZfv13g+g!K^MV4ePLutpb}6vJ4a7Ys+Cw$d^F0Uxn9{1OMhQ663@|X1r6Y#X|KQaS`sf z+ZA~%00#l!;?KKT-uVeLS{8NOZ6{O!UnJhg&mJ+#T%!MiXW&t@Qz!!py*)mjsT|eO zlS0Pz<})MvD%y=7u!oVGCs7OC{xtVJLIo5yu!OvGb5+B&-?=N4@c^9oK-`+x`^QKa zwmhiG7~T<6Y_#o1wWQVe-a+EKh7SH*H#yAQUO>wr8MQ#L9h5y2^saa$9$$U8==K zUW{5y68~=al9AOATl1ggjB^pT60Ch6l11G@c~$Zv++VdTCIgvEI=MOGbvixqh@dM$ zAGpk~NE0WO1%Y#pOR#lLFR!u!|IBBqJytzFjIr~BNY0o-0y>L}8it^d{3{NrJ;gh* z2%u!9z6^VNyZ=5~nQTC@Pb5yC_uKix0h?X*hwn5VV$AXFJ;nEw>3tC(+qufaH3nwH zp@-l8AIXTrsjuH}fn=$Xx^bR^*QanDW(XU1DEv@cgq){snAbZSxrbb*htJITS2+Cg z+!z*{eKwSlWg$D@9xVq`(Dae6Ng4NJy|coj$d!hyx#6{v;(YL|V^sFJKEA?0^k9u~ zXx}28ug>ngMcm#==#|VLZ<52ATn|7;NA8Y2a)#H$ky`u}7UDPL)Y#AA0j+_p5S^m9 z{K>LBXzTuhG@lY;rasA)6YmBw--6mn@slHR!kk|jx@u~WIj*z+piDM*cd8J zUx-D1oM}D4H88H^DJQRV;ikLSbEN0Kjw~SOjU*1RqVt`l<`j^tBpMXBaiBQXV@Pm+ zePB~Tt2p7(Z@YyUq*|_U-_j* zsj>y8s&N^oGC(lHtLOHnZDKT6IHg{{M@Ts)oZYq~+R9=1GUmToL<;5Yj{N8*q0kaW z`|CFD?~e7@)GWx?+f|aGuJciggd>-W`2UMSkgvr3`ujv6@b$QiX0R+`&Vv;HR06UW zgNAuWC$jkcEUr4dQnEJIML1gQ+=odowrDP;w z`?FvY{236mgYK39Zmv@EQ8kI4@_@Eg^lWJ6eBeZX`0D?4Exh4D&NZO=Ln)YEax#7H zL#DZ<=Nzsx)N4Kd8uT!O_X-^wf-sfZS-s`vsM{(N%e@crD~B&x!>r{z$S;E=kKqq$l48!?~ua1_vM;* z0r;h4b_~Db)CR?R-+lF-v;V^3g%X1HFs<)R_0qYVaWH-Aq`0>=wd7nyVlw9@X(M)z zJosa%_f=EA4%N2?e>0^XL}Wr;6dikFqIUiDb z!hsmVztEm~oJm<=?~D6!^iEELpFWqjL^ez?_@>)uv`J5^{@%L>wU&@lWjy^nTsW3d ziz75NR&KzRIwPWeu^IWkMU(<$zmE3`Fw=Ltm}{+)H(UKeKFml8JEu2%>@8km=TQCP zgXnR$erNgn#qU=x&B!Os+P9C;8GRk(l+t-9`%JqX;-W#){Wz{uiNo0WF6eG-9sj3} zFTUa6PxvEGpH*QrL7r7Je3JUwlV(WD+!rW43KjgzD}Emr$aksqroB_-RpYu_l-Nga zjU2xPf(*T)zOmrxhbmbuFR)II4#oMDOTs|iX-&`nwy;Pl#95urVP=g!{DAs*u;4tu znCep>W-`Bs;gZ!8&x6`{Kc0J!@Bcda&dc$2?v_9UXZ4kYus2)X`yNL3C+wiFtj^z? zD(Ony7f9JZs!aP29Cg+0I@b(4yJ3sk$fWdHTZzED6x}YU?+Zri$jH1y{`D6sTY?TX z_R?v~cuR@14lgA$UzVRPl1TRPnP4Hy$A@ms-^r~nkXzAC>ioI zP4k@pJ*dIAlPC1A^PeZ5Qqi>3@jChP0}xKrf` zAOH&guDhcFL<26S7ht|?=(}B4xzzH8D{XLLQwb%Z`m|r7Kp@&OQY$_0v8p=OU_kQ&Ihtc); zzHtgo*h4x^_1RxaYBQH^{LTwWj0+G2F-FKn9AWSO2vxmSF4pxn3HkNrG`)hu}NJRP5 z%z94Gr?+3$gi81S`0RPgc~mFUd&ur$SVfPW1fC$aw-=>1HV|}*-jsE ze``uN1rcA^b)9VZ>=ipO{bPahrU{=s*^}QqY5C;E3DamvC=+M%IF97J zj6PD2wN8vEkf+5@SNQ4K<265ezcEA!1kupk+{~zzxu_RkWD`FI*-CVbkYsLC%PLAfb<==|Nj{M5gGoMzb61j zRBD(Y9&_xS0Z?>){OK!H)>nn`B%8>;4vGDzMZlt!_+y|EIy``C0`2$HfB(mVtQqMX zAQ;CDxD%oHQd{KlXQdn&wm%82x6Yn83V;JwF~n_Mw3dZ`woI_59#t&S(M7I&_VYPRBbGExj1U>gZuBz`r%8r{xy3?g0}XStAN=M=xyh)kI$Ok zkEi;j(T?N)B1h!((=!hoF^^yIx_I;W`xV7G-+{kWz6>ZT;3iOQPCL%){rxarRH^?L z{hcv8(L~S@)6|`bu=Z8p=9WHw_SASf@P?=Fzhh=rPr%^SszS4$6jdF%t;;e)68izW z3QQYZT*~*Q*RL{)8f#$B32VGpIy_X|>g32Kcl|@e&zh^hjtBa>QNhTD8IUNU?R4>GM%S(PNc_ad(9rC@GZ}{ul+=E5w0&J z@|x(M0w0%eDCZCtmn%RaEzn;25xDTw2(RrvkGdEpgmY3~JH13i|6(9tp8WTM53g`qB6;U*6R65&fDB}P;-`@?GjdZSky?~Uie;yrU_PQUS?;_4_FJ8PP|4**Sg zx*J9yK=B@2VTYP`^3D93kt+%(#xE>wUAM|Q8JM^|Z2W1;`YLEv;hYGga%9UZNb#vf z^;M;Y3sz}o!~*SoCQGcke{t3Ilc61_N|3{Z;xwSR41)1o8DsY()yoppvZAI@?+Cz^ z2GyA(E>Z5f+kaZRkzVn!H6|JOaf1{$@f!muD>(_rE{BSl(&3GCUu}BDH!C^W#gOre z45jau$Twr=)v7Dp5f3!82&FZTtJ^tnYXRCT1O3W%5L*AQ*$wwR-ozXf*Fwe{dT9%w z7DHOG#GF7KylCE+LBly)fIr4oc|V(W64XhaD5)-Alok2X7zM->rf%}j6 z##Qs-mEthdhKI@1Gada-!c;g2)grlds-!qL8sD8olv39--= z2y)IL_@HedYnIzb>&qvLbl5btWY4FwU2|prqjvR`@iqstLvQtXeVjxw^_=3&5~aHH zpt>e8m{nD1d1?BL)DnB~K+Md9zf;F%19_XTuPJPsYyCia=!IJGg}j35u=@5wlmxtK z*u;d?$4Ard4}@_ql&U2eG~r4!%N3XvYhH+3j1A8C?R&ur0uQJ79C1Zn1s;SX1PO0a zRyXX*xaEhd=TPi>Oi(t;ku$I6ON{;dHjfEClLzg;9&V4v(e&t&{`y7==!} zLnc>leT{Y6*TJt`OsuUlF{VVs)|5XU4qz_cr+O}=!s1IZq^hk@V(qgJt*MHKspC!~ zxfV6XgHzSoH9fw0%h?LK{bRj~QG?QKaM11;Yn==;Jpo16a$PwxTi^Ehsmy{VbT=b$X?o134NZJShUWAnP! z?ijtg4q`K8hIfxfjs%|1dUZOzsN#^X1MpXYD zKm0xx$-C4;J>0UNkTD)2IAo#Q1?R{GNMFZp2@uS zhYg{7JDL8nis`!=dZp-FMjy;`7<@K6{W|Q|zHms|uQIz|(-LvZh>v9HTn1H5!9L$``9_z&Yh8@KdV z9ef+_HKmzXksSH}>xN8rR+f6{=|1HpX)(m!nUD`yOp1?V?(0WEA0*Zw;!_E^UXoU3 z!SYzWJMQN!`fRRT{`g581YRFBtiENx@XfM~VDJDw?{Eq&?XjpIiq6Hh!R^+_aE#O{ zC9glUE4-##EmFH)`(A&rmR~f|t`Z`9^X~d{dD&@>J$0vm-~%#pV>mr>%ul6mTwY&$ zR1q>u-G&YZ8*K~=``e|Czq_!x6Mb^?Ig0r9MSaTw_EQ|BQi<^0>*KydFl<;(jSr;1 zVv*~Ui7?VX%b(R%yS1$@IlX&+35CYllEXbAIg?pg8Ze*DECKamFVAW;F3!cc6hd9R zCro?nU&zNfww21|i+%1)RM!(2g^$inhy@ko0cjOBhaz`}F-w}qXzI^`8$Rg>gHEAU z4Y6jIv8thpeckQq$NCI}l=HshfYw_Q;@pO9UeVsL90C7K3gF@-nnh$%y=)_JCo~R zjG>~!Gxi#3#28sBhnZO~oOvL)I(DIENM9R2mP?D=V_?N8jvzo2p6Ur5k>)iWie265 z-5~{ann_dXUPwKJi><;3wlN=Cti6#}b~!i072`7}gFOh$1W~9}5`xNE<&G`cY*m4l3$#&z7t+7kJQG zl1Lg_`|WA?_;7XT^nAtE7Texzhw8CptPhakcc;y0E;Fa);b2jDTJsn9T=h@qgo-%0 z<8Yz5t=}$t-VetQ=b_v7TNYzRp|bYG5BT}BAo;Tw`@7kAU|OmHV_pj~G>n{e3RdHG_My?IAzXuV@yhA{X14D(_4Aj;Qxd*l4#thPXC7lU6E zQ^SohGi-b^zVoY4O&YU!P3GEA>dIlJfsX;+=#Y}YvJ$)e{cU1W98nuzU1>TDeJ}09 zP`Syi(Y(>Xc6|^rBfEIl-hQQWK1kn69(`1Esj%QHC;?l9Q(2Or4T=q*d}fph|jMHWpn)MGbRF5H;|QL4j0X$-Wi)(hHkywzTok z1wKsF%<~E@M&EMJzdlxPc>2T`5-K?bF)KOLMg-V`{cYIZeD*=%tyTJA0`kjwPYskG z#&eZJDKw0FYPfQ}K(9JNUPr@r?AkzoFWw$hZiF4ic!yWvQ19{bzQ(02cr%Pq&Z5UZ zqabCGIsT=wR2sBXjl=U<^;vr@gg}hni@V9bLmQxKxY^q{p^8lO z4s~i9%PRi@=}(&QmQ1dkOLkO=726pb$0_6+Zq5^KoaCbDciRUA zy4~e_uWRpXE{ZS{bjQ-9Ogx^J6xNyOBg~qC6JZZardS;htg{rxSat?~?20cv>bpEE z_oW!Ak2z8%1~y0vvp7z-1G&;E#o5p0+>-hDh~O5m=L)^#3>!S=$IP1}!KJwn2jSDB zWt+nc{`@^`k;Oirv@RSfY|d^o-EjXUj4`B!?Yi$|OYclajZeuz$6H@)n+EUFoDMUU zSlu?6c{UeY$r95ceifc;Uxv)C&-$R}EAe?N>rD(+iFEMG|LM(I7vOuq3IxI`$lOpY@%>r7@Hmq+I7YVn(%Wxzc zOpZ6hI{2>V;ItN824Qi=m$N^1WqyH->)F{a;@#{1$n+tI4$p;`gAfcwL%sHITo(unmXVzSePVrlsm^6Y$>sRA)m9>PFrlx;Wq z)@*^FvZErN%jWT4zG!1@limLl*fSYBx=VRL6+-f*`r0x5IgRg9EB4=nk1XH|%oT~< zjAi82{{O9|>yBsh`~F>@wyJ39Flw|`wKZFNwN)c#OC*b5eTL4R&#~`=!C~_j0+hK|2R{XB`lrR(tWs={&-8Atf<@V0U}na$ijlf{%=1szs_5m)^0_E zotJ2DRC|{Flj%wxg~e5Vaq(i2{~n8~2L36e2kI|y?IXt48Ra=;DZ#YRAlE@1jPwCd zRh6}9&R1;{kSobTJ6f+bs+E54mub04?@Ju$$M@8QRL?*v=8fO?IgNaZ^|!othj!C3 z&$oLbFi*!!f33r(-Za!-V3ep2_8VePo@fXI;zPqBsHFSQ1;j37oO9g#Ilf$1UN8CG z=J=H4;5_<;LB&%eNqXNaW`q2!p>GdC5-wiLll?SMpuyeU=Q(2>|4zZ{Ko~DgUn0XW zxm3gD7iX+pqAL9Nrh2o?gR~?4>K%&IyT?}ozz1Yx&Z5A<{%*t0<_cw7mg+OJQ86x9 z&q=TCo7tfWh03fgPf??i;@XON-*UXszh$dSc&ZgX?izt*4PF{_lHTEhHZd-sSwtq! zC=S?*#oby_9~SU(rf2+%_ARZKu=1B*iHpnpyg9>m_?~8!S;&)1yeGlpy?Xtz)v9!o zz0>#%+k+B&4-?`A05^LL1|}4_|9FGEYbj&QX3fqxd|6?m!qD_)<;_ly&@8oe&yjtX zg*XWZJ#Mu^i@0*XtzkHRA$2{SiQm!Th1^a%$8gQ$hC-`i@xJu7)j&g@_99&nzevvp z<~}u!hRiNppTg_+oEzq?SfkWC0&)kcM7^^ zFK>c#+#TUIhjk0{FVA@}!jU11xXc}+{!1G>4OIvI^(EgKD>b@jd3cjeQLP>u{IYvM zygb<8klwjiMU{UuqXM!9e)F&I2VGzlb^||o{x|v{umf$>aU&x!X!|O5>=L)2h=DoR zK{gEsj=kDmBn@g%zuBobO zbvCH~1f)-hUFGBaeuy13@$=4(l6`Pkd}rM6Ia>XVy}a3GRqrMd-Myf?5BGE4e^_aX zS3j5p)LyIdO(2wZ+}&c{*Ug~?l#D6%nG1$)JJ+=%MHgWPB(7g**xC85uhFQbn+GF~ zxiOo+g1$cJMeD8WJsM+ zAhVV;#V2|j6qw}@9Aw~qC}!e%5MVzFzwj^f4&c9Zm%+3=zhrt_;I$p4ww_N{GCR@^ z=T7prE#tHKsvavL%?^F0g}VdknppRqod%Y5&nL1n(gQ1X-_=-s*PxUsGIetsh&$k26~);5>g=?{26 zy_ZpN+RL2{u#g{Cn-MCv99zXY@VelQ`k~}O=5tA2)smdRm6@SV*|qL%TBhZ7WG&+e z@z()+@xqF7Mwd&Kh&CBSjj!4q9I`53jP#~ws*-k`xdCvU!;`xmf7All7}3PAKu4w= zrQyv$nNEbDrjtUN(N5OlHh)*25iyWVUpw1<`wnr(vkDj_D4$b4_G_Mj5ExxzRJ2?^ z8HA79cEzKOPMeE*};Lu_n)SS z{`8##-Tc#emF)4aP_7P?n{1R1GDzg(CYt)C|8@2A8a+w< zT?1jOB^FDDV@~gt`dYl_^IMWd#Ky&p?OMyIPTrVpThG=U_Xa4B2V0q3SH+{dL#KO| za6}n0+CJHHK7VBs-2tpmMR)s`1|Pb_<8BY9v4nE$raNApq3s0Xs=w~$@qug2Wm%jT z1{4c>XJStI6DBaIx=2Im=$ulb7ZKDO7sZ!Y1^JeDkKVS)*=Ka%X*nLefNiKts4WQ7 zbnvSNE7h)4a;N!q2jxEJUr|rPeg(~?wjSnsF`3qM47@)$U260p!1-ZeE-c}Lm1mYv z&UmHu`5wL4Y>Pi_E3}v8!?in6FY0^=2f^^s{d>(Sj;3Gd%Fku2jaL||V-&#ZwbZi* zo|8_hZk_+3%iu$0Gj%DjeHKR4HM^>9h0gD~r_WPPjhF24&c#FAvphF7RM%%-P;`Ah<<*TOt%;4aX`~3aX7*)7C5R-1}9qB1ulq+zGb0k5@1m4|c?gB;ZY=A&!e5 zmP0oOwhwaq1tPy9(~*Z0cucju!yjtxS=hX{WSoUD0|W{7u`I7}PLnsuFXaX6rqI)t z1gehz#d@v07VA89z97@_;F9OAH5^ISQZ)~Qd>_zy;DoIrlBcVabw*Z7+fv;u9JX^o zJcxc(9Qf_rHXo0-6MX1$PPEMcg#w%C2GJ98`A9y-pPEmY2cFa z04vG=ICgjn{$aGXrSc_vio&-R#fIgI{hp|2_4iOJud|ufGd4nVBuOdW@ju(utb_bn ze8X5hlJle>zbti8Rl_LO6GQjcdP9f0C%Z5wXi$2GIn7y^FHscV)d|#k=#VT2_wiD* zGi=7upzZk%$!R&>y}MdbPwN@?gnG|g3wse!oqo=1)!ptU$j?uu*GqVPQR(&a+m7u~ zM)C~*+hnTF6EklK`DU>d^953^VY2I)ppCXW&;yFf^X{KwlqERPDAo%&b-Isz*NXCN z&@`B0O?$g+eNYt+Di2UqR@rPjuTn+q9q4u8DeyJQhwrM9(n$|hJ$>=FcXac)J_`+d za}wcPwRXQMQW_6?F;xY)*PsHnVTtt0(AS7sYFc}biF;J3l5UA#BtB>>d z5~F`pLQq0EIvhB+cYaL264U)OdBNXPGud%VMf@cM!$`e=V46Mu)p$nG=CAb<#UbTj zi2$qwF(B{YW7*+lqIT2`nu9;~X)xAEt^RLMmoYG+SN|O>iYDa!O>i`XlxJwL!u(Ry z>X#LcNAh13?Nq5VxCVm9Kw*mGdy*8z>Dj7(*NtH0#8>Q+K3261rA(OKmVeNOm8h+q z41TZ|OTXN09?%-FUS0CG{!^^*uzT69%td)QG7?+0`IyZ z>q&TIZdG!_Xb>8hfVMVd98C`gJ3jNP3P>66kJnQlFmlu<{_~iWt#WzVUF6qJ5nEfy zq^_#o9yy=~Eh3f2y3Inl~|c`3+o$30xn)208Wcjn$N)>BOM`KM zXzAYE1buKEe;!yF=n&=;^tUbM{eH1$L(yqJukLfZtz`#FW{H`dk~{^jkOA%AcTNQ) z9GyU}J5Twi5UT7F%lNl*yvN_{_LMdb&R$_)7OySTFU*csEy|nV`zm<}ON;>{lj424 zIrG3WNLU-E^vtiEzRQvo&R#6Z_UB~KUL~0ic;28W0wO>u4r;3lM<(G+@X``A;uWvr ztG}TAqY4`aBz^c>Mw=Pk{!>Y2kMwaiB0vF-u>e5$xFrClAuu&~TTkolhJ*X1v}M1zdtfP!yaO%de4I@>mJuaPavb%O?Y%hnjm_Pgfz2k2vBXK<~fwlJan)-x$0>8L42P#LMYd_oy z{mFW@&B2c%)ot>5M{^X2D{RS}d!z>*A>8eenekoYyIMBZm#&9iY-Cg4gm_cD4g>y8 zg!WedMe9|0&kqP=qmL>C7-$W=>OsHjZ5uzRdd&7%WjBF~gt#l37S&sN9%`UZ|3KZ1 zSu3`ZNW7wY!#z36DvKr&L0bzN(2oXgKn+^=0Bja&WKT?U6;-9>POK?yinrXURVj6& z8-IMNKIeuKs+9ygmLt#BGkrCDQO?V9jmUuc*4`^3ayLKSe}tUey3dmr`^RjyT}KGS zH0v_WSbG*X6b~4wI^kF3*KtZ#1Djp+Zs8zgD zMB$xFE55+bfH2S?yfEs=a0~B3A=*$gH+FH9bg0T4f{0d>p@Cq1 z_$~w6it%J5_+Wd=K{YbvQTMVvCWG|gkKLb3QlFi{apiaTk9a3`P=~4(2ayL%en*jGJo|H8x zCi>z{&qKdYyOGwkfZ?PkV!+utWYlpcjewUXyzB~|jVtd@+B53?i)GlTK%T4B8xzBW zQGmY{SgBNyGmg{;cX-HCM~%ekPSG4T=Bwh(v2=NSrat-qJ~!5 z|879}oV&Cc!Ja>Fm_F}|YY^<067HWUq~a`KR#Z+gq)$5M3ShIMJZ$t$M6-hjm!MXI zo!SYB2e^dl9?K*aw_AG5MYa!Ha0m9Un4#6h;Bd^pEi)_%lW{ zy!FM}p!Sz~8!jKDaR(Uj~9gn@7wDiCfhB#NZ_MtIq$TCMGx;Sp`wk}fg76?U~ zarl`cmduzVA?-anx~bY8qIEOe()~(nvO6~!;pZHD)A{4uU~kwXkr>Z9*m;-`g^YP;46)5CJKc8 z54uJa)kJG%P}Qd)`bcfd@FCB3mEJ<1d~sPj97gm#>2;VXk4S%(Zu@!YdDml}{@M`S zX+E;rcHMef!7|8{`{uPqx;0v;Ay3?FyBa-z2D$n+oTQGz8V03ri9x*@aJw`{1>ZD-_{sNoLnM!Aeo{i6v3A90>81M5nFV$Vad$N3+6wY8>bx~< znibE6-I&erC?_^g>i+R1>}cl+LqmOiJtC8zR@hx_Nou^l@pMEYMIG&BBJ6Rf7&aK? z{_FPrBeDWpoJ=*>@)A(?k|=3)qZi{cYm7itsePKPVz}w)+x<|C&e{Gu%dD>+Y3BV0 zRXYLfG%sR^HURPuJ|iVk13;UKb5-;1lzBZD)-pSuh$B>cxnzSxG*^cZcgvGeM=`n- zsh!mc-9cT|gbtlUVRuI6En03Y6GY;QU|B-H*r42lRZ?2vl;=6Jwih2A=dXRP0h{;> z0ueDzKSC&E83c7zzTZ~{AwR5k+pyAM!%VS*(h|`aAL1}Igbo{y*7sSpDVVU6%~#m4 z+u|bj|4e$a7k|92ecqppymdv~sZe>r*gr(Zc+voEzee|I1dobY_+vwX?&VXOli~N( zV;+juG^~B7WMy;evW@&Ham(Wb$KqBLd&@|U?D6c-2`qy72&L1EW%lBWU?1!qN8n;X zt+innZF%oD6muYj(S#|7SDR}*2 zd4cZFM$sxMF-bqON7p&P(O2rzC!IEMQA8&9wB1i(vXTLHrnjLGkt=0F>>ZrN*ZV@g zE;;=`*{LM5vq8ZeO_v6ahVJ1)$>>c)&HNJ$l#fAzU2TFBQAAnrj<9i586OEb2^>^^z{dn{Bv6u*DOolQkQq9cHxP%Bf zMEN}0l*^7+P}w&AWtY*N9i|Gi$sx3J_eb6Eb(IH_Dgn}@pdt(_qVrCG^F<3+!XIIX z0hgFxev;E86y?%~!sC2DKq8USlH0xu{N*r}M3}Y|>Y_GiPU*UR8FFGMqr=itb|=BggN19Oj+`S5 z{UT{jN(j5!B-JH*Bt8MiLmNjzrqhb^N=#B(cex2sge-^Kws7x=ZCiT@TILAouV4?T zElt(;sbF_ip5Uc}w|F?f<)+=q4A;2k1pvV{iFtketA;GdP-GM-R3GPye3#sEyOWSr zpFI3Q8re|*lpqx_oQZq=uqLxDHt1Fr)-W)0?k37KHq%T{JULNzhlissI_#`8QhB|! zO6ol1h_w?%kIyRqct>FkN>?o_6^q5D;;5Tku{vB9{uf6hl>wrZ_$KDIs}8kDrNek< zh)ANiH7P&5iczbDeNIsY5uOI?h2DuyU+zCIT_c}HrCWFMz;s_?X>RCKa_L)FY zWSZf*gEtvDM(9qdrImM`(=fgBm*D?qe7e2tWOs`EQ1ZR7WC9Q;O0F^6LzMqUemPbI zn`}XgJcmh^bG-QagkjX%K{DNzoh521PERh%Vk08#%x$>}<-X>raF2(RvW~ih4Qmha zYkAL-*yrOE2w$9J1G?~lwRg8M;>Qzjl48{A-)-nvU-UEiiSk~gEWUIlVvCcizzI-_ zqW)wo8Fr$-3rlc{PBFOCNoI>)?GVv=;0D7Ah3{Yni?dJ^5j`a2*hSBfNWY3N&uSds zzUat~y$-KW>y7|zbBLH5BrKghQ=qUxMLoEZ$MvamW`CPuSRDDM;_pL_icL;Y{ut^!*$3YvE(;<93&`HKvfkr__fE7Xm|E)l)3 zkW*oDR>hcE<9#*rG}-IAo^@C+k>an&jwGFi$N#fnIrviSAep*aCT@`Qn26xI+O9JY z)C4Y&Z6$unu$MPidiF*i=fJ_@(6zzA<);*5BQgd@Znqk8ai}KzFQL?JL8qndQPJCQ zhE+~ZbY47f5QgjRp^u0`(^}W#nCyRA>j7^wAl2->`W9gtii6<}$MSQ!%-7_@2M;R# z&>kg^m&I;yGsQ_J+v*dGc~w6F9;i6=K5g0mZ5W%recqZp@Swe2;6vZ>n31FV-;~Ac zup~Qmir&o#+Zi+4TQuVo6juM_?){p1;OcCtQ##lC-UvDFXE@g2bgX_N7}*4O3{Iz7 z)V#7lhz_e||CBtY^l)#SR4Niz$TLjP&Tc@KUv?b>^jEt2GxmN4J~rhEI>oTgkT0U( zbdh0t#mfY-m?;08(qnt&6#3+FSlL;=eBN-SU!`{J;@*#2SM8mO2gw3AlT-EosVM)@ zuR##96w!I{tsm6>xB1L>khcum!C(uU_Eq}p9NEnivA*pETpq?}W%5}rv(FnfhuMh4 zOxsa|(;Cf{FE?CTKN{eMFh&U*Vua}dnS9dCBB7+(n#$dxBMK5Al2hnUV4nytGH!vC z#Z%_!O@7$IV|&pDG#pF_lkau81a&m8-b+6NDL<$)x%sJRqi%SUWcOuO*R7UnDwtIp zb)4fZ;KfDVtScK%D)Ot9HOsA8}&Yq+4c7^nMm#zmQw~0eh4#z9qXE2&qmjLSK zQeHtUete1$E2r*Yac@w6^$kAR|93w>FqlBHWaSk-B7LHZ%-%&P-PXrVE9qW>E*@mV z1Y+lu*yn}H#TyZ#Rjvg{6~-lDjHhV;W7D)Oqs3n4Kp@tMaV;t&pXL(t{h{H1=6=3! zt!m1(Qf(cL)#LStH@5%Lup{ABW!Xh#1i^NkB|FNr_%zoJQ&oc{Yrg2dQ{}xct;$RV zz%Nc9o^c`{f6F%bn4ND^9=RMg)t#J(-`Z1W_!H$kzBVxbh;KSQtGg;N%H)VML{a*L zAT&$f`CG?aeMXaw^D<>Sk#U!@G=9IUHd+ny7N$L{0=xgQ3g@qBQnD?OvmD76Q}2#C zZjW46jir4Vt|85x*jsGc1vgV3N!$P_-*^tXYZRi_&J3BPhMHWzb(8g|_2(O?Sf4#D zc9L_(+!|tX`Qi1?dAw}Jc`Tx>SEn*6$rJX~##bqj;u&l};&-v*PdU}^QJ()^26*vP)tDp&K<5;bB_xie z(ID1k!w>Goo)Z1-#s1k7!+%WCu*KhHy9irhvTEm!oxILGaa8bfB7^nadbY@pm}jx2 zCGP0O2{*~n%N2^12H*b&oYoLlDXKnQp?D_0PT{=Uaf{#D>8A9<6N|DVpi?IbBahwz MG!35=JhplJe{UmmKmY&$ literal 188460 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 z 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 z zM}vI3H;{m^zm70}cdXU-2ukBH-LQ#XA?nmZ=cF7gu69?V6a%hj>ICQ@*)7!Kfl}<5 z=yMe2t}K*7Di<{eP>dlm*x`4#bFUy`kBc-Ues=a!ODmR!+Vy&c?$qXBWQ=U+fo8+# zD+IU7d6FL|5IJl5IsefHxp@`CvHDN{3z-9V-RkinaUy_;45yF3)2-~x1x1nB{x zI-X~Y;Zl!JxAzmmN;l%%kBiLaC?mW62k;F?%(OH4IElU(&_-55?lMdzGS%^_fpKBm zv6OXI6?~MjD)9sc0JybXpT%aw{7^J&O{&3y_w@_DTM(O|Y^%L0j&*)PIN#b*yZru` z#+BT3>UaDlEi`IIcgiCGe=Ph?lmNp~@~fO-ju;c~qu;R*xk(0|PeC({Y2K<`rD zIEGB+!J`0Ki@~V zBWKdsANQM&TbcSHSjT4IFp@;kXs%{I>RPTnuUoM`gKUV@+&-RqZ`^yd&VTK)T&rDh z{&==z{Bb#mL&L+9;7#7NWW#n{;4z~1Mc7YQwHBS&uu2*?js%Z~gU?gA?dW1LUNUXz z3W}@J^ZCS9+R4<{V!VvF;pM^P&t*7UBd+Ru19?U(fMM%lK6z+$kt2F{I542gNQ2rd zplho2b1%P%y5GRw>M8K4@9X+0b<69ojKKf9Y|q#HUT5W;QE8tSdykHdfDkz>d})lW z8PadIS9WF!A%h`&dIA2c2myiw`>Q|!t)ZxelL1NV*RT>h^eTm-k9yEDc~d(wgAhn> zFX0NZ)j+RvPB7fl`O2=jZL5wMqeT?gpi(TP~;9_DxiOh6dS zZw|n9I=9RyWIy8E@RF1c?O%$yE-{v{0QZB3!?}$eF@>>6SJ~E6T;3by^D04bvYE|u z%0y1D`GmB`ZFZBt&J?8KHlkB}QE3EA<7Pt5NI-q@^yV@U%M}EvTAE5&2&{6iP{O-+ zNV3|o8!|&_B-)n>z zU&I`Iem%;F@{P!76wXL%BXyDe4)9hU>Y1{#f3KzeJid;v<@<7<4j+G6ij|U4*s;eO zf_d5{oO{tv7@ju(@Y1GPpLIwk40fZ7xkc8(+b02jyc0(rn-$i>E=7wi+rL2UO;WPF zH_G-A2D|Ium95P#Qe58B{r8al z+ZEushB4Yx4;Bm~AwO1X&>5kZDJf6gM)Uz@t)OslB0A((vab)DVL4F@>S?cIRYsfS zJ+_vE{x1M|&-p1`JiuI7O6JDZp3|+9Dy>vL{>f#?s_8XowZ)TU{+)ntina2>2N>{ zfl+O;MUa?(mDO&tuJzt4!i@PtDe((uu;B$fwoS~e*;_UEHFG`A;(4|^q6?$$Q%F}s zM-Z(!*erS3u=*SDk(xg2L}5{oz1;lY*>Ky0aKXIPO|ytPL*c|7a2cSRv0!>bu*qD%#$YXn?_~-4bg8 zds>%+0*u%ntyO>J5o{O$>qa-ECw4ZpAD>iH{Z@^X)Mz?*mJ*Z2mUg^5v${l^y60Ut zr}*pb#UL*H|Xs@hJ!KE1l*{Ix~e4S6ISZScZ?8J(oQ$KWFZ zNVr2eu<%#fU>k-a%|4IHMS;v8n3=WqM~vor5$X9>u-hu@_{*$mUB{(Jx_`50Y%~CJ z-7U5n^s9EiO>&Q5Gtw^|^K`WpCi$Lt%Z7o;6?#|tQu}0RQ9`csAY}ExBv9dN9vYw^ zUa3SeE>kaQMf^p^19-vkxq>Gj2KdvfbE)K<*b%SBSj1F8YXu|-2PpD6ZNZgbd6(%i zt3P2z@8Tpgb>urH6%}P|Wov*HA^>qt$b~cYdGUbbk%HNxR^&KHZ!JO)@$ybV zrF1M^SBW+6>&RaJy+CWx;3CsZQ~KfV1%?A&G=^NnxEu}p8(YOzW@r|seo)gJ0Fgom z<4Q#^-!zo&5VHP4IwMqDZLC5ioq)eihY=~Lg21!FidDa=5qui;;$*)E>Nkt(TM?s{ z6hcr?T{s8YRKh0d@C5>j zvIN$fl$?Fcc3$$8on1C7r2Q}jHNvd0f7Q1iB5q@N@YCzEgBY+4#hL;kw6Co9ZZHbT2#z2cmclGw$*2Ht9>4J+TMIRnv7K!?$pK=O)5q!D~3eM1@ zhGQp$h2%M1YBG58D!py)9ZnrN`MU9KZd4Ex!}Hvu{c4apY5H%lX_zosd(qG)ofYe# zru*DKuMSE+8d+fo?Cc0SBL!$TTVHtZsR+paANXvSh;(sxH$evMn;)yz_`)||$nN?w z>FcD4d%Ic}rJ;kZ?cHw)ILB;X?IWD!QH@I>xsM`-Ko+nw#Vc!K_k#ICr#Y1Hah3G% zIy{hQlM92c+5@b+w(Cuq_M@q`Vh7K_43<(Ba(fv$o^GrC5J>WELHG$s@>TxJgcVd^ z`P`}uEhNHllqV)EG;fzT)O-Gc%|Jcg;J?=?9t=*JfVN37r*2@koUT;qiwzpd(U zdfmeHF>oDTBY20BuZn?a44sRO{ZmMcy7xv~7_jfnnJ1yU(|q+wnUku;XsUc5BsD_N z0_cW~9D#tkaWeSs$$!fc~*f{z1I=#Qnme z2>$9cJzN!=vvn3T>F}9}gMxAlULT=huf0F=n z5IU1uL_sZOMtnJ(bdIT{#Qw+d{$5pR2EY#Cy$TmKGK-Bhd`s@QYXDfTN-zutP;lzS zSSHgS+hgfW>@!m_SH&}RjuOc0T#Gc{quWwpXT%mexRq{!8jkIsZp_v1zRS&z9`1cT zWB0s^iqgeA9c;;m+#>o2<^MBKe*(#mMNqBVp%%L*GNjAXYzwnk^BXOh0Qee5j(_ zzmbyr=)T9krDs$(!mS>AGYl_mlA5>y4)Pr$X(d^PZW&C(^NMmLM%ZHtH>pO!Sj<4? zRv?qy2~X7Br>$x|=#&uq)JfT1mx1>m>g2zTlV0s(nv83UXob2;w7Ur?I6LaSC~zy5 z{78PDi>a7pso_kciQa4o_f6Xag9(@0H{b1H+@!xcB+7Q+FkxU2TOE}+0B`Zdr^N?k z({!?Ta)EfS_=i2UU*1VE$xFLSMHWz0Ar*&f91gP+jjq4n>KvvB?@V&kjqMX;G2-%H zf<8&>MoeEByqvRf?)HQ1tfw%AW$p$(-Tojn4*sTL%QV*x>=|8X7jk^IqHQ!8y&d&G z)BbB;gTf!OHRHyOBBaLp6~p}8$L8O>Vxu3iXZsG} zXNA;R`W|viAtfGqly;p6c2q|FxfQ*5%vyQ6rOr$aN<~DD5W${)RaDAA(P?o8H8jZ+ zx!k94qOj@-W?-gh)~_Fog}ymiawjCFT9pKnXFKoFfeg{{*e(DXds>&c_LJ^>Ct%&J zd2io=Ja(EtlBvgG1(@$#WT$|W8wCw4QswRbn@FFn6~Vt+@8;Eqj~UwAI#d`Pk^7<` z-3m!~9z0<1?QF(mN*U5+7FX1*fS&ymQ9o_&fD}9pqlVBXlaxZc2ZYIuuX#iU_n{%& z*#JRrEZ})#ax2*(g1gUt<@OOl2fNF0i9a^W@KqgzWidmbN@*4!*|m2Y4HAKEHt1lK zzY~=|uC9~m2y+xhaQrAn$GMjh?H2`Fv7JlP-29h;Ne{f<=>Ss(Dh~t~G981!O6SXe z^Ra2a8qUOgVT2ufh;4Q>lHp)#l%Gh7h-_9i5GmMxw5yKvVwv}eXdBD>UakD2nHbxD zGU{e>Z^k)Isw6EN?D+Cvg89bta`d$!4uu(VdiCfhbt< zndngB^X0@!do2?g(3c}1ZH@`6m>m*IN@CvM?Nt8LDfEyaT+pv{5-(|~k=R|ix>=H8 z(50jh@}2W$k;R5@^@Z-747wsT6N9}^r3gp~%#Nw5PI;>|SG<9;~ zpW7Lu3duHO3RKZxE3z7r{cv5g1Hat-7^)Ev`>(c4oA#+&WG^6I+s!{PnQNr+Q^%7c zp{m~sYIo-^$q^oSy+k6@@CZv`8- zrwD#zc|AsbYlRt5L;MQ9cMCQ(|H5$Ni}=Xgl00rH>t~OQ)PfC6O`lnFmKi~9(y+$M zwV;EypcHI#*VZ=S{#v93m9vnNh%L9^BCgA~_9Nr(G@bT?n(iaX_?~Qs_yjlXy_0V6 zVipi6Ekj?A8m~JL0cYnA5BKm>Ln zFrbeXV>5KA(}TI*TN4VSnp!0#9lbbc4Ey{|<)4l;(?)CL6$mabN%8e~jfFpdPRx{} zY6HD>?FopvQ$g3zoU(XDhpuAx8MP`jv+%})fT&xXvZx=>oa71>hU5B z@*mv_^;~g1(@l;gMZfaBI~-U|H$9JwNheN$3cb9 z4OFHJS%JLI!AlzGPkDF9EhC-RZ(fV6%>(E5dZz!OtQJ$a-?>q6zm-eC>Qr#>lA0k@ zccfF1WU09B{;n}u@eU8OAuFh8b+NZ{aER%6g&KI&DB%HJZ~c-1%~qZCC!^mJho3j0 z5E@ipxw}V@hr#ny0AhX`O^8M=QrP<7L03yTF#%jn1ZXnrD?S*V=ajT3W;o0D=C5hf zYV7BeVw+LRyyuL~J{?Tq@69U@#Hbj=hQZIwl(MxptLHI}fWa`~9T>Zz6EltiQU>mc zS2qEv9msxJV20q;h%l^;Lhysf*SWBu0Fw0OumYW3)Xm*f#aw)^cC&$oq>Mj-*-ndg zu7;+Rw-5c@tW}F=^pAcjAG>!o4fvtCH+rdNmGWabtFZt#c2hd3li-o{OQC4pX;wLWsg(9Fx|ApR{ca z4a0GJFNF$W`g%_X!X`DeMaD!=H9m(WfEH4t!xsywXi$@C;3YTDTMuZSe3>K|1?|Vb z|EdHWgY(i2=jchoi2Ba89SO;xDJ3W)s?^m0Gw^l1p4VE9n~_PkM_boBZ1xnfoQTpP z&P_Pf`isHV;iN-HIie;TN})Psk%+VfsUlIScujrG)7kK{8!*Eq(xrWPK?AE`XvaX^ zMJi=x-o_It-;XIvA|pmaS7DFSt7K(~m~p?a*%b zx=eZ;?n<)jq*16{FRwz+)mq4L_J&%*i1pJu3=@lfy<==sw5qjPy?0U4=Br^Dslhi7 z^o_HqhWb9yt3Nm0w0Y}CTJ#|!O6wW;rBEF9tNJeAlv_HV)(r^Pq7ENqmq=SLvloi& zi3llhjwBH1S(Wg)?uDR<`lKYi;s_&2^DpIO1veTzNtUM-LW92#xA@Z^)=wiaOoUb3 zF1c;AZ458?K0~jqjgwO?#gaK4g~45iD(FTj|7?~7sNzcb$Xr5}6RV*H7zzm&9-BQ` z&s%ebRM&9ImOC)SfDQ!2&Va7*Qt;!W4I#dnx!9 z(XNY-A|q60NlMxoNq;ghk?R9Dgi$QEC;D_f?R;T7HFJ0bl@jA&L`{vqGpLF5 zUoN)CS%Uxe_#(JINTk!H*hi-Z`A^GW6A%lv={8mu?17IeUc;FZ<18!Ik8!^yJuW#@&k zyFKomDs!Q!3FCg8YKUQNRyWEeg9NxIulmxL-67XJ5`jxCi5$eREr)?{P<72Wlz5~g zT`eo{Hl)uA&zGk3JO_ahj708$#QG-{Mn~54-U)0u-w{qhK^?zfv6d{gtihbI(kVkd3GDx7=+7o0JdVDb0s@73%1t*7s^dqucJEJqS7Q{mSubE}(6@bO@M z(ZB$TRMCxL{mLpz$TcMOs8mlJ1OR}z%rrNSeQ#7QQk24v#u%{OX5Hs+-^`-gPiX|8 z&BspY!;m}|NMa|Y)-dtz4tY9Y`~7hhfUih;v2mPtS8C3d@zKS}ut=g;#9;l~v%8&w z%H)o{3jnMhF}#<*@*wXIUkz{YgLwj|Ki{KGa^Rd;lxefa#bGNp)y<#*!!U?n`1qeS zb_@!MJgCb*urF#K{g(<7)%sfn$))i&eU7NL;{wA^kw}0whn8CPzt4QbC$RxP4{kzm zLyw37NiOnW}wm%re>#ue7u?BJ5W*(2b0oqx=8>R4^ zW;k#rs01cTMM?-%+m|S)Z~uWq^9i7<2fyzYcZufkhG&LKCgu6#7tX{giDodW6w$rv zwB*Azxsa*Cu{y8be9+Fl?gLf6JjJM3FS@JHc65Y6YZR|t;}95G(AWntwJL6A?C0(r zBz)u$MFY;mTwR*Mzef9g_xqmeknsjVcnq}p(>anA)<-L)>u~@>Cv`!jOFwHDypjy? zh$nfXPtVm$(7v;^u7^7PeWR7J@Ic*9J!l!oadG8S*@W7U1e5Y(fPpcN>}U>yCIo|) z%dK#gT4{*o;QZ$f@kx?WWdjo&P#dP3n61$o4og3b}2}q4_~kyRVFT- zRv2?S#r7DxZ@zB>68f6pBhrN2S}|eKZ!*w{!HV7p{2Co4rb>G@o-a(qs=BLV_nB>3 zO4hxhnF&sWBrRz|aSr@Gl&xH%`vOv%j0qmQCz}b&U>ge-%?syRRfm4*k07#LrGIG$^e1lR>mNN>s|GZl8g83~zuWY_ z>o@$@`)o$ph9XzWp#g1NGn`&cZw%hSx0I2;q=c$+)5lJrgVyxwa-pBj2C5x+S!jHQ zg`lv8X4y2Sp?P6th>o4vMq?HPCw}%|N z7tIamT0BYmzkhopC=r(QBr$8)pM1rE|6Bo8*g|uWj4QPVnq_84ONpbdTeKd)3R|kf zS}Qb716gDiIJ`10uPTOH2w;TTRpa0IP?v=T;eW3GU(uzsSW-#G8#0V8%h{8$l% z3hA*qtA}qtNzRVQ3MCR8j;Iz^9c=GDl#Dff%ww)MW9=u=O2Y!Y`B2dmbqXqQLafS3h_J zM4MAC8_+w}N&}HSYzi01Y4xdDhG4u6ypg7G!@gQsmY4oZwTw zz%Ce+M6OFh%N4X&M1!$|qgc^22v^=&kxn&%oWS8Q1I+VF#FChNU6B_wZfF75S>Ar_ z7$$Wl81=HmL!i?PTdLt>in8R#LH!Pyme8@~N&1;1(ZU2PQoUklfv~hLcAu10y81{6 zxFyFDZ#$rgR(zpQ`4n;gVne1%Ff7yHMcQ({0Mdsz5D_xKu(|IuEkI4H`tijMYZ%6E z5Jv>uyVu~OHT=LtVxz&XUeq~)Vfgp1O6{7{wKJV~&G&B_<_pzTmA3$F5 z46bB+$9LElVx|GR5QZwrG(sQ{ZV=XGm~p7MyOI&E@GYI4A$sPS08U=f5fj(&+~;?j z!T-p08iF>$@wq;89yM=YdaLdRyF5n*JGUuq_fF0Va}J=GUb$xUG(SM(7KGR{M{diG zUE5e&Ths1t{~7d>fm^Y=V=k}1V4PST*{FLjtn3a-A@o7J#h(}=8lklOn)HhD>X5>K z{NX_=p}AwW#q4_*hT8T+B_rnn|0V}s`aFnCg zUew|9E&0povu?+QBGobZV#zTykJx!4{Q;~z2G?m}16$%bML#@Fqz0ZLyH;zoq-wgY zbKJ&F%FS0#o>5cnr7J`}XX!KvvdxUoG6*O9>RfXuL?c_f5Iogi4hek&3}6pwuhmEC zhj>L#Z!S5Jz{OF*H<6w6U69Od(Ep4K-X&N#5Nqpm53^D20}`jbCxT!T-#fjN$*9Z6j@oMHY2-xQ*Ozc zJ(Nq`DVx;<;Zx6f2db#Xf4XA)9l?}=FZgYjzy(;v8B_L$OFl18E-wRW3zucvOun(? zf$NWNa!W^Saw`jFiEC9TR<(SxWunhM zMH0_+9tB=j%x$s?n~URKLlUi32eoUyH&U~<7X4LIiLi5YK|9V;5|(#uIe$=GC_@)4Zt>*pm~ zJ#S<_zNt$mQ*F(N)4Ea^;rkGeyz>l}XOm-B^1H-6B7s?UBAjQ0`+BIo9ty{aZIeuz zkLi}Po}3VsTw_(FsgXHM(uSgzRp+qRyaqx3H~P*^-w4)-7TGAk2OWs45wB3C^RF5742|)Wf$QP?qCU=mi2l zyK=E%;Awk>Ky>AnUqV$0G~(&z@2ZHe;khdp>P+4lB^$BJh7U>SWnltjS_*N+&sPCy zO*$5h*c4J&h*>V8#B$s%u=%@v6OufH(~9R&4O0QZYBeA}_OLQqPsFcL**!b5&g0;v0Bm}3cXG_7dpwRU5<9V@`Uy` zzU$ylWw=&(f77gwFCY?Y#J;Cp75G-!*Y3_r_-!N6B-SZ8mLl}y533$6YC5tW#KSK) zNo@v^OnNF2Nl7i?_&3yb~zNcfqLw9!19KY?SRdfbn_U)Jy6p{Iq(<<)j8$2ou~P=CqD$>k%3 z;vHuHd@k?{>h?eawp#>1H-~P)*Xzq9frcJf$lXOC#O3oY21c>mdKpTG{RH(;y@&Dd z^$&VKzJVT${8yB7@UD29BqW3c-B00j%ER#&5r8`RfUFcu0*giP^7lh?TOIp?8`6*K zh!5j~yq4E;c@QBm&%P55R<lF5`Le*MvVU)UcS8z4lQ_nFS92}y<{<&iKbnUW!x zPW;cLy?dNpuzPm*@O&1gU%%v>7i=azcu&-81JDSVvN$B8$=g%|)unQ7@+qzy2+0)1 ziE6$DM#p}tYIu0l(-muC`UHN?pl7|3IU%TpYP8*{`>|P+y4*_mY+5f9VB%qSChbDJ z&-z>Vu<@FA3r&q!qGQz$l(|0C@lY?z=aP#cxzA8CkXaOTSF56Q`$XE`Ws_=>i{QSr zRTPf8OT2KNokPW}W1pj!lpKlpizD6`EjfHI(x4{6kn&Hg>n|CBrh&K_&o49aEaS6Gz8Dxwh3~wc8Lz zmc+`;xXZnFgJeY{OXtM1l9gRRC-T|xh_D~&pRNTz+(A#eHZ#TzrRp|rmj}zWPtMnv7z2!Rq6j$aOV^*#9?!K&v?!#M!jyL+b{S2t zS;^rdi0Kj@E8UZga1I(E-m1`7iKabDj`a3QEc-eauIBzLBRbi)V8x0GHAOLCx{ybp zssLwTum^NHvroUo^CL>t%cyDEFX%wEJ7Ey#rQtjCT$;Jt5S^QenT{(lsbjL5UUkfn zmS4zp2(0iR*I!6dQc_kt)FyX56q8_u$m&?%DKvS%Z=NJ!g}qNj$BdY3sgeHv_a?|| z@$m0riGnnB1CE4pLk<>C<>BlQzSwp+1^vt>k@{)nuncjta*Cy(wLWzza*y=IAQUKSLB7{-2Md zlae4(EiRy7oNO)2GA;E8v3mzQ9q4DD304z>h9*mg!oLUAtJcyZ1euybOHOG*RBn2H zEpKnTH-9D=b&54NciUK5ba5hcdw8$gNP1wxA+^n^^mE@SEPt9KAISCk$0e_6`hF8HwMvDyVgm=T`V9o z+cjbRtJiS-rPm;;N|sYdj0JXBQ;dM>w(#xrOI^x5bjOb2Nm7(@hGLBm@Ewb?l5bhJ zvcl*x+-p@g(iJNrw4Q4DLkMncE(aCM@}HZ$2_IscoYR!;6iQyL|2Q^&n*UyHu1X3| z?$h@Sb7;eGKfilK4k(UQW3E|$<9jx86KfnF+5bCcsDJ{kFt(ZZb7BofNEwRMr>!U5 zpKq#R{C}ILlMe>rnxgWkB*Mv-TP3y#@%;yl#k>6>NnV-r>llacoTq*?dy6J=~CDXjh(%x7~EE`;Q1q|e@csj}&f zNSTnkg!dqux4J*QJtsvC(J&&sRgefTK%SQv@`rdnwa8$hQmHM86W6mo3S-dQ2fgz4Yn3ieKPmsbDGQH!)L9x z7s-3SMhOOc^?nm|${l&T!{IM}zSMGMzLQ@Bf1^n8y@xn-m~>uz8zo1&#+Z!rbYz-Z zUkmaZdyc-3({#-&7SR@mRSVsw?<~T$3|ih<7Hw<4wpj=nX`>Ic5P{2TtYg~J@noMe z;MgN3)?uRF?~HY9^iT)@-ac0uy<#?F2xW4Jde3TTI!34Ko9$W45YC8spwHe_@*oFz z^l!=9zBmxvom38F-)4+k}6twmOx!B1S~gGlxu+>~04d`U8QbMt!M*Sg24HWa=+@M0V89`3<+b;(Sk z*sKC1Z@fYX1LJ?lfrz*kz9B%tC$BAz zSW&{ZkMXB+c|%3QUS>HK{0ZI?&@Jj&iF0#rKN^P&!2C)+y0INHUR~R@LVs(vn;4f~&euly0AsL7=v2hR5lU)ttF?+M za_h?Ji^k|cb*YRcNww0m!cHPEC0MiEQ^-kwRY-t*FIVvx{j!pPb^VTYkXpJEGv558VkSZ$etA~I1 z97A-{63^-_rVY>D>Z*3b-E>Hymz^??gph)j!hj0X*XzdI*#>;6x-uwu0xRKy`qPGI zSxUmGPTt!FzGb$dWv%r}@0Hb9K7aGoxaaNJaE_{WnU%ui;jgGI`<7{p*HyP9Pk#Ss zjXw$Bw?q0-?_8t0j2Z*?7tK(xQpY58%wY1ZuQn-bCQ~z)WcYE2>H&*CMXR_6;a&C= zuRs}e1jTT3iY&f&*%?NLBa0<3r=gy^L!Ja2XxIPHGV$FCGXa+dbQ7GBj`(OokG*_w z@5PZ$=p~{jl<7z}IJ+VYv%AE!ZjlN~x0NPz5rU!NNsgE*cnd0?K^U7+i5q79d4R-B zg3U32rqdkJMtawc?+D_sJSRCNFyRQa#+JGZ z#iuKHWZ_3Mg!@Ip3hIp&_1hH+bw2Clfe|>dO&~(xq4?!tqPS@x0?cRk!@@r3yq4_@ z=>D)?NL18=lek**2xg}T=vJp`Zc=*~6DU+SdC8f&{9(iwul&a?A!5RI=Dg{iM-U-+ zcM_-zuECDLSh7~ECKROoj#st*z<||xx>@t9@#@?>@Nu54pvt#9tQL;J;~c)oA6fJd z({`oXj*o*{+7R+GoHbMWKN2W+M%AGh@*5pybT@1Cm`LDS${Ym37;{4Jo?SD^@<`6z zP%n`|YASvdxp1h)18Z z&7ph66>y4`Okqk-Y^H@iwcRtpSJ|kQq@CL)TAYiI1q(Z&gZjQQJA~rOG=hhnwyYU) zY;1{c)+ug#p+KHuKvCyzvAzp<5;y6SPjPe}eYfv3LS>zbX}NKQzB-TkRw|SeSB+rJ$!i8{0^&biuLj^@!OG@X^9sm)n~Du)zBN7C(wqyq zaK$|=m^a8gXDmwYv?77(thBjvmtA-Dn3dEpdBMj*`H{3ZJ+Uq=B3ha6Fgio@h4RB{ zzuHb7ZSRvC!B&d@2T7=5CEE97eoklWU=jV^~XikYn#OA*9v1=zTDXy zl7h#l7(HB1di<6=XzV0nAfDd7D_j%Kb;TK7KH6|&q1P1?B+k0)Z)9SwBjiVQHt1qA z!P05%ln+eHKIrpmq?3@)RoIMj{RFUt9}ep=l?vt}aCYMGFykgKwTVZ~Y((Z#*v<|X zw#%~TTa_({rH$2zkV*`~C1T1XF`@n687F!XP%XdFfkoQn9~gWn%Gs<$80qV`Iu94o zbp-x(79vCP(`$m(DW0U*c_(Lrq1cZ1(=Lto)S=%@uej})3?`NBW)(hnECU3V(bA*l z2hX(LPxymOQRw7ztqDCG;5Zf3HKppKs16!%W$rN%=)9u+WrRApj39sxpVo2lW2d8Z zc(qEY!Enbi_w*`4SWg#E@0|-W=DSJ26qMbuYM6`N>qw8lZ6o6h|5nefsCazY)ueHg zF~nz#XtQh*?y>z{ZHZEyHuK{q#mfox8qz4P3qT?^!wVuaeN5(w-_VTal$jf~^vJEc zt`=oK2(i#<0gHlS{2>dK@|ilmUd9=TD%5=!&0LqQs_+0xzG$`K*G+erveWjcuarug zmHd+&&G0~K!Vh|<;0;*Aj{rBW55bOx@|CLwvP0Vtoz?oghc?Z_ynZ)1&hfjH2~In7 zR)nlEE*9#yIcc1MF+@bJhG+c|AK{#E<2@jxCg4=A-y3BO4j5if>MbYU;( zXiTo2)L%bF%bV22w#D35?2>Y5_7lhZmZ;Aqcnj_bJYk^X_@4DD%y_+ENes!;Gk$>~ zg{U_%8ShOSy7^SFel%oYceRDrer1Gm(mvxuha2;~0^S#;-IzE@+K=4GbL>*I? z`Yrq&2x#8^0|+qPPv;)O8Q)c4o5|5AIe}cR9J+Vz<{^VT_JWy73%Da zZ42^`1gocOhiS*4q$GU}Xp;4^ zG2{e3;s>>!Rjmc=yIsT=Rpz1t&sp$to}E6Fy<;XqEJr3znLb;kZ_lQ zk%9bq+K*Fp@N}MSg+Xmr+mB;#fp}ll0aM)C7Unw*_ftEvece7UVub11Bg$8Vq>E}F z2Qrc|1qS8BE`n)eGg-ws-%8UQQ*YsP4k|Lo8-kYHoIt_70>JN^rNsL$(({7y=r-%r~qfGbfVDvh<9F`>Z|@;`%iMB$mzb%n67~ zxVUh1#oKdO^9-m?*n_+|WuO9(JS^dV|5$OsN&nj6= zRuf;^>Z%ujUZ2|s!@i}b5FU40w~5ri4)3M;VT08%H1(w%}Ade-}jI> zM8?H4Pk)M45a=E4jpcDg7OZYa4K~9Gs%F9IKCr=15!HJ*G9bVF_Y0C32AXT!T0&8=!g~1%xc1 z6h&M=`rQMtg#5He(ly#V4JNdLLdtv$}hy-T3*R(MwT))8Sb9alB5?S+DN zAL{QJTuOggf%o3)GKAa>jO?}|%PI%7KXVh`1Nk09h8F`9dw{2A*+2-|q*a@R0&}GZ zrwRw4L2DbPLFbkN7ncQH6dcLcHuBdL&f~#u-8u};Dfg&;6CTcZB%hjYx0BLL|40u1 zP1BYeu|qZzINaW)vD89=RCh~!zdM+Pbi@m>8gZ0Dr^DPG>J?q;qD8LoaddMbs0cIL z+kR z9dit-gD2nHjN|JL+XJXp_o-MbPrlP}rlgJ6p#V=K?!R3&CnA5W(sg=Wdf56QUtkmX zE5oeEXX2EZuHcf{@FU9ic)*6(*G$rn05Zr~IDZcF zQHqX0;>RMUdNS~eM<(CGv*}3*WjRPOAp^~^oT0GnOnAkY*G(A$JFk-7 zn%=k!_x{gWo6}u{GAmI4v#T!#lUs_r`xHpC0yX|7fAbHXH1oN9y&-W2_ z;uo~>5Ap-vBTVeK^->Y=G&{nm7LLs_;bLFs`#hRu<5t-GdHZHvtnp;hV>lP!N7QK9BO4j_VKsMq@GvH>4E|7Js!Ov9Ix0BOn;Jcow_?Z3C`py{#A`P=oj#T= zj(_uzNPm1wffCbPR9Akt2!k?(%f{C%rC}a&u@!>U>XfyF>9wWc^3GwOwFO^wYa9l` zR(=0MhK(fepY_|oSvtRcFFW)2D0-XN(?(=o>(SThN>gbq!GR=g#Dwl zw~{8n{dJ6F#Rm{=@X;Ba{a=zVov46_fM~MtS8urye+M=H|61o#aP?1U0ZM>;kOHkn| z30wJnRLcpvl5=9Hm7_{A^|C6-7?nlDhPQgIyjV&`044bgM1E?J%ajKunCZyP@G-@> zf*F#B3imG>L&o=>o#akAnh0a3<|T+moec;m%6&CALNGsc)GUcivPTf3Ut z7S*3m!TRXtWp;oezoE{}=kMItHW`p!j2PaKrSwISO!0t1bb5&{TKhlg>2`5q+KE+p zse*+}6O)laD=Mb5OnORK$O5Gx3*^HrB|v)GPH2nrIB1Q?arw1hnWx5S2KGL=)kc&p z5{R<9?nLwHhqPhf9^YS~i6^51xxzt=fn=psFpf^%Lk`FDDu}?Hj@N3J4hpFCGRlKi z#Nf_~4d!5=Z#uBNYF<*77f|&anME($9;qjDBbN69a=5#h;ZTX=n60DZ?fn3$2hkpX zlE~htR19*Ns?^B;*f!pdm+H}I0K(zK*mGlg`d4FF%XyZ`K~ss zHGvh{kd_6oWM$@O{U*c~ZDN^7CG>gZvkx4JDgvA!_GLh6O~Vprb*-U;tKQL3433(c zRir)g*;AKA4tJq=}uVs|OFO1}O%Yl(cItdQRBvmjW)T`*h@9y*;{ zZX}~>&ALgfGB!U#-s+5tspwe~TP(F|^yR?3ZW_nPGS8XZz>n+akq(4=;7+qwY{*mK znU?ku&gJ$YpI=$#!UJ+DNY^RXp(?BLmC(Zz`%5}@R4mD#`uYYaw2Qm@zWiP1gfKNB z@J~4CfUbik((Oz|h=%TW$vU%-Sqhsn53v-NawID0b!cudO4p?c0XZX^S8*WBfXlP_ zpYwr-zatNiX|X|w`FqEJ`RzXtA@pD-={1}P!-tfQ8t|Zd5o8J;7uFP| z`ND_Di$%X8ny_c>@cw?oB>gn}Y{U4@YHt4c>j9&|3tBSS{aS?0coL~B1A#sUP8;&` zKK-4@CrUU%H5Af_p{5=E*YD1UN^nE34Ye|kmOAlwBx%$0NhTbJ)dH+pmz4=*{mW2M zg;YoO@?iMCMWTV+Aa@&>Po9G`ei;nw|6Kfjl=Sb`Q@x<+|M$W7{F%S8C@%s#*gx;j|5q1RZr)qBokj$K z{GYAs9Q>Y^iF1A{kpF=q(fg$ShOR17-_N^Rv}m@f(-r)mKLSVkdv;3NXTuwwJQr$> z5lil8w=YC%%kR$omKn@u%3Ypy8fhY=|L4W@K3(r2uLjF6$06_*L}F_S`r(OggPv#o4eb7RM+ETF26vy zxf3Z?^#T{S91rcRe!O-o8tEeA9SCl3e`>uD`aW*?@3eln+i0T9&BEDD4z<;ves#LJ zyW2WBbV8*|iGcsowP4>g9=lyq)Dy2k3<8U7=b&;mmq{y&fYF%@og|GlIWx1fHyv8R zTP|0dmD`R6$=^Eif_Dnpc*q~vI`kvVAKZe`K@&M%-I-d5uUijOB9UzEV$CDw8owee zA+cb2me$iz^>5v}>rJrIN!s4??>ng!lIt^xXUbN>RLGQ4d| z213x$na)-HM69h{rpZ6Q6Gn*3G}?#UVOK8>$z)R~H2|BcT5Bf*?iPZ@k3?c_BA{Z& zkqAY(meTn7^qz81deOE_Xa7M*MRiu52jxE!*6{PmP$n)?9A00q3(0Ev zmK82ac`7F7hVP0*Dl8pHx>Xc&i`19+9MO#n2g5@CMwtxTNve&cYtw0kWm8z!`;EP{ z*rkempAU;?9RFsSQfQ{%iSI$_s;kJ)ufl?0gDUa(5pbI!`h(xuX4TjB@^nL0UX4Iw zzAH~7d>$R?tuY)~@u-Q$O$}0tj6Jn4a^=EdX9rx~k>i1VbY>$)4tufGKVqQ(Vj<38AT%IKy2W#msw_r6>;v@)dflQ}wKE@hGL@5S%kY-qoAynKT7 z6}|^xU|8+~=xG?B3LVW&$0PJsTAjgiK)oV>|F-S0S_izqMYetFheuX4;2a@43a-HaYf z_TVzJ8F%^N?&vL$`+C&%Wk}~I*6~-I=ni{9$b^{>ErQ6HyBmBK|3X`oH*L;zc3ZyH zt1XD4>ct4ta!NX*Ig&+WkUmO~x8y@Nc6HdVKDHFxS^TEA_^1a`B;>Z(SNG|JK#ohN zQG)}e^SUcl|MXJ%EJK`i@U77pVen3CNFCnZ|T?Z~h@HDu+KU_M9Q)Qi1(VtE-#Kxx@I zc^ul*A=42%^McbUlf+^4c8hvzt5`=tjAG-yw#$@3WLkdV6>NTblN=iwpc4PltgYHX zo&IP3gA*C^A@!&HN2yL5&^guqpFrj|dbbysFO`{y?{)vj@}Wb!`Y5lS_SpW9Bug$( ze07rx3X7pwrp{ZHZkv2rJ>sUeNk7;yt-$Qwa-!D|Pu*EIKY+?wdSFOPXIV&lh9<~P zSCv;lgdjo=J@qDz=Vj{9jLjrQL2L;aA(5p$pt655c!!PE20n zJ;3ScB9r$saeq+Y)o6zXbW#{u3BJBG($kXSw=<{8imNic z>bki0>G@0F#6L!|D(W2<=rK7@0kW+d{2q^i#VypU<9<}xyqgrAV3Q4yJNe{v<4 zG8l)-b<|r?t*L24sB#iQHdp2o+mw~mmVx%C@EKUmjQ~Q^_H7Kbh?M#$@No;_2z2#j z*$?N+4-$l1Owksr9J1^*i9&CO1z0G!aTe)>etzkq1!LLUqq3{xZ7LOxn;ibOn+U5) zf70!n1}5@_ve%+qZ{nnAJ+#c%sjaR2!z+C0<&!a@{&I;5ba~6tv5ZQU)+U5^ZysHL z+oDfHCt8JTl5WwLo|ZAR7_=9^s17!iS};=`IB3nH^;;H}goAuu@xO|6tLzTV=C@BB z)w9Trn4XXr&M`z%Q7UX0uw);9v7pYsXAE%ABS%Lu==-D(QDS8y9ZMUsviZN@#NJY( z%XpV|X+AGeT|ZabFgrzX9G|m`;Z;0-co)WhSG9i5{1FU&gDFZ?UXtv_l>LXSk=sVhV$@<=|0E zW0?ml+Jc{}>#$9G74Pnse{hsYi8d(Dl^xXt?5csF-ie3 zZPW|R5n@bYzX|8-2_vc|91TtMp!zjS$452)clU7>pf@|aFG=2O`a}{M&`u*n}G}U43;C;c}$*WOGggNs5KUF zdZE~maz)j?2j?OlA5Y`52G~1K35Fm_o>Eor+}2{-j~>J$@1G=0H^ugwvNHazPKU6Y z6VKr9uG%~T^Pn4;6_xjvrZPTpb2pK~K#L@7SsyumwHVQ}dc!Lj3`Igl;kAtu4WzY5 zO_b~pw?=x;VzniGcrO|zajaka<~6=udWN82xfYh|bDbp~nx$&+yF!y>jpTC$r|HT>)F!beMnFQ%rxXR8Nl&dy77ne%NQ=tY1lW=C>5ytC>Z_ z2HGgDe2OW0W6C8ceb8q(=z4gy=j*>kC_yq zW_*2Z3MvyopGI~dIEph(*me}rq7K91oiH>eA{!L2u$ReGrnDdEnNjn>{oOsisCZ^X z5WKO4wAg?rc@|Pj^3ztkH}AVMDDIN0U(c_~ABmDC%6#D+tBoLNs`+rLTng)$7v!i( z)y?wwOh=YBU;|WK%uL1r5L9vG^#$$ua>`nOd{b*U^cq7PammHm8Jg6>I$z5MNjIER z2gBJ3Vj+}|m=}+l`=iMcWJ8}tJ|zw9KcuADSJox%Y2tc|Ov{0I;2>uk~|eNDG@phPG`8MI=ybmy`vn;lyVo zAg4S;v$K3_FxWBq6$2{SW)pW>XYw4n+_n+8e$UA~v-AdA>g1IAk$JO3G=V42+w)3Q zIh02D=A6UK5=d(pDJ?&J=5A5eeQu6JwXd!8LW)E6=IMQtZxoR6C_huqXnpiJH#hi( zapuA=nP1|iAKQ9WU@oz5fU2Cl6;WAlxE!iS*Ti5vBt}D5=e6)Q-DtV89jUu=ucHmA zxqP@Z<@FHhDww<>OxObgQZRLoB00Bq({=p|3Sp+M^tf=p!Lu%LLlQ2+cL`zbm zO5yz2=O8|THCIlUYFZFRP5Yi!%+7i>e=m}=_#AjG#UHkU55(d}TT2*4R$dEiblJPef5x z8&Bf?T51}_U<6#}(JmFeKCAzhsHSc`!Nyhil-Yz7MAP2JIQ?}+Bf@6eg6f+=Tuj0y z1izL?eP4uxZ2y54Om%MZ-M6(xo8@EOO&m+N??k3m;J&JOhi>Au6rWD+)z%-(Zw>{e z%{6z&QJ-Fz440RIhpT8#yvkXw1Z^Vqv+%FQr^4}yI$c4CD|yY+E5<*m0p7oq`>wrf z04=|g5t_x%=K~*O+w94f12jc<8J`GRRgGS~~U6Xr&qVvzcB#nE`WNooFJS zVjbt=7N1@Ylus)c;oaU&1XH*cUr|@R7GS4$Xx7V^?Q2^bPxCWNi48D<=k7jLp4!KI zxn$s%trhMWPQSovbduV2Wnw=c98jBg(2CQ~Q2SB-W)24OJeXU)Mb9+)w zZyt?4nqdSXDSx!odOMX$>oS*PoN1ex-Td^j)jT)V+%gr~(fMVS&ti(e>1~2rm$3|Z z|9F~d*|nKN3_Eo)mEBD0#-R0fRX(}4rS8z{e!eo*<8puLmHdQ*;Xf`j)N?;nYG#!o zL_;k%R&7%st(a0U`q~EbS}&#^IX004aoxViXcb09^DC~=u2#&*Slw#=KAeRrm(M+A z&&(%v6IpAjhNrB%th}V8MDdzNKF)AFsFuRWBn)E{KzNZx#f5!hH1*2pF3S&bl3+_Xu=;qv!HLhAlN8o z;m7$H$ux7v)#k-Jo5e?*R*y9OIYM&1T_nWC#TD;1``p$cWLdtDv~%7HBf59NSx2d5 z&UP-XTv|^q+I)tb1MyX~tXMr>{(xV6m>1 zVA0|uSvT9XSZRL~gjHTC5~g0CBJk+WWS&ySIjLkD(8TRZn0ys;1JXUkTJA$VdzNKB z*FPKHiaWuIH+#d5Op-fl@8GU)MEkwX!&TgQi*mZjm|L&rt%Tnn=ZIT=8zFhVv3M>Y zzAe~kIIga5JXCJZSF_*cD35akE?F5qK9IhmM$T({bWts~W*78S=AAX7e@wB>?nD9i zeQD?RhV*{Rh$!JAK@uJVL(@a zPN=gOds`u|cOIuLFSn@ayug>|A4D*6*79gR?m3KIM@vK2io632HbpTy>SrgpUASjC z+I;hxB@1lZ8ao+uYL4ivNVJIe1UhQj^pNIT0;d$pXBmxWv&wRf&0 z9m`^LnPAHj1Zx|qc&QUt$?~eC=K#)@o5XM`sp?M?`AJS7r*(wU-uN73YtlWb@72q# zKNc&+`PhKt+tRF=lPy61jFI+bCH|&!*8QZGN1+Lm7%(LC$Os(8_8S(68 zI(hDeb+t6-Iv^F;ul{os;45eb&l0iRDQCsL31PJ|cd1WXrJtQn^=%ytrJ`d>?r6r1 z`UTPNT|dSwRb{!&KkCBfTJ>lx;0DGy=S@I(Sm0`Y_+tJv^DE0sDZ(hlb&N6Gtnq_z zXTlBOo3Uws8j`g~WasAnc8O@k_3PL2gI2d2dva#VcFD*-S44d8yT-MTKt^b>^OlHv zS6#N%mDY?g{NIb}1E?R>&)da~r>FeFU9(+ho>F0@vWdd^h$&Vc=khg=yD#O<)iV*^ zqSpmWf===Z{8JTkS2f2LM*ZPWQ||cF>GN;lP9C@XYo|Co4+0UuwYQcCZ{t$2PJ5N@ zjF%KUIv3gcwR38$mY+fnQ<9mD9|q(+52kT$ciuWglW97YAIkz#9!rf@Q*b)6A{7z~ zRNrg>tEX3n;>}X9+}|d7elIoUv(hV?K^;V7;9P|0)6A}=+Xeq!89=1@Y(DK_WZgwx zE@KAKnX>@Vs4ee&t*M*i?R>>l>8;#3wTlbZasI7jvV2=m;rJQKxsl%!+DAel?D&Oe{*K;kvD_pZN#Iscuq1<8QP0v8ZRN9OA?HSyw@=+wN zE2PZN)xxiLJ!*0FqVcnx6OPs|yhP9LFD=Jp6z`S4G8?l_2AQD=af=YmTm-pQGShSx zvkU+mf4$UC9r>SG9%U?>t*9#NdD8Yvs%#20quR4D_?W#KkY6cphRtOQ1tr5_2*wAS zh33ay5?kkP(4Pw|+Rv?Xa}Z^X@0%9Imx*2JlC!&quy`*Uyb5V+UHI-v`4cr3n-lQvnTckaXa3E!ak@YD$euZG(2JGzY$?hP0CMl0~Li>yfrqBm2^RN}~g0 z=gaEk=FKm~NZ>K&iDjSX`TxV-o5w@-{{7<-QHT~KSxQvaO7@T>BFWBRDA|o6jCD*% zDxt-ao$UKQV;`c(zVF7qjz3#V(a`pH^$?8yR7WL z-@l(E8~NSSp-vQ4QhL97AXk@dMF^fFbo#NAhjcw3j|}<48I*SXLx9=UAPoo(Oa2kxev#ofW*nuvB+u#UqV( zc!fNax2Uw`hlo{IqRh7Vsu@*}~ak3-Xu!uZ+~y`v@PK<6K41&_eEaMtS>LKHE+D zxCb1_l!v|g2#fJvN1WE!?nV8L@$4M?On7dZ*Tx&POL;^=%7FeQjMJ5*qVk<+OIE|Kx^MVo#JVN> zO#aB1k8CS(V`<6a;j+(#MwP`7dE{V$!L;uD_4IDkV1Sd7WbG+AiRoSTxYP>>bwu#; z9;<7v&1%mSbumvS9Fh`0he~VZH^`s{k57diqy^=bETKuGPf_4qa-i3P8|ho%{>#i~ zpV`1IqBu*OH}t^s@}Sg~z2q$kL%dh==hF+e1b9~X=ra9IY#b>dg5W_orTrh67WANN5 zhji-m#z*Sy-Uh$f@1M*0nu)Jjc>LJya(h4Q@)DU2y$eR*Z`4eGN4GqJ^l?F=wR|GT zU^$&irSaX&5?e)009LKf!q1iMhuLRB-5-3&h~77yzZH?V>bq|ftEzVht0<`24PFGk zi@)&%L8sF7E`Z(TE9Z-$(a{|JWs!Id1o@E(JZUHU!_B-J-7Cu-(WYxPj~c=~lIC*v zYA^+Xw&D`#F9R5N5UPFYK=|XkH^s}oPFHebEyaxDB_1tze;sXKXsEOr%c|BJ5P&U* z4}g2#RL@3>b@@2qp4jB(Z#rn~Eqx4aIIs}(VGmp9%pJ0TI1)W@3~+>E`9R>))u-}` zbZEraC0rHn735Nh8^U;8e*OOL!I@#l`SUn2e-qT)t732tyTtMar{EGjMzU~#p6~wK zsNHp$ZI_9?;p1>}yT=JCE#deihW5tcIqyfyV~L|da6A3lZ{?=633fK3lM+#*}!DfW-o$ zmt*9c#h~EwyK#tN{O~-HR{6qtY4-~WrluDPp%$}TeyMHc(hZ?_<>(?U#jI@MfojX4v$i@W@Fs!Ved=vN;QJ;i zEn}qO{Sx5ar???xe>_^#>Ug6|N~z+tYtW1pv*3O>JP0o#zF3PO-S4P47>c|qi@O__ zA(N3+#1OBjO%y35d$>842p6Cxw)O&$99lL%SU3vSv&N8`Mz|%p$~DpGux@3t@eNJ2 z(VdVMRv8R@_o2XN^DANtb~~RT=GCxBgjBnil!=t+a`k|HNA_T)Y2dK*yKw}%H;4Qd zwgT1aA;p0-=looqw+b`n>&nvhg2tk^Z1fNPV|`$8wGi}z(4d7zQ@^aZUQ#E8>{_2I zn7h!dpE=@+wtm$(>4r^Suly<|{rgd`(tb-#*H=wEpP~*no*rtS%_mDxQx~QMJK%0^ zfQF{mXo7P)>DWB=K?gUMddzyydA-Z3J}O9Cv2!OGKSI93J4x1f8Z)%%Vo`h-CaYtr07D4@OvD3_wUCh>qYK7Y+pF@1!Y85BOegY z@4s!-QZvcwm@StNbv4x@*wzO)4R=#l~Dt85CWCV2Zt%*j3(zonH_1d17SK;3Hn0oM|vQS|)bNB=1&XOJ&7r6SB6 zETliEc+@$oS+}?^e*4L_J=h12oMEKa*yP!^8t3A8QzQEh>#GBGs+IJuNILm_y$G`? zSPQCjqhX*l)Ao~|?p~&pbA;VPMlvDA^oE-A%`6@5?ZkN58(^7;UBorU=I7WjmmLr1 zTd}tkvibYfObxAy4OAh={Ee3F4D~C}T8)B>;v=n=w(wM!Y-FBDp+8%5ON*w7$y&iw zP0Mq}c)_N@tfgxS-MzwYgP--?<>4DoA;LC&CbPOA))mJ`b*f{`J}>NUhZa)1*(@fY zlX5K$=iTm?2lWr(Buw~4U)qmVd50`5?=dk(7}5wflv-=n$m%ESA*AgQeF+;*;UWkH z(_-kJfvFZwp$uAHPR2)J@blu4OZn{0Ur!2OGg50=`RJ9G%_r2Un3~Iftr*X`KVN}I zv~iX!M${1It7E>l1(Pv_MNb>Oh77)K7uIf6e60tWT0ms1p?qE|N{=Go>~98&R^)~E zYqwdbGfEnJbM&#hIFNX%^E-k5e60W(UI9~!@v1S5n5;;Y_U1BQ62I8zaTi2)V5HM< z(c1p-_pCwoYpEjSB3UL3zU^o+0wfR zVbXj6_MV#?BI1D+&Cp%I*)ZKPTcc{nDtC2x_~8b(_a>hkdv3L)HUfdJ!`Mg*DP)Gj z89NBsu`876NUg+iYb;AQZGvOi3cqg@Hk>Ho>Q!GY>#w=n?*Nrr>j1fLM^W)VrL*Fq zprZ8M#JE2isaYr64*0gyktYncq*sgGvY)Nf2N&gk;#f!><7Dy}l@k{2@nT^8o>`;_ z5fVT1Oed}F$byuSa-gi)SHD*r>N2i9StpqD#`BE6IAkwaqX-bf{%g&}BKez*hQ=n1 zxmjz@0#h^ZM6)&F zhK6#K)6F28o^3tDaAv zZx7bRGnmr_jjh^wL$<2OB3^8!+c)kzF;qF@l2Y-QB~tqvh&AJWb=l7QPnUmksu$0y zsH=}z_YpDRm9z%!$FR!|giQvQ*vP;gk@y*e^Jb)U~8ikJJr+tg3Rrb&sB| z40*J9vw=iQ$y~VDwf}Q2OX>K^zNIRojXjrr-p}<{S3mVXFKo(G>xj0Y-gl5u2{obd zpmjWVnvRk-R@QeS;?o4y)So!WQV!Kv?2yQ4hP$`gW@qc-lmMC%~=>LuON2DZwOkgn(tZkh2pS&wsPTbkOne`G!NV|Qwm z3_C)}gV8YwmmRnZ+kfP7ye^pP+|B6MKTY(DGmgaq1kjgFs*yrF38SwH~N$HPZWNN_umgQZmL)H^e0)(%>L^)z;8~2UK~-r%g7b1{P%)?j;`E!;lD%i ziyin$5&ZhNTy=yZyj(WD6ZBw)h za!Hn^$%gWe{NL%Iye50))6dw-kw7Ul46ZT=zesMa3XdtZgdx$Q-0~Vr3tjz=4;r`T zUW9qP3W)Vq6gj3;)tMDy=2b9Ym5r%eVV&jqqf%863d#%6n2%=)zHP7UY8#XTsI;#mp;#vrBVoFTj6ARVwJ8Hvhgr^*RYgBEHLkcP0xGeX z8Gnc$mV6J9GTJ`*jO!}hPd?+PTePO4b)*j#Ed`kN>rB?3OX(-(^xelGdHtlh7%>^_ zmb|U@7bxC6Rh`Fk1AC(|{hd{Ozn9l{+qna3E3kqHZ)~oom(9r^f0cc{pmvem4?pSl zD(xcB6Dy60*QDyKi)jQs;z1@~8~D0ZEG7?bB%W22Ifft4)n#AlOu03(Ol#93J02bx zyX^#DkDhnc@Nl&ubxfmMvu92DUqWt5n8vzgTjZ(Z=l?3(kEbks5w;8SP@Cz2-6Y+_~oaebTH= zkFTt}mW6I`jwFlT7o8vfxZ0#Nh>e})s~ zWBQnU{l?ovu6(a~B?3=ot%pyaU)^w5Q(=sdJ-4iqdr>!nHGA9dgiy@n04xJfF{TIZ ziE2bfv)h(trsxI#r0Cc*aW;?ZD>ABb+p>m$h4$JKSW%HJO#Be5(FnUAk_(?u*Y*5P zHfz4NRatr;p(ks&`FWonS(9@X+v#TgQto&Vv@2}7)!#TcYZ*D8rJBYne z?QhWVQCFLPMl)m|mz$c3-CEpvna)k6T(nVA^(=MnnHANwEK=PWQkxK7h$rTYAA32q zT1m=vk&pRl_Stvw_c|BwP0dCX&r?r4mu`_UDAh1rA3oEAKTGG-OWKr>@n;`$*3qgk zE?4+4SGa#CNF6l9&OF-G)x2#10>3|FW4axIkZJQwJ<4nmR~P)wSV%oed}6+h*OJJT`}o zUUmttT=C4T=vD)A#*ER3mJ%N~Zur+{ZTk(b!=N+5qWjWg*PUN=e@SS0q7b@0ZkTK% zJh$#!NSJQJ91wgPm2T$yYgI2D2Lg(et}nTORy;aUBGI2IZf)3p zIoQFj$H|NDRZRV)aCuC2eCNf=*YQjL#y9Q8EG4unmWvNdphCxC_unnwJlX&+ zK=%%wyHM(N3%NAsF$sOP_z-t{T#Y@qOOt%*T}bo1_E8q3v#&-LExOAEcN%t z*;<$oc)nv{t!PA1y;$%<@2Fa0a^t1S%P^N?lK0cIiqrCvl8_;J`zCMAX#PGx616mf z=HY@vr~Bap2p%8IJ=G@$q>T?!Jy%6pCfpG^X~$%Do(HCtT`^3%*Kvu~>P?8;Aoc#@ z_q!M|*9slB4Z30@9nLW`REEKt!nGB1v?6KFNp^mIVc!Zd;=G~01Lr55KC#G~{rqEg zkw-$a#6a^(ao1-y39NtM($}bzgYX#Ln=&KOeHl}Gyrkt&vztl?Y-#tUaj(-^J)5{7 zv2SV%on88VSw-Q_nPWYhcMCfHr6EyN?oHM=gZbbJM|>}`TJMb^7R<`}-&M_eW=uVi z-Re}tdm1o8g>@h88f3$Rl(m&B_%u2~N(w#qLv_b{GsehUj`N#0zbf~P$C+yk(TX65 zaU^pxML>u_Nn(Q99Iw77s>yu_#}W>;AIVNr4AeoR^%!$Vu`9&AB%g>GE3BJWcYbH1 z-=h&8`IeQjOv3l0!!_GpS+drsjo!Y+eBrYnh7F19`iuf+vj*C|B=+kV+?u{z&O;IN zBp@HewQm=>{p%#&y$=RE>O{4o5U!4IZIMRF#8go4rC3Y$$I4-kK?YWNDq^$Q{nr!hQ z0ZD7@t3YPLuE|@^Zsqy9_-1UOY^d!JbD?XxO+5TeOaF+t$E@qBdEN)V-% zuFP0mpCNqrp6mc}kn{2ICq<3zw5w#K%vOEH&DHWNxeU7e zzi`uGjm->`*)iqk?|7<#wz=-ihwbl|EeZ~Lz_xe%9LwR1=TGQ;cK?4nQ-NZEiWCf37!1JF)0(rPz?A=EKiM zIpNNiv}LOn>7qs|*z+lZy*ens> z8hVYi`%dLe^!HO@pDy#tKK~S?e*Ge8+;wYE@i**hhx=|4x*8S^5wA3DSlQM>q*~}0 zWA|tUDzb8H^cNdpWaZcjq49V+pb);>9^^>`>4%KXfd6>m@41 z3hFmX%e)uy@7qgI9z$b!5j>5#^!kLW`LPb$TN0DEMtb_6-@~nRarKj0GmhMSY@%!w z1QJwKt&kd&$lj`mwFF*kAY{AAdFx|ZYwH$jvER;4@~;TS-m$e^x^K6&ikpqE@Zqn5 zjTDNwr8~aAGI$d2U-c8OV{Q)YekKwA!yBq~fNyMEP7^02Q zK@ha_o~7e+VhB=^uugQ#eropyUxkRAvrJf=wF?XZ?G({PSmR3`AjOn=+V$Kr-Cj`L zzt=p;HAPF!{##{g*^aN#hloy1KLZ|jg_5Id=!BoIUpl;N>CH!bCIi~UoNfg-e!(m)hm`wNXm6eXK5GF zY}yFm*SC4HE-r=&*m@DJTa*4nYox@={DYo+fyqd7Q10^6K2$&ta=8~K(zax5kb~P- zJW*cp)inpBWoOkW%u-Oe!IFo`wDL@r$J$`yk170Z_K=cALVYtxcA$hts@d*y`x~c4n$iWqD4& zT;NJX#8Hq8GzrN?%kR)HE(682ua$kf@g7@$mwh@;CRe2Y`xGwTd6R_u0Lv8~&oO9bofuw7NvQpuF^kWhlu*I97Z7VYaY&i*p>yid$D zi&sEDi#uJtFGjV*Nux<-evJ$V<>u1p8m_0vmAI6j*ep7mHI~H?D$Y;rW?Y~P*lS*U zK9@CNj%x3Zh zPQXE13F5!ODm1X6s=u^uTSqxV3z2aJyWSC?{ni+dLxm{YWpsQQj z{G&~~e_?Qs4!V>&_dW}$#}8@O61vt@itNpJHgt5O{;ZIv`-3-GOQbBnQ~{iO$oAM0 z8l@+EtE=B2wVNipH^L|}Tp;pl`d%WZph+fN7}Rr0YcK10AE}Qk@T+kq^2@_n%lAH$ zGPpfHhAiS(3%G?5M~*rPQl0HMNszT6#bw>iRo!QoIK9qr8LMbloCP^ZKwnj+cFyn1 z=;UP1%`cIgvHr1<+H9M#?WgB6d2sKKV>(CcJ2);#^W|alp|g4wTC0N2zJj4A&&qdi zp0xA~!J`*HT55#9eXB#95ax(B`tl)D*yxp>+!o@NmmgfPBOy;O zhT`#NLyxUdm4UOoyoQ$`_jQM^(?ap`KPWG3Zz!^Z*Ecj0k^^C*NyoujF+MnE!wej| zLt)~}TVh1lF=VFRo&Z-jN3qaAdcI!IfvzXXgEeuzW8+aNmz1+SuP&q;ExVU9H-1wo zsUpEEkcH);u9tQxzfkx4e`-hx#wJlUn%PJ_YmFY`N{{cRUj;ECJ2`L6GoOi?>w#i>SJ*L7a5 ziY78d$br#bS?vPKu4D(_*WST4ySX^4tB7GL(LuHWGlkEhR+>>OM$19H(8_Tc^vvXb z7!=4a+zx(j?%kUID&e<91L!N^TEL`9q)-9IvzBUf)=NVzCf*sP@~o|^&!?*Xrp00f zwiq&&SpUID>buQBfC3xad3oWioDhlXIP)u0#tiAEDRjw?*2Q~>iGCxTZi^P+?n+^X zc~y@{%V#4(JTQgvDUQX149(@|-?8Oq^dIHd6>F|J0p&SO;lOdEahZy0XtI7m3Rm zaCI|Gv|PC?!=oljSCmpQzVuklA3xX-e4rE%;rSTtApO+by2t$HoOMy~69m06S6(z{ z>yk~+Veup8sCLc?#2dD0?kKT85WaQ<2+Y=zi;|}RZ@F-GLEJw%_kj$`zK5hpf^Zgj zuqf<)m1&9Tzg|)NLIES4c?QfdHf)n=GCVum+}r5TjLL-*_G(NQjt6zjoCRNDO|U_< zQA^%*Q9v1~3GTT>e1bp2n@fY!K5_VrRLAk`>$q$}hM%D}pMk{`MXes`!*n#SojELI zld$u6QWMfQU~Omk#-Yf{Za1{MshdLvmf7lH5_OZH1XQYFkumd&zQ7A^j4+#Zj6)sc z3ym^9Pm9Hi#Gs_$3Jm3?&{fi#_~8ND8(DUbI=Eqaq0~=28L{r_6EuJO%SOvIA$j!n zBPBqyyNlC@wV6|vR%Pd8{Vy@u>`kMyzf`EwFs3hjw69ck$m`iu$f@T<4J|kX6iBhI zo@0)6a>y-~yWU9X%X(WxgDXE}NSIL`6{H!0NU#od==G7yoiWNr#pKZwtY05Ia1*^p z${M)zNlLnRDNQu?`_xyt+{Q}=OKX1oJ`^}*@|0{44`PfZe6;A!<~-tl&sYv^eh3UV z0?rF2Ur7la*ZR^X!`V~My9X;!K*RHta2LHgvBQY|7*Q7MHaMdZcgn+ZSV`K(HRy78 ze$ytwSQ~;$pYeY9saw<)@+2hMF1srKNX^BA*zg+qoTkqfFEJi(cmv|Q=&UAAYhV4t z;T@s80ff#^?+hM}$s;vx$lIENrn?uCRN)<~<3kZ(Ot;uFJ-XEIxeMch>8iuss#d^N#gB-hhy6V@luKZ45jHq>?Sdl>}U za&|Jb>mSb@+h@-`7$a1?n#7peBL}u) zxeret#+OfcuUj}p^{0>LyW$hux`$8Xud+!|^OGAdsXyPj{1B8FsA{D9blj{cZ_p%X zWY)7z72d`^EeWr`HFnCV~g|AYW$q+TOHQ#7*Kbq3R()& zaaR3DOJP2njUFj|+h3 zl1nl1HaFT5syb7hAVNY*DuvLX2dh2>$+>L~`{$lCdO9v>skVl|6(4q~r&f?iCZO9t zYTlR5mfg3ogn7Y~D#H=CAMJ7A^w6^N=3$0z$w(*bVka%=^x2*i_sVs8Pw5V~LL<26 zb?h~Ho8NA$_RjH?v^0m3A|I&8&aIMP`StP`TYrFUDBzl5Xm`V6z)&TQ!~FUzBhtT= z*JHMR?{WkOa{h5rTXuR4goy!Y@|pT^*3Ta`!Z0^Aq&jjBnz|R)Blna zKUYIp51ePE`u{9hz9#E^T>hmCU=-Vtwd>Q3+Z!z+*zEz+flTf6c9?SpP-F7(-o(LX z$H3N`I&VzA1-%NpHQ{JRr^m)T6Botb=6>UxIEuZJ-5i z%J689mY#=#b;40pqFrY7HZ)?;BGN?sou`KWFMdT54z!&P{muqV$(?((V-Ztnq3LO9 zo)jTX6yk^Xr(lxw*hsl4D(bqsHc4?c_|mUuR&k)1)4H;=+bsj&#Ag&cta^Uz{_h^H z)6$z$NQkz=zpr^GJUQS?#QvOWBJhx1Q2v{j0AZA+TN@3IH&IbK;_G{ALe$di!nL1R zh!)dt4%XJa41K*2*d;|-3#f%h+N=zlNyA30*@?)h$Z$eVI-aQGV> zRpJ3qF{@+3jg{g*iPkB)wR{V2u8>1=OgDWgmFu>>SJh)BHAT<|MPToBr8sF{nj|JTKn8phuonsvlAO9Q4Y4-Y%3^;YG?=LC&&r$6J zz<-{*ZKQhtw_g0xL_kL`p60H-aj#Ry|2OCK=VE`LBFKEr{u+V2c_@S0d zms*4`b@(E;2Jf8yJFUm=aa-I`O=1GZ(oB-Bq&M5!Fw@qk5?JRN1|mF6byeq#t=7@E z&%%%bJ!A0p2B~k~m&^bW#P!8npfM*EFP~lQIQP{nVu{Wx za9PO$bRoVvv7|71|C>c~VIC=IJ-{(gMh9&b^meYT=eC!SASMHzwBW@@kOt~RM#Mem z+hb6VXGh$!s>%#x*ppipN+9wj8tg%=ggsVJ4KYxf5ns@^3$5(UvY(x|$Sh9-scY_J zUKmCxZL&D%Sn1-1jld~WG`6lOzj(yr@F9?HR)C#b3-kjW{{`)_P*kSm=={{inC;4Z z@^w%&-WKu!3KYG6KrUylR=K7T-@_vEPa3uMEDb(~+;2NNStB9{&K3%laKSk#7sHg} z&@dw$+t_eVsU!Zc*tbUjs!+_UQ4LVyXDJ&Qx$uM!62y%>;)8@Q`}X3Ea5_G(#g(YD zsf>ErLa4_A`odjhkK>x(qEq0?2LdFy&{gB?qAY2P8Gsq-ma@&rc?`Ll(l1e|OfMb1 zWAhDSkws?$5PFdU^0Fy!w^253F1=sW>=+jdo8O0#shLGgtd&nLS!r;+nUOr7g|L({)47_!LMiR^mLVi(*#ZO?$X7+v_;w0C+q2P zsWm25gQ{#lofMz9wfUjSJcG<6)M-KTT%UxoKun!t_-)z4(AMPcJpTiL>qpBDb( zCu|f8wgigkE~IJck{gSo1ayvEmJ-qN6VM z-R{Z2@15DdP5Ky@@N1PXbNtN}t;(d7^i=h21g!^6v%YYz;-uipUb?JlmD_?mVrn=h zJ9Cxu$&IK}p5uYQOJUE;Y>_#l^1WHj7VK=~=K@4S;@m~~<|Ttm@MwZ)!8*YAf5H^od8qeNi7g zV@5DiO3mP=xz64gyeQnytrji7PM#%k!Ev%hcL;nZ22imA9jUOW@r%sBqEXSS9J zcaMBD99TC=eLvdNIVqan{JhtvRJG*W+0K$lpJ=u+=-ShqAtNf}bMYnEA7(;~8q-FljW z8Y2v!qLUxIXw`?0^;zWOKl@16)3njV$LMB=n;f-bqiK&RaprSERK*lgTt9j4Ge*L# zFm3w=&&85_&_#hH$64v>4$FswCSs}&Jhb;~jMAdt0xu;$qO4j$_wIJ~z@^arg@U2e zntiW$ZgthgW+bPVOQ|A0S@g)AkMH_fnGvL278sq^2h9hiO|^&=ZGd#i^DLFy-x8*} z`VWfq10^J8)LDzH`w&CxQRZW9cRohWKwL?mbqgNTS?)H(&MJU|}}sOmg_NG6c?kyzqi^ zcS(A+{k5N=z6zYPqbq%5xu_axY==AePJr{9>RCpv%Zg~rJNa|a+KfeVcKX<9Op|0m zknv|l)iu0xFL|=|>J(Tlx`K$h} zXPY2mw_oEKV4s7`HOcrwgCEg6M0US|E8lx8K=s6>P)>+4P%L)WY{QSCf;+;eclM1Di&E?TQp>A}WZOIJDe z%f_RFjID)H*GhqnK0-m>Ee!lZ-orKDQngZD^*mr9)Tfq>bo{bHkSF!@vvW$o zvz6i_r|d#^o`rC0yW>7W7A0*df(UMVGB@OVu88!{ebgJXh{x*fb%_4BW{_D~73in> z&$^p&`eIe)mC+pUaQG&S%*KPqiS2|5_35jkY_WvXGS<`YBa_F&u<@w`C^MSgDOp%<#=Zl5=3eiS8_~&l1mF5l{l{gbecCi&ys5bGW$`H3-8w zSFKS~J-uBe+7h{0k0%MZ3JZ`33S@vmPQ%DeuTQCJY#zNGQ}* zurQ*4BS+|mKx3{+w9(UnE*tQxL9T;GtO8%<09&+%q}Ezilkz++{<7s^VbHp}l&37F z$W$o^og4f0uDUAxo8@yIqc?^X8%2_-hTNCoN91R{AVy_S8~7Hn#4wi_6(xI5{3~^; z)%R7eDrb{Zi?Y=BA60&c1@O;5&dM>5mVP3?W?nVY`j9?xh4Nzcb zPj^Ay$M`1_L=as8B)DWR5lA?7hx-9lyFA%Dm`(KlbYtj1hGz1|6#c{0Jn&S$b!UJG z+8r4NY=u&PrgXFBBwV4wbN?N1)4_?b(Aw*#9Vt#qI8Rq?wr^U#F@X(P z)MxCtF#l@12f)5g1j|@oV6yH}jY6(D5ZrBTvsfoyUobm-ymLo2X2Pz|Lq)0;kN7IEI3k|#mfdJ-It#SM;wV}_YDM3%!}c9YSrKw51f5Xe zA&F_1cn*(?k93SJ3i)ZWKFg)BmPlj*vm$cP6g_;>4tH*82H|=XRg| z^xPyjaKe#~^8d)TG%%l&_o<4GiK%84m73CWVghnh+O_aBssxe$;Eqxn)8(w>FJ4^4D4)J_-G%t+<6~Us6V6d4_uO9`{xL*YYD?&B zP!neH4QV(h0s0N8{RIH(&Jli%14tei0Di+~-Bi7TSSb@G=8(f@BK6?f{D^7qm}#Fs z8%G`fF)?*a{jw9Hmys`wYQ$lzeu^+59OBP*wGKa0V+JFhBrGq{Ar}#h1gL!G^vpHc zebt~7;`Uwgxds{7y!e^m=@F3+qQ7Y?-$Tyy!>+js(ptLbd|8moQq?I> zd@6dO_u9Z`?q;(XIMunTJ1R_6uceDc<(|~h?62O==hiPm{%tS6{s7i@{W6WDs(W{wmC;eH0JcYjpsUPeBstG;t%(E*WmgJ@2nuUM)f@#4D!nyF@(LK>sG4{o8)+xK_1TKKB5F05)Id5J%R$;5!kn3j^ePRSnF4|}@Hq8x{@ zq;hGeU6eMj%^s*=>s_Um_cP=IPx`!xBQAl=J6FxdqC!bBnW7xzfiY3jW!ZC8Top^j z015X?#^^-=ms@XFwI~EAnqO_Ewt{=2*W}7g%r{{_I&X>mIyE}0ZIr*^dEpz9=jH0# z5*=;2DBi~->unUkP+Z?BBXcVwzu_+fBq1g}lj}z+FeZIFE-A+eKPY+BIQnpPFll^xATP+|hbuxzpx8zX@HxnGVPUw6c zY}a!H{fIGdDK~!NuAD*Roc!u-IwAMj@=wM?BpjE*k)-{14CoaV_;c2(yse3^5`%cV zWpItmcz#bG>%(?h!gTkS$Q4{F+4qg}2_(<-r3W2m3I> z?Yp!)F4`O%t*j0ED+|Uz3`0NgA$=T>1#UnVM5Wy)DNi^Y?~gO`@f_E_y!>o6t6$)I zsN!H|bpuZY^SsHCk-ZP%)FYGG6R58m#I1fXv+(YzRzg8m^#N&^15bH!@)i_rM3(j% z++4roN0Lc!s0BamWo(@J&fnUne4F3cSkhVNhW%l}tD~VZ8>Em zPn4IL=3+BDOium^RwoY)U0rhwJNs~15Z4?#62l>TF;Mb!qJMV zj$w5fVWakbLP<~%T6Vzw{!~u&fo8z5uAnv98!LEbdD?0DlHO3n zy;5;L^gu?UEjqvi(T&)={>_of-t4dL4R9M`wCBr2{cufABWo+-$4~oV^-;)gvPC@{CpgCz zQ>k4m;^ZO{2hAYVdyv;*tE+)-=BpX&`%7ZnO;4Eb4{!mu0?Q&fGDSvx29Bb37d0D& zd`Ze?-h6>)*%DT!$G?py75zb4^*TUC+v$a0kL`&YeQDWCKe*+V$927Mdh*pSD!DAk z8toG~ntNMqQ43ra;s9B^SQp2-)g^Pm!K#eVRG3H_JWw$8W4k_GzrPYR^YDi zEFwTA$!O2#Lp5nxuUbje?-u#8ekh&O?zU^%o>8IvB3fRqnwp~`SmOo!*ff{Sv7c2I zzw}TS=)NO|2jQ^${7lB3o=Hcb5q_rLp{xhO{HMSN(=2kd-3OEhpZ!{Tg#1pW>`_w{ zU%VvB`DjQ{!Q{oae#~k6z+^tK=X*;wKVZXz2-Naqq)*i3X7%nXB5m|?oSn>v1Cnnd zaci7Q%~Z4s*Xp;v{Xy0a(L;Ujz#II9(H%6+b?qI)Z!l%{8Cc4HZVq~+0?2S#@lE6@ z`v)27f8;7y@Kj)jJF(l-USP>7;wWB!W~0PVJ3ZtvR`la7D>#`C z)D$i%fM&u}Zt+|=a(w=H2u)pZlTYt4;%c4fxueb}zRMcW;6JQ0gl;dsLu~Df*j^p{ z1M^10K#h3nq(Yf%~mMy+Q-<_x^@DJ7S zDiG+~N(}(b!8>3{22-*I4g*Jf7ZXkF8l5f;Ce{5v36t!W_8L=IP@!TwX6kn3q zvd7~>YSKi)Ch6txPeaOZX7xriSN8WvWITqdJ?~5FKH|F9-E)*rf&}@PEEw+Idwp!^ z*(Y^{3$<@(uTH(rNS5T0L^$1F<9PB|(^RzV-uTriZtkN^;`V+o?ljy}q4cFvc}V*} zg_|xeCFTGtHBYL@&h9ARfsLeW}SNbD;ywqQ#gI4r@;=l2|Ub;sZ?VJUTS3;2v_SEs;$%t{OrY@Ba}=FGE^##TXD{9suz#=a$aPDMTe){VF6b_ zpH-flo0Hz_)(oCpk$co@Dr@5TLm5$zIad=X zyJl)N*xm&tCWjJU#1R|qmaFBx`=JX>L`6Z!hNvQo+&#@&dlPU6!%(C--=@>Z$WD|s z*=b4~FE3yIEltn~k?`Q^kg-5F_Q!$PG-@@MBoRm=7G3tQ6xjP1%)SF1Hp42yYhM)9 zGHLg0YntT019uGzmhR1&BagNAkA`>U3i?Lb>qV)=GI`g^)dzV-{pTG_F* z6{pP#EHiMSZmu$5^#d#K&JAJf$lJU@^&G5r^%+Sc*nES{*Kv@9!f9MXb$uL9e!jCE ztZH)oZq9&WYiT&}`V9v4mShrEkz6_i5+CWbZ_BTVZG);WpjZ0-ANIcepXvAizk?25 zg-%FLoh0W{QI3@g2^A4DD#tK~v<)-sBoz`u5v!bXHir$vLP*ZX*=BP-&gQty%(m}( zz2DXQ_I|zpg759~o0})szMB+ZIRH>^~FJ zKW)GA#=E`3vB|;bccpNHx~i1g?@h z{^VhzqmEu(Y%;*fsMH2|4>2U;^>+AB^@H$BH~1h{DAIhe+q+Xu;4K!&{*yy>jD#lb^<^gu@4`2=+x501AvXT3gyxoV(I zx-i6z1KsAlf{*M)nvDWe8ob8JYTK2j4M(s&c@;wtCe;_wB|5k`Up&wvd9B2ZKY@pg zeSPzB_npKMGp!_Osz)?`;kY!9=&if#R8V4!2i>0n(~^`9eAU9uu=BJ-9ZMk%hJJN z*Zh-Rg&E|v#E$uap(ISHbPemhYQ^Gc>kMSR)m7_W(;}o{Jes)5;N^dcFSZLXNngQ8 ztFNCosanC@$B>iXN-C-*Y@#r?WaKgCnwN@Qa1^eT5!_H&$l}heN zbP1@Lc!6La8r<30DJMs0rteZRIO4bZl>3mEe-YwwSlK|eEuzU_(a*$UC#6YlbrmhRA$4x0 zq@c)HtE%DkSP2C*((?-9sNfp|R;?S|h)_ zfmgIt&+N2=5tebdb^|zzdWfP+>j_t)OdN8=9jDkZb4j+VLdA@sK)^KaDi^VLtq=v3 zS-VRz98@Y^c+5xFBXm^KmZFjDNcf`Q?Gs5cEZ$(vrJvki=;(#yeXBt8C*904x%~!^ zArteeX z$eCKz1rtht!3&T>DZ9OEZnVD&0onvV&#aovj#&4J)N8x3ukfDL+4)aRHpPLj#=DYB z989z%Swlq>`~Ex>W+$^rv+6XVq{POR=mro)jTDH;Ia~2Le0zTAr@}CViu8{+k2iZW zoi2(%tfW0ltf! z#SD(D+bdUKD`U^7s-`U?%3v0Uqf@pFs!kK+D(|(>k8iKZm-d^-OBhlC@2?>cAxBz` zr58jA?LVtVp01U|LSN4yH7!j%Jwrho+xa1w9yTbgstO^%puSS z7~;F=>B1sKWN@ux*>1>ijc?mpse*5nz1@wdKwh;}3^a2}BS_POs#c=0R@7Jc9DAXZ z*MA0k2w9j9yxRgYlRoM3HU-VS%2^v#HIECouO8s7bldMR`~Kt63F`fpwnpn&xx-_9 z`)USyL2^#$SC*lnn`?i}H1DyI;)SeN>E~6HRZn#wT#x5(68^&=)t?Mv_Llew7^J)1 z1vc#Mo9ydXHkGh)a#RH8dxdP3+`Z1*iJ3^K01m72|$wB)m$7XzaW4e$ww z6&jj@Y8v3-dA*q;QZhA1SHQY1>yIJB11HfFR`s-k{(>an>gV=5R2M4v6My6Zr@^fj8lDEC#0Nb&f&?3kfz1n_Ngqq1sU4cR zsh0Y}gPYV|ndy4BK#kd3{AOUgU4lMD`ktDls@P)E9EdatP0bT~DXqcV2AXIk&6UGg zMd7@e6v!kl6~szeHUlgttWz^nxm=C8Bl!H*nzN-rZ8u?KY5>C5HfWJm2_?9BD*vd7 zfqaUBJJ3{Y;{GP$r(bsg_L4Db|jKZ%c~bH1qjOe+SnawC1uL*W7-Y@5DK?LIYvgw`#us7^5Z(lPYY_I!{TQ3l z9E!B{uCS$2`Rx8%On#;sx>lF&HN_iiqP5mDi+P1L9){)PxHq9bqR8i<8BqhypW!ph@))Z+NgGwfq5@#QPiFaIfnr_SK`sctSqyD;F>fM3@;OZT z;z|tDD&A}+xJ5smn{$RPo8F4T>vX+ZTCI;Z<~D7mo`Mjy`P%E4gbR@2 zW_gST+{1~AgP^$6$yRgEcV57$HZQIbwKb2~ItJzIqjW+Pn^vu8vrkifX;}VZ7SXnY z{gHNRNd$H`v|LtUUCLpsBB@OoA(}Gf#x2I0tA-$qZ3b;@ddD?&>&$W=>YvlIC<}BQ z`%XtyyEq3PmwIrj@K=O%{-eg;PGhsa{of3_t+Fq@B#qV6?gOB&;m@)kNM#G zY|zfDe?`W(IHBBE#P`b$ZY5%`M4y0xQTn{AZYEo0JjRC56>5PzaaeZo1|$i6HPkTO_KjWnt@q<1g_Jyub)4Z37EM)$a99 zZLF`t3^Mfu61_jzct(AP+31^8#}w&AJ5$-%k7t_1{F7{PZh}Wj+_-CDN25oN`G5HX zR32~M=6K+^p7`qpjfG+jP=MXT)h5HGn1af6ZqG@AgNDxf%_|T*xZJ$b<%DaEI(bqd z9;Fsw;-q)s{Nuloj?dvYprU%MfecB6!zFaUo@$hBo`=-#BjQ+FW#uB_O zfxEoKe>;jQ*0|6%IgM~XJ+#p9F8)SHUPGaE?8f)TdORIih~s)-L{p1=Ofw$WpV+gx7+)+X(*Nz|f8kH*4dpnjQL+$HNdiMFR-xgjgNPrcz*jBBZ1VL!jg@Z$# z;cf1#Li(ifE68*eyX&XL*g1&VxJENByo8#)4-{NtxlsT79Pg+TNDgbnKd_uX;gm~m za^WsY`5gu+OyK)ty%-<(rDEVe=-O8J&G2-tdn(vy!zS{@ui9UT>A~k`)Tv6c^aT%d z+fqg}rs=AKN#+=6a#?sYw)K^wy+iaKbw+D$t1&e;uWX}6#1UPpC4FJ0j*YL_Wp(sV zfSLOu| zdw$*ad3%Tae`uK4-h;JW;g$ww;Twc1pFZ;S=BmFQy*(rQS5Wb1nyyZj?YeM?KJ?Nz zUbli56R)RGB77+Te^L3SPb@oxw7!>xe*UU)jWqOWWXklKkl9o_^-PD;!b@&|zJczm zSI_>H=@0~c@aRYUtlj?#s85@GoqxDcZ)l$QP#<n_Aud zcKD5=T5;(`2@T|Vxx!n8*G>d&QUJA2eGYOtMC{&UcSiWSaB{;UGq2)sbt)OPt1Xei z3EE?|tq;;3;26^;B1_awML^U34tD>w;&(B_!@!^M@5kMnQeS$sU0LlvqY>*EA+Iz& zj5;*5V1Mk?{P0cGtsHgx&F;Z6`d%Q|4Rku#f(HH0cIY;CAy&FaTRy9G2wsf&Ob{}1 z^=@v>rCmN1w<6I$^!mz{gtIo&S`T<;?UzY*7oPrM^3x5%uWS5M?Gyx&pp{Sv^1!@P zyvXvIZz9#FGcodNq0k%Oj3mnL80{(6WtS06qy6clNQI*=Ei&s0Nq%x4 z`-X5Ur*TH8L_JyK|}efE^-j%FrN1HqiOsd90ti`$9n2;9;?y zvVbsGX#MWf>BmpegBKLS-%M^^*%DW2^!ZFlXF|;OxJb!#;R>7fAG z5JzI4jkRy?yQP}Dtu_d9^$q{;&&4$Id9^2{tz<*ikKY+ZwkzVCzZs2hTuwc3s#WD1 zv6W=6_;!nTO3{^g7p^{-xB0=pMEU2IPmc+$YAD0kMZPZmOLwFFU7{a6^NW?Ud$}5J)v4U4m~bEA8>hA$@zg_9T*k zlW{2G*`B-wv?_s9@GBJB4F7tP1~;>&FJy9tj!C8?aRcSxk=)k9;ZI zPN=5~hr0`1JY>mQ7I(5d`2EQDYx%tldFxTZOEm`?rgHg@V&~t)M|SQ#EN6ob0n6dx z%d0ccM;`PfOMjT=kgA_)6(p@J%7M^P!kep(U1+^NsR!Ucwa98mWcWfH1ON6)e_MHY z;!p90(e2I&7A`9k;yYtZ60HF~zW}goUU|J83<6o!m2K(YU@)Tvua{;+J;h)h1EC7G&$b?b?5k zeD_nZLze7x1SHRH1PzRtR7xL4$Imv4+VXcB6_+|?9Kr$8mKx$~6UZ^UnRSaYqqn;i z&L9#Umw1(CM^AwV4KWmWx0VHV@iSBJV!UlXa!N(n^sf}jX612Z^PnfWXnDEcLVTx3 z@oQqF&)U>Gae+tIH@QQ~#}v2OCy}mnPEuU+Z1uFNZm@5*A9Su(J1=<4goMpYKWOi| z|D&b=dymvbxOA=3(!#fkbQmw^TzZX{p?dlR>LFylN4N{!=0BfwTV@^n7aaXNHTN}A zXxsdzzcX@2hoSl*V{wWkqIg7p5W@?7;iV{O&S+3n_*JK330rn=XnA2ewK;|?wcA@g zfD9be5b6+}QLq1W8{F8DK<8SgyE|LoyAs^Q_HYz;icZ^q!IgXN_S75H_NmLo^gLKJZI$#fqNC%vmlZoA6~UA z3t492-1t*`Za?od=bTqC9QZV5M)WaJXseiv$F{kWTy9H~fd{Mx)HGLZ5}T%_t@kVQ zI8Z9^*8`;;8o2@+8T{sv@A09f1dNMxD-zC-FR|>0m(N+T%;mMEoNCoo+Q$p96 zKkpNe|9eY1@jv}Nb$&y?Al!NQ{*hKZ@lNc(wB}VE$m2&i{%G2cL(`l701&0003^Go z`JNzO6lH#1`dX~Cbh6&qxs3{hj~jpg*}*$ko;-za{FzkpIr#NTiS)ree-a)7dm^%H z829D$hUkLdQt>MZB{(t=6_5yS3c4flKR%v5FHp|S3)6oX`il>b&d(n_|0E6iVVm23 z%;R@@cC!F_{2#&pW9c6``y0vppV0iDTKu1-`5pZIHkbcrOaFiH7M(cgwKRA4uHN3> zlFhsRoXY=g`uk^YCNwS8x9yDio zhS{D^!igl=ww5VjG|()hUhNgJ!RQQA?yj7)SI| zP|a?|%Gru=TD{d2L98Y?RrYkL^j7sCgtl5L$gl=l0Y6cNf#y|Vru5c7l2M*-Q=sGf zTSE8PClDAoZixtKeuJ)Cs|5MPd%a7T!mj#+yb^LcUbPs>@3sYqa;dFZup=IGMcR@uaxMfW~~P zJN0vmP>BS<>jMYI|kiR47tyA!sJ<`CzFWIf*TWXO+qvzu)z zMC}(6o8~Ybc|K534TNh?3U0;Dt#Hu=a?m5C%`g38A9$(eWyh}24wHW2Hi~~G#DopxJ7X)d^U5RA0YTn;%79zBt#d73Dj~32_neyt5LwjYP>^b^_jo8k}uw zU!!--86$)VmDe5LYxiX8t>VYIsb>~{LHw`BE`Ge+;9uA z)q~$%y|G^FcOgV}6Y=e`=$F{R?~g@ge6-xo%i{04;$erbK}1f`D&~UqoH~mAfHidz z%vkD@T!s4JB}#OZdRj8(ZIs27Z#tsoFo)i@-1dCl2O2WbshS%!$r-vU>G&W5_<(Z? zGDm<-AcevwPUi!Bxg3%0#*4%%_`=t-Kw^hY*wp69)6fuyv~#OkB)}6y)15F7wf>k7 zO&M10G3_@A*C6?O3 zCLJnyOBH~YU@uQ4w-5OR2p$T-DHB0ETj(~tZkDm1vmIKGAs5XH&a}2cyz6gu{nZgy zRX5PabG)JdeT5s-Pjbl3%WhNZ(d0G5iuniS!R4|GOi!q)wRD<2pb31`s+eblK`+A6 z`+sy;Hp8-~;k^eAsb)=c^;h$KOX@+D`pmiqx&f`C{Z%Vlu!hvqZ*qLExF~W^ks7f4 z;O*xF&w!)YmpO$UL)vBSK*9m;-q=jP#p^2pKyZ}7d@R__?1!Uc2|(U1_P&{WYtehb z;~Dy3TbtF4ap+8B^8RYu`V_rHuGebsc!CsU&0udnf`8(Cpzkx=Kbolgc#ep80bG4) z<=ydwI)`>mbSiPdciv^aam;GMuO2a`b&vSG>85giOlGeWwOez3fZsUP4Sa+S;E?*L zS>TuZ>pA$@LoTyJspgB6m)6O<8&O`*w5?^gk`;jj?<= zhh)p2%A%49`pbzfLry0G7iF;COJs-_qy3j(qqfY8ed9$rD^oKt6P#jObIt#6X%O*FQu`YuDDmi8bhn$}Nx) z?RgB1Md>bhuQk;EZe=%&H1AuQi;pVx&y^tP(`y*Fv1`3ukRgrvQm-llk8R0I6=Q%Y zt@)SRXf1gC`vE0Eq8JTxopy_%w6Q3JYo1LTyi=6D7-u(c%GWvP9cTpMZpONRs|E5K zIa9UGM`Wsf?inbN_|~osGGPoULkKQTCyLdq-_SjtO!4IOu`-DwBpFXDO39$;`>GQN zT)0TN;nk(WxcS^F+q#a97-NFFsB|3nv8SU>6OXoSjd0-3RLa@~j!QM>08{$@wlGY) ztEGDJWId!PaZ>gBP}AK{h`cIK$r#LAcIkhkJhEi?5ki4q}g*XuwtQ zx*2%Yk*7)bq2zm06zuVO|JCx8IkuD;&3OuWS1~eDcmnn@ciWu1c1ksl&|Lv>4RqiI z5A6thuzFz|32!l|g1DsPu%jLBQwd}uG2^s+SjMb8ZZd|5lOPLDz0w@HeF5H8@ia^h zjl9He4OtaUei%S18_jT+b#9uQlYblUWQ@kD@1*8K^2wo>dp&m#?~b>Bc9m4GScPpw zLRclv?FJpZ)jp#Vb82FZwAP)?#-zR}r00;Zbheidwm}`H$`^LTcviQ;A*movYT6vp zbRI42l{hekSPV3Y+*x$QQoru?4(Hc9lT(zYWIc7oyiu@B%C1;xx5QL%F%ULOVG>Jv zXeCh9?T%C$6X_%^_#_!d;uNNwrpyr(Y4vymS6$f!IqbofjXO~h7KW79qzqWBw94e5 zyS!*~l>c5av{#32odt>wp=0PJi6QE^?a1}#LmOD)Q9CX1pY7-8v=1>WsSk1!fyeNk(|2u6D68ZbB53?-V) z>zsz+A_3U%?Q4vcb=2cC8ZOOIZT0eDL(kHiw&>=Ss$@F)p6VtE=N1t|n*5nhk8s;G zzt%hy^a;(+OZA0z-D>>Oc-j!UOq*n22NV>mI+#R|yR@?kP1154u^~Cpz{^&M@v*ut zkl@tohl$xNHU?kA9;!gGZzn(CHM2W9fKXzzdstI;oleaI*HuDJDVyW51jZ9+5xSJc z-q77SB1QhN=o5g`hDXKi=bELK+aLqvn$o5Xu)wwD$M@s76Eh602lFW0afOZhW72-9n zKOygavABw@?d!}rqCxc)vg`FSu1)#6DjCaOTOMy5*(+8y^vu|=o#govsK-v2Q`wZ` zXxxYoyH!x8TXHWX;OAl6SKUv?!>3_k;vIS*vGBH0XuBb?QA})eh#c&_ES zJ|9o1I{;Dn{q%3ddIP<6Q*007c)x0?Q@CJaO>$mYb12XPxweM;sgFsXO3Dvvk)6}W zMi=EuoFNTB=RA&JUF(Y}^cpy1zq?}c3O&X9QXnhDZ&Vb*1?`wCY>^;Z);Tnq>k-=r zeVc|$BH(b|DJ@e0wz6#3;16c^>vWTwXFPqo!B!+8%)7~1s^Q}}5sk4C}X(zM>4=r1gh=cgbE%s+EcX-d{ z72T(R3}N#Y^>yb4`z-bwkTb6#-Bl=tIz@jWi;&>hlvMKF9v4fO`RF5cM>e(lr^`NY zF4uKlr7+8mKs$PB0);AzEe&P6ZBI_@KABS`zp3XC0r>{SY$;i8DqpW&pIO-dBMgVUuX3^5 zw|Q?U{<{`rDfQ5e>5A0r>+YU20VSX-ouPj8-CF7#_BooCWQ=b^DeL%h)ro3T~LO z0H1tykmzba92x9h9&jWCREsxwu>!xwXsZ~#h`aH?Owx(b z;!%?Vo;Y(Oa`)uW=JAf@XnAP^Sq){iTpCZ;7t`XFuj-k9Z%3T`>FP|^3 z>yA^G0;ZGs<=$QPzNiZ|&CzCC)0RS|3>s_rpBf-tQBYEs7)7?~IcbZ$&Nl<%8l^?I z|6ZR%P_E0lmn+pbb*_LjM-sy32Fu90y&aT*?}Bm(Z8EQPHHA57qylpJ&WsifXpKB(nWT0L1IV2-%pns%xVS#3#s$G>()4NfWGvEdLeEQU6$x_fN1BvRM+Wke|2 z8E{z)(YaLGex77Mb?(DZj-lC>yRWWkm?Km3eaBB(4n*6C{xzgjc`yJw(zOK=IKjDF zT)1BpTIAq2&1B0S<7#72So%GZd-T-4%MDxqo!I%BX?o{{dBylO=|snE1%MDrI-bI6H)nW3@if3s?UZr z6r-3!S>bJUM|P-Ub5%BX-7865mc3bC^4aG^yzFeHS zAxc-@LSY~vqF&4OT1}J#V^jv_N7$u%dhl{rrQr5=J9=j!5;UP(cneD+JMD-b{pKZ% zv0=|+Bom%H9dm~3B7I4k3RQVYoGC%sc!uS*;-31fKD1jw%374S_=A~JnKP9-Q%q{1 zChNpfm7SS)qOkFEgz=fy1ohC`P@bRw{*>VX7gjiUEmm52L{Ck0<1v|_Sh(R}MQ6dY zWkB^ajVCLHr)$L2kGH8L5{lcPW!Z`5JFf{|>Bf*fB`JXspt5B}+A|ulSf=bY_-tR- z?Fr|Qs&($JwT{SpCbCt_a*)Q4GmsHW-$m?JTI@?+cphA;EDmXln9j~`Ww$(p-5>BE z2`t$e0<oK!W#nj3uuw zPC9tD<`KFJ}_}v zrDNS4>F(|brXKc-Q(Rjz`&kMrH=GuC7wS)bNm6K!vgVK`1vP3K1|aM)^++2K?$*E| z&F9qmjAe=N($<0XmTP#m5?H1h%732HM=xB~DPFh7av33~l|98bg={kxKkI7#)VR7w zU6@l$tuNslBJMq|-p4yLy%|cD6M*cdFcKL`278y+->ZgCy0Zu$GE}@9H}ky`)&2q* z(+CDi*EPR>U3jX=%Fgm8*5T_kBGwIM^ZrW42knp~wBf@o3+fv?eVu*fDuHMvEMt;i z2Afnb*`m>oE)3Vus$NY^EO9zPqL1rhj=_}mEECC~o0^WOa|lsiixnA4mAKosIh@tN zyLPl0LYw4hzq_9~0Eh5;4GB4)j?h+%l&Tb4Cm_g{4~7I+vF9Xmz5QshC*fxDDJUAq zBoWe^Z2Br8VK1=5i&$FT{E&xshuvN7HW8FsagZ&EsTh}SBdhbn zKtiiSYzS=mf?uo#JkUN?h9|L*+s{*vuN@ghobB$ea><0dd9KD17B0u<)*%p5I!BQK zYsfNB)YY*@#?r~H)~*MdJbEytaYLA>_lB=_%VE!{UakA?KJMdON8VRRs<4u8MTE-L zkSul}R^$Tvyjy@*+zkOpWH7SLVa=YIikpLt49Q}!^%rA)jNc(a@#_|8{xF&i`}1%u zny*`5bx~?>@q%6Zk@cp}ci#g_s#od`Co>10LU`3F2flc3>Z5^qs<(D@SFPU1Dz6*p zOnh^uMP$j!)}&3H#UB5T;B%^tFhP)}!OVU-O;B#!_v%*y?)=chl|4mBtD&Cf-C(0zt{ zOp5)FNA;3LZZQG3!Vh>G<22@?Yz*!j1`cllRF1l0d3ape4qslH+D`lg!_hdw$;(#u zL*t%Ja#c+VSol+ZMzumY&+a9DMic6KJei^ zMO`221cX|ZF=9m_)7}PH6kj&1YF1xg1P7Hb3>jvIgbb2|ZPrM&ykoV1RX-&nYZVp{ z*m@Mm-{=~kt-JcPiDaijFEY!tKKtBQUtPz`0Y6W9VR=9BNBg@)vK-5sxY@R`eIEPe2VbUU!{Jw4PqVkcaf=kD9g46 z@68(!q3Q!2^9jVd8aPFWQ#T$Cx;f$Af~GXT?vR@??U&Iw+y$j@^WDVMF=-S6Q>k`Z zzm63&i2f!@FhhrGEp|dl?-o3|!mND$+I{62e`o1a^U!beh2PB>0h084o~#lYoJiR} z0ng>D-g;i3ocewQ2SuaA=oz}L4_LL%O!TQaQ|x3H8#4LYsMt8`DnGmoy2zINP_K93 zcdezjj*yNchohYXbClpbqUgww?7_j1c~XX*n{k72aes}!51kB!7U-XhJKr(v z)<`leAHi!#N_l@?Lfbo%yW?E-_}DY2okk^vpJ#UEC`HDRXXRtO#2=%ErDWBPgzRguY|6z_MyWdo>#KBY#Kw;I z-EIio5?ppN=Y-k|>nx>Kua;52S{AUd6HSl$+KJ3)MO-1C(O%>ENU9bA343Zh zN>}x}+RKtv`a%?MsU8hFjX43m` z>LOwaEML-cX<6SV@G|&%KG&v9s;wMSoN}gqF0!YiNQ1r?@wN9Q^}8pY*td255=jE! z?SJ17p)51<>^=KEdlrso^6Hv z$ut_-`1nwcBcsKBksAFrkhy~@L*a!Sm5cX0W7D8-pWoN`rLMFLkrjUezc6I>%FILM zs`vMbE*56grPvWo(>Y_EJ>{+>{SkmCbiSS0`EUGs9(lB=RUJF61G|?fJNNNZ8zc(R zMEHneQj(fQ!YA+!Lov@JF-_s5o=R`^7EweN>}PL4dL+@|XJg1XHdp;fz_SK(KFC1QeiJkDH52|=K+ZW^UQ zDoNhG>drJl#?eT}2f=-CT{Fw0T!mXx%3JrhNbFG+eI#jzDRph7tc{Ca^?Z4L) zA=4l)-{q`?;%P6wc%`^47}gb_J)=jK!(^+!U$YXFZT~Lw`uC3?S9MQ(Fe~Fetm4z- zcfyRG7;SJC6eT)$qRg*HczYWCZWj1+T72E&qlYC;OLkVt&=k|6h;Bxt{m?#DduaRO zlL&8rT|xEZuk+;J&qmmq z`7IwdUL-oBUvX6ah}vazZ&nK<^{U^#+S&H70QKz>c zn1FlLhkFJ#fDS%U!`7?A^~zew_-qbC5r50HM*J^yjz zCNF#eP&;6JfWnmIS(Y-1JlERi8jI zX*Br5_zUL>xXD?FNcfsk!Ma1{a-13(>-bP8KubQ6Qm}_weCW`BZRf}NJ)MnYVUuWW zmXC_g=%vRTl^X}K-sg7~_>bXgN3}@TSqpK{^;29nvdd7BvxC(A3Ropx(fG zf2t@0{yin=@zjHXC9fo`RD^eND&!=~GBg>BO;&DUM=bolHAmgH-DFggV;g6X+J9(9 zE86Uz^8ezI@4~IprYP4+oH>TnXlm59Jqk z3DR{2lurDqb86-GhV1fd5yYF=S|0bMx`9#5Ls`bqxs?tF%>5oh?jXJOUq-IAL=H8M8H8@z zX8L-=<6lttw{VN>HDTq+T}KCY*r%&B-{?J-Jer+)Rqdk+gkhf1l#}%k$Lw*Bt~2&%m2&2ObQ6?@Fj zqJv|lUE!`Q|BNQhG8pi3s4JKNtn|I1R3gcS5YVVSGBZMOfB)h-QrU2M8<;S$mz18! z{zkhTe89?oJ!&uF!k0O^Q|`B#nFC&ojDM8eXn{5@rruDAZ*$c*h91>Do!N0nuH=gx z$$=HiY|dwU$>^e4Unm5@mKUd*!`?f^RC|x0$c*yBSyAIkGcss5>BmEbldp*S6(f-N z0X)7Cf^RqyKO6C<3FVhUzBpfne=BD;bM;=J;S43S9^`19sJe6uplmgC)=@(5l{`Mf zOu1k-)<;9xmD!7N#N|1;@0FRklakH(_EzXRF0k0s5+o2~N+u*aKRBj0`Ml|0?Ce@F>D>CwElU>k38Zm|4;#%0eg+X3DKPddMUoux$(s4m&{ z#tj(Jrp=H+yIGChBV*7N=v>&mk6;CGuml&v{O!zbv1W#k4H5@z%%S|#GrOj>Scqz zkUksCT!D~r*Q1(p!I-3bWKJ%?)%DAPU5L)+k&ICL^b-7u@mleAP)31424-eVN zu2?xN-$$09I%fT*_zPVO9UJDDiq8LhcJNOS5nzi)ecKEKjhe=-Rw$TILuTq*BXa9!S;eO53{=GmA-KoG?colWnK z7!CH8^a%ZO9YtUkU(%o zTC?K5EIQbBU#v9Ku+Jji5^$!V$#~FmIRaE*_1n7rwn75MJ?#=8B~K}+oVS~ps+`S! zC{MTvL{%C+ziU607KmzN(3RzIZrO^pHzdAo>&$dAK&kcj(YtA$5g8$alM0~aN>O>+ zU}f&5U~KwB%iHB`W-;o5zTx{aGmeSof=R>%sUg&g8)(!2T>AD^IW55_4nVNw#E!}~ zhNcvzp>o{{p!a;`p?9BxvmxQ;jKO6EbW>%B0RQAFOPl(oKZftQEFEm#PWlm|m#{v* z7w?=*T^vy~M!7E3-IkQ2Q`I zo|Nu&DE9tN0x+}EyDS}fN#m-cNdloeJ!}@WQga!MX=;EU|L^r~*tolsVgpY6xnP2G z@3FoXG$0bPz`eDkopI)-lTeR2$k67kSp@$<6 zMr*t$UbOPUQkDHG0}+i=^6320y<~FUGagAiRyMPR)9%|h0g|C%%hTnb!tCJtsM?2L0&Dx zu4t**1m7Uns@Tj;K{U8^BbAB@Rlv%%X3OUA!-Cno>wk77uf-C5JG1hiswI$a4%YmV>lq>(V+HZHi zU||KeB!XGv8679q-IC5)M6bS4ldC6He?uSEXZ>)hCP%ENOPXRbE_1E0_}nsaHb5|g zu*X*;4L*5Fhnf$-(_zQ)x1iY&f=m_3LD_$IuW0D2w7m-QiL+VkhMSe^XSQK-&4V4F z{PHhq=uiJ$IeLCb;UgS$?YtK4Zp5tTa%fG{EnsCj323X|FX$-qhYcz|^N>B#-=~ev zsKiISV$o3D9#85Or;-CrkzWL{NOIy~thd0t4T#=;xrw!0A2H{cNWXbmcxPcQBBnsg zl(krs6eoyQNVgIlj~2V)LpN;LGiZA0f;IVn@}rZ7Hfhwt_ZV@U5-G=&fZ#-w93~4= zR&h;?#n?j%F!M13vmzn{RseYzFo;pF?h-NvKDGW3QWqNd;G;<;V0KIZnh-g;>I3w7 z=RlyTsA*ZnN~jOiNn^3f+BTWfAn;08JM@Y89xe94e}GlrJqy)euI6FesKutXK$s(; zTAiFRn-W8(h9{o2afk-9ziG|5c5}Sn77IX0&BxDeHN%0)Aua(MiqH8mB-hX0AF0W~ zI?c(G$d>-6GclaA>SPI$QCV4m7U8EdWv8C|eIWQp4_<6vHTdb(tjN@2cB(BnF~`iN zB%WOk1fdFUf2ttA^I`2Vn+Y-_dA+Z0OOq}Ygf*+<@f%DSfy5<$K-C?FzY=z{jpjwB zb+8O;c~28F)UnDOBCxus?xW!$_i&o}4?A8FTV{)o{Byy(J9##_uc_TYo1Q-P8P1@6 zB?gNW?dvN{iX6it6MGFYlZCFJ*<7AK(x>YuntXZxh=zWAQYj}p-=mu%A<1qjs8Np) z4bLAH{;ThdVOfyA#hc^rM@~AEx#Lv$t;DzH-8BD~RFoX&<3DBZ=rHVh{B3A5vr6C{ z6A?)d{b1g4bZ!Q=cQ>cy7%otCM$Wj><$W9N{-S~7QD>l5b9o!1(#&0;gSU@JGXsm| z6bm@d!~u|~DNS?*eYpBd^sJ9ntP#j(*}#W&7-rVl^X++vgXc9?A`lL24E}=d2inF& z&zk%<8l5HymEt3nzDu;+hB_%6bYN-Gp1MK--qF-0e{LbviZbP%^&yi~4(_ zW|n$QU~A=7!9*BBE05t;g~D$^3low}*76vo=iafR6p{eFE66+8nu3zTn-;YiuFDgu zfT)SFlV?J`BfzZ1VEb3z+5gc2{_n6!aN$`gF49(pCSa81t1oE$k8)uuW|04obhq*p&16lX**27ChE zT)k!@>7a1piP_}XO;A#@nJh&eI2H_S7WIv$IVR%FG|F7)@wgw_|I;qLp~F+2dH1Db z8fe*c*j@HF&9YqenVN#!)Y${ZwA!-zv&9vW5o?WT`(WEOmy-hD`z>xsI6XPY{0Hqm zmN>dUTaL4DM%321lHNeQ8tmbqpkWPFGMq_5&c@312v|urQx5P-)@R<3{?q9FZ{)Y8 zCCEYKzxa}G@?)~5z*hHdqzPOQ0LIegsrUKqz3^0JN=L-nR2kZ~3}aXM5p4V9h#XNd zvkl=51;#O%)*8jxxXsK*!HN#1*W?YOOWYHMa$_8fCHHB;bZ zMz>+LW?qO$)KCoE39SiYbD|jt&fHm3GDz>CtPxSZUZ=Uz%eZQB_<@fu2sps??Hbrp8LivQXl0`Q1!L(}ijBN24x}mhk zYtDuIV>G76$`mUxuRWAC1&+r*Bia6l%k^3Im>}niKhEf>uwaoy-r?;`B~u=t6(qDt z?AdYGZ{w#09!nYSm0zu1bGE7p$$s5owi>=eq&^ChfubH`?;D;DJv01-5_W8|&Cv{% z&vg2@kWb!AIz21}#EP+%%Lewr>QvrHe~|u_*C5-a!FWYU#;*Q-?T#o(!O5g!zwDf^ zJOA)`WNifvHE03Vlj37Z3!(n9XmVqY@7Ghi7l7Efb?bHErfVR@L5i0C z_PF&MdrlU$jXn@d`?{&k5f3B7jF%pV4T2KhQxdpavKH9N?tyE1gbo~r2-wIJ_6BQx z`{vV)NfO%Nu*}%7D+?&Q@th{Pbf=5s?!W2rQ^!UEsQcBdDI4y^6mTYL^nEtWHc4@d z7Bj-o`GF}eR)uFBLYI1GtQc3J?ZE-9Av^bRpv$^yc5y_=vOcV|P8@jn2ak`&@(rE2 zI8kqSsbgBLOUk-^ajAHGUiT}n0Tc6C@|qLoA*`WI8jJnf$!1L+Idz9@NfJmT&g$9S z4R5fPk^ht9LKr!&BH6quF^EMSH8{pri#_|*%sLfz#(SVFmc-t|ewK=N?7l7Z+nD>D zwqdkE|_bZT(BEuEulxnm73NKvx20>m(o1P3A`B=1BR3 zVM8{o2!c2xq(>6V`h%Z7_O(`oM7!vQ(1>mGj$W)$Qq;b>t-S`B8Ct`$fEFG~HX#sh z49hz7(jAm-z*u7^h*W{1EPWPn2vjVj?$Oe0M42sp^AZIwh0Uj2t~-lBfi$8*sgOcTl;vI>o4P(E-d7yZRG;QLESoXo z_HVU!CTjJ{?2!^%af$@)6ae1JZ{D@@^HJPwvioT4zIr^RWC$y(*7L0xnvtuG!>#}T zSiQ7tbl`}Yq8K*BaSA%3I!QpaQ`Fsx1_Xs=5(<82bWoke13jK^ z=XuSx(`P~X)PfZn6}9++Beoq3PddxeU}dO`V4%Q~0rTFbp;0opXK9BicUAg7eIX8X zmCy;x=L==lJWC%!C7M2FdusPf?q> z;25c)NQ+6Fsjk$V#6c*c%$k(UGW4hcZ)DqX3ZKA6Ymd2RmCVi9e@A0098gieh;6AJ zsNrEKVu2OYHlWXL($sm5H=}$lFgh>!@Sz)mwm=e+l49>8R4d`1RMFOa6z=H5Qc5Jb z`fU4lS4i>l-P8DpO=<9EFCHN37_sP@3D5qNKqJ=?C{Qw$`@=_o{YxZ( zn2*P>g6ep1XBjG38nBndVi39UBBj40{N4PSGq-0)RV6CVyvS4p+6~AKWz7JFo`3+o z5IsN^42z_@Rh8OmPMhU8!X5`+79!wfJK2;JnLetW3A}f;$jkR$gxJTr+;p}yt%Q%L z*Vr=u=jLd-S?D}EoxrSl57{&O?NADpDS7IVGj@o>`tgK zm)H&`h)|58DPZpsSo)|~u@*jTKOQ~Yy^L;NZVLN>B%yOjp@6oi{XZ^9xA58gd{W_2 z621ej-67!qFvCkA3Bb$`KZ{ ziPuy<(a{NHL9^8}c-DpF$xVfMi*IO2Vm-o)T+JM1@q^CH1I1v7iI>A|XljT_Q? zTY`DQu`llJoLKX*OG^1XKd|WgukPO~Q{YFsiN|S^!wSJm6RDN9-ASFIJ11Eq*?WAJQeS8MfVtQaZkVouf z5Q}3b(;m4T;$@WIXpag>yOJTZ?@K3DI8hXYjwYVxnr9Jnr%-iqi|9A<2-< z8kaX;b;!LhxnwD@dqu@GiK=b7S%>(X^sfK-TgKe6LbtZ|?YCW3$=hd`E$X)j@HV{f kUh)6?-QW1`ul|_hF}L!>U4iBN2jC|%Z1=aqZ@xSFUl{?2yZ`_I diff --git a/display-invoice.png b/display-invoice.png new file mode 100644 index 0000000000000000000000000000000000000000..92c345d987ba362cd3a2ccefccdd0812e054f9f2 GIT binary patch literal 46002 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

+ +

+ Once the payment request is displayed, the customer has 15 minutes to send the appropriate amount. Paymium notifies the merchant of the completion of his payment via the associated callback (for which an URL may be provided when creating the payment request), once one Bitcoin confirmation for the payment is received the funds are credited to the merchant's account, a callback notification is then made. From edebd2f668b040d86beb7afe7173dff836d69952 Mon Sep 17 00:00:00 2001 From: AK Date: Mon, 9 Jan 2017 12:58:05 +0100 Subject: [PATCH 104/110] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3784ce15..9aadd5d0 100644 --- a/README.md +++ b/README.md @@ -1142,9 +1142,9 @@ Paymium notifies the merchant of the completion of his payment via the associate ##### Endpoint -| method | path | -|--------|------| -| POST | /api/v1/merchant/create_payment | +| method | path | authorization | +|--------|---------------------------------|--------------------------| +| POST | /api/v1/merchant/create_payment | oauth2 (scope: merchant) | ##### Parameters From 7e2cf32f2b7478a1f761e21bdb0b3d611dd05213 Mon Sep 17 00:00:00 2001 From: AK Date: Thu, 26 Apr 2018 15:26:53 +0200 Subject: [PATCH 105/110] Update README.md API signature is the _hexdigest of the_ HMAC-SHA256 hash of some params. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9aadd5d0..c92bce1e 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ $ curl "https://paymium.com/api/v1/user" \ ``` * The **API key** is the token that is displayed when listing your currently active tokens, - * The **API signature** is a HMAC-SHA256 hash of the nonce concatenated with the full URL and body of the HTTP request, encoded using your API secret key, + * The **API signature** is the hexdigest of the HMAC-SHA256 hash of the nonce concatenated with the full URL and body of the HTTP request, encoded using your API secret key, * The **nonce** is a positive integer number that must increase with every request you make ### OAuth2 authentication From 43f7a084f9cc92f5828ebc90e991db05d635900c Mon Sep 17 00:00:00 2001 From: Benjamin DESCAMPS Date: Tue, 15 Jan 2019 17:11:06 +0100 Subject: [PATCH 106/110] Remove Fix Readme doc --- FIX-4.4.md | 61 ------------------------------------------------------ 1 file changed, 61 deletions(-) delete mode 100644 FIX-4.4.md diff --git a/FIX-4.4.md b/FIX-4.4.md deleted file mode 100644 index 8b46833d..00000000 --- a/FIX-4.4.md +++ /dev/null @@ -1,61 +0,0 @@ -![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) - -### NEW : Java example connector now avaible [here](https://github.com/Paymium/fix-connector-example) - -### NEW : Python example connector now avaible in the `contrib/` directory, kindly provided by one of our users - -The Paymium FIX API allows developers to subscribe to real-time market updates using the Financial Information eXchange protocol in its 4.4 version. This API is currently in beta-testing phase. - -Do not hesitate to contact the support for any issues or suggestions. We're also available on IRC at Freenode on the #paymium channel, ring davout for assistance. - -## Currently supported - - Subscription to the real-time depth - -## On the roadmap - - Ability to place orders and receive execution reports - -# Using the FIX API - -## Obtaining access -Our FIX acceptor is available at fix.paymium.com on port 8359. - -## Managing the session -Once connected, your client is expected to issue a `Logon` message containing `PAYMIUM` as the `TARGET_COMP_ID`, a non-blank `Username` (553) field. Encryption is not supported, the `EncryptMethod` (98) field must be set to `0`. - -The acceptor will then reply with a `Logon` message. From there on, `Heartbeat` messages are expected at regular intervals. - -The acceptor will correctly handle `TestRequest` messages by replying with a matching `Heartbeat`. It will also handle a `ResendRequest` by resending the requested message range. - -## Obtaining market data - -Clients may issue a `MarketDataRequest` to subscribe to the depth feed. Typically it will allow a client to receive a snapshot of the current state of the order book once, followed by real-time incremental updates whenever the data changes. See the example session. - - -# Example FIX session -This session shows the message exchange between a client and the Paymium acceptor for the purpose of receiving market data updates. - -Messages sent by the client are indicated by a `>>>` while received messages are prepended with a `<<<`. Separator bytes are replaces with pipe characters for clarity. - -```` -# The client connects and sends a Logon message, immediately followed by a Heartbeat (not really necessary at this point) ->>> 8=FIX.4.4|9=75|35=A|49=DAVID_SND|56=PAYMIUM|34=1|52=20141027-17:10:37|98=0|108=30|553=DVE|10=192| ->>> 8=FIX.4.4|9=55|35=0|49=DAVID_SND|56=PAYMIUM|34=2|52=20141027-17:10:37|10=219| - -# The acceptor replies with a Logon -<<< 8=FIX.4.4|9=75|35=A|49=PAYMIUM|56=DAVID_SND|34=1|52=20141027-17:10:37|98=0|108=30|553=DVE|10=192| - -# The client then sends a MarketDataRequest asking for the bids, asks, trades, open, close and VWAP of the EUR/XBT instrument -# The entry types are currently ignored, only bids and asks are returned, the instrument symbol value must however be correctly set to 'EUR/XBT' ->>> 8=FIX.4.4|9=138|35=V|49=DAVID_SND|56=PAYMIUM|34=3|52=20141027-17:10:40|262=X|263=2|264=0|265=1|267=6|269=0|269=1|269=2|269=4|269=5|269=9|146=1|55=EUR/XBT|10=188| - -# The acceptor starts by returning a MarketDataSnapshot message (shortened for clarity) -<<< 8=FIX.4.4|9=13159|35=W|49=PAYMIUM|56=DAVID_SND|34=2|52=20141027-17:10:40|262=X|55=EUR/XBT|268=477|269=0|270=0.0001|271=65300.0|269=0|270=0.001|271=1000.0|269=0|270=0.01|271=100.0|269=0|270=0.1|271=1010.0|269=0|270=1.0|271=101.002308|269=0|270=2.94|271=1.0|269=0|270=5.0|271=0.01|270=1000000.0|271=0.2|10=171| - -# The client regularly sends out Hearbeats ->>> 8=FIX.4.4|9=55|35=0|49=DAVID_SND|56=PAYMIUM|34=4|52=20141027-17:10:52|10=218| - -# Whenever new data is available it is sent to the client by the acceptor -<<< 8=FIX.4.4|9=104|35=X|49=PAYMIUM|56=DAVID_SND|34=6|52=20141027-17:12:18|262=X|268=1|279=1|269=0|270=288.999|15=EUR|271=0|10=124| -<<< 8=FIX.4.4|9=104|35=X|49=PAYMIUM|56=DAVID_SND|34=7|52=20141027-17:12:19|262=X|268=1|279=1|269=0|270=288.999|15=EUR|271=0|10=126| -<<< 8=FIX.4.4|9=111|35=X|49=PAYMIUM|56=DAVID_SND|34=8|52=20141027-17:12:20|262=X|268=1|279=1|269=1|270=288.999|15=EUR|271=0.011361|10=208| -```` From 0ff3c7edb8f59b74110f207f6db8b42727c5c1fb Mon Sep 17 00:00:00 2001 From: working4coins Date: Fri, 19 Apr 2019 16:55:39 +0200 Subject: [PATCH 107/110] Fix Typo Change WebScoket to WebSocket --- examples/public_socket.js/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/public_socket.js/README.md b/examples/public_socket.js/README.md index 3f1341e5..fb9e1416 100644 --- a/examples/public_socket.js/README.md +++ b/examples/public_socket.js/README.md @@ -1,4 +1,4 @@ -## WebScoket +## WebSocket This is an example of how to connect to the Bitcoin-Central WebSocket with node.js . From 99d1bcb931325ac50ffe2f93019138d66d701846 Mon Sep 17 00:00:00 2001 From: Benjamin DESCAMPS Date: Fri, 19 Apr 2019 17:03:47 +0200 Subject: [PATCH 108/110] Client fails to connect to the socket Add default protocol and subdomain in order to connect to the websocket --- WEBSOCKETS.md | 4 ++-- examples/public_socket.js/client.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 04ac4adb..615d5daf 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -155,7 +155,7 @@ Example: ### Subscribing -You must connect your socket.io client to `paymium.com/user`, setting the path +You must connect your socket.io client to `https://www.paymium.com/user`, setting the path option to `/ws/socket.io`. You must emit a `channel` event with the user channel id. This channel id is @@ -167,7 +167,7 @@ When new data is available, a `stream` event is triggered. ```javascript var io = require('socket.io-client'); -var socket = io.connect('paymium.com/user', { +var socket = io.connect('https://www.paymium.com/user', { path: '/ws/socket.io' }); diff --git a/examples/public_socket.js/client.js b/examples/public_socket.js/client.js index 26a81c09..bb00c957 100644 --- a/examples/public_socket.js/client.js +++ b/examples/public_socket.js/client.js @@ -1,6 +1,6 @@ var io = require('socket.io-client'); -var socket = io.connect('paymium.com/public', { +var socket = io.connect('https://www.paymium.com/public', { path: '/ws/socket.io' }); From 61392ef170f4daea4cc7256080536ddb8eb051f1 Mon Sep 17 00:00:00 2001 From: Benjamin DESCAMPS Date: Tue, 9 Jul 2019 10:06:04 +0200 Subject: [PATCH 109/110] Add https to paymium public websocket --- WEBSOCKETS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WEBSOCKETS.md b/WEBSOCKETS.md index 615d5daf..c86c239c 100644 --- a/WEBSOCKETS.md +++ b/WEBSOCKETS.md @@ -33,7 +33,7 @@ triggered. ```javascript var io = require('socket.io-client'); -var socket = io.connect('paymium.com/public', { +var socket = io.connect('https://www.paymium.com/public', { path: '/ws/socket.io' }); From 50b28122ee952b9fc6f1206f571022c4cfb8df94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me?= <48957057+jeromedcpaymium@users.noreply.github.com> Date: Mon, 30 Sep 2019 15:49:19 +0000 Subject: [PATCH 110/110] Update README.md Update logo url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c92bce1e..910a1206 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Paymium logo](https://raw.githubusercontent.com/Paymium/api-documentation/master/logo.png) +![Paymium logo](https://raw.githubusercontent.com/Paymium/old-api-documentation/master/logo.png) **NEW: Our sandbox environment is now available, visit [sandbox.paymium.com](https://sandbox.paymium.com) (you may have to add a security exception for the SSL certificate to validate).**

l`VasP8N$AVs6Gk;l?;K=24lHAzwpe?M{f=H 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 S0gw~m$3VwKyHfN1i~j+u?P6B| literal 0 HcmV?d00001 From 447110f96a71cd89f6b40dddbfcab153845212fc Mon Sep 17 00:00:00 2001 From: AK Date: Tue, 28 Jun 2016 18:51:52 +0200 Subject: [PATCH 103/110] Update README.md Add invoice picture --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d7eb201f..3784ce15 100644 --- a/README.md +++ b/README.md @@ -1131,6 +1131,10 @@ The merchant platform can then : To display the payment request to the user, the `https://paymium.com/invoice/{UUID}` can be used, this is used by the e-commerce framework plugins. +