@rempays/shared-core 1.0.2-beta.1 → 1.0.2-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -267
- package/dist/auth/authorizer-example.js +7 -3
- package/dist/auth/index.js +5 -1
- package/dist/auth/jwt-validator.js +7 -3
- package/dist/auth/types.js +2 -1
- package/dist/cognito/cognito.service.js +21 -17
- package/dist/cognito/index.js +20 -2
- package/dist/cognito/types.js +2 -1
- package/dist/dynamodb/dynamodb.client.js +31 -27
- package/dist/dynamodb/index.d.ts +1 -0
- package/dist/dynamodb/index.js +18 -1
- package/dist/dynamodb/modules/chat/chat.service.d.ts +59 -0
- package/dist/dynamodb/modules/chat/chat.service.js +294 -0
- package/dist/dynamodb/modules/chat/index.d.ts +2 -0
- package/dist/dynamodb/modules/chat/index.js +18 -0
- package/dist/dynamodb/modules/chat/types.d.ts +27 -0
- package/dist/dynamodb/modules/chat/types.js +2 -0
- package/dist/dynamodb/modules/index.d.ts +2 -0
- package/dist/dynamodb/modules/index.js +18 -0
- package/dist/dynamodb/modules/shared-types.d.ts +9 -0
- package/dist/dynamodb/modules/shared-types.js +2 -0
- package/dist/dynamodb/modules/system-prompt/index.d.ts +2 -0
- package/dist/dynamodb/modules/system-prompt/index.js +18 -0
- package/dist/dynamodb/modules/system-prompt/system-prompt.service.d.ts +51 -0
- package/dist/dynamodb/modules/system-prompt/system-prompt.service.js +262 -0
- package/dist/dynamodb/modules/system-prompt/types.d.ts +13 -0
- package/dist/dynamodb/modules/system-prompt/types.js +2 -0
- package/dist/facebook-api/embedded-signup.d.ts +56 -0
- package/dist/facebook-api/embedded-signup.js +203 -0
- package/dist/facebook-api/facebook.d.ts +1 -67
- package/dist/facebook-api/facebook.js +7 -3
- package/dist/facebook-api/http.js +9 -3
- package/dist/facebook-api/index.d.ts +7 -2
- package/dist/facebook-api/index.js +27 -1
- package/dist/facebook-api/types.d.ts +109 -0
- package/dist/facebook-api/types.js +2 -0
- package/dist/http/client.js +12 -4
- package/dist/http/index.js +6 -1
- package/dist/index.js +23 -7
- package/dist/s3/index.js +17 -1
- package/dist/s3/s3.service.js +9 -5
- package/dist/textract/index.js +17 -1
- package/dist/textract/textract.service.js +9 -5
- package/package.json +2 -2
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FacebookApi = void 0;
|
|
4
|
+
const http_1 = require("./http");
|
|
5
|
+
class FacebookApi {
|
|
3
6
|
static async init() {
|
|
4
7
|
if (this.token && this.phoneNumberId && this.apiVersion)
|
|
5
8
|
return;
|
|
@@ -23,7 +26,7 @@ export class FacebookApi {
|
|
|
23
26
|
await this.init();
|
|
24
27
|
const url = `https://graph.facebook.com/${this.apiVersion}/${this.phoneNumberId}/${path}`;
|
|
25
28
|
try {
|
|
26
|
-
const http = getHttpClient(this.token);
|
|
29
|
+
const http = (0, http_1.getHttpClient)(this.token);
|
|
27
30
|
const { data } = await http.post(url, payload);
|
|
28
31
|
return data;
|
|
29
32
|
}
|
|
@@ -160,6 +163,7 @@ export class FacebookApi {
|
|
|
160
163
|
return await this.post("messages", payload);
|
|
161
164
|
}
|
|
162
165
|
}
|
|
166
|
+
exports.FacebookApi = FacebookApi;
|
|
163
167
|
FacebookApi.token = null;
|
|
164
168
|
FacebookApi.phoneNumberId = null;
|
|
165
169
|
FacebookApi.apiVersion = null;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getHttpClient = getHttpClient;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
2
8
|
let client = null;
|
|
3
|
-
|
|
9
|
+
function getHttpClient(token) {
|
|
4
10
|
if (client)
|
|
5
11
|
return client;
|
|
6
|
-
client =
|
|
12
|
+
client = axios_1.default.create({
|
|
7
13
|
timeout: 10000,
|
|
8
14
|
headers: {
|
|
9
15
|
'Authorization': `Bearer ${token}`,
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export { FacebookApi } from './facebook';
|
|
2
|
-
export
|
|
1
|
+
export { FacebookApi } from './facebook.js';
|
|
2
|
+
export { EmbeddedSignup } from './embedded-signup.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
import { FacebookApi } from './facebook.js';
|
|
5
|
+
import { EmbeddedSignup } from './embedded-signup.js';
|
|
6
|
+
export declare const facebookApi: typeof FacebookApi;
|
|
7
|
+
export declare const embeddedSignup: typeof EmbeddedSignup;
|
|
@@ -1 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.embeddedSignup = exports.facebookApi = exports.EmbeddedSignup = exports.FacebookApi = void 0;
|
|
18
|
+
var facebook_js_1 = require("./facebook.js");
|
|
19
|
+
Object.defineProperty(exports, "FacebookApi", { enumerable: true, get: function () { return facebook_js_1.FacebookApi; } });
|
|
20
|
+
var embedded_signup_js_1 = require("./embedded-signup.js");
|
|
21
|
+
Object.defineProperty(exports, "EmbeddedSignup", { enumerable: true, get: function () { return embedded_signup_js_1.EmbeddedSignup; } });
|
|
22
|
+
__exportStar(require("./types.js"), exports);
|
|
23
|
+
// Export singleton instances for easy usage
|
|
24
|
+
const facebook_js_2 = require("./facebook.js");
|
|
25
|
+
const embedded_signup_js_2 = require("./embedded-signup.js");
|
|
26
|
+
exports.facebookApi = facebook_js_2.FacebookApi;
|
|
27
|
+
exports.embeddedSignup = embedded_signup_js_2.EmbeddedSignup;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export interface SendTextParams {
|
|
2
|
+
to: string;
|
|
3
|
+
body: string;
|
|
4
|
+
previewUrl?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface SendTemplateParams {
|
|
7
|
+
to: string;
|
|
8
|
+
name: string;
|
|
9
|
+
languageCode: string;
|
|
10
|
+
components?: any[];
|
|
11
|
+
}
|
|
12
|
+
export interface SendInteractiveParams {
|
|
13
|
+
to: string;
|
|
14
|
+
header?: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
};
|
|
18
|
+
body: string;
|
|
19
|
+
footer?: string;
|
|
20
|
+
buttons: Array<{
|
|
21
|
+
type: "reply";
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface SendInteractiveListParams {
|
|
27
|
+
to: string;
|
|
28
|
+
header?: {
|
|
29
|
+
type: "text";
|
|
30
|
+
text: string;
|
|
31
|
+
};
|
|
32
|
+
body: string;
|
|
33
|
+
footer?: string;
|
|
34
|
+
buttonText: string;
|
|
35
|
+
sections: Array<{
|
|
36
|
+
title: string;
|
|
37
|
+
rows: Array<{
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
}>;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export interface SendImageParams {
|
|
45
|
+
to: string;
|
|
46
|
+
link: string;
|
|
47
|
+
caption?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface SendDocumentParams {
|
|
50
|
+
to: string;
|
|
51
|
+
link: string;
|
|
52
|
+
filename?: string;
|
|
53
|
+
caption?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface SendLocationParams {
|
|
56
|
+
to: string;
|
|
57
|
+
latitude: number;
|
|
58
|
+
longitude: number;
|
|
59
|
+
name?: string;
|
|
60
|
+
address?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface SetTypingParams {
|
|
63
|
+
messageId: string;
|
|
64
|
+
}
|
|
65
|
+
export interface MarkAsReadParams {
|
|
66
|
+
messageId: string;
|
|
67
|
+
}
|
|
68
|
+
export interface ExchangeTokenParams {
|
|
69
|
+
code: string;
|
|
70
|
+
}
|
|
71
|
+
export interface ExchangeTokenResponse {
|
|
72
|
+
access_token: string;
|
|
73
|
+
token_type: string;
|
|
74
|
+
expires_in?: number;
|
|
75
|
+
}
|
|
76
|
+
export interface AppAccessTokenResponse {
|
|
77
|
+
access_token: string;
|
|
78
|
+
token_type: string;
|
|
79
|
+
}
|
|
80
|
+
export interface DebugTokenResponse {
|
|
81
|
+
data?: {
|
|
82
|
+
app_id?: string;
|
|
83
|
+
type?: string;
|
|
84
|
+
application?: string;
|
|
85
|
+
data_access_expires_at?: number;
|
|
86
|
+
expires_at?: number;
|
|
87
|
+
is_valid?: boolean;
|
|
88
|
+
scopes?: string[];
|
|
89
|
+
granular_scopes?: Array<{
|
|
90
|
+
scope: string;
|
|
91
|
+
target_ids?: string[];
|
|
92
|
+
}>;
|
|
93
|
+
user_id?: string;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export interface WABAInfo {
|
|
97
|
+
id: string;
|
|
98
|
+
name: string;
|
|
99
|
+
timezone_id?: string;
|
|
100
|
+
message_template_namespace?: string;
|
|
101
|
+
account_review_status?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface PhoneNumberInfo {
|
|
104
|
+
id: string;
|
|
105
|
+
display_phone_number?: string;
|
|
106
|
+
verified_name?: string;
|
|
107
|
+
quality_rating?: string;
|
|
108
|
+
code_verification_status?: string;
|
|
109
|
+
}
|
package/dist/http/client.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HttpClient = void 0;
|
|
7
|
+
exports.createHttpClient = createHttpClient;
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
class HttpClient {
|
|
3
10
|
constructor(config = {}) {
|
|
4
11
|
const { token, ...axiosConfig } = config;
|
|
5
|
-
this.client =
|
|
12
|
+
this.client = axios_1.default.create({
|
|
6
13
|
timeout: 10000,
|
|
7
14
|
headers: {
|
|
8
15
|
...(token && { 'Authorization': `Bearer ${token}` }),
|
|
@@ -41,6 +48,7 @@ export class HttpClient {
|
|
|
41
48
|
return response.data;
|
|
42
49
|
}
|
|
43
50
|
}
|
|
44
|
-
|
|
51
|
+
exports.HttpClient = HttpClient;
|
|
52
|
+
function createHttpClient(config) {
|
|
45
53
|
return new HttpClient(config);
|
|
46
54
|
}
|
package/dist/http/index.js
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHttpClient = exports.HttpClient = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return client_1.HttpClient; } });
|
|
6
|
+
Object.defineProperty(exports, "createHttpClient", { enumerable: true, get: function () { return client_1.createHttpClient; } });
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
17
|
// Export all modules
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
18
|
+
__exportStar(require("./cognito/index"), exports);
|
|
19
|
+
__exportStar(require("./auth/index"), exports);
|
|
20
|
+
__exportStar(require("./s3/index"), exports);
|
|
21
|
+
__exportStar(require("./textract/index"), exports);
|
|
22
|
+
__exportStar(require("./facebook-api/index"), exports);
|
|
23
|
+
__exportStar(require("./dynamodb/index"), exports);
|
|
24
|
+
__exportStar(require("./http/index"), exports);
|
package/dist/s3/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./s3.service"), exports);
|
package/dist/s3/s3.service.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3Service = void 0;
|
|
4
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
2
5
|
/**
|
|
3
6
|
* Servicio para manejar archivos en S3
|
|
4
7
|
* Usado para almacenar documentos antes de procesarlos con Textract
|
|
5
8
|
*/
|
|
6
|
-
|
|
9
|
+
class S3Service {
|
|
7
10
|
/**
|
|
8
11
|
* Sube un archivo a S3 desde un buffer o URL
|
|
9
12
|
*/
|
|
10
13
|
static async uploadFile(params) {
|
|
11
14
|
try {
|
|
12
|
-
const command = new PutObjectCommand({
|
|
15
|
+
const command = new client_s3_1.PutObjectCommand({
|
|
13
16
|
Bucket: this.BUCKET_NAME,
|
|
14
17
|
Key: params.key,
|
|
15
18
|
Body: params.body,
|
|
@@ -28,7 +31,7 @@ export class S3Service {
|
|
|
28
31
|
*/
|
|
29
32
|
static async downloadFile(key) {
|
|
30
33
|
try {
|
|
31
|
-
const command = new GetObjectCommand({
|
|
34
|
+
const command = new client_s3_1.GetObjectCommand({
|
|
32
35
|
Bucket: this.BUCKET_NAME,
|
|
33
36
|
Key: key,
|
|
34
37
|
});
|
|
@@ -54,7 +57,8 @@ export class S3Service {
|
|
|
54
57
|
return `chats/${params.chatId}/messages/${params.messageId}-${timestamp}${extension}`;
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
|
-
S3Service
|
|
60
|
+
exports.S3Service = S3Service;
|
|
61
|
+
S3Service.client = new client_s3_1.S3Client({
|
|
58
62
|
region: process.env['AWS_REGION'] || 'us-east-1',
|
|
59
63
|
});
|
|
60
64
|
S3Service.BUCKET_NAME = process.env['S3_DOCUMENTS_BUCKET'] || 'rempays-documents';
|
package/dist/textract/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./textract.service"), exports);
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextractService = void 0;
|
|
4
|
+
const client_textract_1 = require("@aws-sdk/client-textract");
|
|
2
5
|
/**
|
|
3
6
|
* Servicio para extraer texto de documentos usando AWS Textract
|
|
4
7
|
*/
|
|
5
|
-
|
|
8
|
+
class TextractService {
|
|
6
9
|
/**
|
|
7
10
|
* Analiza un documento desde S3 y extrae el texto
|
|
8
11
|
*/
|
|
9
12
|
static async analyzeDocumentFromS3(s3Bucket, s3Key) {
|
|
10
13
|
try {
|
|
11
|
-
const command = new AnalyzeDocumentCommand({
|
|
14
|
+
const command = new client_textract_1.AnalyzeDocumentCommand({
|
|
12
15
|
Document: {
|
|
13
16
|
S3Object: {
|
|
14
17
|
Bucket: s3Bucket,
|
|
@@ -37,7 +40,7 @@ export class TextractService {
|
|
|
37
40
|
*/
|
|
38
41
|
static async analyzeDocumentFromBytes(bytes) {
|
|
39
42
|
try {
|
|
40
|
-
const command = new AnalyzeDocumentCommand({
|
|
43
|
+
const command = new client_textract_1.AnalyzeDocumentCommand({
|
|
41
44
|
Document: {
|
|
42
45
|
Bytes: bytes,
|
|
43
46
|
},
|
|
@@ -58,6 +61,7 @@ export class TextractService {
|
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
|
-
TextractService
|
|
64
|
+
exports.TextractService = TextractService;
|
|
65
|
+
TextractService.client = new client_textract_1.TextractClient({
|
|
62
66
|
region: process.env['AWS_REGION'] || 'us-east-1',
|
|
63
67
|
});
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rempays/shared-core",
|
|
3
|
-
"version": "1.0.2-beta.
|
|
3
|
+
"version": "1.0.2-beta.10",
|
|
4
4
|
"description": "Core utilities layer for RemPays platform with AWS services integration (Cognito, S3, Secrets Manager, Textract, Facebook API, DynamoDB)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"type": "
|
|
7
|
+
"type": "commonjs",
|
|
8
8
|
"private": false,
|
|
9
9
|
"author": "RemPays Team",
|
|
10
10
|
"license": "UNLICENSED",
|