0.3.86 • Published 4 years ago

carpal v0.3.86

Weekly downloads
3
License
MIT
Repository
github
Last release
4 years ago

JavaScript-SDK

The JavaScript SDK for developers(including third party developers/vendors) to create custom modules by using Carpal Fleet core services.

Alt text

The SDK is under active development, we will release the latest version to npm as soon as we have new services ready.

The current version of this SDK is 0.1.50

To install CarPal SDK: npm i --save carpal

If you were using webpack and had encountered the regeneratorRuntime is not defined error, you may need to include babel-polyfill to your project(npm install --save babel-polyfill). For more info, you can find it from here https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined

We only tested it with ES6, theoretically it should work with ES5. Use it at your own risk for ES5.

Algo

ModuleMethodDescription
carpal/dist/algo/RoutingoptimizeRouteAsync({date, routeSettingId, routingScope}, token)This returns a Promise object (reject/resolve). Example. date (mandatory)(string) = '2018-02-28' **routeSettingId (mandatory)(integer) = 124 routingScope (mandatory)(string) = 'all'**

Account

ModuleMethodDescription
carpal/dist/data/account/AuthgetTokenAsync(email, password, clientId, secret)This returns a Promise object with both access token and refresh token.
carpal/dist/data/account/AuthrefreshTokenAsync(refreshToken, clientId, secret)This returns a Promise object with both new access token and refresh token by using existing refresh token.
carpal/dist/data/account/AccountresetPasswordRequestAsync(email)This will call the email service to send out a link and return a Promise object with true/false
carpal/dist/data/account/AccountresetPasswordAsync(token, email, password, confirmPassword)This will actually update a user's password and return a Promise object with true/false
carpal/dist/data/account/AccountvalidateResetPasswordTokenAsync(token)This returns a Promise object, if return true the token is valid, otherwise an error occurs.

Customer

ModuleMethodDescription
carpal/dist/data/customer/CustomercreateNewCustomerAsync(customerObj)This returns a Promise object with true/false for registration result. The customerObj payload example {email:'xxx@example.com', password: '123456', firstName:'John', lastName:'Lennon', phone:'+6512345678', birthday:'d-m-y', identityId:1, coName:'ABC Pte ltd', coPhone:'+6512345678', coVatNo:'xxxxxx'}
carpal/dist/data/customer/SettinggetCustomerPreferenceSettingsAsync(domain, token)This returns a Promise object with Logo and Background Image URL for Customer
carpal/dist/data/customer/JobgetJobDetailAsync(orderId, token)This returns a Promise object with Job Detail with given orderId
carpal/dist/data/customer/JobgetJobSummaryAsync(orderId, token)This returns a Promise Summary with Job Summary with given orderId
carpal/dist/data/customer/OrdercreateNewDeliveryWindow(deliveryWindowObj, token)This returns a Promise object with delivery window Detail. The deliveryWindowObj payload example {customerId: 1, identityId: 1, productTypeId: 1, transactionGroupId: 'optional', displayName: 'xxx', startTime: '12:00', endTime: '16:00'}
carpal/dist/data/customer/OrdergetCustomerOrdersWithFiltersAsync(filterObject, customerId, token, validateSchema)To use getCustomerOrdersWithFiltersAsync, validateSchema has to be set to true, else by default it is set to false. Currently, validateSchema is not handled yet. This returns a Promise object with all customer's orders. The filterObject payload example {pickupDate: '2017-11-06', orderStatusIds: 1, 2, 3} To utilize the function, customerId and token must be provided.
carpal/dist/data/customer/OrdergetCustomerOrderCountsAsync(filterObject, customerId, token)This returns a Promise object with all customer's order counts. To utilize the function, filterObject(pickupDate: '2017-12-31'), customerId and token must be provided.**
carpal/dist/data/customer/OrderupdateJobLiveData(originalJobDatum, pubSubPayload, filterObject)This returns update Jobs with both activeStatusCounts and totalStatusCounts counts. Can add orderStatusId and pickupDate fields inside of filterObject. This function will response new data for the today pickupDate, otherwise it will response the existing data.
carpal/dist/data/customer/DrivergetCustomerDriverDetailAsync(customerId, identityId, driverId, token)This returns a Promise object with customer's driver detail.
carpal/dist/data/customer/DrivergetCustomerDriverListAsync(fileterObject, token)This returns a Promise object with customer's driver list. (V2 Endpoint)
carpal/dist/data/customer/DrivergetDriverListAsync(fileterObject, token)This returns a Promise object with customer's driver list. (V3 Endpoint) fileterObject = { limit: 20, page: 1}
carpal/dist/data/customer/DriverexportDriverListFileAsync(fileType, token)This returns a Promise object with download link url. Example of fileType param - csv or pdf or excel
carpal/dist/data/customer/DriverdeleteCustomerDriversAsync(driverIds, token)Example of driverIds param- 123, 456, 672
carpal/dist/data/customer/DrivercreateNewDriverAsync(driverInfo, customerId, token)This returns a Promise object with new driver detail. The driverInfo payload example {identityId: 1, productTypeId: 3, transactionGroupId: 180, firstName: 'String', lastName: 'String', email: 'String', password: 'String', birthday: 'yyyy-mm-dd', phone: '+65xxxxxxxx', existingUserEmail=false, sendConfirmationSms=false, isNewUser=true, vehicleTypeId: 1, vehicleBrand: 'String', vehicleModel: 'String', vehicleLicenseNumber: 'String', vehicleModelYear: 2018, vehicleColor: 'String'}
carpal/dist/data/customer/DrivergetCustomerDriversWithFiltersAsync(filterObj, customerId, token, validateSchema)To use getCustomerDriversWithFiltersAsync, validateSchema has to be set to true, else by default it is set to false. Currently, validateSchema is not handled yet. This is an example of filterObj to be passed to getCustomerDriversAsync: const filterObj = {driverStatusIds: 2, orderRouteTypeIds: 1,2, driverTypeIds: 1,2,3}
carpal/dist/data/customer/OrderupdateDriverLiveData(originalDriverDatum, pubSubPayload, filterObject)This returns update Drivers with both activeStatusCounts and totalStatusCounts counts. Can add driverStatusIds and driverTypeIds fields inside of filterObject.
carpal/dist/data/customer/OrdergetBatchOrderProgressAsync(customerId, token)This returns a Promise object with batch order progress.
carpal/dist/data/customer/OrdergetGroupingLocationAsync(groupingLocationId, token)This returns a Promise object with all locations grouped by pickupGroupID.
carpal/dist/data/customer/OrdergetGroupingLocationsAsync({statusIds, pickupDate, limit, offset}, customerId, token)This returns a Promise object with all locations grouped by pickupGroupID. statusId 1 means MyOrders, 2 means Locations with Errors. pickupDate format should be 'yyyy-mm-dd'**
carpal/dist/data/customer/OrdercreateGroupingLocationAsync(locationObject, token)Example of locationObject = {"pickupLocationAddress":"22 Gim moh road","deliveryAddress":"Holland Close"}
carpal/dist/data/customer/OrdereditGroupingLocationAsync(groupingLocationId, locationObject, token)pass updated fields into the locationData Object. Example of locationObject = {"pickupLocationAddress":"22 Gim moh road","deliveryAddress":"Holland Close"}
carpal/dist/data/customer/OrdereditGroupingLocationsAsync(locations, token)locations params must be array. Can pass multiple edited locations with groupingLocationId into this array. Example. groupingLocationId: 1, locationData: {pickupLocationAddress: 'xxxx'}
carpal/dist/data/customer/OrderupdateAndTruncateOrderErrorsAsync(locationDataList = [], errorIds = [], token)locationDataList param must be array. Can pass multiple edited locations with groupingLocationId into this array. Example. groupingLocationId: 1, locationData: {pickupLocationAddress: 'xxxx'}. It is the same as edit grouping location function. errorIds param must be array .
carpal/dist/data/customer/OrderremoveOrderErrorRecordAsync(groupingLocationId, token)This function will delete one order record with errors from Dynamodb
carpal/dist/data/customer/OrderremoveOrderErrorRecordsAsync(errorIds = [], token)This function will delete the list of order records with errors from Dynamodb
carpal/dist/data/customer/OrderdeleteGroupingLocationAsync(groupingLocationId, token)This function will delete specific groupingLocationId from params.
carpal/dist/data/customer/OrderdeleteGroupingLocationsAsync(groupingLocationIds = [], token)This function will delete the list of groupingLocationIds

| carpal/dist/data/customer/Order | getUniquePickupAddressesAsync(filterObject, token) | This returns a Promise object with all unique pickupLocationAddresses. Example of fileterObject:: pickupDate = "YYYY-MM-DD", with_order=0 | | carpal/dist/data/customer/Order | cancelBatchFileProcessAsync(groupingBatchId, token) | This returns a Promise object with data true if the batch file is actually deleted.** | | carpal/dist/data/customer/Order | fetchBatchLocationsErrorAsync(pickupDate, customerId, token) | This returns a Promise object with error and its message from Dynamodb. pickupDate format should be 'yyyy-mm-dd'** | | carpal/dist/data/customer/Order | fetchBatchLocationsErrorAsync( pickupDate, customerId, token) | This returns a Promise object with order progress data. pickupDate format should be 'yyyy-mm-dd'** | | carpal/dist/data/customer/Order | fetchMyOrderColumNames(type, customerId, token) | This returns a Promise object with my order table column headers filtered by customerId and type type = my-order** | | carpal/dist/data/customer/Order | getCustomerDriverCountsAsync(filterObject, customerId, token) | This returns a Promise object with all customer's driver counts. To utilize the function, filterObject(driverTypeIds: 1,2), customerId and token must be provided.** | | carpal/dist/data/customer/Search | searchAsync(keywords, scope, fuzzy=true, fuzziness=1, token) | The available options for scope:drivers, ordersThis returns a Promise object with search results. (for scope argument, please leave it as empty string for now) |

Driver

ModuleMethodDescription
carpal/dist/data/driver/LiveRoutesendLiveRouteDataAsync(liveRouteObj, token)This returns a Promise object with sns message. The liveRouteObj consists of {orderId, addressId, driverId, latitude, longitude, orderRouteTypeId}
carpal/dist/data/driver/VehiclesgetVehicleTypesAsync(token)This returns a Promise object with all vehicles types

Routing

ModuleMethodDescription
carpal/dist/ui/routing/RoutinggetOrderListWithoutRoutes(filters, token)This returns a Promise object with sns message. The liveRouteObj consists of {orderId, addressId, driverId, latitude, longitude, orderRouteTypeId}

Messaging

ModuleMethodDescription
carpal/dist/data/messaging/PubSubInitializing connection: pubsub('APP*PUBSUB_KEY', 'CHANNEL_ID', realtime?) **_By default, realtime is set to true to establish a socket connection. For transactional mode, you should set it to false*subscribe(eventName, callback)publish(eventName, messageObj) unsubscribe(eventName, listener) listener** is the callback listener function that was previously subscribed.Example:const ps = pubsub(API_KEY, CHANNEL_ID);pubSub.subscribe(eventName, callback);pubSub.unsubscribe(eventName, listener)pubSub.publish(eventName, listener)

Notification

ModuleMethodDescription
carpal/dist/data/notification/NotificationgetNotificationsAsync(all = true/false, userId, token)This returns a Promise object with notifications. Param all=true/false to indicate if show only unread or all notification messages
carpal/dist/data/notification/NotificationdeleteNotificationAsync(notificationId, userId, token)This returns true if requested notificationId is deleted.

Data validation

This is a special set of functions to verify the inbound data from Pub/Sub against the schemas predefined by CarPal. You can choose not to use these functions at your own risk

ModuleMethodDescription
carpal/dist/data/validation/SchemagetSchemaAsync(service, schemaName)This returns a Promise object with the a schema. This function should be called before calling the validate function
carpal/dist/data/validation/Schemavalidate = (schema, payload)This returns true if all fields in schema are covered by payload object, otherwise it returns false. This function checks both field names and data types

Public

ModuleMethodDescription
carpal/dist/data/public/CountrygetCountriesAsync()This returns a Promise object with a list of countries available for carpal services
carpal/dist/data/public/IdentitygetIdentitiesAsync()This returns a Promise object with a list of identities(cities) available for carpal services
carpal/dist/data/public/LanguagegetLanguagesAsync()This returns a Promise object with a list of languages supported by carpal system
carpal/dist/data/public/SettinggetCustomerPublicProfileSettingsAsync(domain)This returns a Promise object with Logo and Background Image URL

Utility

ModuleMethodDescription
carpal/dist/data/utility/FileUploadfileUploadAsync({fileObject}, token)This returns a Promise object with groupingBatchId

Tutorials

This is a simple tutorial to show you how to use CarPal JavaScript SDK to quickly build a web based fleet management application.

First, you need to request for your client ID and secret.

Then you can start with Customer registration(we use ReactJS here):

import React ...
import { getTokenAsync } from 'carpal/dist/data/account/Auth ';
import { createNewCustomerAsync } from 'carpal/dist/data/customer/Customer';

export default Class Registration extends Component{

  register = async (formData)=>{
    try{
      const result = await createNewCustomerAsync(formData); //This function will return a promise with result true if registration successful

      //user login immediately after registration success
      if(result){
        const authResult = await getTokenAsync('xxx@example.com', 'xxxxxx', 1, 'secret string...');

        //Store the tokens in localstorage
        localStorage.setItem('auth', {accessToken: authResult.accessToken,
                                      refreshToken: authResult.refreshToken,
                                      customerId: authResult.customerId});

        //Navigate to other page...
      }
    }catch(e){
      //Handle error here
    }
  }
  render(){
    return (
      ...
      <Button onPress={()=>this.register(formData)}>
        <Text>Register</Text>
      </Button>
      ...
    )
  }
}

Utilizing Realtime dashboard

We implemented Pub/Sub messaging architecture in the SDK so that your application can take the advantage of Realtime dashboard features.

You need to use Pub/Sub module in carpal/dist/data/messaging/PubSub

Let's take ReactJS as example here:

import React ...;
import { pubsub } from 'carpal/dist/data/messaging/PubSub';


export default class Dashboard extends Component{
  constructor(props){
    super(pros);
    ...

    //You will get an APP_KEY after registered with Carpal
    const ps = pubsub('APP_PUBSUB_KEY', 'CHANNEL_ID');

    //subscribe to a channel here.
    //handle your logics in callback function and pass it as an argument.
    ps.subscribe('event_name', function (message) {
      //process the message object
    });
  }
}

License: MIT https://opensource.org/licenses/MIT

0.5.66

4 years ago

0.5.65

4 years ago

0.5.64

4 years ago

0.5.63

4 years ago

0.5.61

4 years ago

0.5.62

4 years ago

0.5.60

4 years ago

0.5.59

4 years ago

0.5.58

4 years ago

0.5.57

4 years ago

0.5.56

4 years ago

0.5.55

4 years ago

0.5.54

4 years ago

0.5.53

4 years ago

0.5.52

4 years ago

0.5.51

4 years ago

0.5.50

4 years ago

0.5.49

4 years ago

0.5.47

4 years ago

0.5.48

4 years ago

0.5.46

4 years ago

0.5.45

4 years ago

0.5.44

4 years ago

0.5.43

4 years ago

0.5.42

4 years ago

0.5.41

4 years ago

0.5.40

4 years ago

0.5.39

4 years ago

0.5.38

4 years ago

0.5.37

4 years ago

0.5.36

4 years ago

0.5.35

4 years ago

0.5.34

4 years ago

0.5.33

4 years ago

0.5.32

4 years ago

0.5.31

4 years ago

0.5.30

4 years ago

0.5.29

4 years ago

0.5.28

4 years ago

0.5.27

4 years ago

0.5.26

4 years ago

0.5.25

4 years ago

0.5.24

4 years ago

0.5.22

4 years ago

0.5.21

4 years ago

0.5.20

4 years ago

0.5.19

4 years ago

0.5.18

4 years ago

0.5.17

4 years ago

0.5.16

4 years ago

0.5.15

4 years ago

0.5.14

4 years ago

0.5.13

4 years ago

0.5.12

4 years ago

0.5.11

5 years ago

0.5.10

5 years ago

0.5.9

5 years ago

0.5.8

5 years ago

0.5.7

5 years ago

0.5.6

5 years ago

0.5.5

5 years ago

0.5.4

5 years ago

0.5.3

5 years ago

0.5.2

5 years ago

0.5.1

5 years ago

0.5.0

5 years ago

0.4.14

5 years ago

0.4.13

5 years ago

0.4.12

5 years ago

0.4.11

5 years ago

0.4.10

5 years ago

0.4.9

5 years ago

0.4.8

5 years ago

0.4.7

5 years ago

0.4.5

5 years ago

0.4.6

5 years ago

0.4.4

5 years ago

0.4.3

5 years ago

0.4.2

5 years ago

0.4.1

5 years ago

0.4.0

5 years ago

0.3.99

5 years ago

0.3.98

5 years ago

0.3.97

5 years ago

0.3.96

5 years ago

0.3.95

5 years ago

0.3.94

5 years ago

0.3.93

5 years ago

0.3.92

5 years ago

0.3.91

5 years ago

0.3.90

5 years ago

0.3.89

5 years ago

0.3.88

5 years ago

0.3.87

5 years ago

0.3.86

5 years ago

0.3.85

5 years ago

0.3.84

5 years ago

0.3.81

5 years ago

0.3.82

5 years ago

0.3.83

5 years ago

0.3.80

5 years ago

0.3.79

5 years ago

0.3.78

5 years ago

0.3.77

5 years ago

0.3.76

5 years ago

0.3.75

5 years ago

0.3.73

5 years ago

0.3.72

5 years ago

0.3.71

5 years ago

0.3.70

5 years ago

0.3.69

5 years ago

0.3.68

5 years ago

0.3.67

5 years ago

0.3.66

5 years ago

0.3.63

5 years ago

0.3.62

5 years ago

0.3.61

5 years ago

0.3.55

5 years ago

0.3.60

5 years ago

0.3.59

5 years ago

0.3.58

5 years ago

0.3.56

5 years ago

0.3.57

5 years ago

0.3.53

5 years ago

0.3.52

5 years ago

0.3.51

5 years ago

0.3.50

5 years ago

0.3.49

5 years ago

0.3.4-5.1

5 years ago

0.3.48

5 years ago

0.3.46

5 years ago

0.3.45

5 years ago

0.3.47

5 years ago

0.3.44

5 years ago

0.3.41

5 years ago

0.3.42

5 years ago

0.3.43

5 years ago

0.3.40

5 years ago

0.3.38

5 years ago

0.3.39

5 years ago

0.3.37

5 years ago

0.3.36

6 years ago

0.3.34-2

6 years ago

0.3.35

6 years ago

0.3.34-1

6 years ago

0.3.34

6 years ago

0.3.3-4.1

6 years ago

0.3.3-3.3

6 years ago

0.3.3-3.2

6 years ago

0.3.3-3.1

6 years ago

0.3.31

6 years ago

0.3.32

6 years ago

0.3.33

6 years ago

0.3.3-0.2

6 years ago

0.3.3-0.1

6 years ago

0.3.30

6 years ago

0.3.2-9.1

6 years ago

0.3.29

6 years ago

0.3.2-8.1

6 years ago

0.3.28

6 years ago

0.3.27

6 years ago

0.3.2-6.1

6 years ago

0.3.26

6 years ago

0.3.2-5.2

6 years ago

0.3.2-5.1

6 years ago

0.3.25

6 years ago

0.3.22

6 years ago

0.3.24

6 years ago

0.3.21

6 years ago

0.3.23

6 years ago

0.3.20

6 years ago

0.3.19

6 years ago

0.3.1-7.3

6 years ago

0.3.1-7.2

6 years ago

0.3.17

6 years ago

0.3.1-7.1

6 years ago

0.3.16

6 years ago

0.3.1-4.rc-3

6 years ago

0.3.1-4.rc-2

6 years ago

0.3.1-4.rc-1

6 years ago

0.3.15

6 years ago

0.3.14

6 years ago

0.3.1-1.1

6 years ago

0.3.11

6 years ago

0.3.12

6 years ago

0.3.13

6 years ago

0.3.9

6 years ago

0.3.10

6 years ago

0.3.8

6 years ago

0.3.7

6 years ago

0.3.6

6 years ago

0.3.3

6 years ago

0.3.2

6 years ago

0.2.10

6 years ago

0.2.9

6 years ago

0.2.4

6 years ago

0.2.3

6 years ago

0.2.1

6 years ago

0.1.99

6 years ago

0.1.98

6 years ago

0.1.96

6 years ago

0.1.95

6 years ago

0.1.94

6 years ago

0.1.93

6 years ago

0.1.92

6 years ago

0.1.90

6 years ago

0.1.89

6 years ago

0.1.88

6 years ago

0.1.87

6 years ago

0.1.86

6 years ago

0.1.85

6 years ago

0.1.84

6 years ago

0.1.83

6 years ago

0.1.82

6 years ago

0.1.81

6 years ago

0.1.80

6 years ago

0.1.79

6 years ago

0.1.78

6 years ago

0.1.77

6 years ago

0.1.76

6 years ago

0.1.75

6 years ago

0.1.74

6 years ago

0.1.73

6 years ago

0.1.72

6 years ago

0.1.71

6 years ago

0.1.70

6 years ago

0.1.68

6 years ago

0.1.67

6 years ago

0.1.66

6 years ago

0.1.64

6 years ago

0.1.63

6 years ago

0.1.62

6 years ago

0.1.61

6 years ago

0.1.60

6 years ago

0.1.59

6 years ago

0.1.58

6 years ago

0.1.57

6 years ago

0.1.56

6 years ago

0.1.55

6 years ago

0.1.54

6 years ago

0.1.53

6 years ago

0.1.52

6 years ago

0.1.51

6 years ago

0.1.50

6 years ago

0.1.49

6 years ago

0.1.48

6 years ago

0.1.47

6 years ago

0.1.46

6 years ago

0.1.44

6 years ago

0.1.43

6 years ago

0.1.42

6 years ago

0.1.41

6 years ago

0.1.40

6 years ago

0.1.39

6 years ago

0.1.38

6 years ago

0.1.37

6 years ago

0.1.36

6 years ago

0.1.35

6 years ago

0.1.34

6 years ago

0.1.33

6 years ago

0.1.32

6 years ago

0.1.31

6 years ago

0.1.30

6 years ago

0.1.29

6 years ago

0.1.28

6 years ago

0.1.27

6 years ago

0.1.26

6 years ago

0.1.25

6 years ago

0.1.24

6 years ago

0.1.23

6 years ago

0.1.22

6 years ago

0.1.21

6 years ago

0.1.20

6 years ago

0.1.19

6 years ago

0.1.18

6 years ago

0.1.17

6 years ago

0.1.16

6 years ago

0.1.15

6 years ago

0.1.14

6 years ago

0.1.12

6 years ago

0.1.11

6 years ago

0.1.10

6 years ago

0.1.9

6 years ago

0.1.8

6 years ago

0.1.7

6 years ago

0.1.6

6 years ago

0.1.5

6 years ago

0.1.4

6 years ago

0.1.3

6 years ago

0.1.2

6 years ago

0.1.1

6 years ago

0.1.0

6 years ago

0.0.99

6 years ago

0.0.98

6 years ago

0.0.97

6 years ago

0.0.96

6 years ago

0.0.95

6 years ago

0.0.93

6 years ago

0.0.92

6 years ago

0.0.91

6 years ago

0.0.90

6 years ago

0.0.89

6 years ago

0.0.88

6 years ago

0.0.87

6 years ago

0.0.86

6 years ago

0.0.85

6 years ago

0.0.84

6 years ago

0.0.83

6 years ago

0.0.82

6 years ago

0.0.81

6 years ago

0.0.79

6 years ago

0.0.78

6 years ago

0.0.77

6 years ago

0.0.76

6 years ago

0.0.75

6 years ago

0.0.74

6 years ago

0.0.73

6 years ago

0.0.72

6 years ago

0.0.71

6 years ago

0.0.70

6 years ago

0.0.69

6 years ago

0.0.68

6 years ago

0.0.67

6 years ago

0.0.66

6 years ago

0.0.65

6 years ago

0.0.64

6 years ago

0.0.63

6 years ago

0.0.62

6 years ago

0.0.61

6 years ago

0.0.60

6 years ago

0.0.59

6 years ago

0.0.58

6 years ago

0.0.57

6 years ago

0.0.56

6 years ago

0.0.55

6 years ago

0.0.54

6 years ago

0.0.53

6 years ago

0.0.52

6 years ago

0.0.51

6 years ago

0.0.49

6 years ago

0.0.47

6 years ago

0.0.45

6 years ago

0.0.46

6 years ago

0.0.44

6 years ago

0.0.43

6 years ago

0.0.42

6 years ago

0.0.41

6 years ago

0.0.40

6 years ago

0.0.39

6 years ago

0.0.38

6 years ago

0.0.37

6 years ago

0.0.36

6 years ago

0.0.35

6 years ago

0.0.34

6 years ago

0.0.33

6 years ago

0.0.32

6 years ago

0.0.31

6 years ago

0.0.29

6 years ago

0.0.30

6 years ago

0.0.28

6 years ago

0.0.27

6 years ago

0.0.26

6 years ago

0.0.25

6 years ago

0.0.24

7 years ago

0.0.23

7 years ago

0.0.22

7 years ago

0.0.21

7 years ago

0.0.20

7 years ago

0.0.19

7 years ago

0.0.18

7 years ago

0.0.17

7 years ago

0.0.16

7 years ago

0.0.15

7 years ago

0.0.13

7 years ago

0.0.12

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago