@bootpay/backend-js
Advanced tools
+195
-236
| "use strict"; | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
| function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
| return new (P || (P = Promise))(function (resolve, reject) { | ||
| function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
| function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
| function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
| step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
| }); | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -23,18 +14,16 @@ exports.Bootpay = void 0; | ||
| */ | ||
| getAccessToken() { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const { application_id, private_key } = this.bootpayConfiguration; | ||
| const response = yield this.post('request/token', { | ||
| application_id, | ||
| private_key | ||
| }); | ||
| // set Token | ||
| this.setToken(response.access_token); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async getAccessToken() { | ||
| try { | ||
| const { application_id, private_key } = this.bootpayConfiguration; | ||
| const response = await this.post('request/token', { | ||
| application_id, | ||
| private_key | ||
| }); | ||
| // set Token | ||
| this.setToken(response.access_token); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -47,12 +36,10 @@ /** | ||
| */ | ||
| receiptPayment(receiptId, lookupUserData = false) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.get(`receipt/${receiptId}?lookup_user_data=${lookupUserData ? 'true' : 'false'}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async receiptPayment(receiptId, lookupUserData = false) { | ||
| try { | ||
| const response = await this.get(`receipt/${receiptId}?lookup_user_data=${lookupUserData ? 'true' : 'false'}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -65,12 +52,12 @@ /** | ||
| */ | ||
| cancelPayment(cancelPayment) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('cancel', Object.assign({}, cancelPayment)); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async cancelPayment(cancelPayment) { | ||
| try { | ||
| const response = await this.post('cancel', { | ||
| ...cancelPayment | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -83,12 +70,10 @@ /** | ||
| */ | ||
| certificate(receiptId) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.get(`certificate/${receiptId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async certificate(receiptId) { | ||
| try { | ||
| const response = await this.get(`certificate/${receiptId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -101,14 +86,12 @@ /** | ||
| */ | ||
| confirmPayment(receiptId) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('confirm', { | ||
| receipt_id: receiptId | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async confirmPayment(receiptId) { | ||
| try { | ||
| const response = await this.post('confirm', { | ||
| receipt_id: receiptId | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -121,12 +104,10 @@ /** | ||
| */ | ||
| lookupSubscribeBillingKey(receiptId) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.get(`subscribe/billing_key/${receiptId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async lookupSubscribeBillingKey(receiptId) { | ||
| try { | ||
| const response = await this.get(`subscribe/billing_key/${receiptId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -139,12 +120,12 @@ /** | ||
| */ | ||
| requestSubscribeBillingKey(subscriptionBillingRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('request/subscribe', Object.assign({}, subscriptionBillingRequest)); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async requestSubscribeBillingKey(subscriptionBillingRequest) { | ||
| try { | ||
| const response = await this.post('request/subscribe', { | ||
| ...subscriptionBillingRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -157,12 +138,12 @@ /** | ||
| */ | ||
| requestSubscribeCardPayment(subscriptionCardRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('subscribe/payment', Object.assign({}, subscriptionCardRequest)); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async requestSubscribeCardPayment(subscriptionCardRequest) { | ||
| try { | ||
| const response = await this.post('subscribe/payment', { | ||
| ...subscriptionCardRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -175,12 +156,10 @@ /** | ||
| */ | ||
| destroyBillingKey(billingKey) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.delete(`subscribe/billing_key/${billingKey}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async destroyBillingKey(billingKey) { | ||
| try { | ||
| const response = await this.delete(`subscribe/billing_key/${billingKey}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -193,12 +172,12 @@ /** | ||
| */ | ||
| requestUserToken(userTokenRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('request/user/token', Object.assign({}, userTokenRequest)); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async requestUserToken(userTokenRequest) { | ||
| try { | ||
| const response = await this.post('request/user/token', { | ||
| ...userTokenRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -211,12 +190,12 @@ /** | ||
| */ | ||
| subscribePaymentReserve(subscribePaymentReserveRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('subscribe/payment/reserve', Object.assign({}, subscribePaymentReserveRequest)); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async subscribePaymentReserve(subscribePaymentReserveRequest) { | ||
| try { | ||
| const response = await this.post('subscribe/payment/reserve', { | ||
| ...subscribePaymentReserveRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -230,12 +209,10 @@ /** | ||
| */ | ||
| subscribePaymentReserveLookup(reserveId) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.get(`subscribe/payment/reserve/${reserveId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async subscribePaymentReserveLookup(reserveId) { | ||
| try { | ||
| const response = await this.get(`subscribe/payment/reserve/${reserveId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -248,12 +225,10 @@ /** | ||
| */ | ||
| cancelSubscribeReserve(reserveId) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.delete(`subscribe/payment/reserve/${reserveId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async cancelSubscribeReserve(reserveId) { | ||
| try { | ||
| const response = await this.delete(`subscribe/payment/reserve/${reserveId}`); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -265,12 +240,10 @@ /** | ||
| */ | ||
| shippingStart(shippingRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.put(`escrow/shipping/start/${shippingRequest.receipt_id}`, shippingRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async shippingStart(shippingRequest) { | ||
| try { | ||
| const response = await this.put(`escrow/shipping/start/${shippingRequest.receipt_id}`, shippingRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -282,12 +255,10 @@ /** | ||
| */ | ||
| cashReceiptPublishOnReceipt(cashReceiptPublishRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('request/receipt/cash/publish', cashReceiptPublishRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async cashReceiptPublishOnReceipt(cashReceiptPublishRequest) { | ||
| try { | ||
| const response = await this.post('request/receipt/cash/publish', cashReceiptPublishRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -299,14 +270,12 @@ /** | ||
| */ | ||
| cashReceiptCancelOnReceipt(cashReceiptCancelRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.delete(`request/receipt/cash/cancel/${cashReceiptCancelRequest.receipt_id}`, { | ||
| params: cashReceiptCancelRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async cashReceiptCancelOnReceipt(cashReceiptCancelRequest) { | ||
| try { | ||
| const response = await this.delete(`request/receipt/cash/cancel/${cashReceiptCancelRequest.receipt_id}`, { | ||
| params: cashReceiptCancelRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -318,12 +287,10 @@ /** | ||
| */ | ||
| requestCashReceipt(cashReceiptRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('request/cash/receipt', cashReceiptRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async requestCashReceipt(cashReceiptRequest) { | ||
| try { | ||
| const response = await this.post('request/cash/receipt', cashReceiptRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -335,14 +302,12 @@ /** | ||
| */ | ||
| cancelCashReceipt(cancelCashReceiptRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.delete(`request/cash/receipt/${cancelCashReceiptRequest.receipt_id}`, { | ||
| params: cancelCashReceiptRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async cancelCashReceipt(cancelCashReceiptRequest) { | ||
| try { | ||
| const response = await this.delete(`request/cash/receipt/${cancelCashReceiptRequest.receipt_id}`, { | ||
| params: cancelCashReceiptRequest | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -354,12 +319,10 @@ /** | ||
| */ | ||
| requestAuthentication(authenticateRequest) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('request/authentication', authenticateRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async requestAuthentication(authenticateRequest) { | ||
| try { | ||
| const response = await this.post('request/authentication', authenticateRequest); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -371,15 +334,13 @@ /** | ||
| */ | ||
| confirmAuthentication(receipt_id, otp = null) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('authenticate/confirm', { | ||
| receipt_id, | ||
| otp | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async confirmAuthentication(receipt_id, otp = null) { | ||
| try { | ||
| const response = await this.post('authenticate/confirm', { | ||
| receipt_id, | ||
| otp | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -391,14 +352,12 @@ /** | ||
| */ | ||
| realarmAuthentication(receipt_id) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.post('authenticate/realarm', { | ||
| receipt_id | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async realarmAuthentication(receipt_id) { | ||
| try { | ||
| const response = await this.post('authenticate/realarm', { | ||
| receipt_id | ||
| }); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
@@ -405,0 +364,0 @@ } |
@@ -20,3 +20,3 @@ import { AxiosInstance, AxiosRequestConfig } from 'axios'; | ||
| $token?: string; | ||
| mode: string; | ||
| mode: 'development' | 'production' | 'stage'; | ||
| bootpayConfiguration: BootpayConfiguration; | ||
@@ -23,0 +23,0 @@ API_ENTRYPOINTS: BootpayEntrypoints; |
+42
-52
| "use strict"; | ||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
| function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
| return new (P || (P = Promise))(function (resolve, reject) { | ||
| function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
| function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
| function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
| step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
| }); | ||
| }; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -16,7 +7,13 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| exports.BootpayBackendNodejsResource = void 0; | ||
| // @ts-expect-error | ||
| const axios_1 = __importDefault(require("axios")); | ||
| class BootpayBackendNodejsResource { | ||
| $http; | ||
| $token; | ||
| mode; | ||
| bootpayConfiguration; | ||
| API_ENTRYPOINTS; | ||
| apiVersion = '4.3.4'; | ||
| sdkVersion = '2.2.10'; | ||
| constructor() { | ||
| this.apiVersion = '4.3.3'; | ||
| this.sdkVersion = '2.1.9'; | ||
| this.mode = 'production'; | ||
@@ -56,2 +53,3 @@ this.$http = axios_1.default.create({ | ||
| }); | ||
| // @ts-expect-error | ||
| this.$http.interceptors.request.use((config) => { | ||
@@ -103,49 +101,41 @@ if (config.headers !== undefined) { | ||
| entrypoints(url) { | ||
| return [this.API_ENTRYPOINTS[this.bootpayConfiguration.mode], url].join('/'); | ||
| return [this.API_ENTRYPOINTS[this.bootpayConfiguration.mode === undefined ? 'production' : this.bootpayConfiguration.mode], url].join('/'); | ||
| } | ||
| get(url, config) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.$http.get(this.entrypoints(url), config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async get(url, config) { | ||
| try { | ||
| const response = await this.$http.get(this.entrypoints(url), config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
| post(url, data, config) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.$http.post(this.entrypoints(url), data, config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async post(url, data, config) { | ||
| try { | ||
| const response = await this.$http.post(this.entrypoints(url), data, config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
| put(url, data, config) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.$http.put(this.entrypoints(url), data, config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async put(url, data, config) { | ||
| try { | ||
| const response = await this.$http.put(this.entrypoints(url), data, config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
| delete(url, config) { | ||
| return __awaiter(this, void 0, void 0, function* () { | ||
| try { | ||
| const response = yield this.$http.delete(this.entrypoints(url), config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| }); | ||
| async delete(url, config) { | ||
| try { | ||
| const response = await this.$http.delete(this.entrypoints(url), config); | ||
| return Promise.resolve(response); | ||
| } | ||
| catch (e) { | ||
| return Promise.reject(e); | ||
| } | ||
| } | ||
| } | ||
| exports.BootpayBackendNodejsResource = BootpayBackendNodejsResource; |
+16
-5
| { | ||
| "name": "@bootpay/backend-js", | ||
| "version": "2.1.9", | ||
| "version": "2.2.0-beta.2", | ||
| "description": "Bootpay Server Side Package for Node.js", | ||
| "types": "dist/bootpay.d.ts", | ||
| "main": "dist/index.js", | ||
| "main": "./dist/index.js", | ||
| "module": "./dist/index.mjs", | ||
| "exports": { | ||
| ".": { | ||
| "import": "./dist/index.js", | ||
| "require": "./dist/index.js", | ||
| "types": "./dist/lib/request.d.ts" | ||
| } | ||
| }, | ||
| "scripts": { | ||
| "test": "echo \"Error: no test specified\" && exit 1", | ||
| "build": "rm -rf ./dist && tsc --build && cp ./package.json dist/package.json && rm -rf ./dist/src && cp ./README.md dist/", | ||
| "build": "rm -rf ./dist && tsc --p ./tsconfig.json && cp ./package.json dist/package.json && rm -rf ./dist/src && cp ./README.md dist/", | ||
| "clear": "tsc --build --clean" | ||
| }, | ||
| "dependencies": { | ||
| "axios": "^0.26.1" | ||
| "axios": "^1.6.2" | ||
| }, | ||
| "devDependencies": { | ||
| "ts-node": "^10.7.0", | ||
| "typescript": "^4.7.4", | ||
| "typescript": "^5.3.3", | ||
| "@types/node": "^18.6.2" | ||
@@ -33,2 +41,5 @@ }, | ||
| ], | ||
| "ts-node": { | ||
| "esm": true | ||
| }, | ||
| "author": "Bootpay", | ||
@@ -35,0 +46,0 @@ "license": "MIT", |
Unpublished package
Supply chain riskPackage version was not found on the registry. It may exist on a different registry and need to be configured to pull from that registry.
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Unpopular package
QualityThis package is not very popular.
0
-100%46638
-6.62%1015
-4.78%2
100%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
Updated