@nlabs/reaktor 0.9.0 → 0.10.1

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 (400) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/README.md +9 -0
  5. package/TEST_UTILITIES_GUIDE.md +360 -0
  6. package/coverage/index.html +61 -46
  7. package/dist/actions/apps.js +242 -0
  8. package/dist/actions/connections.js +90 -0
  9. package/dist/actions/conversations.js +350 -0
  10. package/dist/actions/dynamodb.js +150 -0
  11. package/dist/actions/email.js +152 -0
  12. package/dist/actions/files.js +283 -0
  13. package/dist/actions/groups.js +292 -0
  14. package/dist/actions/images.js +735 -0
  15. package/dist/actions/index.js +66 -0
  16. package/dist/actions/ios.js +164 -0
  17. package/dist/actions/locations.js +122 -0
  18. package/dist/actions/messages.js +208 -0
  19. package/dist/actions/notifications.js +59 -0
  20. package/dist/actions/payments.js +497 -0
  21. package/dist/actions/personas.js +110 -0
  22. package/dist/actions/posts.js +595 -0
  23. package/dist/actions/reactions.js +322 -0
  24. package/dist/actions/s3.js +133 -0
  25. package/dist/actions/search.js +90 -0
  26. package/dist/actions/sms.js +108 -0
  27. package/dist/actions/statistics.js +62 -0
  28. package/dist/actions/subscription.js +220 -0
  29. package/dist/actions/tags.js +292 -0
  30. package/dist/actions/users.js +784 -0
  31. package/dist/actions/websockets.js +174 -0
  32. package/dist/adapters/arangoAdapter.js +46 -0
  33. package/dist/adapters/fileAdapter.js +76 -0
  34. package/dist/adapters/imageAdapter.js +40 -0
  35. package/dist/adapters/messageAdapter.js +49 -0
  36. package/dist/adapters/postAdapter.js +70 -0
  37. package/dist/adapters/reaktorAdapter.js +44 -0
  38. package/dist/adapters/tagAdapter.js +50 -0
  39. package/dist/adapters/userAdapter.js +115 -0
  40. package/dist/config.js +125 -0
  41. package/dist/index.js +66 -0
  42. package/dist/lambdas/actions/websockets.js +132 -0
  43. package/dist/lambdas/authorizer.js +67 -0
  44. package/dist/lambdas/connection.js +91 -0
  45. package/dist/lambdas/utils/message.js +42 -0
  46. package/dist/lambdas/utils/websocket.js +105 -0
  47. package/dist/mocks/conversation.js +35 -0
  48. package/dist/mocks/file.js +38 -0
  49. package/dist/mocks/group.js +47 -0
  50. package/dist/mocks/image.js +44 -0
  51. package/dist/mocks/nlabs.png +0 -0
  52. package/dist/mocks/post.js +55 -0
  53. package/dist/mocks/tag.js +37 -0
  54. package/dist/mocks/user.js +88 -0
  55. package/dist/mutations/index.js +26 -0
  56. package/dist/mutations/locations.js +44 -0
  57. package/dist/mutations/messages.js +86 -0
  58. package/dist/mutations/personas.js +100 -0
  59. package/dist/mutations/posts.js +53 -0
  60. package/dist/mutations/reactions.js +51 -0
  61. package/dist/mutations/statistics.js +39 -0
  62. package/dist/mutations/subscriptions.js +56 -0
  63. package/dist/mutations/tags.js +120 -0
  64. package/dist/mutations/users.js +116 -0
  65. package/dist/objectTypes/app.js +173 -0
  66. package/dist/objectTypes/bankAccount.js +76 -0
  67. package/dist/objectTypes/connection.js +48 -0
  68. package/dist/objectTypes/conversation.js +77 -0
  69. package/dist/objectTypes/creditCard.js +86 -0
  70. package/dist/objectTypes/document.js +46 -0
  71. package/dist/objectTypes/error.js +46 -0
  72. package/dist/objectTypes/external.js +74 -0
  73. package/dist/objectTypes/file.js +100 -0
  74. package/dist/objectTypes/filter.js +43 -0
  75. package/dist/objectTypes/group.js +123 -0
  76. package/dist/objectTypes/iapSubscription.js +40 -0
  77. package/dist/objectTypes/image.js +129 -0
  78. package/dist/objectTypes/index.js +68 -0
  79. package/dist/objectTypes/location.js +109 -0
  80. package/dist/objectTypes/message.js +96 -0
  81. package/dist/objectTypes/passcode.js +42 -0
  82. package/dist/objectTypes/persona.js +87 -0
  83. package/dist/objectTypes/plan.js +95 -0
  84. package/dist/objectTypes/post.js +125 -0
  85. package/dist/objectTypes/reaction.js +61 -0
  86. package/dist/objectTypes/relation.js +49 -0
  87. package/dist/objectTypes/search.js +72 -0
  88. package/dist/objectTypes/statistics.js +39 -0
  89. package/dist/objectTypes/subscription.js +117 -0
  90. package/dist/objectTypes/tag.js +65 -0
  91. package/dist/objectTypes/user.js +144 -0
  92. package/dist/queries/index.js +33 -0
  93. package/dist/queries/locations.js +45 -0
  94. package/dist/queries/messages.js +52 -0
  95. package/dist/queries/posts.js +154 -0
  96. package/dist/queries/reactions.js +56 -0
  97. package/dist/queries/statistics.js +39 -0
  98. package/dist/queries/subscriptions.js +44 -0
  99. package/dist/queries/tags.js +75 -0
  100. package/dist/queries/users.js +64 -0
  101. package/dist/templates/email/layout.js +302 -0
  102. package/dist/templates/email/passwordForgot.js +38 -0
  103. package/dist/templates/email/passwordRecovery.js +35 -0
  104. package/dist/templates/email/verifyEmail.js +38 -0
  105. package/dist/templates/email/welcome.js +38 -0
  106. package/dist/templates/sms/passwordForgot.js +24 -0
  107. package/dist/templates/sms/passwordRecovery.js +24 -0
  108. package/dist/templates/sms/verifyEmail.js +24 -0
  109. package/dist/templates/sms/verifyPhone.js +24 -0
  110. package/dist/templates/sms/welcome.js +24 -0
  111. package/dist/types/apps.js +32 -0
  112. package/{lib → dist}/types/arangodb.js +1 -1
  113. package/{lib → dist}/types/auth.js +1 -1
  114. package/{lib → dist}/types/connections.js +1 -1
  115. package/dist/types/conversations.js +16 -0
  116. package/{lib → dist}/types/email.js +1 -1
  117. package/dist/types/files.js +16 -0
  118. package/dist/types/google.js +16 -0
  119. package/{lib → dist}/types/groups.js +1 -1
  120. package/dist/types/images.js +16 -0
  121. package/dist/types/index.js +60 -0
  122. package/{lib → dist}/types/locations.js +1 -1
  123. package/{lib → dist}/types/messages.js +1 -1
  124. package/{lib → dist}/types/notifications.js +1 -1
  125. package/dist/types/payments.js +16 -0
  126. package/dist/types/personas.js +16 -0
  127. package/dist/types/posts.js +16 -0
  128. package/{lib → dist}/types/tags.js +1 -1
  129. package/dist/types/users.js +16 -0
  130. package/dist/types/websockets.js +16 -0
  131. package/dist/utils/adapterUtils.js +45 -0
  132. package/dist/utils/analyticsUtils.js +72 -0
  133. package/dist/utils/arangodbUtils.js +165 -0
  134. package/dist/utils/auth.js +57 -0
  135. package/dist/utils/index.js +30 -0
  136. package/{lib → dist}/utils/session.js +10 -7
  137. package/index.js +1 -1
  138. package/jest.config.js +17 -0
  139. package/jest.setup.js +36 -0
  140. package/lex.config.cjs +13 -0
  141. package/lib/actions/apps.js +17 -249
  142. package/lib/actions/connections.js +7 -0
  143. package/lib/actions/content.js +17 -0
  144. package/lib/actions/conversations.js +19 -325
  145. package/lib/actions/dynamodb.js +2 -150
  146. package/lib/actions/email.js +2 -152
  147. package/lib/actions/files.js +5 -287
  148. package/lib/actions/groups.js +23 -263
  149. package/lib/actions/images.js +31 -646
  150. package/lib/actions/index.js +2 -62
  151. package/lib/actions/ios.js +9 -162
  152. package/lib/actions/locations.js +7 -110
  153. package/lib/actions/messages.js +21 -193
  154. package/lib/actions/notifications.js +2 -59
  155. package/lib/actions/payments.js +11 -461
  156. package/lib/actions/posts.js +77 -515
  157. package/lib/actions/profiles.js +8 -0
  158. package/lib/actions/reactions.js +25 -312
  159. package/lib/actions/s3.js +2 -133
  160. package/lib/actions/search.js +5 -90
  161. package/lib/actions/sms.js +2 -106
  162. package/lib/actions/statistics.js +6 -60
  163. package/lib/actions/subscriptions.js +12 -0
  164. package/lib/actions/tags.js +19 -262
  165. package/lib/actions/users.js +67 -537
  166. package/lib/actions/websockets.js +16 -158
  167. package/lib/adapters/arangoAdapter.js +2 -46
  168. package/lib/adapters/contentAdapter.js +2 -0
  169. package/lib/adapters/fileAdapter.js +2 -76
  170. package/lib/adapters/imageAdapter.js +2 -0
  171. package/lib/adapters/messageAdapter.js +2 -0
  172. package/lib/adapters/postAdapter.js +2 -70
  173. package/lib/adapters/reaktorAdapter.js +2 -44
  174. package/lib/adapters/tagAdapter.js +2 -50
  175. package/lib/adapters/userAdapter.js +2 -110
  176. package/lib/config.js +2 -125
  177. package/lib/handlers/graphqlHandler.js +2 -0
  178. package/lib/index.js +2 -30
  179. package/lib/lambdas/actions/websockets.js +14 -112
  180. package/lib/lambdas/authorizer.js +2 -67
  181. package/lib/lambdas/connection.js +2 -92
  182. package/lib/lambdas/utils/message.js +2 -42
  183. package/lib/lambdas/utils/websocket.js +2 -105
  184. package/lib/mocks/conversation.js +2 -35
  185. package/lib/mocks/file.js +2 -38
  186. package/lib/mocks/group.js +2 -47
  187. package/lib/mocks/image.js +2 -43
  188. package/lib/mocks/post.js +2 -55
  189. package/lib/mocks/tag.js +2 -37
  190. package/lib/mocks/user.js +2 -88
  191. package/lib/mutations/index.js +2 -0
  192. package/lib/mutations/locations.integration.js +2 -0
  193. package/lib/mutations/locations.js +2 -0
  194. package/lib/mutations/messages.integration.js +2 -0
  195. package/lib/mutations/messages.js +2 -0
  196. package/lib/mutations/posts.integration.js +2 -0
  197. package/lib/mutations/posts.js +2 -0
  198. package/lib/mutations/profiles.integration.js +2 -0
  199. package/lib/mutations/profiles.js +2 -0
  200. package/lib/mutations/reactions.integration.js +2 -0
  201. package/lib/mutations/reactions.js +2 -0
  202. package/lib/mutations/statistics.integration.js +2 -0
  203. package/lib/mutations/statistics.js +2 -0
  204. package/lib/mutations/subscriptions.integration.js +2 -0
  205. package/lib/mutations/subscriptions.js +2 -0
  206. package/lib/mutations/tags.integration.js +2 -0
  207. package/lib/mutations/tags.js +2 -0
  208. package/lib/mutations/users.integration.js +2 -0
  209. package/lib/mutations/users.js +2 -0
  210. package/lib/objectTypes/app.js +2 -0
  211. package/lib/objectTypes/bankAccount.js +2 -0
  212. package/lib/objectTypes/connection.js +2 -0
  213. package/lib/objectTypes/conversation.js +2 -0
  214. package/lib/objectTypes/creditCard.js +2 -0
  215. package/lib/objectTypes/document.js +2 -0
  216. package/lib/objectTypes/error.js +2 -0
  217. package/lib/objectTypes/external.js +2 -0
  218. package/lib/objectTypes/file.js +2 -0
  219. package/lib/objectTypes/filter.js +2 -0
  220. package/lib/objectTypes/group.js +2 -0
  221. package/lib/objectTypes/iapSubscription.js +2 -0
  222. package/lib/objectTypes/image.js +2 -0
  223. package/lib/objectTypes/index.js +2 -0
  224. package/lib/objectTypes/location.js +2 -0
  225. package/lib/objectTypes/message.js +2 -0
  226. package/lib/objectTypes/passcode.js +2 -0
  227. package/lib/objectTypes/plan.js +2 -0
  228. package/lib/objectTypes/post.js +2 -0
  229. package/lib/objectTypes/profile.js +2 -0
  230. package/lib/objectTypes/reaction.js +2 -0
  231. package/lib/objectTypes/relation.js +2 -0
  232. package/lib/objectTypes/search.js +2 -0
  233. package/lib/objectTypes/statistics.js +2 -0
  234. package/lib/objectTypes/subscription.js +2 -0
  235. package/lib/objectTypes/tag.js +2 -0
  236. package/lib/objectTypes/user.js +2 -0
  237. package/lib/queries/index.js +2 -0
  238. package/lib/queries/locations.integration.js +2 -0
  239. package/lib/queries/locations.js +2 -0
  240. package/lib/queries/messages.integration.js +2 -0
  241. package/lib/queries/messages.js +2 -0
  242. package/lib/queries/posts.integration.js +2 -0
  243. package/lib/queries/posts.js +2 -0
  244. package/lib/queries/reactions.integration.js +2 -0
  245. package/lib/queries/reactions.js +2 -0
  246. package/lib/queries/statistics.js +2 -0
  247. package/lib/queries/subscriptions.js +2 -0
  248. package/lib/queries/tags.integration.js +2 -0
  249. package/lib/queries/tags.js +2 -0
  250. package/lib/queries/users.integration.js +2 -0
  251. package/lib/queries/users.js +2 -0
  252. package/lib/templates/email/layout.js +3 -25
  253. package/lib/templates/email/passwordForgot.js +3 -25
  254. package/lib/templates/email/passwordRecovery.js +3 -25
  255. package/lib/templates/email/verifyEmail.js +3 -25
  256. package/lib/templates/email/welcome.js +3 -25
  257. package/lib/templates/sms/passwordForgot.js +2 -24
  258. package/lib/templates/sms/passwordRecovery.js +2 -24
  259. package/lib/templates/sms/verifyEmail.js +2 -24
  260. package/lib/templates/sms/verifyPhone.js +2 -24
  261. package/lib/templates/sms/welcome.js +2 -24
  262. package/lib/types/apps.types.js +2 -0
  263. package/lib/types/arangodb.types.js +1 -0
  264. package/lib/types/auth.types.js +1 -0
  265. package/lib/types/connections.types.js +1 -0
  266. package/lib/types/content.types.js +1 -0
  267. package/lib/types/conversations.types.js +1 -0
  268. package/lib/types/email.types.js +1 -0
  269. package/lib/types/error.types.js +2 -0
  270. package/lib/types/files.types.js +1 -0
  271. package/lib/types/google.types.js +1 -0
  272. package/lib/types/groups.types.js +1 -0
  273. package/lib/types/images.types.js +1 -0
  274. package/lib/types/index.js +2 -56
  275. package/lib/types/locations.types.js +1 -0
  276. package/lib/types/messages.types.js +1 -0
  277. package/lib/types/notifications.types.js +1 -0
  278. package/lib/types/payments.types.js +1 -0
  279. package/lib/types/posts.types.js +1 -0
  280. package/lib/types/profiles.types.js +1 -0
  281. package/lib/types/statistics.types.js +1 -0
  282. package/lib/types/tags.types.js +1 -0
  283. package/lib/types/users.types.js +1 -0
  284. package/lib/types/websockets.types.js +1 -0
  285. package/lib/utils/adapterUtils.js +2 -45
  286. package/lib/utils/analyticsUtils.js +2 -72
  287. package/lib/utils/arangodbUtils.js +5 -142
  288. package/lib/utils/authUtils.js +2 -0
  289. package/lib/utils/contextUtils.js +2 -0
  290. package/lib/utils/dbI18n.example.js +6 -0
  291. package/lib/utils/dbI18n.js +2 -0
  292. package/lib/utils/googleTranslate.js +2 -0
  293. package/lib/utils/graphqlUtils.js +2 -0
  294. package/lib/utils/index.js +2 -30
  295. package/lib/utils/languageDetection.js +2 -0
  296. package/lib/utils/localeUtils.example.js +2 -0
  297. package/lib/utils/localeUtils.js +2 -0
  298. package/lib/utils/middlewareUtils.js +2 -0
  299. package/lib/utils/sessionUtils.js +2 -0
  300. package/lib/utils/stripeUtils.js +2 -0
  301. package/lib/utils/templateUtils.js +2 -0
  302. package/lib/utils/testUtils.js +2 -0
  303. package/lib/utils/translationQueue.example.js +2 -0
  304. package/lib/utils/translationQueue.js +2 -0
  305. package/package.json +41 -37
  306. package/.eslintrc +0 -10
  307. package/.prettierrc.js +0 -4
  308. package/lib/actions/apps.d.ts +0 -25
  309. package/lib/actions/conversations.d.ts +0 -14
  310. package/lib/actions/dynamodb.d.ts +0 -8
  311. package/lib/actions/email.d.ts +0 -5
  312. package/lib/actions/files.d.ts +0 -19
  313. package/lib/actions/groups.d.ts +0 -14
  314. package/lib/actions/images.d.ts +0 -26
  315. package/lib/actions/index.d.ts +0 -21
  316. package/lib/actions/ios.d.ts +0 -7
  317. package/lib/actions/locations.d.ts +0 -5
  318. package/lib/actions/messages.d.ts +0 -13
  319. package/lib/actions/notifications.d.ts +0 -5
  320. package/lib/actions/payments.d.ts +0 -10
  321. package/lib/actions/posts.d.ts +0 -19
  322. package/lib/actions/reactions.d.ts +0 -30
  323. package/lib/actions/s3.d.ts +0 -7
  324. package/lib/actions/search.d.ts +0 -3
  325. package/lib/actions/sms.d.ts +0 -3
  326. package/lib/actions/statistics.d.ts +0 -3
  327. package/lib/actions/subscription.d.ts +0 -7
  328. package/lib/actions/subscription.js +0 -218
  329. package/lib/actions/tags.d.ts +0 -29
  330. package/lib/actions/users.d.ts +0 -47
  331. package/lib/actions/websockets.d.ts +0 -19
  332. package/lib/adapters/arangoAdapter.d.ts +0 -2
  333. package/lib/adapters/fileAdapter.d.ts +0 -3
  334. package/lib/adapters/postAdapter.d.ts +0 -2
  335. package/lib/adapters/reaktorAdapter.d.ts +0 -6
  336. package/lib/adapters/tagAdapter.d.ts +0 -2
  337. package/lib/adapters/userAdapter.d.ts +0 -2
  338. package/lib/config.d.ts +0 -20
  339. package/lib/index.d.ts +0 -5
  340. package/lib/lambdas/actions/websockets.d.ts +0 -6
  341. package/lib/lambdas/authorizer.d.ts +0 -20
  342. package/lib/lambdas/connection.d.ts +0 -12
  343. package/lib/lambdas/utils/message.d.ts +0 -1
  344. package/lib/lambdas/utils/websocket.d.ts +0 -7
  345. package/lib/mocks/conversation.d.ts +0 -8
  346. package/lib/mocks/file.d.ts +0 -11
  347. package/lib/mocks/group.d.ts +0 -17
  348. package/lib/mocks/image.d.ts +0 -3
  349. package/lib/mocks/post.d.ts +0 -38
  350. package/lib/mocks/tag.d.ts +0 -2
  351. package/lib/mocks/user.d.ts +0 -4
  352. package/lib/templates/email/layout.d.ts +0 -2
  353. package/lib/templates/email/passwordForgot.d.ts +0 -2
  354. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  355. package/lib/templates/email/verifyEmail.d.ts +0 -2
  356. package/lib/templates/email/welcome.d.ts +0 -2
  357. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  358. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  359. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  360. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  361. package/lib/templates/sms/welcome.d.ts +0 -2
  362. package/lib/types/apps.d.ts +0 -46
  363. package/lib/types/apps.js +0 -32
  364. package/lib/types/arangodb.d.ts +0 -30
  365. package/lib/types/auth.d.ts +0 -7
  366. package/lib/types/connections.d.ts +0 -7
  367. package/lib/types/conversations.d.ts +0 -29
  368. package/lib/types/conversations.js +0 -16
  369. package/lib/types/email.d.ts +0 -13
  370. package/lib/types/error.d.ts +0 -20
  371. package/lib/types/files.d.ts +0 -26
  372. package/lib/types/files.js +0 -16
  373. package/lib/types/google.d.ts +0 -29
  374. package/lib/types/google.js +0 -16
  375. package/lib/types/groups.d.ts +0 -21
  376. package/lib/types/images.d.ts +0 -51
  377. package/lib/types/images.js +0 -16
  378. package/lib/types/index.d.ts +0 -18
  379. package/lib/types/locations.d.ts +0 -20
  380. package/lib/types/messages.d.ts +0 -16
  381. package/lib/types/notifications.d.ts +0 -17
  382. package/lib/types/payments.d.ts +0 -112
  383. package/lib/types/payments.js +0 -16
  384. package/lib/types/posts.d.ts +0 -31
  385. package/lib/types/posts.js +0 -16
  386. package/lib/types/statistics.d.ts +0 -3
  387. package/lib/types/tags.d.ts +0 -10
  388. package/lib/types/users.d.ts +0 -76
  389. package/lib/types/users.js +0 -16
  390. package/lib/types/websocket.d.ts +0 -13
  391. package/lib/types/websocket.js +0 -16
  392. package/lib/utils/adapterUtils.d.ts +0 -1
  393. package/lib/utils/analyticsUtils.d.ts +0 -21
  394. package/lib/utils/arangodbUtils.d.ts +0 -65
  395. package/lib/utils/auth.d.ts +0 -20
  396. package/lib/utils/auth.js +0 -50
  397. package/lib/utils/index.d.ts +0 -5
  398. package/lib/utils/session.d.ts +0 -16
  399. /package/{lib → dist}/types/error.js +0 -0
  400. /package/{lib → dist}/types/statistics.js +0 -0
@@ -1,287 +1,5 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
- var files_exports = {};
19
- __export(files_exports, {
20
- GIPHY_URL: () => GIPHY_URL,
21
- addFile: () => addFile,
22
- decodeBase64: () => decodeBase64,
23
- encodeBase64: () => encodeBase64,
24
- getGiphySearch: () => getGiphySearch,
25
- getGiphyTrends: () => getGiphyTrends,
26
- getPathUserFiles: () => getPathUserFiles,
27
- getYouTube: () => getYouTube,
28
- getYouTubeSearch: () => getYouTubeSearch,
29
- getYouTubeTrends: () => getYouTubeTrends,
30
- insertFile: () => insertFile,
31
- linkFiles: () => linkFiles,
32
- parseGiphyItem: () => parseGiphyItem,
33
- updateFiles: () => updateFiles,
34
- uploadFile: () => uploadFile,
35
- upsertFile: () => upsertFile
36
- });
37
- module.exports = __toCommonJS(files_exports);
38
- var import_rip_hunter = require("@nlabs/rip-hunter");
39
- var import_utils = require("@nlabs/utils");
40
- var import_arangojs = require("arangojs");
41
- var import_googleapis = require("googleapis");
42
- var import_config = require("../config");
43
- var import_analyticsUtils = require("../utils/analyticsUtils");
44
- var import_images = require("./images");
45
- var import_posts = require("./posts");
46
- var import_error = require("../types/error");
47
- var import_fileAdapter = require("../adapters/fileAdapter");
48
- const eventCategory = "files";
49
- const GIPHY_URL = "http://api.giphy.com/v1/gifs";
50
- const getYouTube = () => import_googleapis.google.youtube({ auth: import_config.Config.get("google.key"), version: "v3" });
51
- const insertFile = (context, file) => {
52
- const action = "insertFile";
53
- const { database } = context;
54
- const formattedFile = (0, import_fileAdapter.parseFile)(file);
55
- const aqlQry = import_arangojs.aql`INSERT ${formattedFile} IN files RETURN NEW`;
56
- return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
57
- action,
58
- category: eventCategory,
59
- label: import_error.ErrorTypes.DATABASE_ERROR
60
- }, error, context));
61
- };
62
- const upsertFile = (context, file) => {
63
- const action = "upsertFile";
64
- const { database } = context;
65
- const formattedFile = (0, import_fileAdapter.parseFile)(file);
66
- const { fileId } = formattedFile;
67
- const insert = {
68
- ...formattedFile,
69
- _key: fileId,
70
- added: Date.now(),
71
- modified: Date.now()
72
- };
73
- const update = {
74
- ...formattedFile,
75
- _key: fileId,
76
- modified: Date.now()
77
- };
78
- const aqlQry = import_arangojs.aql`UPSERT {_key: ${fileId}}
79
- INSERT ${insert}
80
- UPDATE ${update}
81
- IN files RETURN NEW`;
82
- return database.query(aqlQry).then((cursor) => cursor.next()).then((updatedFile) => updatedFile).catch((error) => (0, import_analyticsUtils.logError)({
83
- action,
84
- category: eventCategory,
85
- label: import_error.ErrorTypes.DATABASE_ERROR
86
- }, error, context));
87
- };
88
- const uploadFile = (context, file, buffer) => {
89
- const { session: { userId: sessionId } } = context;
90
- const formattedFile = (0, import_fileAdapter.parseFile)(file);
91
- const {
92
- description,
93
- fileId,
94
- fileType,
95
- name,
96
- url
97
- } = formattedFile;
98
- const now = Date.now();
99
- const formatFileId = fileId || (0, import_utils.createHash)(`file-${sessionId}`);
100
- let updatedName = name;
101
- if (!updatedName && !!url) {
102
- updatedName = url.substring(url.lastIndexOf("/") + 1);
103
- }
104
- if (fileType === "image/jpeg" || fileType === "image/png") {
105
- return (0, import_images.resizeSaveImage)(context, formatFileId, buffer, fileType).then((resizedImage) => insertFile(context, {
106
- ...resizedImage,
107
- _key: formatFileId,
108
- added: now,
109
- modified: now,
110
- name: updatedName,
111
- userId: sessionId
112
- }));
113
- }
114
- return insertFile(context, {
115
- ...formattedFile,
116
- added: now,
117
- modified: now,
118
- userId: sessionId
119
- });
120
- };
121
- const addFile = (context, file) => {
122
- const action = "addFile";
123
- const { base64, url } = file;
124
- if (!!url) {
125
- return (0, import_rip_hunter.get)(url).then((body) => uploadFile(context, file, Buffer.from(body, "binary"))).catch((error) => (0, import_analyticsUtils.logError)({
126
- action,
127
- category: eventCategory,
128
- label: import_error.ErrorTypes.FILE_REQUEST
129
- }, error, context));
130
- } else if (!!base64) {
131
- const buffer = Buffer.from(base64);
132
- return uploadFile(context, file, buffer);
133
- }
134
- return (0, import_analyticsUtils.logException)({
135
- action,
136
- category: eventCategory,
137
- value: import_error.ErrorTypes.FILE_REQUIRED
138
- }, {});
139
- };
140
- const parseGiphyItem = (gifImage) => {
141
- const {
142
- id,
143
- images: {
144
- original: { url = "" } = {},
145
- fixed_height_small: { url: thumb = "" } = {}
146
- } = {}
147
- } = gifImage;
148
- if (!id || !url) {
149
- return null;
150
- }
151
- return {
152
- id,
153
- thumb,
154
- type: "giphy",
155
- url
156
- };
157
- };
158
- const getGiphyTrends = (limit = 30) => {
159
- const gifUrl = `${GIPHY_URL}/trending?api_key=${import_config.Config.get("giphy.key")}&limit=${limit}`;
160
- return (0, import_rip_hunter.get)(gifUrl).then((res) => res.json()).then((json) => json?.data?.map(parseGiphyItem).filter((item) => !!item));
161
- };
162
- const getGiphySearch = (query, limit = 30) => {
163
- const formatQuery = encodeURI(query);
164
- const gifUrl = `${GIPHY_URL}/search?q=${formatQuery}&api_key=${import_config.Config.get("giphy.key")}&limit=${limit}`;
165
- return (0, import_rip_hunter.get)(gifUrl).then((res) => res.json()).then((json) => json?.data?.map(parseGiphyItem).filter((item) => !!item));
166
- };
167
- const getYouTubeTrends = (limit = 30) => {
168
- const action = "getYouTubeTrends";
169
- const youtube = getYouTube();
170
- return new Promise((resolve, reject) => {
171
- youtube.videos.list({
172
- chart: "mostPopular",
173
- maxResults: limit,
174
- part: ["snippet"],
175
- regionCode: "US"
176
- }, (error, data) => {
177
- if (error) {
178
- console.error(error);
179
- reject(new Error(import_error.ErrorTypes.YOUTUBE_ERROR));
180
- } else if (data) {
181
- const list = data.items.map((item) => ({
182
- id: item.id,
183
- thumb: item.snippet.thumbnails.high.url,
184
- type: "youtube",
185
- url: `http://www.youtube.com/embed/${item.id}`
186
- }));
187
- resolve(list);
188
- }
189
- });
190
- });
191
- };
192
- const getYouTubeSearch = (query, limit = 30) => {
193
- const action = "getYouTubeSearch";
194
- const youtube = getYouTube();
195
- return new Promise((resolve, reject) => {
196
- youtube.search.list({
197
- maxResults: limit,
198
- part: ["snippet"],
199
- q: query,
200
- regionCode: "US"
201
- }, (error, data) => {
202
- if (error) {
203
- console.error(error);
204
- reject(new Error(import_error.ErrorTypes.YOUTUBE_ERROR));
205
- } else if (data) {
206
- const { items } = data;
207
- const list = items.map((item) => ({
208
- id: item.id,
209
- thumb: item.snippet.thumbnails.high.url,
210
- type: "youtube",
211
- url: `http://www.youtube.com/embed/${item.id}`
212
- }));
213
- resolve(list);
214
- }
215
- });
216
- });
217
- };
218
- const getPathUserFiles = (userId, filename) => `users/${userId}/files/${filename}`;
219
- const linkFiles = (context, postDocId, files) => Promise.all(
220
- files.map((file) => upsertFile(context, file).then((file2) => (0, import_posts.createPostEdge)(context, postDocId, file2.id, "isPosted", { type: file2.fileType })))
221
- );
222
- const updateFiles = (context, postDocId, files) => {
223
- const action = "updateFiles";
224
- const { database } = context;
225
- const edgeCollection = database.collection("isPosted");
226
- return edgeCollection.inEdges(postDocId, {}).then((edges) => {
227
- if (edges.length) {
228
- return Promise.all(
229
- edges.map((edge) => {
230
- const { _key: edgeKey } = edge;
231
- const aqlQry = import_arangojs.aql`REMOVE {_key:${edgeKey}} IN isPosted`;
232
- return database.query(aqlQry).catch((error) => {
233
- throw error;
234
- });
235
- })
236
- ).then(() => {
237
- if (files.length) {
238
- return linkFiles(context, postDocId, files).then(() => files);
239
- }
240
- return [];
241
- });
242
- } else if (files.length) {
243
- return linkFiles(context, postDocId, files).then(() => files);
244
- }
245
- return files;
246
- }).catch((error) => (0, import_analyticsUtils.logError)({
247
- action,
248
- category: eventCategory,
249
- label: import_error.ErrorTypes.DATABASE_ERROR
250
- }, error, context));
251
- };
252
- const encodeBase64 = (buffer) => Buffer.from(buffer).toString("base64");
253
- const decodeBase64 = (dataString) => {
254
- const action = "decodeBase64";
255
- const getData = (str) => str.match(/^data:([A-Za-z-+/]+);base64,(.+)$/) || [];
256
- let matches = getData(dataString);
257
- if (matches.length !== 3) {
258
- matches = getData(decodeURIComponent(dataString));
259
- if (matches.length !== 3) {
260
- throw Error(import_error.ErrorTypes.INVALID_INPUT);
261
- }
262
- }
263
- return {
264
- data: Buffer.from(matches[2], "base64"),
265
- type: matches[1]
266
- };
267
- };
268
- // Annotate the CommonJS export names for ESM import in node:
269
- 0 && (module.exports = {
270
- GIPHY_URL,
271
- addFile,
272
- decodeBase64,
273
- encodeBase64,
274
- getGiphySearch,
275
- getGiphyTrends,
276
- getPathUserFiles,
277
- getYouTube,
278
- getYouTubeSearch,
279
- getYouTubeTrends,
280
- insertFile,
281
- linkFiles,
282
- parseGiphyItem,
283
- updateFiles,
284
- uploadFile,
285
- upsertFile
286
- });
287
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvZmlsZXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2dldCBhcyBodHRwR2V0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5pbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvY3Vyc29yJztcbmltcG9ydCB7Z29vZ2xlfSBmcm9tICdnb29nbGVhcGlzJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgnO1xuaW1wb3J0IHtGaWxlVHlwZX0gZnJvbSAnLi4vdHlwZXMvZmlsZXMnO1xuaW1wb3J0IHtsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscyc7XG5pbXBvcnQge3Jlc2l6ZVNhdmVJbWFnZX0gZnJvbSAnLi9pbWFnZXMnO1xuaW1wb3J0IHtjcmVhdGVQb3N0RWRnZX0gZnJvbSAnLi9wb3N0cyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yJztcbmltcG9ydCB7SW1hZ2VUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3BhcnNlRmlsZX0gZnJvbSAnLi4vYWRhcHRlcnMvZmlsZUFkYXB0ZXInO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnZmlsZXMnO1xuXG5leHBvcnQgY29uc3QgR0lQSFlfVVJMOiBzdHJpbmcgPSAnaHR0cDovL2FwaS5naXBoeS5jb20vdjEvZ2lmcyc7XG5cbmV4cG9ydCBjb25zdCBnZXRZb3VUdWJlID0gKCkgPT4gZ29vZ2xlLnlvdXR1YmUoe2F1dGg6IENvbmZpZy5nZXQoJ2dvb2dsZS5rZXknKSwgdmVyc2lvbjogJ3YzJ30pO1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0RmlsZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmaWxlOiBGaWxlVHlwZSkgPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnaW5zZXJ0RmlsZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXR0ZWRGaWxlID0gcGFyc2VGaWxlKGZpbGUpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2Zvcm1hdHRlZEZpbGV9IElOIGZpbGVzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwc2VydEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cHNlcnRGaWxlJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdHRlZEZpbGUgPSBwYXJzZUZpbGUoZmlsZSk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZm9ybWF0dGVkRmlsZTtcbiAgY29uc3QgaW5zZXJ0OiBhbnkgPSB7XG4gICAgLi4uZm9ybWF0dGVkRmlsZSxcbiAgICBfa2V5OiBmaWxlSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgfTtcbiAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgLi4uZm9ybWF0dGVkRmlsZSxcbiAgICBfa2V5OiBmaWxlSWQsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgfTtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHtmaWxlSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gZmlsZXMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXBkYXRlZEZpbGU6IEZpbGVUeXBlKSA9PiB1cGRhdGVkRmlsZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBsb2FkRmlsZSA9IChjb250ZXh0LCBmaWxlOiBGaWxlVHlwZSwgYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0dGVkRmlsZSA9IHBhcnNlRmlsZShmaWxlKTtcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGZpbGVJZCxcbiAgICBmaWxlVHlwZSxcbiAgICBuYW1lLFxuICAgIHVybFxuICB9ID0gZm9ybWF0dGVkRmlsZTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBmaWxlSWQgfHwgY3JlYXRlSGFzaChgZmlsZS0ke3Nlc3Npb25JZH1gKTtcbiAgbGV0IHVwZGF0ZWROYW1lID0gbmFtZTtcblxuICBpZighdXBkYXRlZE5hbWUgJiYgISF1cmwpIHtcbiAgICB1cGRhdGVkTmFtZSA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgfVxuXG4gIGlmKGZpbGVUeXBlID09PSAnaW1hZ2UvanBlZycgfHwgZmlsZVR5cGUgPT09ICdpbWFnZS9wbmcnKSB7XG4gICAgcmV0dXJuIHJlc2l6ZVNhdmVJbWFnZShjb250ZXh0LCBmb3JtYXRGaWxlSWQsIGJ1ZmZlciwgZmlsZVR5cGUpXG4gICAgICAudGhlbigocmVzaXplZEltYWdlOiBGaWxlVHlwZSkgPT4gaW5zZXJ0RmlsZShjb250ZXh0LCB7XG4gICAgICAgIC4uLnJlc2l6ZWRJbWFnZSxcbiAgICAgICAgX2tleTogZm9ybWF0RmlsZUlkLFxuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBuYW1lOiB1cGRhdGVkTmFtZSxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBpbnNlcnRGaWxlKGNvbnRleHQsIHtcbiAgICAuLi5mb3JtYXR0ZWRGaWxlLFxuICAgIGFkZGVkOiBub3csXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRGaWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbGU6IEZpbGVUeXBlKTogUHJvbWlzZTxGaWxlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkRmlsZSc7XG4gIGNvbnN0IHtiYXNlNjQsIHVybH0gPSBmaWxlO1xuXG4gIGlmKCEhdXJsKSB7XG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKGJvZHkpID0+IHVwbG9hZEZpbGUoY29udGV4dCwgZmlsZSwgQnVmZmVyLmZyb20oYm9keSwgJ2JpbmFyeScpKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkZJTEVfUkVRVUVTVFxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKCEhYmFzZTY0KSB7XG4gICAgY29uc3QgYnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQpO1xuICAgIHJldHVybiB1cGxvYWRGaWxlKGNvbnRleHQsIGZpbGUsIGJ1ZmZlcik7XG4gIH1cblxuICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICBhY3Rpb24sXG4gICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgdmFsdWU6IEVycm9yVHlwZXMuRklMRV9SRVFVSVJFRFxuICB9LCB7fSk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VHaXBoeUl0ZW0gPSAoZ2lmSW1hZ2U6IGFueSk6IEltYWdlVHlwZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBpbWFnZXM6IHtcbiAgICAgIG9yaWdpbmFsOiB7dXJsID0gJyd9ID0ge30sXG4gICAgICBmaXhlZF9oZWlnaHRfc21hbGw6IHt1cmw6IHRodW1iID0gJyd9ID0ge31cbiAgICB9ID0ge31cbiAgfSA9IGdpZkltYWdlO1xuXG4gIGlmKCFpZCB8fCAhdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRodW1iLFxuICAgIHR5cGU6ICdnaXBoeScsXG4gICAgdXJsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2lwaHlUcmVuZHMgPSAobGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBnaWZVcmwgPSBgJHtHSVBIWV9VUkx9L3RyZW5kaW5nP2FwaV9rZXk9JHtDb25maWcuZ2V0KCdnaXBoeS5rZXknKX0mbGltaXQ9JHtsaW1pdH1gO1xuXG4gIHJldHVybiBodHRwR2V0KGdpZlVybClcbiAgICAudGhlbigocmVzOiBSZXNwb25zZSkgPT4gcmVzLmpzb24oKSlcbiAgICAudGhlbigoanNvbjogYW55KSA9PiBqc29uPy5kYXRhPy5tYXAocGFyc2VHaXBoeUl0ZW0pLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2lwaHlTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBmb3JtYXRRdWVyeSA9IGVuY29kZVVSSShxdWVyeSk7XG4gIGNvbnN0IGdpZlVybCA9IGAke0dJUEhZX1VSTH0vc2VhcmNoP3E9JHtmb3JtYXRRdWVyeX0mYXBpX2tleT0ke0NvbmZpZy5nZXQoJ2dpcGh5LmtleScpfSZsaW1pdD0ke2xpbWl0fWA7XG5cbiAgcmV0dXJuIGh0dHBHZXQoZ2lmVXJsKVxuICAgIC50aGVuKChyZXM6IFJlc3BvbnNlKSA9PiByZXMuanNvbigpKVxuICAgIC50aGVuKChqc29uOiBhbnkpID0+IGpzb24/LmRhdGE/Lm1hcChwYXJzZUdpcGh5SXRlbSkuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRZb3VUdWJlVHJlbmRzID0gKGxpbWl0OiBudW1iZXIgPSAzMCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFlvdVR1YmVUcmVuZHMnO1xuICBjb25zdCB5b3V0dWJlID0gZ2V0WW91VHViZSgpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgeW91dHViZS52aWRlb3MubGlzdCh7XG4gICAgICBjaGFydDogJ21vc3RQb3B1bGFyJyxcbiAgICAgIG1heFJlc3VsdHM6IGxpbWl0LFxuICAgICAgcGFydDogWydzbmlwcGV0J10sXG4gICAgICByZWdpb25Db2RlOiAnVVMnXG4gICAgfSwgKGVycm9yOiBFcnJvciwgZGF0YTogYW55KSA9PiB7XG4gICAgICBpZihlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihFcnJvclR5cGVzLllPVVRVQkVfRVJST1IpKTtcbiAgICAgIH0gZWxzZSBpZihkYXRhKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhLml0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgICB0aHVtYjogaXRlbS5zbmlwcGV0LnRodW1ibmFpbHMuaGlnaC51cmwsXG4gICAgICAgICAgdHlwZTogJ3lvdXR1YmUnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpdGVtLmlkfWBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJlc29sdmUobGlzdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFlvdVR1YmVTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0WW91VHViZVNlYXJjaCc7XG4gIGNvbnN0IHlvdXR1YmUgPSBnZXRZb3VUdWJlKCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB5b3V0dWJlLnNlYXJjaC5saXN0KHtcbiAgICAgIG1heFJlc3VsdHM6IGxpbWl0LFxuICAgICAgcGFydDogWydzbmlwcGV0J10sXG4gICAgICBxOiBxdWVyeSxcbiAgICAgIHJlZ2lvbkNvZGU6ICdVUydcbiAgICB9LCAoZXJyb3I6IEVycm9yLCBkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuWU9VVFVCRV9FUlJPUikpO1xuICAgICAgfSBlbHNlIGlmKGRhdGEpIHtcbiAgICAgICAgY29uc3Qge2l0ZW1zfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBpdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgdGh1bWI6IGl0ZW0uc25pcHBldC50aHVtYm5haWxzLmhpZ2gudXJsLFxuICAgICAgICAgIHR5cGU6ICd5b3V0dWJlJyxcbiAgICAgICAgICB1cmw6IGBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7aXRlbS5pZH1gXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXNvbHZlKGxpc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoVXNlckZpbGVzID0gKHVzZXJJZDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGB1c2Vycy8ke3VzZXJJZH0vZmlsZXMvJHtmaWxlbmFtZX1gO1xuXG5leHBvcnQgY29uc3QgbGlua0ZpbGVzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nLCBmaWxlczogRmlsZVR5cGVbXSk6IFByb21pc2U8YW55PiA9PlxuICBQcm9taXNlLmFsbChcbiAgICBmaWxlcy5tYXAoKGZpbGU6IEZpbGVUeXBlKSA9PiB1cHNlcnRGaWxlKGNvbnRleHQsIGZpbGUpXG4gICAgICAudGhlbigoZmlsZTogRmlsZVR5cGUpID0+IGNyZWF0ZVBvc3RFZGdlKGNvbnRleHQsIHBvc3REb2NJZCwgZmlsZS5pZCwgJ2lzUG9zdGVkJywge3R5cGU6IGZpbGUuZmlsZVR5cGV9KSkpXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWxlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0RG9jSWQ6IHN0cmluZywgZmlsZXM6IEZpbGVUeXBlW10pOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlRmlsZXMnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNQb3N0ZWQnKTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhwb3N0RG9jSWQsIHt9KVxuICAgIC50aGVuKChlZGdlczogYW55KSA9PiB7XG4gICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge19rZXk6IGVkZ2VLZXl9ID0gZWRnZTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGlzUG9zdGVkYDtcblxuICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYoZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsaW5rRmlsZXMoY29udGV4dCwgcG9zdERvY0lkLCBmaWxlcykudGhlbigoKSA9PiBmaWxlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZihmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGxpbmtGaWxlcyhjb250ZXh0LCBwb3N0RG9jSWQsIGZpbGVzKVxuICAgICAgICAgIC50aGVuKCgpID0+IGZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZUJhc2U2NCA9IChidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyA9PiBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuZXhwb3J0IGNvbnN0IGRlY29kZUJhc2U2NCA9IChkYXRhU3RyaW5nOiBzdHJpbmcpOiBhbnkgPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVjb2RlQmFzZTY0JztcbiAgY29uc3QgZ2V0RGF0YSA9IChzdHI6IHN0cmluZykgPT4gc3RyLm1hdGNoKC9eZGF0YTooW0EtWmEtei0rL10rKTtiYXNlNjQsKC4rKSQvKSB8fCBbXTtcbiAgbGV0IG1hdGNoZXMgPSBnZXREYXRhKGRhdGFTdHJpbmcpO1xuXG4gIGlmKG1hdGNoZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgbWF0Y2hlcyA9IGdldERhdGEoZGVjb2RlVVJJQ29tcG9uZW50KGRhdGFTdHJpbmcpKTtcblxuICAgIGlmKG1hdGNoZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfSU5QVVQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGF0YTogQnVmZmVyLmZyb20obWF0Y2hlc1syXSwgJ2Jhc2U2NCcpLFxuICAgIHR5cGU6IG1hdGNoZXNbMV1cbiAgfTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSx3QkFBNkI7QUFDN0IsbUJBQXlCO0FBQ3pCLHNCQUFrQjtBQUlsQix3QkFBcUI7QUFFckIsb0JBQXFCO0FBR3JCLDRCQUFxQztBQUNyQyxvQkFBOEI7QUFDOUIsbUJBQTZCO0FBQzdCLG1CQUF5QjtBQUV6Qix5QkFBd0I7QUFFeEIsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxZQUFvQjtBQUUxQixNQUFNLGFBQWEsTUFBTSx5QkFBTyxRQUFRLEVBQUMsTUFBTSxxQkFBTyxJQUFJLFlBQVksR0FBRyxTQUFTLEtBQUksQ0FBQztBQUV2RixNQUFNLGFBQWEsQ0FBQyxTQUFxQixTQUFtQjtBQUNqRSxRQUFNLFNBQVM7QUFDZixRQUFNLEVBQUMsU0FBUSxJQUFJO0FBQ25CLFFBQU0sb0JBQWdCLDhCQUFVLElBQUk7QUFDcEMsUUFBTSxTQUFtQiw2QkFBYSxhQUFhO0FBRW5ELFNBQU8sU0FBUyxNQUFNLE1BQU0sRUFDekIsS0FBSyxDQUFDLFdBQXdCLE9BQU8sS0FBSyxDQUFDLEVBQzNDLE1BQU0sQ0FBQyxjQUFpQixnQ0FBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHdCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLE9BQU8sQ0FBQztBQUN0QjtBQUVPLE1BQU0sYUFBYSxDQUFDLFNBQXFCLFNBQXNDO0FBQ3BGLFFBQU0sU0FBUztBQUNmLFFBQU0sRUFBQyxTQUFRLElBQUk7QUFDbkIsUUFBTSxvQkFBZ0IsOEJBQVUsSUFBSTtBQUNwQyxRQUFNLEVBQUMsT0FBTSxJQUFJO0FBQ2pCLFFBQU0sU0FBYztBQUFBLElBQ2xCLEdBQUc7QUFBQSxJQUNILE1BQU07QUFBQSxJQUNOLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDaEIsVUFBVSxLQUFLLElBQUk7QUFBQSxFQUNyQjtBQUNBLFFBQU0sU0FBYztBQUFBLElBQ2xCLEdBQUc7QUFBQSxJQUNILE1BQU07QUFBQSxJQUNOLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDckI7QUFFQSxRQUFNLFNBQW1CLG9DQUFvQixNQUFNO0FBQUEsYUFDeEMsTUFBTTtBQUFBLGFBQ04sTUFBTTtBQUFBO0FBR2pCLFNBQU8sU0FBUyxNQUFNLE1BQU0sRUFDekIsS0FBSyxDQUFDLFdBQXdCLE9BQU8sS0FBSyxDQUFDLEVBQzNDLEtBQUssQ0FBQyxnQkFBMEIsV0FBVyxFQUMzQyxNQUFNLENBQUMsY0FBaUIsZ0NBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsT0FBTyx3QkFBVztBQUFBLEVBQ3BCLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFDdEI7QUFFTyxNQUFNLGFBQWEsQ0FBQyxTQUFTLE1BQWdCLFdBQW1CO0FBQ3JFLFFBQU0sRUFBQyxTQUFTLEVBQUMsUUFBUSxVQUFTLEVBQUMsSUFBSTtBQUN2QyxRQUFNLG9CQUFnQiw4QkFBVSxJQUFJO0FBQ3BDLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sTUFBTSxLQUFLLElBQUk7QUFDckIsUUFBTSxlQUF1QixjQUFVLHlCQUFXLFFBQVEsU0FBUyxFQUFFO0FBQ3JFLE1BQUksY0FBYztBQUVsQixNQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSztBQUN4QixrQkFBYyxJQUFJLFVBQVUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDdEQ7QUFFQSxNQUFHLGFBQWEsZ0JBQWdCLGFBQWEsYUFBYTtBQUN4RCxlQUFPLCtCQUFnQixTQUFTLGNBQWMsUUFBUSxRQUFRLEVBQzNELEtBQUssQ0FBQyxpQkFBMkIsV0FBVyxTQUFTO0FBQUEsTUFDcEQsR0FBRztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsVUFBVTtBQUFBLE1BQ1YsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLElBQ1YsQ0FBQyxDQUFDO0FBQUEsRUFDTjtBQUVBLFNBQU8sV0FBVyxTQUFTO0FBQUEsSUFDekIsR0FBRztBQUFBLElBQ0gsT0FBTztBQUFBLElBQ1AsVUFBVTtBQUFBLElBQ1YsUUFBUTtBQUFBLEVBQ1YsQ0FBQztBQUNIO0FBRU8sTUFBTSxVQUFVLENBQUMsU0FBcUIsU0FBc0M7QUFDakYsUUFBTSxTQUFTO0FBQ2YsUUFBTSxFQUFDLFFBQVEsSUFBRyxJQUFJO0FBRXRCLE1BQUcsQ0FBQyxDQUFDLEtBQUs7QUFDUixlQUFPLGtCQUFBQSxLQUFRLEdBQUcsRUFDZixLQUFLLENBQUMsU0FBUyxXQUFXLFNBQVMsTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLENBQUMsQ0FBQyxFQUNyRSxNQUFNLENBQUMsY0FBaUIsZ0NBQVM7QUFBQSxNQUNoQztBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsT0FBTyx3QkFBVztBQUFBLElBQ3BCLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFBQSxFQUN0QixXQUFVLENBQUMsQ0FBQyxRQUFRO0FBQ2xCLFVBQU0sU0FBaUIsT0FBTyxLQUFLLE1BQU07QUFDekMsV0FBTyxXQUFXLFNBQVMsTUFBTSxNQUFNO0FBQUEsRUFDekM7QUFFQSxhQUFPLG9DQUFhO0FBQUEsSUFDbEI7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8sd0JBQVc7QUFBQSxFQUNwQixHQUFHLENBQUMsQ0FBQztBQUNQO0FBRU8sTUFBTSxpQkFBaUIsQ0FBQyxhQUE2QjtBQUMxRCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sVUFBVSxFQUFDLE1BQU0sR0FBRSxJQUFJLENBQUM7QUFBQSxNQUN4QixvQkFBb0IsRUFBQyxLQUFLLFFBQVEsR0FBRSxJQUFJLENBQUM7QUFBQSxJQUMzQyxJQUFJLENBQUM7QUFBQSxFQUNQLElBQUk7QUFFSixNQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7QUFDZCxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0EsTUFBTTtBQUFBLElBQ047QUFBQSxFQUNGO0FBQ0Y7QUFFTyxNQUFNLGlCQUFpQixDQUFDLFFBQWdCLE9BQTZCO0FBQzFFLFFBQU0sU0FBUyxHQUFHLFNBQVMscUJBQXFCLHFCQUFPLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSztBQUV0RixhQUFPLGtCQUFBQSxLQUFRLE1BQU0sRUFDbEIsS0FBSyxDQUFDLFFBQWtCLElBQUksS0FBSyxDQUFDLEVBQ2xDLEtBQUssQ0FBQyxTQUFjLE1BQU0sTUFBTSxJQUFJLGNBQWMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pGO0FBRU8sTUFBTSxpQkFBaUIsQ0FBQyxPQUFlLFFBQWdCLE9BQTZCO0FBQ3pGLFFBQU0sY0FBYyxVQUFVLEtBQUs7QUFDbkMsUUFBTSxTQUFTLEdBQUcsU0FBUyxhQUFhLFdBQVcsWUFBWSxxQkFBTyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEtBQUs7QUFFckcsYUFBTyxrQkFBQUEsS0FBUSxNQUFNLEVBQ2xCLEtBQUssQ0FBQyxRQUFrQixJQUFJLEtBQUssQ0FBQyxFQUNsQyxLQUFLLENBQUMsU0FBYyxNQUFNLE1BQU0sSUFBSSxjQUFjLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNqRjtBQUVPLE1BQU0sbUJBQW1CLENBQUMsUUFBZ0IsT0FBdUI7QUFDdEUsUUFBTSxTQUFTO0FBQ2YsUUFBTSxVQUFVLFdBQVc7QUFFM0IsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNsQixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsTUFDWixNQUFNLENBQUMsU0FBUztBQUFBLE1BQ2hCLFlBQVk7QUFBQSxJQUNkLEdBQUcsQ0FBQyxPQUFjLFNBQWM7QUFDOUIsVUFBRyxPQUFPO0FBQ1IsZ0JBQVEsTUFBTSxLQUFLO0FBQ25CLGVBQU8sSUFBSSxNQUFNLHdCQUFXLGFBQWEsQ0FBQztBQUFBLE1BQzVDLFdBQVUsTUFBTTtBQUNkLGNBQU0sT0FBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFVBQVU7QUFBQSxVQUNyQyxJQUFJLEtBQUs7QUFBQSxVQUNULE9BQU8sS0FBSyxRQUFRLFdBQVcsS0FBSztBQUFBLFVBQ3BDLE1BQU07QUFBQSxVQUNOLEtBQUssZ0NBQWdDLEtBQUssRUFBRTtBQUFBLFFBQzlDLEVBQUU7QUFFRixnQkFBUSxJQUFJO0FBQUEsTUFDZDtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBRU8sTUFBTSxtQkFBbUIsQ0FBQyxPQUFlLFFBQWdCLE9BQXVCO0FBQ3JGLFFBQU0sU0FBUztBQUNmLFFBQU0sVUFBVSxXQUFXO0FBRTNCLFNBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RDLFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDbEIsWUFBWTtBQUFBLE1BQ1osTUFBTSxDQUFDLFNBQVM7QUFBQSxNQUNoQixHQUFHO0FBQUEsTUFDSCxZQUFZO0FBQUEsSUFDZCxHQUFHLENBQUMsT0FBYyxTQUFjO0FBQzlCLFVBQUcsT0FBTztBQUNSLGdCQUFRLE1BQU0sS0FBSztBQUNuQixlQUFPLElBQUksTUFBTSx3QkFBVyxhQUFhLENBQUM7QUFBQSxNQUM1QyxXQUFVLE1BQU07QUFDZCxjQUFNLEVBQUMsTUFBSyxJQUFJO0FBQ2hCLGNBQU0sT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVO0FBQUEsVUFDaEMsSUFBSSxLQUFLO0FBQUEsVUFDVCxPQUFPLEtBQUssUUFBUSxXQUFXLEtBQUs7QUFBQSxVQUNwQyxNQUFNO0FBQUEsVUFDTixLQUFLLGdDQUFnQyxLQUFLLEVBQUU7QUFBQSxRQUM5QyxFQUFFO0FBRUYsZ0JBQVEsSUFBSTtBQUFBLE1BQ2Q7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQUVPLE1BQU0sbUJBQW1CLENBQUMsUUFBZ0IsYUFBNkIsU0FBUyxNQUFNLFVBQVUsUUFBUTtBQUV4RyxNQUFNLFlBQVksQ0FBQyxTQUFxQixXQUFtQixVQUNoRSxRQUFRO0FBQUEsRUFDTixNQUFNLElBQUksQ0FBQyxTQUFtQixXQUFXLFNBQVMsSUFBSSxFQUNuRCxLQUFLLENBQUNDLGNBQW1CLDZCQUFlLFNBQVMsV0FBV0EsTUFBSyxJQUFJLFlBQVksRUFBQyxNQUFNQSxNQUFLLFNBQVEsQ0FBQyxDQUFDLENBQUM7QUFDN0c7QUFFSyxNQUFNLGNBQWMsQ0FBQyxTQUFxQixXQUFtQixVQUFvQztBQUN0RyxRQUFNLFNBQVM7QUFDZixRQUFNLEVBQUMsU0FBUSxJQUFJO0FBQ25CLFFBQU0saUJBQWlDLFNBQVMsV0FBVyxVQUFVO0FBRXJFLFNBQU8sZUFBZSxRQUFRLFdBQVcsQ0FBQyxDQUFDLEVBQ3hDLEtBQUssQ0FBQyxVQUFlO0FBQ3BCLFFBQUcsTUFBTSxRQUFRO0FBQ2YsYUFBTyxRQUFRO0FBQUEsUUFDYixNQUFNLElBQUksQ0FBQyxTQUFTO0FBQ2xCLGdCQUFNLEVBQUMsTUFBTSxRQUFPLElBQUk7QUFDeEIsZ0JBQU0sU0FBbUIsbUNBQW1CLE9BQU87QUFFbkQsaUJBQU8sU0FBUyxNQUFNLE1BQU0sRUFDekIsTUFBTSxDQUFDLFVBQWlCO0FBQ3ZCLGtCQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDTCxDQUFDO0FBQUEsTUFBQyxFQUNELEtBQUssTUFBTTtBQUNWLFlBQUcsTUFBTSxRQUFRO0FBQ2YsaUJBQU8sVUFBVSxTQUFTLFdBQVcsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLO0FBQUEsUUFDOUQ7QUFFQSxlQUFPLENBQUM7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNMLFdBQVUsTUFBTSxRQUFRO0FBQ3RCLGFBQU8sVUFBVSxTQUFTLFdBQVcsS0FBSyxFQUN2QyxLQUFLLE1BQU0sS0FBSztBQUFBLElBQ3JCO0FBRUEsV0FBTztBQUFBLEVBQ1QsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxjQUFpQixnQ0FBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHdCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLE9BQU8sQ0FBQztBQUN0QjtBQUVPLE1BQU0sZUFBZSxDQUFDLFdBQTJCLE9BQU8sS0FBSyxNQUFNLEVBQUUsU0FBUyxRQUFRO0FBRXRGLE1BQU0sZUFBZSxDQUFDLGVBQTRCO0FBQ3ZELFFBQU0sU0FBUztBQUNmLFFBQU0sVUFBVSxDQUFDLFFBQWdCLElBQUksTUFBTSxtQ0FBbUMsS0FBSyxDQUFDO0FBQ3BGLE1BQUksVUFBVSxRQUFRLFVBQVU7QUFFaEMsTUFBRyxRQUFRLFdBQVcsR0FBRztBQUN2QixjQUFVLFFBQVEsbUJBQW1CLFVBQVUsQ0FBQztBQUVoRCxRQUFHLFFBQVEsV0FBVyxHQUFHO0FBQ3ZCLFlBQU0sTUFBTSx3QkFBVyxhQUFhO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsTUFBTSxPQUFPLEtBQUssUUFBUSxDQUFDLEdBQUcsUUFBUTtBQUFBLElBQ3RDLE1BQU0sUUFBUSxDQUFDO0FBQUEsRUFDakI7QUFDRjsiLAogICJuYW1lcyI6IFsiaHR0cEdldCIsICJmaWxlIl0KfQo=
1
+ import{get as f}from"@nlabs/rip-hunter";import{createHash as w}from"@nlabs/utils";import{aql as h}from"arangojs";import{google as $}from"googleapis";import{Config as E}from"../config";import{resizeSaveImage as x}from"./images";import{createPostEdge as B}from"./posts";import{parseFile as T}from"../adapters/fileAdapter";import{ErrorTypes as u}from"../types/error.types";import{logError as y}from"../utils/analyticsUtils";import{useDb as c}from"../utils/arangodbUtils";const d="files",P="http://api.giphy.com/v1/gifs",A=()=>$.youtube({auth:E.get("google.key"),version:"v3"}),R=(e,o)=>{const t="insertFile",{databaseName:r}=e,n=T(o),i=h`INSERT ${n} IN files RETURN NEW`;return c(r).query(i).then(s=>s.next()).catch(s=>y({action:t,category:d,label:u.DATABASE_ERROR},s,e))},C=(e,o)=>{const t="upsertFile",{databaseName:r}=e,n=T(o),{fileId:i}=n,s={...n,_key:i,added:Date.now(),modified:Date.now()},l={...n,_key:i,modified:Date.now()},p=h`UPSERT {_key: ${i}}
2
+ INSERT ${s}
3
+ UPDATE ${l}
4
+ IN files RETURN NEW`;return c(r).query(p).then(a=>a.next()).then(a=>a).catch(a=>y({action:t,category:d,label:u.DATABASE_ERROR},a,e))},F=(e,o,t)=>{const{session:{userId:r}}=e,n=T(o),{description:i,fileId:s,fileType:l,name:p,url:a}=n,m=Date.now(),b=s||w(`file-${r}`);let g=p;return!g&&a&&(g=a.substring(a.lastIndexOf("/")+1)),l==="image/jpeg"||l==="image/png"?x(e,b,t,l).then(_=>R(e,{..._,_key:b,added:m,modified:m,name:g,userId:r})):R(e,{...n,added:m,modified:m,userId:r})},L=(e,o)=>{const t="addFile",{base64:r,url:n}=o;if(n)return f(n).then(i=>F(e,o,Buffer.from(i,"binary"))).catch(i=>y({action:t,category:d,label:u.FILE_REQUEST},i,e));if(r){const i=Buffer.from(r);return F(e,o,i)}return Promise.reject(new Error(u.FILE_REQUIRED))},U=e=>{const{id:o,images:{original:{url:t=""}={},fixed_height_small:{url:r=""}={}}={}}=e;return!o||!t?null:{id:o,thumb:r,type:"giphy",url:t}},z=(e=30)=>{const o=`${P}/trending?api_key=${E.get("giphy.key")}&limit=${e}`;return f(o).then(t=>t.json()).then(t=>t?.data?.map(U).filter(r=>!!r))},H=(e,o=30)=>{const t=encodeURI(e),r=`${P}/search?q=${t}&api_key=${E.get("giphy.key")}&limit=${o}`;return f(r).then(n=>n.json()).then(n=>n?.data?.map(U).filter(i=>!!i))},V=(e=30)=>{const o="getYouTubeTrends",t=A();return new Promise((r,n)=>{t.videos.list({chart:"mostPopular",maxResults:e,part:["snippet"],regionCode:"US"},(i,s)=>{if(i)n(new Error(u.YOUTUBE_ERROR));else if(s){const l=s.items.map(p=>({id:p.id,thumb:p.snippet.thumbnails.high.url,type:"youtube",url:`http://www.youtube.com/embed/${p.id}`}));r(l)}})})},W=(e,o=30)=>{const t="getYouTubeSearch",r=A();return new Promise((n,i)=>{r.search.list({maxResults:o,part:["snippet"],q:e,regionCode:"US"},(s,l)=>{if(s)i(new Error(u.YOUTUBE_ERROR));else if(l){const{items:p}=l,a=p.map(m=>({id:m.id,thumb:m.snippet.thumbnails.high.url,type:"youtube",url:`http://www.youtube.com/embed/${m.id}`}));n(a)}})})},K=(e,o)=>`users/${e}/files/${o}`,I=(e,o,t)=>Promise.all(t.map(r=>C(e,r).then(n=>B(e,o,n.id,"isPosted",{type:n.fileType})))),M=(e,o,t)=>{const r="updateFiles",{databaseName:n}=e;return c(n).collection("isPosted").inEdges(o,{}).then(s=>s.length?Promise.all(s.map(l=>{const{_key:p}=l,a=h`REMOVE {_key:${p}} IN isPosted`;return c(n).query(a).catch(m=>{throw m})})).then(()=>t.length?I(e,o,t).then(()=>t):[]):t.length?I(e,o,t).then(()=>t):t).catch(s=>y({action:r,category:d,label:u.DATABASE_ERROR},s,e))},Z=e=>Buffer.from(e).toString("base64"),J=e=>{const o="decodeBase64",t=n=>n.match(/^data:([A-Za-z-+/]+);base64,(.+)$/)||[];let r=t(e);if(r.length!==3&&(r=t(decodeURIComponent(e)),r.length!==3))throw Error(u.INVALID_INPUT);return{data:Buffer.from(r[2],"base64"),type:r[1]}};export{P as GIPHY_URL,L as addFile,J as decodeBase64,Z as encodeBase64,H as getGiphySearch,z as getGiphyTrends,K as getPathUserFiles,A as getYouTube,W as getYouTubeSearch,V as getYouTubeTrends,R as insertFile,I as linkFiles,U as parseGiphyItem,M as updateFiles,F as uploadFile,C as upsertFile};
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvZmlsZXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2dldCBhcyBodHRwR2V0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5pbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7Z29vZ2xlfSBmcm9tICdnb29nbGVhcGlzJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge3Jlc2l6ZVNhdmVJbWFnZX0gZnJvbSAnLi9pbWFnZXMnO1xuaW1wb3J0IHtjcmVhdGVQb3N0RWRnZX0gZnJvbSAnLi9wb3N0cyc7XG5pbXBvcnQge3BhcnNlRmlsZX0gZnJvbSAnLi4vYWRhcHRlcnMvZmlsZUFkYXB0ZXInO1xuaW1wb3J0IHtJbWFnZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7RmlsZVR5cGV9IGZyb20gJy4uL3R5cGVzL2ZpbGVzLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2ZpbGVzJztcblxuZXhwb3J0IGNvbnN0IEdJUEhZX1VSTDogc3RyaW5nID0gJ2h0dHA6Ly9hcGkuZ2lwaHkuY29tL3YxL2dpZnMnO1xuXG5leHBvcnQgY29uc3QgZ2V0WW91VHViZSA9ICgpID0+IGdvb2dsZS55b3V0dWJlKHthdXRoOiBDb25maWcuZ2V0KCdnb29nbGUua2V5JyksIHZlcnNpb246ICd2Myd9KTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2luc2VydEZpbGUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdHRlZEZpbGUgPSBwYXJzZUZpbGUoZmlsZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7Zm9ybWF0dGVkRmlsZX0gSU4gZmlsZXMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwc2VydEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cHNlcnRGaWxlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXR0ZWRGaWxlID0gcGFyc2VGaWxlKGZpbGUpO1xuICBjb25zdCB7ZmlsZUlkfSA9IGZvcm1hdHRlZEZpbGU7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLmZvcm1hdHRlZEZpbGUsXG4gICAgX2tleTogZmlsZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG4gIGNvbnN0IHVwZGF0ZTogYW55ID0ge1xuICAgIC4uLmZvcm1hdHRlZEZpbGUsXG4gICAgX2tleTogZmlsZUlkLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7ZmlsZUlkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfVxuICAgIElOIGZpbGVzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkRmlsZTogRmlsZVR5cGUpID0+IHVwZGF0ZWRGaWxlKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGxvYWRGaWxlID0gKGNvbnRleHQsIGZpbGU6IEZpbGVUeXBlLCBidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXR0ZWRGaWxlID0gcGFyc2VGaWxlKGZpbGUpO1xuICBjb25zdCB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgZmlsZUlkLFxuICAgIGZpbGVUeXBlLFxuICAgIG5hbWUsXG4gICAgdXJsXG4gIH0gPSBmb3JtYXR0ZWRGaWxlO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRGaWxlSWQ6IHN0cmluZyA9IGZpbGVJZCB8fCBjcmVhdGVIYXNoKGBmaWxlLSR7c2Vzc2lvbklkfWApO1xuICBsZXQgdXBkYXRlZE5hbWUgPSBuYW1lO1xuXG4gIGlmKCF1cGRhdGVkTmFtZSAmJiAhIXVybCkge1xuICAgIHVwZGF0ZWROYW1lID0gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICB9XG5cbiAgaWYoZmlsZVR5cGUgPT09ICdpbWFnZS9qcGVnJyB8fCBmaWxlVHlwZSA9PT0gJ2ltYWdlL3BuZycpIHtcbiAgICByZXR1cm4gcmVzaXplU2F2ZUltYWdlKGNvbnRleHQsIGZvcm1hdEZpbGVJZCwgYnVmZmVyLCBmaWxlVHlwZSlcbiAgICAgIC50aGVuKChyZXNpemVkSW1hZ2U6IEZpbGVUeXBlKSA9PiBpbnNlcnRGaWxlKGNvbnRleHQsIHtcbiAgICAgICAgLi4ucmVzaXplZEltYWdlLFxuICAgICAgICBfa2V5OiBmb3JtYXRGaWxlSWQsXG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIG5hbWU6IHVwZGF0ZWROYW1lLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIGluc2VydEZpbGUoY29udGV4dCwge1xuICAgIC4uLmZvcm1hdHRlZEZpbGUsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRGaWxlJztcbiAgY29uc3Qge2Jhc2U2NCwgdXJsfSA9IGZpbGU7XG5cbiAgaWYoISF1cmwpIHtcbiAgICByZXR1cm4gaHR0cEdldCh1cmwpXG4gICAgICAudGhlbigoYm9keSkgPT4gdXBsb2FkRmlsZShjb250ZXh0LCBmaWxlLCBCdWZmZXIuZnJvbShib2R5LCAnYmluYXJ5JykpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuRklMRV9SRVFVRVNUXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9IGVsc2UgaWYoISFiYXNlNjQpIHtcbiAgICBjb25zdCBidWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCk7XG4gICAgcmV0dXJuIHVwbG9hZEZpbGUoY29udGV4dCwgZmlsZSwgYnVmZmVyKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoRXJyb3JUeXBlcy5GSUxFX1JFUVVJUkVEKSk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VHaXBoeUl0ZW0gPSAoZ2lmSW1hZ2U6IGFueSk6IEltYWdlVHlwZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBpbWFnZXM6IHtcbiAgICAgIG9yaWdpbmFsOiB7dXJsID0gJyd9ID0ge30sXG4gICAgICBmaXhlZF9oZWlnaHRfc21hbGw6IHt1cmw6IHRodW1iID0gJyd9ID0ge31cbiAgICB9ID0ge31cbiAgfSA9IGdpZkltYWdlO1xuXG4gIGlmKCFpZCB8fCAhdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRodW1iLFxuICAgIHR5cGU6ICdnaXBoeScsXG4gICAgdXJsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2lwaHlUcmVuZHMgPSAobGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBnaWZVcmwgPSBgJHtHSVBIWV9VUkx9L3RyZW5kaW5nP2FwaV9rZXk9JHtDb25maWcuZ2V0KCdnaXBoeS5rZXknKX0mbGltaXQ9JHtsaW1pdH1gO1xuXG4gIHJldHVybiBodHRwR2V0KGdpZlVybClcbiAgICAudGhlbigocmVzOiBSZXNwb25zZSkgPT4gcmVzLmpzb24oKSlcbiAgICAudGhlbigoanNvbjogYW55KSA9PiBqc29uPy5kYXRhPy5tYXAocGFyc2VHaXBoeUl0ZW0pLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2lwaHlTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBmb3JtYXRRdWVyeSA9IGVuY29kZVVSSShxdWVyeSk7XG4gIGNvbnN0IGdpZlVybCA9IGAke0dJUEhZX1VSTH0vc2VhcmNoP3E9JHtmb3JtYXRRdWVyeX0mYXBpX2tleT0ke0NvbmZpZy5nZXQoJ2dpcGh5LmtleScpfSZsaW1pdD0ke2xpbWl0fWA7XG5cbiAgcmV0dXJuIGh0dHBHZXQoZ2lmVXJsKVxuICAgIC50aGVuKChyZXM6IFJlc3BvbnNlKSA9PiByZXMuanNvbigpKVxuICAgIC50aGVuKChqc29uOiBhbnkpID0+IGpzb24/LmRhdGE/Lm1hcChwYXJzZUdpcGh5SXRlbSkuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRZb3VUdWJlVHJlbmRzID0gKGxpbWl0OiBudW1iZXIgPSAzMCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFlvdVR1YmVUcmVuZHMnO1xuICBjb25zdCB5b3V0dWJlID0gZ2V0WW91VHViZSgpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgeW91dHViZS52aWRlb3MubGlzdCh7XG4gICAgICBjaGFydDogJ21vc3RQb3B1bGFyJyxcbiAgICAgIG1heFJlc3VsdHM6IGxpbWl0LFxuICAgICAgcGFydDogWydzbmlwcGV0J10sXG4gICAgICByZWdpb25Db2RlOiAnVVMnXG4gICAgfSwgKGVycm9yOiBFcnJvciwgZGF0YTogYW55KSA9PiB7XG4gICAgICBpZihlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihFcnJvclR5cGVzLllPVVRVQkVfRVJST1IpKTtcbiAgICAgIH0gZWxzZSBpZihkYXRhKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhLml0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgICB0aHVtYjogaXRlbS5zbmlwcGV0LnRodW1ibmFpbHMuaGlnaC51cmwsXG4gICAgICAgICAgdHlwZTogJ3lvdXR1YmUnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpdGVtLmlkfWBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJlc29sdmUobGlzdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFlvdVR1YmVTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0WW91VHViZVNlYXJjaCc7XG4gIGNvbnN0IHlvdXR1YmUgPSBnZXRZb3VUdWJlKCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB5b3V0dWJlLnNlYXJjaC5saXN0KHtcbiAgICAgIG1heFJlc3VsdHM6IGxpbWl0LFxuICAgICAgcGFydDogWydzbmlwcGV0J10sXG4gICAgICBxOiBxdWVyeSxcbiAgICAgIHJlZ2lvbkNvZGU6ICdVUydcbiAgICB9LCAoZXJyb3I6IEVycm9yLCBkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuWU9VVFVCRV9FUlJPUikpO1xuICAgICAgfSBlbHNlIGlmKGRhdGEpIHtcbiAgICAgICAgY29uc3Qge2l0ZW1zfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBpdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgdGh1bWI6IGl0ZW0uc25pcHBldC50aHVtYm5haWxzLmhpZ2gudXJsLFxuICAgICAgICAgIHR5cGU6ICd5b3V0dWJlJyxcbiAgICAgICAgICB1cmw6IGBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7aXRlbS5pZH1gXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXNvbHZlKGxpc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoVXNlckZpbGVzID0gKHVzZXJJZDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGB1c2Vycy8ke3VzZXJJZH0vZmlsZXMvJHtmaWxlbmFtZX1gO1xuXG5leHBvcnQgY29uc3QgbGlua0ZpbGVzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nLCBmaWxlczogRmlsZVR5cGVbXSk6IFByb21pc2U8YW55PiA9PlxuICBQcm9taXNlLmFsbChcbiAgICBmaWxlcy5tYXAoKGZpbGU6IEZpbGVUeXBlKSA9PiB1cHNlcnRGaWxlKGNvbnRleHQsIGZpbGUpXG4gICAgICAudGhlbigoZmlsZTogRmlsZVR5cGUpID0+IGNyZWF0ZVBvc3RFZGdlKGNvbnRleHQsIHBvc3REb2NJZCwgZmlsZS5pZCwgJ2lzUG9zdGVkJywge3R5cGU6IGZpbGUuZmlsZVR5cGV9KSkpXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWxlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0RG9jSWQ6IHN0cmluZywgZmlsZXM6IEZpbGVUeXBlW10pOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlRmlsZXMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaXNQb3N0ZWQnKTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhwb3N0RG9jSWQsIHt9KVxuICAgIC50aGVuKChlZGdlczogYW55KSA9PiB7XG4gICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge19rZXk6IGVkZ2VLZXl9ID0gZWRnZTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGlzUG9zdGVkYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZihmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtGaWxlcyhjb250ZXh0LCBwb3N0RG9jSWQsIGZpbGVzKS50aGVuKCgpID0+IGZpbGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGlua0ZpbGVzKGNvbnRleHQsIHBvc3REb2NJZCwgZmlsZXMpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jb2RlQmFzZTY0ID0gKGJ1ZmZlcjogQnVmZmVyKTogc3RyaW5nID0+IEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG5leHBvcnQgY29uc3QgZGVjb2RlQmFzZTY0ID0gKGRhdGFTdHJpbmc6IHN0cmluZyk6IGFueSA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWNvZGVCYXNlNjQnO1xuICBjb25zdCBnZXREYXRhID0gKHN0cjogc3RyaW5nKSA9PiBzdHIubWF0Y2goL15kYXRhOihbQS1aYS16LSsvXSspO2Jhc2U2NCwoLispJC8pIHx8IFtdO1xuICBsZXQgbWF0Y2hlcyA9IGdldERhdGEoZGF0YVN0cmluZyk7XG5cbiAgaWYobWF0Y2hlcy5sZW5ndGggIT09IDMpIHtcbiAgICBtYXRjaGVzID0gZ2V0RGF0YShkZWNvZGVVUklDb21wb25lbnQoZGF0YVN0cmluZykpO1xuXG4gICAgaWYobWF0Y2hlcy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9JTlBVVCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBCdWZmZXIuZnJvbShtYXRj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QU8sZ0JBRW5ELE9BQU85RCxFQUFNUSxDQUFZLEVBQUUsTUFBTUUsQ0FBTSxFQUNwQyxNQUFPRSxHQUFpQixDQUN2QixNQUFNQSxDQUNSLENBQUMsQ0FDTCxDQUFDLENBQUMsRUFDRCxLQUFLLElBQ0Q4QyxFQUFNLE9BQ0FGLEVBQVVuRCxFQUFTb0QsRUFBV0MsQ0FBSyxFQUFFLEtBQUssSUFBTUEsQ0FBSyxFQUd2RCxDQUFDLENBQ1QsRUFDS0EsRUFBTSxPQUNQRixFQUFVbkQsRUFBU29ELEVBQVdDLENBQUssRUFDdkMsS0FBSyxJQUFNQSxDQUFLLEVBR2RBLENBQ1IsRUFDQSxNQUFPOUMsR0FBaUJiLEVBQVMsQ0FDaEMsT0FBQVEsRUFDQSxTQUFVTixFQUNWLE1BQU9ILEVBQVcsY0FDcEIsRUFBR2MsRUFBT1AsQ0FBTyxDQUFDLENBQ3RCLEVBRWEwRCxFQUFnQjVDLEdBQTJCLE9BQU8sS0FBS0EsQ0FBTSxFQUFFLFNBQVMsUUFBUSxFQUVoRjZDLEVBQWdCQyxHQUE0QixDQUN2RCxNQUFNMUQsRUFBUyxlQUNUMkQsRUFBV0MsR0FBZ0JBLEVBQUksTUFBTSxtQ0FBbUMsR0FBSyxDQUFDLEVBQ3BGLElBQUlDLEVBQVVGLEVBQVFELENBQVUsRUFFaEMsR0FBR0csRUFBUSxTQUFXLElBQ3BCQSxFQUFVRixFQUFRLG1CQUFtQkQsQ0FBVSxDQUFDLEVBRTdDRyxFQUFRLFNBQVcsR0FDcEIsTUFBTSxNQUFNdEUsRUFBVyxhQUFhLEVBSXhDLE1BQU8sQ0FDTCxLQUFNLE9BQU8sS0FBS3NFLEVBQVEsQ0FBQyxFQUFHLFFBQVEsRUFDdEMsS0FBTUEsRUFBUSxDQUFDLENBQ2pCLENBQ0YiLAogICJuYW1lcyI6IFsiaHR0cEdldCIsICJjcmVhdGVIYXNoIiwgImFxbCIsICJnb29nbGUiLCAiQ29uZmlnIiwgInJlc2l6ZVNhdmVJbWFnZSIsICJjcmVhdGVQb3N0RWRnZSIsICJwYXJzZUZpbGUiLCAiRXJyb3JUeXBlcyIsICJsb2dFcnJvciIsICJ1c2VEYiIsICJldmVudENhdGVnb3J5IiwgIkdJUEhZX1VSTCIsICJnZXRZb3VUdWJlIiwgImluc2VydEZpbGUiLCAiY29udGV4dCIsICJmaWxlIiwgImFjdGlvbiIsICJkYXRhYmFzZU5hbWUiLCAiZm9ybWF0dGVkRmlsZSIsICJhcWxRcnkiLCAiY3Vyc29yIiwgImVycm9yIiwgInVwc2VydEZpbGUiLCAiZmlsZUlkIiwgImluc2VydCIsICJ1cGRhdGUiLCAidXBkYXRlZEZpbGUiLCAidXBsb2FkRmlsZSIsICJidWZmZXIiLCAic2Vzc2lvbklkIiwgImRlc2NyaXB0aW9uIiwgImZpbGVUeXBlIiwgIm5hbWUiLCAidXJsIiwgIm5vdyIsICJmb3JtYXRGaWxlSWQiLCAidXBkYXRlZE5hbWUiLCAicmVzaXplZEltYWdlIiwgImFkZEZpbGUiLCAiYmFzZTY0IiwgImJvZHkiLCAicGFyc2VHaXBoeUl0ZW0iLCAiZ2lmSW1hZ2UiLCAiaWQiLCAidGh1bWIiLCAiZ2V0R2lwaHlUcmVuZHMiLCAibGltaXQiLCAiZ2lmVXJsIiwgInJlcyIsICJqc29uIiwgIml0ZW0iLCAiZ2V0R2lwaHlTZWFyY2giLCAicXVlcnkiLCAiZm9ybWF0UXVlcnkiLCAiZ2V0WW91VHViZVRyZW5kcyIsICJ5b3V0dWJlIiwgInJlc29sdmUiLCAicmVqZWN0IiwgImRhdGEiLCAibGlzdCIsICJnZXRZb3VUdWJlU2VhcmNoIiwgIml0ZW1zIiwgImdldFBhdGhVc2VyRmlsZXMiLCAidXNlcklkIiwgImZpbGVuYW1lIiwgImxpbmtGaWxlcyIsICJwb3N0RG9jSWQiLCAiZmlsZXMiLCAidXBkYXRlRmlsZXMiLCAiZWRnZXMiLCAiZWRnZSIsICJlZGdlS2V5IiwgImVuY29kZUJhc2U2NCIsICJkZWNvZGVCYXNlNjQiLCAiZGF0YVN0cmluZyIsICJnZXREYXRhIiwgInN0ciIsICJtYXRjaGVzIl0KfQo=