@nlabs/reaktor 0.3.0 → 0.4.0

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.
Files changed (56) hide show
  1. package/lib/config.js +153 -0
  2. package/lib/data/conversations.js +311 -0
  3. package/lib/data/dynamodb.js +206 -0
  4. package/lib/data/email.js +222 -0
  5. package/lib/data/files.js +525 -0
  6. package/lib/data/groups.js +435 -0
  7. package/lib/data/images.d.ts +3 -2
  8. package/lib/data/images.js +1051 -0
  9. package/lib/data/index.js +266 -0
  10. package/lib/data/ios.js +355 -0
  11. package/lib/data/locations.js +172 -0
  12. package/lib/data/messages.js +299 -0
  13. package/lib/data/notifications.d.ts +2 -2
  14. package/lib/data/notifications.js +59 -0
  15. package/lib/data/payments.js +771 -0
  16. package/lib/data/posts.d.ts +1 -1
  17. package/lib/data/posts.js +766 -0
  18. package/lib/data/reactions.js +529 -0
  19. package/lib/data/s3.js +155 -0
  20. package/lib/data/search.js +155 -0
  21. package/lib/data/sms.js +83 -0
  22. package/lib/data/subscription.js +337 -0
  23. package/lib/data/tags.js +397 -0
  24. package/lib/data/users.d.ts +7 -4
  25. package/lib/data/users.js +470 -0
  26. package/lib/data/websockets.js +250 -0
  27. package/lib/index.js +45 -0
  28. package/lib/types/apps.js +2 -0
  29. package/lib/types/arangodb.js +2 -0
  30. package/lib/types/auth.js +2 -0
  31. package/lib/types/conversations.d.ts +2 -0
  32. package/lib/types/conversations.js +2 -0
  33. package/lib/types/email.js +2 -0
  34. package/lib/types/files.js +2 -0
  35. package/lib/types/google.js +2 -0
  36. package/lib/types/groups.js +2 -0
  37. package/lib/types/images.js +2 -0
  38. package/lib/types/index.js +227 -0
  39. package/lib/types/locations.js +2 -0
  40. package/lib/types/messages.js +2 -0
  41. package/lib/types/notifications.js +2 -0
  42. package/lib/types/payments.js +2 -0
  43. package/lib/types/posts.js +2 -0
  44. package/lib/types/reactions.d.ts +2 -0
  45. package/lib/types/reactions.js +2 -0
  46. package/lib/types/tags.js +2 -0
  47. package/lib/types/users.d.ts +1 -0
  48. package/lib/types/users.js +2 -0
  49. package/lib/utils/analytics.js +83 -0
  50. package/lib/utils/arangodb.js +143 -0
  51. package/lib/utils/auth.js +75 -0
  52. package/lib/utils/graphql.js +21 -0
  53. package/lib/utils/index.js +84 -0
  54. package/lib/utils/objects.js +62 -0
  55. package/lib/utils/redis.js +36 -0
  56. package/package.json +30 -30
@@ -0,0 +1,435 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol");
4
+
5
+ require("core-js/modules/es.symbol.description");
6
+
7
+ require("core-js/modules/es.array.concat");
8
+
9
+ require("core-js/modules/es.array.iterator");
10
+
11
+ require("core-js/modules/es.array.map");
12
+
13
+ require("core-js/modules/es.array.slice");
14
+
15
+ require("core-js/modules/es.date.now");
16
+
17
+ require("core-js/modules/es.date.to-string");
18
+
19
+ require("core-js/modules/es.function.name");
20
+
21
+ require("core-js/modules/es.object.define-properties");
22
+
23
+ require("core-js/modules/es.object.freeze");
24
+
25
+ require("core-js/modules/es.object.to-string");
26
+
27
+ require("core-js/modules/es.promise");
28
+
29
+ require("core-js/modules/es.string.iterator");
30
+
31
+ require("core-js/modules/web.dom-collections.iterator");
32
+
33
+ Object.defineProperty(exports, "__esModule", {
34
+ value: true
35
+ });
36
+ exports.isGrouped = exports.getGroupsByReaction = exports.deleteGroup = exports.updateGroup = exports.addGroup = exports.createGroupEdge = exports.getGroupDetails = exports.getGroup = exports.getGroupListByTags = exports.getGroupListByUser = exports.getGroupList = void 0;
37
+
38
+ var _utils = require("@nlabs/utils");
39
+
40
+ var _arangojs = require("arangojs");
41
+
42
+ var _flatten = _interopRequireDefault(require("lodash/flatten"));
43
+
44
+ var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
45
+
46
+ var _utils2 = require("../utils");
47
+
48
+ var _tags = require("./tags");
49
+
50
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
51
+
52
+ function _templateObject7() {
53
+ var data = _taggedTemplateLiteral(["FOR g IN groups\n FILTER g._key == ", "\n FOR u IN INBOUND g._id isGrouped\n FILTER u._key == ", "\n LIMIT 1\n RETURN u"]);
54
+
55
+ _templateObject7 = function _templateObject7() {
56
+ return data;
57
+ };
58
+
59
+ return data;
60
+ }
61
+
62
+ function _templateObject6() {
63
+ var data = _taggedTemplateLiteral(["FOR u, r IN OUTBOUND ", " hasReaction\n FILTER r.value == ", "\n COLLECT reactionName = r.value INTO reactionItems\n RETURN {value: reactionName, count: LENGTH(reactionItems[*].r.value)}"]);
64
+
65
+ _templateObject6 = function _templateObject6() {
66
+ return data;
67
+ };
68
+
69
+ return data;
70
+ }
71
+
72
+ function _templateObject5() {
73
+ var data = _taggedTemplateLiteral(["FOR g IN groups\n FILTER g._key == ", "\n REMOVE g IN groups\n RETURN OLD"]);
74
+
75
+ _templateObject5 = function _templateObject5() {
76
+ return data;
77
+ };
78
+
79
+ return data;
80
+ }
81
+
82
+ function _templateObject4() {
83
+ var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN groups RETURN NEW"]);
84
+
85
+ _templateObject4 = function _templateObject4() {
86
+ return data;
87
+ };
88
+
89
+ return data;
90
+ }
91
+
92
+ function _templateObject3() {
93
+ var data = _taggedTemplateLiteral(["INSERT ", " IN groups RETURN NEW"]);
94
+
95
+ _templateObject3 = function _templateObject3() {
96
+ return data;
97
+ };
98
+
99
+ return data;
100
+ }
101
+
102
+ function _templateObject2() {
103
+ var data = _taggedTemplateLiteral(["FOR g IN groups\n FILTER g._key == ", "\n LIMIT 1\n RETURN g"]);
104
+
105
+ _templateObject2 = function _templateObject2() {
106
+ return data;
107
+ };
108
+
109
+ return data;
110
+ }
111
+
112
+ function _templateObject() {
113
+ var data = _taggedTemplateLiteral(["FOR g, e IN INBOUND ", " isGrouped\n FILTER g._key == ", "\n LET users = (\n FOR u, l IN OUTBOUND g._id isGrouped\n RETURN MERGE (u, {type:l.type})\n )\n LIMIT 1\n RETURN DISTINCT MERGE(g, {users:users})"]);
114
+
115
+ _templateObject = function _templateObject() {
116
+ return data;
117
+ };
118
+
119
+ return data;
120
+ }
121
+
122
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
123
+
124
+ /**
125
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
126
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
127
+ */
128
+ var eventCategory = 'groups';
129
+
130
+ var getGroupList = function getGroupList(context, from, to) {
131
+ var action = 'getListByApp';
132
+ var database = context.database;
133
+ var limit = (0, _utils2.getLimit)(from, to);
134
+ var aqlQry = "FOR g in groups\n LET users = (\n FOR u, l IN OUTBOUND g._id isGrouped\n RETURN MERGE (u, {type:l.type})\n )\n ".concat(limit.aql, "\n SORT g.added\n RETURN DISTINCT MERGE(g, {users:users})");
135
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
136
+ return cursor.all();
137
+ })["catch"](function (error) {
138
+ return (0, _utils2.logError)({
139
+ action: action,
140
+ category: eventCategory,
141
+ label: 'db_error'
142
+ }, error, context).then(function () {
143
+ return null;
144
+ });
145
+ });
146
+ };
147
+
148
+ exports.getGroupList = getGroupList;
149
+
150
+ var getGroupListByUser = function getGroupListByUser(context, from, to) {
151
+ // const action: string = 'getListByUser';
152
+ var database = context.database,
153
+ sessionId = context.userId;
154
+ var limit = (0, _utils2.getLimit)(from, to);
155
+ var aqlQry = "FOR g, e IN INBOUND \"".concat("users/".concat(sessionId), "\" isGrouped\n LET users = (\n FOR u, l IN OUTBOUND g._id isGrouped\n RETURN MERGE (u, {type:l.type})\n )\n ", limit.aql, "\n SORT g.added\n RETURN DISTINCT MERGE(g, {users:users})");
156
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
157
+ return cursor.all();
158
+ })["catch"](function (error) {
159
+ throw error;
160
+ });
161
+ };
162
+
163
+ exports.getGroupListByUser = getGroupListByUser;
164
+
165
+ var getGroupListByTags = function getGroupListByTags(context, tags, from, to) {
166
+ var action = 'getListByTags';
167
+ var database = context.database;
168
+ return Promise.all((tags || []).map(function (tagName) {
169
+ var formatTagName = (0, _utils.parseId)(tagName);
170
+ var limit = (0, _utils2.getLimit)(from, to);
171
+ var aqlQry = "FOR p, e IN OUTBOUND \"".concat("tags/".concat(formatTagName), "\" isTagged\n FOR u IN users\n LET likes = (\n FOR post, like IN INBOUND p._id likes\n FILTER like.value == 'like'\n RETURN like\n )\n LET dislikes = (\n FOR post, like IN INBOUND p._id likes\n FILTER like.value == 'dislike'\n RETURN like\n )\n FILTER e.type == 'post' && p.userId == u._key\n ", limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {user:u, likes:LENGTH(likes), dislikes:LENGTH(dislikes)})");
172
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
173
+ return cursor.all();
174
+ });
175
+ })).then(function (results) {
176
+ return (0, _uniqBy["default"])((0, _flatten["default"])(results), '_key');
177
+ })["catch"](function (error) {
178
+ return (0, _utils2.logError)({
179
+ action: action,
180
+ category: eventCategory,
181
+ label: 'db_error'
182
+ }, error, context).then(function () {
183
+ return null;
184
+ });
185
+ });
186
+ };
187
+
188
+ exports.getGroupListByTags = getGroupListByTags;
189
+
190
+ var getGroup = function getGroup(context, itemId) {
191
+ var action = 'getItem';
192
+ var database = context.database,
193
+ sessionId = context.userId;
194
+ var formatItemId = (0, _utils.parseId)(itemId);
195
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), "users/".concat(sessionId), formatItemId);
196
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
197
+ return cursor.next();
198
+ }).then(function () {
199
+ var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
200
+ return group;
201
+ })["catch"](function (error) {
202
+ return (0, _utils2.logError)({
203
+ action: action,
204
+ category: eventCategory,
205
+ label: 'db_error'
206
+ }, error, context).then(function () {
207
+ return null;
208
+ });
209
+ });
210
+ };
211
+
212
+ exports.getGroup = getGroup;
213
+
214
+ var getGroupDetails = function getGroupDetails(context, groupId) {
215
+ var action = 'getDetails';
216
+ var database = context.database;
217
+ var formatGroupId = (0, _utils.parseId)(groupId);
218
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), formatGroupId);
219
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
220
+ return cursor.next();
221
+ }).then(function () {
222
+ var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
223
+ return group;
224
+ })["catch"](function (error) {
225
+ return (0, _utils2.logError)({
226
+ action: action,
227
+ category: eventCategory,
228
+ label: 'db_error'
229
+ }, error, context).then(function () {
230
+ return null;
231
+ });
232
+ });
233
+ };
234
+
235
+ exports.getGroupDetails = getGroupDetails;
236
+
237
+ var createGroupEdge = function createGroupEdge(database, userId, groupId, type) {
238
+ var action = 'createGroupEdge';
239
+ var formatUserId = (0, _utils.parseId)(userId);
240
+ var formatGroupId = (0, _utils.parseId)(groupId);
241
+ var formatType = (0, _utils.parseChar)(type, 16);
242
+ var now = Date.now();
243
+ var edgeCollection = (0, _utils2.useDb)(database).collection('isGrouped');
244
+ var edgeId = (0, _utils.createHash)("group-".concat(formatUserId, "-").concat(formatGroupId));
245
+ var edge = {
246
+ _from: "users/".concat(formatUserId),
247
+ _key: edgeId,
248
+ _to: "groups/".concat(formatGroupId),
249
+ added: now,
250
+ type: formatType
251
+ };
252
+ return edgeCollection.save(edge, {
253
+ returnNew: true
254
+ })["catch"](function (error) {
255
+ return (0, _utils2.logError)({
256
+ action: action,
257
+ category: eventCategory,
258
+ label: 'db_error'
259
+ }, error, {
260
+ id: formatUserId
261
+ }).then(function () {
262
+ return null;
263
+ });
264
+ });
265
+ };
266
+
267
+ exports.createGroupEdge = createGroupEdge;
268
+
269
+ var addGroup = function addGroup(context) {
270
+ var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
271
+ var action = 'add';
272
+ var database = context.database,
273
+ sessionId = context.userId;
274
+ var now = Date.now();
275
+ var _item$description = item.description,
276
+ description = _item$description === void 0 ? '' : _item$description,
277
+ _item$name = item.name,
278
+ name = _item$name === void 0 ? 'Untitled' : _item$name,
279
+ type = item.type;
280
+ var id = (0, _utils.createHash)("group-".concat(sessionId));
281
+ var formatDesc = description.substr(0, 640);
282
+ var formatType = (0, _utils.parseChar)(type, 16) || 'private';
283
+ var insert = {
284
+ _key: id,
285
+ added: now,
286
+ description: formatDesc,
287
+ modified: now,
288
+ name: name,
289
+ type: formatType
290
+ };
291
+ var db = (0, _utils2.useDb)(database);
292
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
293
+ return db.query(aqlQry).then(function (cursor) {
294
+ return cursor.next();
295
+ }).then(function () {
296
+ var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
297
+ var itemType = 'groups'; // Update linked tags
298
+
299
+ var groupId = group._key;
300
+ return (0, _tags.extractTags)(db, itemType, groupId, formatDesc).then(function () {
301
+ return createGroupEdge(database, sessionId, groupId, 'admin').then(function () {
302
+ return group;
303
+ });
304
+ });
305
+ })["catch"](function (error) {
306
+ return (0, _utils2.logError)({
307
+ action: action,
308
+ category: eventCategory,
309
+ label: 'db_error'
310
+ }, error, context).then(function () {
311
+ return null;
312
+ });
313
+ });
314
+ };
315
+
316
+ exports.addGroup = addGroup;
317
+
318
+ var updateGroup = function updateGroup(context) {
319
+ var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
320
+ var action = 'update';
321
+ var database = context.database;
322
+ var _item$description2 = item.description,
323
+ description = _item$description2 === void 0 ? '' : _item$description2,
324
+ id = item.id,
325
+ _item$name2 = item.name,
326
+ name = _item$name2 === void 0 ? 'Untitled' : _item$name2;
327
+ var itemId = (0, _utils.parseId)(id);
328
+ var now = Date.now();
329
+ var formatDesc = description.substr(0, 640);
330
+ var update = {
331
+ description: formatDesc,
332
+ modified: now,
333
+ name: name
334
+ };
335
+ var db = (0, _utils2.useDb)(database);
336
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), itemId, update);
337
+ return db.query(aqlQry).then(function (cursor) {
338
+ return cursor.next();
339
+ }).then(function () {
340
+ var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
341
+ var groupKey = group._key;
342
+ var itemType = 'groups'; // Update linked tags
343
+
344
+ return (0, _tags.extractTags)(db, itemType, groupKey, description).then(function () {
345
+ return group;
346
+ });
347
+ })["catch"](function (error) {
348
+ return (0, _utils2.logError)({
349
+ action: action,
350
+ category: eventCategory,
351
+ label: 'db_error'
352
+ }, error, context).then(function () {
353
+ return null;
354
+ });
355
+ });
356
+ };
357
+
358
+ exports.updateGroup = updateGroup;
359
+
360
+ var deleteGroup = function deleteGroup(context, itemId) {
361
+ var action = 'delete';
362
+ var database = context.database;
363
+ var formatItemId = (0, _utils.parseId)(itemId);
364
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatItemId);
365
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
366
+ return cursor.next();
367
+ }).then(function () {
368
+ var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
369
+ return group;
370
+ })["catch"](function (error) {
371
+ return (0, _utils2.logError)({
372
+ action: action,
373
+ category: eventCategory,
374
+ label: 'db_error'
375
+ }, error, context).then(function () {
376
+ return null;
377
+ });
378
+ });
379
+ };
380
+
381
+ exports.deleteGroup = deleteGroup;
382
+
383
+ var getGroupsByReaction = function getGroupsByReaction(context, reaction) {
384
+ var action = 'getGroupsByReaction';
385
+ var database = context.database,
386
+ sessionId = context.userId;
387
+ var formatReaction = (0, _utils.parseChar)(reaction, 32);
388
+ var userDocId = "users/".concat(sessionId); // Query
389
+
390
+ var aqlQry = (0, _arangojs.aql)(_templateObject6(), userDocId, formatReaction);
391
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
392
+ return cursor.all();
393
+ })["catch"](function (error) {
394
+ return (0, _utils2.logError)({
395
+ action: action,
396
+ category: eventCategory,
397
+ label: 'db_error'
398
+ }, error, context).then(function () {
399
+ return null;
400
+ });
401
+ });
402
+ };
403
+
404
+ exports.getGroupsByReaction = getGroupsByReaction;
405
+
406
+ var isGrouped = function isGrouped(database, userId, groupId) {
407
+ var action = 'isGrouped';
408
+ var formatUserId = (0, _utils.parseId)(userId);
409
+ var formatGroupId = (0, _utils.parseId)(groupId);
410
+ var aqlQry = (0, _arangojs.aql)(_templateObject7(), formatGroupId, formatUserId);
411
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
412
+ return cursor.all();
413
+ }).then(function () {
414
+ var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
415
+ var isValid = !!results.length;
416
+ return {
417
+ groupId: groupId,
418
+ isValid: isValid,
419
+ userId: userId
420
+ };
421
+ })["catch"](function (error) {
422
+ return (0, _utils2.logError)({
423
+ action: action,
424
+ category: eventCategory,
425
+ label: 'db_error'
426
+ }, error, {
427
+ id: userId
428
+ }).then(function () {
429
+ return null;
430
+ });
431
+ });
432
+ };
433
+
434
+ exports.isGrouped = isGrouped;
435
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2dyb3Vwcy50cyJdLCJuYW1lcyI6WyJldmVudENhdGVnb3J5IiwiZ2V0R3JvdXBMaXN0IiwiY29udGV4dCIsImZyb20iLCJ0byIsImFjdGlvbiIsImRhdGFiYXNlIiwibGltaXQiLCJhcWxRcnkiLCJhcWwiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJhbGwiLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJnZXRHcm91cExpc3RCeVVzZXIiLCJzZXNzaW9uSWQiLCJ1c2VySWQiLCJnZXRHcm91cExpc3RCeVRhZ3MiLCJ0YWdzIiwiUHJvbWlzZSIsIm1hcCIsInRhZ05hbWUiLCJmb3JtYXRUYWdOYW1lIiwicmVzdWx0cyIsImdldEdyb3VwIiwiaXRlbUlkIiwiZm9ybWF0SXRlbUlkIiwibmV4dCIsImdyb3VwIiwiZ2V0R3JvdXBEZXRhaWxzIiwiZ3JvdXBJZCIsImZvcm1hdEdyb3VwSWQiLCJjcmVhdGVHcm91cEVkZ2UiLCJ0eXBlIiwiZm9ybWF0VXNlcklkIiwiZm9ybWF0VHlwZSIsIm5vdyIsIkRhdGUiLCJlZGdlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJlZGdlSWQiLCJlZGdlIiwiX2Zyb20iLCJfa2V5IiwiX3RvIiwiYWRkZWQiLCJzYXZlIiwicmV0dXJuTmV3IiwiaWQiLCJhZGRHcm91cCIsIml0ZW0iLCJkZXNjcmlwdGlvbiIsIm5hbWUiLCJmb3JtYXREZXNjIiwic3Vic3RyIiwiaW5zZXJ0IiwibW9kaWZpZWQiLCJkYiIsIml0ZW1UeXBlIiwidXBkYXRlR3JvdXAiLCJ1cGRhdGUiLCJncm91cEtleSIsImRlbGV0ZUdyb3VwIiwiZ2V0R3JvdXBzQnlSZWFjdGlvbiIsInJlYWN0aW9uIiwiZm9ybWF0UmVhY3Rpb24iLCJ1c2VyRG9jSWQiLCJpc0dyb3VwZWQiLCJpc1ZhbGlkIiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBSUE7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QUFBQSxXQUF5QkEsTUFBTSxDQUFDQyxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKRixJQUZJLENBRUMsWUFBa0I7QUFBQSxRQUFqQmUsT0FBaUIsdUVBQVAsRUFBTztBQUN0QixRQUFNNkMsT0FBTyxHQUFHLENBQUMsQ0FBQzdDLE9BQU8sQ0FBQzhDLE1BQTFCO0FBRUEsV0FBTztBQUNMdkMsTUFBQUEsT0FBTyxFQUFQQSxPQURLO0FBRUxzQyxNQUFBQSxPQUFPLEVBQVBBLE9BRks7QUFHTHBELE1BQUFBLE1BQU0sRUFBTkE7QUFISyxLQUFQO0FBS0QsR0FWSSxXQVdFLFVBQUNMLEtBQUQ7QUFBQSxXQUFrQixzQkFBUztBQUNoQ1QsTUFBQUEsTUFBTSxFQUFOQSxNQURnQztBQUVoQ1UsTUFBQUEsUUFBUSxFQUFFZixhQUZzQjtBQUdoQ2dCLE1BQUFBLEtBQUssRUFBRTtBQUh5QixLQUFULEVBSXRCRixLQUpzQixFQUlmO0FBQUNxQyxNQUFBQSxFQUFFLEVBQUVoQztBQUFMLEtBSmUsRUFJRFIsSUFKQyxDQUlJO0FBQUEsYUFBTSxJQUFOO0FBQUEsS0FKSixDQUFsQjtBQUFBLEdBWEYsQ0FBUDtBQWdCRCxDQTNCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VDaGFyLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbic7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9jdXJzb3InO1xuaW1wb3J0IGZsYXR0ZW4gZnJvbSAnbG9kYXNoL2ZsYXR0ZW4nO1xuaW1wb3J0IHVuaXFCeSBmcm9tICdsb2Rhc2gvdW5pcUJ5JztcblxuaW1wb3J0IHtBcmFuZ29EQkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYic7XG5pbXBvcnQge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgnO1xuaW1wb3J0IHtHcm91cEVkZ2VUeXBlLCBHcm91cFR5cGUsIEdyb3VwVXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL2dyb3Vwcyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7ZXh0cmFjdFRhZ3N9IGZyb20gJy4vdGFncyc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdncm91cHMnO1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgZyBpbiBncm91cHNcbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIGwgSU4gT1VUQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgICAgIFJFVFVSTiBNRVJHRSAodSwge3R5cGU6bC50eXBlfSlcbiAgICAgIClcbiAgICAgICR7bGltaXQuYXFsfVxuICAgICAgU09SVCBnLmFkZGVkXG4gICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UoZywge3VzZXJzOnVzZXJzfSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBMaXN0QnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RCTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBnLCBlIElOIElOQk9VTkQgXCIke2B1c2Vycy8ke3Nlc3Npb25JZH1gfVwiIGlzR3JvdXBlZFxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgUkVUVVJOIE1FUkdFICh1LCB7dHlwZTpsLnR5cGV9KVxuICAgICAgKVxuICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICBTT1JUIGcuYWRkZWRcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBMaXN0QnlUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB0YWdzOiBzdHJpbmdbXSxcbiAgZnJvbTogbnVtYmVyLFxuICB0bzogbnVtYmVyXG4pOiBQcm9taXNlPEdyb3VwVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcblxuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgKHRhZ3MgfHwgW10pLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZUlkKHRhZ05hbWUpO1xuICAgICAgY29uc3QgbGltaXQ6IEFyYW5nb0RCTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG4gICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCwgZSBJTiBPVVRCT1VORCBcIiR7YHRhZ3MvJHtmb3JtYXRUYWdOYW1lfWB9XCIgaXNUYWdnZWRcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIExFVCBsaWtlcyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCBsaWtlIElOIElOQk9VTkQgcC5faWQgbGlrZXNcbiAgICAgICAgICAgIEZJTFRFUiBsaWtlLnZhbHVlID09ICdsaWtlJ1xuICAgICAgICAgICAgUkVUVVJOIGxpa2VcbiAgICAgICAgICApXG4gICAgICAgICAgTEVUIGRpc2xpa2VzID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIGxpa2UgSU4gSU5CT1VORCBwLl9pZCBsaWtlc1xuICAgICAgICAgICAgRklMVEVSIGxpa2UudmFsdWUgPT0gJ2Rpc2xpa2UnXG4gICAgICAgICAgICBSRVRVUk4gbGlrZVxuICAgICAgICAgIClcbiAgICAgICAgICBGSUxURVIgZS50eXBlID09ICdwb3N0JyAmJiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwge3VzZXI6dSwgbGlrZXM6TEVOR1RIKGxpa2VzKSwgZGlzbGlrZXM6TEVOR1RIKGRpc2xpa2VzKX0pYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gICAgfSlcbiAgKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgJ19rZXknKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGcsIGUgSU4gSU5CT1VORCAke2B1c2Vycy8ke3Nlc3Npb25JZH1gfSBpc0dyb3VwZWRcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICBMRVQgdXNlcnMgPSAoXG4gICAgICAgIEZPUiB1LCBsIElOIE9VVEJPVU5EIGcuX2lkIGlzR3JvdXBlZFxuICAgICAgICBSRVRVUk4gTUVSR0UgKHUsIHt0eXBlOmwudHlwZX0pXG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UoZywge3VzZXJzOnVzZXJzfSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwRGV0YWlscyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBncm91cElkOiBzdHJpbmcpOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREZXRhaWxzJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGcgSU4gZ3JvdXBzXG4gICAgICBGSUxURVIgZy5fa2V5ID09ICR7Zm9ybWF0R3JvdXBJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBnYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSA9IHt9KSA9PiBncm91cClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHcm91cEVkZ2UgPSAoXG4gIGRhdGFiYXNlOiBzdHJpbmcsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBncm91cElkOiBzdHJpbmcsXG4gIHR5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxHcm91cEVkZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2NyZWF0ZUdyb3VwRWRnZSc7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBmb3JtYXRUeXBlOiBzdHJpbmcgPSBwYXJzZUNoYXIodHlwZSwgMTYpO1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2UpLmNvbGxlY3Rpb24oJ2lzR3JvdXBlZCcpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGdyb3VwLSR7Zm9ybWF0VXNlcklkfS0ke2Zvcm1hdEdyb3VwSWR9YCk7XG5cbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBgdXNlcnMvJHtmb3JtYXRVc2VySWR9YCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBgZ3JvdXBzLyR7Zm9ybWF0R3JvdXBJZH1gLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogZm9ybWF0VXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkR3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogR3JvdXBUeXBlID0ge30pOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgbmFtZSA9ICdVbnRpdGxlZCcsXG4gICAgdHlwZVxuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCBmb3JtYXRUeXBlOiBzdHJpbmcgPSBwYXJzZUNoYXIodHlwZSwgMTYpIHx8ICdwcml2YXRlJztcbiAgY29uc3QgaW5zZXJ0OiBHcm91cFR5cGUgPSB7XG4gICAgX2tleTogaWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWUsXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBncm91cHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBpdGVtVHlwZTogc3RyaW5nID0gJ2dyb3Vwcyc7XG5cbiAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgdGFnc1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwSWR9OiBHcm91cFR5cGUgPSBncm91cDtcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwSWQsIGZvcm1hdERlc2MpXG4gICAgICAgIC50aGVuKCgpID0+IGNyZWF0ZUdyb3VwRWRnZShkYXRhYmFzZSwgc2Vzc2lvbklkLCBncm91cElkLCAnYWRtaW4nKS50aGVuKCgpID0+IGdyb3VwKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtOiBHcm91cFR5cGUgPSB7fSk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZGVzY3JpcHRpb24gPSAnJyxcbiAgICBpZCxcbiAgICBuYW1lID0gJ1VudGl0bGVkJ1xuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWVcbiAgfTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke2l0ZW1JZH0gV0lUSCAke3VwZGF0ZX0gSU4gZ3JvdXBzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwS2V5fSA9IGdyb3VwO1xuICAgICAgY29uc3QgaXRlbVR5cGU6IHN0cmluZyA9ICdncm91cHMnO1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwS2V5LCBkZXNjcmlwdGlvbikudGhlbigoKSA9PiBncm91cCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZyBJTiBncm91cHNcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICBSRU1PVkUgZyBJTiBncm91cHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3Vwc0J5UmVhY3Rpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCwgcmVhY3Rpb246IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0R3JvdXBzQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb246IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpO1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHt1c2VyRG9jSWR9IGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci52YWx1ZSA9PSAke2Zvcm1hdFJlYWN0aW9ufVxuICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgUkVUVVJOIHt2YWx1ZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR3JvdXBlZCA9IChkYXRhYmFzZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2lzR3JvdXBlZCc7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBnIElOIGdyb3Vwc1xuICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgIEZPUiB1IElOIElOQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgRklMVEVSIHUuX2tleSA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgaXNWYWxpZCA9ICEhcmVzdWx0cy5sZW5ndGg7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIGlzVmFsaWQsXG4gICAgICAgIHVzZXJJZFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogdXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuIl19
@@ -7,13 +7,14 @@ export declare const parseImageOptions: (options?: ImageOptions) => {
7
7
  };
8
8
  export declare const getImageOptional: (fields: string[]) => any;
9
9
  export declare const getImageListByUser: (context: ApiContext, userId: string, from: number, to: number) => Promise<ImageType[]>;
10
- export declare const getImageListByLink: (context: ApiContext, itemId: string, itemType: AppCollectionTypes, options: ImageOptions) => Promise<ImageType[]>;
10
+ export declare const getImageCountByItem: (context: ApiContext, itemId: string, itemType?: AppCollectionTypes) => Promise<number>;
11
+ export declare const getImageListByItem: (context: ApiContext, itemId: string, itemType: AppCollectionTypes, options: ImageOptions) => Promise<ImageType[]>;
11
12
  export declare const getImageListByGroup: (context: ApiContext, params: any) => Promise<ImageType[]>;
13
+ export declare const getImagesByReaction: (context: ApiContext, reactionName: string, options?: ImageOptions) => Promise<ImageType[]>;
12
14
  export declare const getImage: (context: ApiContext, id: string) => Promise<ImageType>;
13
15
  export declare const getPathUserImages: (sub: string, imgId: string, type: string, dir?: string) => string;
14
16
  export declare const getAppImageUrl: (data: ImageUrlData) => string;
15
17
  export declare const getUserImageUrl: (data: ImageUrlData) => string;
16
- export declare const getSavedImages: (context: ApiContext, params: any) => Promise<any>;
17
18
  export declare const resizeSaveImage: (context: ApiContext, imgId: string, buffer: Buffer, type?: string, s3Options?: PutObjectRequest) => Promise<ImageType>;
18
19
  export declare const addImage: (context: ApiContext, image: ImageType, s3Options: PutObjectRequest) => Promise<ImageType>;
19
20
  export declare const addImageEdge: (context: ApiContext, imageEdge: ImageEdgeType) => Promise<object>;