@nlabs/reaktor 1.17.0 → 1.19.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 (320) hide show
  1. package/README.md +182 -0
  2. package/docs/ASSISTANT.md +138 -0
  3. package/docs/GENERATION.md +42 -5
  4. package/docs/NATIVE_PUSH.md +56 -0
  5. package/lib/actions/alfredFaq.d.ts +80 -0
  6. package/lib/actions/alfredFaq.js +206 -0
  7. package/lib/actions/analytics.js +1 -1
  8. package/lib/actions/apps.js +1 -1
  9. package/lib/actions/connections.js +1 -1
  10. package/lib/actions/content.js +1 -1
  11. package/lib/actions/contentGeneration.d.ts +4 -0
  12. package/lib/actions/contentGeneration.js +82 -10
  13. package/lib/actions/contentGenerationErrors.js +1 -1
  14. package/lib/actions/conversations.d.ts +1 -1
  15. package/lib/actions/conversations.js +19 -9
  16. package/lib/actions/crm.js +1 -1
  17. package/lib/actions/crud.js +26 -1
  18. package/lib/actions/databaseAccounts.js +1 -1
  19. package/lib/actions/databaseProvisioningLease.js +1 -1
  20. package/lib/actions/dynamodb.js +1 -1
  21. package/lib/actions/email.js +1 -1
  22. package/lib/actions/files.js +1 -1
  23. package/lib/actions/flags.js +1 -1
  24. package/lib/actions/geminiVideo.js +1 -1
  25. package/lib/actions/groups.js +1 -1
  26. package/lib/actions/higgsfield.js +1 -1
  27. package/lib/actions/imageGeneration.js +1 -1
  28. package/lib/actions/images.js +1 -1
  29. package/lib/actions/index.d.ts +1 -0
  30. package/lib/actions/index.js +2 -1
  31. package/lib/actions/ios.js +1 -1
  32. package/lib/actions/locations.js +1 -1
  33. package/lib/actions/messages.js +23 -7
  34. package/lib/actions/notifications.js +1 -1
  35. package/lib/actions/ollamaGeneration.js +1 -1
  36. package/lib/actions/openaiResponseSession.js +1 -1
  37. package/lib/actions/payments.js +1 -1
  38. package/lib/actions/personas.js +1 -1
  39. package/lib/actions/phoneSupport.js +1 -1
  40. package/lib/actions/posts.js +1 -1
  41. package/lib/actions/query.js +1 -1
  42. package/lib/actions/reactions.js +1 -1
  43. package/lib/actions/rum.js +1 -1
  44. package/lib/actions/s3.js +1 -1
  45. package/lib/actions/search.js +1 -1
  46. package/lib/actions/sms.js +1 -1
  47. package/lib/actions/statistics.js +1 -1
  48. package/lib/actions/subscriptions.js +1 -1
  49. package/lib/actions/tags.js +1 -1
  50. package/lib/actions/users.js +57 -4
  51. package/lib/actions/videoGeneration.js +1 -1
  52. package/lib/actions/videos.js +1 -1
  53. package/lib/adapters/arangoAdapter.js +1 -1
  54. package/lib/adapters/contentAdapter.js +1 -1
  55. package/lib/adapters/fileAdapter.js +1 -1
  56. package/lib/adapters/geminiGenerationAdapter.js +1 -1
  57. package/lib/adapters/higgsfieldAdapter.js +1 -1
  58. package/lib/adapters/higgsfieldModelCatalog.js +1 -1
  59. package/lib/adapters/higgsfieldModels.js +1 -1
  60. package/lib/adapters/imageAdapter.js +1 -1
  61. package/lib/adapters/imageGenerationAdapter.js +1 -1
  62. package/lib/adapters/index.js +1 -1
  63. package/lib/adapters/messageAdapter.js +1 -1
  64. package/lib/adapters/postAdapter.js +1 -1
  65. package/lib/adapters/reaktorAdapter.js +1 -1
  66. package/lib/adapters/tagAdapter.js +1 -1
  67. package/lib/adapters/userAdapter.js +1 -1
  68. package/lib/assistant/core.d.ts +53 -0
  69. package/lib/assistant/core.js +123 -0
  70. package/lib/assistant/faq.d.ts +26 -0
  71. package/lib/assistant/faq.js +238 -0
  72. package/lib/assistant/faqCore.d.ts +23 -0
  73. package/lib/assistant/faqCore.js +20 -0
  74. package/lib/assistant/index.d.ts +7 -0
  75. package/lib/assistant/index.js +5 -0
  76. package/lib/assistant/service.d.ts +35 -0
  77. package/lib/assistant/service.js +201 -0
  78. package/lib/config.js +1 -1
  79. package/lib/constants/collections.js +1 -1
  80. package/lib/durableChat/conversations.d.ts +62 -0
  81. package/lib/durableChat/conversations.js +729 -0
  82. package/lib/durableChat/errors.d.ts +6 -0
  83. package/lib/durableChat/errors.js +11 -0
  84. package/lib/durableChat/events.d.ts +22 -0
  85. package/lib/durableChat/events.js +50 -0
  86. package/lib/durableChat/index.d.ts +8 -0
  87. package/lib/durableChat/index.js +10 -0
  88. package/lib/durableChat/membership.d.ts +24 -0
  89. package/lib/durableChat/membership.js +85 -0
  90. package/lib/durableChat/messageTypes.d.ts +76 -0
  91. package/lib/durableChat/messageTypes.js +3 -0
  92. package/lib/durableChat/messages.d.ts +16 -0
  93. package/lib/durableChat/messages.js +257 -0
  94. package/lib/durableChat/transaction.d.ts +10 -0
  95. package/lib/durableChat/transaction.js +53 -0
  96. package/lib/durableChat/types.d.ts +81 -0
  97. package/lib/durableChat/types.js +3 -0
  98. package/lib/handlers/graphqlHandler.js +1 -1
  99. package/lib/index.d.ts +4 -4
  100. package/lib/index.js +5 -3
  101. package/lib/lambdas/actions/websockets.js +4 -4
  102. package/lib/lambdas/authorizer.js +1 -1
  103. package/lib/lambdas/connection.js +1 -1
  104. package/lib/lambdas/utils/message.js +1 -1
  105. package/lib/lambdas/utils/websocket.js +1 -1
  106. package/lib/mocks/conversation.js +1 -1
  107. package/lib/mocks/file.js +1 -1
  108. package/lib/mocks/group.js +1 -1
  109. package/lib/mocks/image.js +1 -1
  110. package/lib/mocks/post.js +1 -1
  111. package/lib/mocks/tag.js +1 -1
  112. package/lib/mocks/user.js +1 -1
  113. package/lib/mocks/video.js +1 -1
  114. package/lib/mutations/analytics/analytics.js +1 -1
  115. package/lib/mutations/content/content.js +1 -1
  116. package/lib/mutations/crm/crm.js +1 -1
  117. package/lib/mutations/events/events.js +1 -1
  118. package/lib/mutations/flags/flags.js +1 -1
  119. package/lib/mutations/groups/groups.js +1 -1
  120. package/lib/mutations/higgsfield/higgsfield.js +1 -1
  121. package/lib/mutations/images/images.js +1 -1
  122. package/lib/mutations/index.js +1 -1
  123. package/lib/mutations/locations/locations.js +1 -1
  124. package/lib/mutations/messages/messages.js +1 -1
  125. package/lib/mutations/personas/personas.js +1 -1
  126. package/lib/mutations/posts/posts.js +1 -1
  127. package/lib/mutations/reactions/reactions.js +1 -1
  128. package/lib/mutations/rum/rum.js +1 -1
  129. package/lib/mutations/statistics/statistics.js +1 -1
  130. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  131. package/lib/mutations/tags/tags.js +1 -1
  132. package/lib/mutations/users/users.js +1 -1
  133. package/lib/mutations/videos/videos.js +1 -1
  134. package/lib/nativePush/graphql.d.ts +14 -0
  135. package/lib/nativePush/graphql.js +105 -0
  136. package/lib/nativePush/index.d.ts +7 -0
  137. package/lib/nativePush/index.js +9 -0
  138. package/lib/nativePush/migrations.d.ts +2 -0
  139. package/lib/nativePush/migrations.js +36 -0
  140. package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
  141. package/lib/nativePush/nativePushContract.fixture.js +27 -0
  142. package/lib/nativePush/payload.d.ts +2 -0
  143. package/lib/nativePush/payload.js +106 -0
  144. package/lib/nativePush/repository.d.ts +9 -0
  145. package/lib/nativePush/repository.js +120 -0
  146. package/lib/nativePush/service.d.ts +2 -0
  147. package/lib/nativePush/service.js +110 -0
  148. package/lib/nativePush/snsProvider.d.ts +17 -0
  149. package/lib/nativePush/snsProvider.js +165 -0
  150. package/lib/nativePush/types.d.ts +89 -0
  151. package/lib/nativePush/types.js +3 -0
  152. package/lib/objectTypes/analytics.js +1 -1
  153. package/lib/objectTypes/app.js +1 -1
  154. package/lib/objectTypes/bankAccount.js +1 -1
  155. package/lib/objectTypes/connection.js +1 -1
  156. package/lib/objectTypes/content.js +1 -1
  157. package/lib/objectTypes/contentGeneration.js +1 -1
  158. package/lib/objectTypes/conversation.js +1 -1
  159. package/lib/objectTypes/creditCard.js +1 -1
  160. package/lib/objectTypes/crm.js +1 -1
  161. package/lib/objectTypes/document.js +1 -1
  162. package/lib/objectTypes/error.js +1 -1
  163. package/lib/objectTypes/event.js +1 -1
  164. package/lib/objectTypes/external.js +1 -1
  165. package/lib/objectTypes/file.js +1 -1
  166. package/lib/objectTypes/filter.js +1 -1
  167. package/lib/objectTypes/flag.js +1 -1
  168. package/lib/objectTypes/group.js +1 -1
  169. package/lib/objectTypes/higgsfield.js +1 -1
  170. package/lib/objectTypes/iapSubscription.js +1 -1
  171. package/lib/objectTypes/image.js +1 -1
  172. package/lib/objectTypes/imageGeneration.js +1 -1
  173. package/lib/objectTypes/index.js +1 -1
  174. package/lib/objectTypes/location.js +1 -1
  175. package/lib/objectTypes/message.js +1 -1
  176. package/lib/objectTypes/passcode.js +1 -1
  177. package/lib/objectTypes/persona.js +1 -1
  178. package/lib/objectTypes/plan.js +1 -1
  179. package/lib/objectTypes/post.js +1 -1
  180. package/lib/objectTypes/query.js +1 -1
  181. package/lib/objectTypes/reaction.js +1 -1
  182. package/lib/objectTypes/relation.js +1 -1
  183. package/lib/objectTypes/rum.js +1 -1
  184. package/lib/objectTypes/search.js +1 -1
  185. package/lib/objectTypes/statistics.js +1 -1
  186. package/lib/objectTypes/subscription.js +1 -1
  187. package/lib/objectTypes/tag.js +1 -1
  188. package/lib/objectTypes/user.js +1 -1
  189. package/lib/objectTypes/video.js +1 -1
  190. package/lib/objectTypes/videoGeneration.js +1 -1
  191. package/lib/organizations/accountLifecycle.d.ts +7 -0
  192. package/lib/organizations/accountLifecycle.js +106 -0
  193. package/lib/organizations/authorization.d.ts +9 -0
  194. package/lib/organizations/authorization.js +40 -0
  195. package/lib/organizations/billing.d.ts +38 -0
  196. package/lib/organizations/billing.js +277 -0
  197. package/lib/organizations/billingProvider.d.ts +4 -0
  198. package/lib/organizations/billingProvider.js +287 -0
  199. package/lib/organizations/billingUpdates.d.ts +9 -0
  200. package/lib/organizations/billingUpdates.js +388 -0
  201. package/lib/organizations/index.d.ts +10 -0
  202. package/lib/organizations/index.js +12 -0
  203. package/lib/organizations/mail.d.ts +10 -0
  204. package/lib/organizations/mail.js +60 -0
  205. package/lib/organizations/memberDirectory.d.ts +15 -0
  206. package/lib/organizations/memberDirectory.js +28 -0
  207. package/lib/organizations/membership.d.ts +19 -0
  208. package/lib/organizations/membership.js +248 -0
  209. package/lib/organizations/passwordRecovery.d.ts +9 -0
  210. package/lib/organizations/passwordRecovery.js +50 -0
  211. package/lib/organizations/plans.d.ts +6 -0
  212. package/lib/organizations/plans.js +40 -0
  213. package/lib/organizations/providerPagination.d.ts +6 -0
  214. package/lib/organizations/providerPagination.js +23 -0
  215. package/lib/organizations/reconciliation.d.ts +11 -0
  216. package/lib/organizations/reconciliation.js +400 -0
  217. package/lib/organizations/signup.d.ts +25 -0
  218. package/lib/organizations/signup.js +169 -0
  219. package/lib/organizations/store.d.ts +25 -0
  220. package/lib/organizations/store.js +167 -0
  221. package/lib/organizations/types.d.ts +138 -0
  222. package/lib/organizations/types.js +3 -0
  223. package/lib/organizations/verification.d.ts +3 -0
  224. package/lib/organizations/verification.js +51 -0
  225. package/lib/queries/analytics/analytics.js +1 -1
  226. package/lib/queries/content/content.js +1 -1
  227. package/lib/queries/crm/crm.js +1 -1
  228. package/lib/queries/events/events.js +1 -1
  229. package/lib/queries/flags/flags.js +1 -1
  230. package/lib/queries/groups/groups.js +1 -1
  231. package/lib/queries/higgsfield/higgsfield.js +1 -1
  232. package/lib/queries/images/images.js +1 -1
  233. package/lib/queries/index.js +1 -1
  234. package/lib/queries/locations/locations.js +1 -1
  235. package/lib/queries/messages/messages.js +1 -1
  236. package/lib/queries/personas/personas.js +1 -1
  237. package/lib/queries/posts/posts.js +1 -1
  238. package/lib/queries/query/query.js +1 -1
  239. package/lib/queries/reactions/reactions.js +1 -1
  240. package/lib/queries/statistics/statistics.js +1 -1
  241. package/lib/queries/subscriptions/subscriptions.js +1 -1
  242. package/lib/queries/tags/tags.js +1 -1
  243. package/lib/queries/users/users.js +1 -1
  244. package/lib/queries/videos/videos.js +1 -1
  245. package/lib/templates/email/layout.js +1 -1
  246. package/lib/templates/email/passwordForgot.js +1 -1
  247. package/lib/templates/email/passwordRecovery.js +1 -1
  248. package/lib/templates/email/verifyEmail.js +1 -1
  249. package/lib/templates/email/welcome.js +1 -1
  250. package/lib/templates/sms/passwordForgot.js +1 -1
  251. package/lib/templates/sms/passwordRecovery.js +1 -1
  252. package/lib/templates/sms/verifyEmail.js +1 -1
  253. package/lib/templates/sms/verifyPhone.js +1 -1
  254. package/lib/templates/sms/welcome.js +1 -1
  255. package/lib/types/analytics.types.js +1 -1
  256. package/lib/types/apps.types.js +1 -1
  257. package/lib/types/arangodb.types.js +1 -1
  258. package/lib/types/auth.types.js +1 -1
  259. package/lib/types/connections.types.js +1 -1
  260. package/lib/types/content.types.js +1 -1
  261. package/lib/types/conversations.types.js +1 -1
  262. package/lib/types/crm.types.js +1 -1
  263. package/lib/types/databaseCredentials.types.js +1 -1
  264. package/lib/types/email.types.js +1 -1
  265. package/lib/types/error.types.js +1 -1
  266. package/lib/types/files.types.js +1 -1
  267. package/lib/types/flags.types.js +1 -1
  268. package/lib/types/google.types.js +1 -1
  269. package/lib/types/groups.types.js +1 -1
  270. package/lib/types/images.types.js +1 -1
  271. package/lib/types/index.js +1 -1
  272. package/lib/types/locations.types.js +1 -1
  273. package/lib/types/messages.types.js +1 -1
  274. package/lib/types/notifications.types.js +1 -1
  275. package/lib/types/payments.types.js +1 -1
  276. package/lib/types/personas.types.js +1 -1
  277. package/lib/types/posts.types.js +1 -1
  278. package/lib/types/rum.types.js +1 -1
  279. package/lib/types/statistics.types.js +1 -1
  280. package/lib/types/tags.types.js +1 -1
  281. package/lib/types/users.types.js +1 -1
  282. package/lib/types/videos.types.js +1 -1
  283. package/lib/types/websockets.types.js +1 -1
  284. package/lib/upload.js +1 -1
  285. package/lib/utils/adapterUtils.js +1 -1
  286. package/lib/utils/analyticsUtils.js +1 -1
  287. package/lib/utils/appContext.js +1 -1
  288. package/lib/utils/aqlHelpers.js +1 -1
  289. package/lib/utils/arangodbUtils.js +1 -1
  290. package/lib/utils/authUtils.js +1 -1
  291. package/lib/utils/awsUtils.js +1 -1
  292. package/lib/utils/collectionRegistry.js +1 -1
  293. package/lib/utils/contextUtils.js +1 -1
  294. package/lib/utils/databaseCredentials.js +1 -1
  295. package/lib/utils/dbI18n.example.js +1 -1
  296. package/lib/utils/dbI18n.js +1 -1
  297. package/lib/utils/generationCallback.js +1 -1
  298. package/lib/utils/googleTranslate.js +1 -1
  299. package/lib/utils/graphqlUtils.js +1 -1
  300. package/lib/utils/imageUtils.js +1 -1
  301. package/lib/utils/index.js +1 -1
  302. package/lib/utils/languageDetection.js +1 -1
  303. package/lib/utils/localeUtils.example.js +1 -1
  304. package/lib/utils/localeUtils.js +1 -1
  305. package/lib/utils/mediaAccess.js +1 -1
  306. package/lib/utils/middlewareUtils.js +1 -1
  307. package/lib/utils/nodeRealtime.js +1 -1
  308. package/lib/utils/opaqueToken.js +1 -1
  309. package/lib/utils/queryBuilder.js +1 -1
  310. package/lib/utils/schemaUtils.js +1 -1
  311. package/lib/utils/secretDatabase.js +1 -1
  312. package/lib/utils/sessionUtils.js +1 -1
  313. package/lib/utils/stripeUtils.js +1 -1
  314. package/lib/utils/stripeUtils.ts.bak +1 -1
  315. package/lib/utils/templateUtils.js +1 -1
  316. package/lib/utils/testUtils.js +1 -1
  317. package/lib/utils/translationQueue.example.js +1 -1
  318. package/lib/utils/translationQueue.js +1 -1
  319. package/lib/videoProcessing.js +1 -1
  320. package/package.json +16 -3
@@ -0,0 +1,257 @@
1
+ /* eslint-disable no-await-in-loop, no-underscore-dangle -- Ordered checks and Arango document identities. */ import { createHash, randomUUID } from 'node:crypto';
2
+ import { ChatError } from './errors.js';
3
+ import { isChatIdentifier } from './membership.js';
4
+ const defaultHash = (value)=>createHash('sha256').update(JSON.stringify(value)).digest('hex');
5
+ const validText = (content)=>typeof content === 'string' && Array.from(content).length <= 4000 && !/[\u0000\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(content);
6
+ const requireValid = (valid)=>{
7
+ if (!valid) {
8
+ throw new ChatError('invalid_request');
9
+ }
10
+ };
11
+ export const readDurableMessage = async (read, conversationId, messageId)=>{
12
+ const message = await read('RETURN DOCUMENT("messages", @messageId)', {
13
+ messageId
14
+ });
15
+ if (!message || message.conversationId !== conversationId || message.chatSchemaVersion !== 1) {
16
+ throw new ChatError('forbidden');
17
+ }
18
+ return message;
19
+ };
20
+ export const createDurableMessagePersistence = (hooks)=>{
21
+ const hash = hooks.hash || defaultHash;
22
+ const now = hooks.now || Date.now;
23
+ const uuid = hooks.uuid || randomUUID;
24
+ const authorize = async (read, conversationId, purpose = 'history')=>{
25
+ const membership = await hooks.authorizeMembership(read, hooks.identity, conversationId, purpose);
26
+ const legacy = await read(`RETURN FIRST(FOR message IN messages
27
+ FILTER message.conversationId == @conversationId
28
+ AND (message.chatSchemaVersion != 1 OR !IS_NUMBER(message.sequence) OR message.sequence < 1)
29
+ LIMIT 1 RETURN true)`, {
30
+ conversationId
31
+ });
32
+ if (legacy === true) {
33
+ throw new ChatError('conflict');
34
+ }
35
+ return membership;
36
+ };
37
+ const receipt = async (read, action, conversationId, key, payload)=>{
38
+ const requestId = hash([
39
+ action,
40
+ conversationId,
41
+ hooks.identity.personaId,
42
+ key
43
+ ]);
44
+ const payloadHash = hash(payload);
45
+ const record = await read('RETURN DOCUMENT("chatMessageRequests", @key)', {
46
+ key: requestId
47
+ });
48
+ if (record && (record.payloadHash !== payloadHash || record.userId !== hooks.identity.userId)) {
49
+ throw new ChatError('conflict');
50
+ }
51
+ return {
52
+ prior: record?.result,
53
+ save: (result)=>read('INSERT @record IN chatMessageRequests RETURN true', {
54
+ record: {
55
+ _key: requestId,
56
+ added: now(),
57
+ conversationId,
58
+ payloadHash,
59
+ personaId: hooks.identity.personaId,
60
+ result,
61
+ userId: hooks.identity.userId
62
+ }
63
+ })
64
+ };
65
+ };
66
+ const rateLimit = async (read, action, limit, interval = 60000)=>{
67
+ const key = hash([
68
+ hooks.identity.userId,
69
+ hooks.identity.personaId,
70
+ action,
71
+ Math.floor(now() / interval)
72
+ ]);
73
+ const allowed = await read(`LET bucket = DOCUMENT('chatRateLimits', @key)
74
+ FILTER bucket == null OR bucket.count < @limit
75
+ UPSERT {_key: @key} INSERT {_key: @key, count: 1, personaId: @personaId, userId: @userId}
76
+ UPDATE {count: OLD.count + 1, personaId: @personaId, userId: @userId}
77
+ IN chatRateLimits RETURN true`, {
78
+ key,
79
+ limit,
80
+ personaId: hooks.identity.personaId,
81
+ userId: hooks.identity.userId
82
+ });
83
+ if (allowed !== true) {
84
+ throw new ChatError('rate_limited');
85
+ }
86
+ };
87
+ const run = (operation, write = true)=>hooks.run(async (read)=>{
88
+ await hooks.authorizeIdentity(read, hooks.identity);
89
+ return operation(read);
90
+ }, write);
91
+ const sendMessage = (input)=>run(async (read)=>{
92
+ requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.clientMessageId) && input.senderPersonaId === hooks.identity.personaId && validText(input.content) && Array.isArray(input.attachmentIds) && input.attachmentIds.length <= 4 && input.attachmentIds.every(isChatIdentifier) && new Set(input.attachmentIds).size === input.attachmentIds.length && (input.content.trim().length > 0 || input.attachmentIds.length > 0) && (input.replyToMessageId === undefined || isChatIdentifier(input.replyToMessageId)));
93
+ const request = await receipt(read, 'send', input.conversationId, input.clientMessageId, input);
94
+ if (request.prior) {
95
+ return request.prior;
96
+ }
97
+ const membership = await authorize(read, input.conversationId, 'send');
98
+ await rateLimit(read, 'send', 60);
99
+ const attachments = [];
100
+ for (const imageId of input.attachmentIds){
101
+ attachments.push(await hooks.authorizeAttachment(read, imageId));
102
+ }
103
+ if (input.replyToMessageId) {
104
+ const quoted = await readDurableMessage(read, input.conversationId, input.replyToMessageId);
105
+ await hooks.authorizeMessageVisible(read, hooks.identity, quoted, membership);
106
+ if (quoted.deleted || quoted.mobilePlatformDisposition !== 'allowed') {
107
+ throw new ChatError('forbidden');
108
+ }
109
+ }
110
+ const timestamp = now();
111
+ const sequence = await read(`FOR conversation IN conversations FILTER conversation._key == @id
112
+ AND conversation.chatSchemaVersion == 1 AND conversation.state == 'active'
113
+ AND IS_NUMBER(conversation.lastSequence) AND conversation.lastSequence < 9007199254740991
114
+ UPDATE conversation WITH {lastSequence: conversation.lastSequence + 1, modified: @now}
115
+ IN conversations RETURN NEW.lastSequence`, {
116
+ id: input.conversationId,
117
+ now: timestamp
118
+ });
119
+ if (!Number.isSafeInteger(sequence) || Number(sequence) < 1) {
120
+ throw new ChatError('unavailable');
121
+ }
122
+ const messageId = uuid();
123
+ const contentVersion = hash([
124
+ messageId,
125
+ 1,
126
+ input.content
127
+ ]);
128
+ const projection = await hooks.classifyContent({
129
+ content: input.content || ' ',
130
+ contentVersion
131
+ });
132
+ const record = {
133
+ _key: messageId,
134
+ added: timestamp,
135
+ attachmentIds: input.attachmentIds,
136
+ attachments,
137
+ chatSchemaVersion: 1,
138
+ clientMessageId: input.clientMessageId,
139
+ content: input.content,
140
+ contentRevision: 1,
141
+ conversationId: input.conversationId,
142
+ deleted: false,
143
+ mobileContentVersion: contentVersion,
144
+ mobileDecision: projection.decision,
145
+ mobilePlatformDisposition: projection.platformDisposition || 'allowed',
146
+ modified: timestamp,
147
+ replyToMessageId: input.replyToMessageId,
148
+ revision: 1,
149
+ senderPersonaId: hooks.identity.personaId,
150
+ sequence: sequence,
151
+ userId: hooks.identity.userId
152
+ };
153
+ if (await read('INSERT @record IN messages RETURN true', {
154
+ record
155
+ }) !== true) {
156
+ throw new ChatError('unavailable');
157
+ }
158
+ await hooks.appendEvent(read, {
159
+ actorPersonaId: hooks.identity.personaId,
160
+ conversationId: input.conversationId,
161
+ kind: 'message.changed',
162
+ membershipEpoch: membership.epoch,
163
+ resourceId: messageId,
164
+ revision: 1
165
+ });
166
+ const result = {
167
+ clientMessageId: input.clientMessageId,
168
+ messageId,
169
+ revision: 1,
170
+ sequence: sequence
171
+ };
172
+ if (await request.save(result) !== true) {
173
+ throw new ChatError('unavailable');
174
+ }
175
+ return result;
176
+ });
177
+ const mutateMessage = (input, remove)=>run(async (read)=>{
178
+ requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.messageId) && isChatIdentifier(input.idempotencyKey) && Number.isSafeInteger(input.expectedRevision) && input.expectedRevision >= 1 && (remove || 'content' in input && validText(input.content)));
179
+ const request = await receipt(read, remove ? 'delete' : 'edit', input.conversationId, input.idempotencyKey, input);
180
+ if (request.prior) {
181
+ return request.prior;
182
+ }
183
+ const membership = await authorize(read, input.conversationId, 'send');
184
+ const message = await readDurableMessage(read, input.conversationId, input.messageId);
185
+ if (message.senderPersonaId !== hooks.identity.personaId || message.userId !== hooks.identity.userId || message.sequence < membership.joinSequence || message.deleted || message.mobilePlatformDisposition !== 'allowed') {
186
+ throw new ChatError('forbidden');
187
+ }
188
+ if (message.revision !== input.expectedRevision || !remove && now() - message.added > 15 * 60000) {
189
+ throw new ChatError('conflict');
190
+ }
191
+ await rateLimit(read, remove ? 'delete' : 'edit', 60);
192
+ const content = !remove && 'content' in input ? input.content : '';
193
+ const revision = message.revision + 1;
194
+ const contentRevision = message.contentRevision + 1;
195
+ const contentVersion = hash([
196
+ message._key,
197
+ contentRevision,
198
+ content
199
+ ]);
200
+ const projection = await hooks.classifyContent({
201
+ content: content || ' ',
202
+ contentVersion
203
+ });
204
+ const updated = await read(`FOR current IN messages
205
+ FILTER current._key == @id AND current.revision == @expectedRevision
206
+ UPDATE current WITH {content: @content, contentRevision: @contentRevision, deleted: @deleted,
207
+ attachmentIds: @attachmentIds, attachments: @attachments, replyToMessageId: @reply,
208
+ mobileContentVersion: @contentVersion, mobileDecision: @decision,
209
+ mobilePlatformDisposition: @platformDisposition, modified: @now, revision: @revision}
210
+ IN messages RETURN true`, {
211
+ attachmentIds: remove ? [] : message.attachmentIds,
212
+ attachments: remove ? [] : message.attachments,
213
+ content,
214
+ contentRevision,
215
+ contentVersion,
216
+ decision: projection.decision,
217
+ deleted: remove,
218
+ expectedRevision: input.expectedRevision,
219
+ id: message._key,
220
+ now: now(),
221
+ platformDisposition: projection.platformDisposition || 'allowed',
222
+ reply: remove ? null : message.replyToMessageId || null,
223
+ revision
224
+ });
225
+ if (updated !== true) {
226
+ throw new ChatError('conflict');
227
+ }
228
+ await hooks.appendEvent(read, {
229
+ actorPersonaId: hooks.identity.personaId,
230
+ conversationId: input.conversationId,
231
+ kind: 'message.changed',
232
+ membershipEpoch: membership.epoch,
233
+ resourceId: message._key,
234
+ revision
235
+ });
236
+ const result = {
237
+ messageId: message._key,
238
+ revision,
239
+ sequence: message.sequence
240
+ };
241
+ if (await request.save(result) !== true) {
242
+ throw new ChatError('unavailable');
243
+ }
244
+ return result;
245
+ });
246
+ return {
247
+ authorize,
248
+ deleteMessage: (input)=>mutateMessage(input, true),
249
+ editMessage: (input)=>mutateMessage(input, false),
250
+ rateLimit,
251
+ receipt,
252
+ run,
253
+ sendMessage
254
+ };
255
+ };
256
+
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvbWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCwgbm8tdW5kZXJzY29yZS1kYW5nbGUgLS0gT3JkZXJlZCBjaGVja3MgYW5kIEFyYW5nbyBkb2N1bWVudCBpZGVudGl0aWVzLiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCByYW5kb21VVUlEfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbmltcG9ydCB7Q2hhdEVycm9yfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQge2lzQ2hhdElkZW50aWZpZXJ9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5cbmltcG9ydCB0eXBlIHtDaGF0UXVlcnl9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIER1cmFibGVDaGF0QXR0YWNobWVudCwgRHVyYWJsZUNoYXRNZXNzYWdlLCBEdXJhYmxlRGVsZXRlTWVzc2FnZUlucHV0LCBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCxcbiAgRHVyYWJsZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQsIER1cmFibGVNZXNzYWdlSG9va3MsIER1cmFibGVNZXNzYWdlTXV0YXRpb25SZXN1bHQsIER1cmFibGVTZW5kTWVzc2FnZUlucHV0XG59IGZyb20gJy4vbWVzc2FnZVR5cGVzLmpzJztcblxuY29uc3QgZGVmYXVsdEhhc2ggPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkuZGlnZXN0KCdoZXgnKTtcbmNvbnN0IHZhbGlkVGV4dCA9IChjb250ZW50OiB1bmtub3duKTogY29udGVudCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnXG4gICYmIEFycmF5LmZyb20oY29udGVudCkubGVuZ3RoIDw9IDQwMDBcbiAgJiYgIS9bXFx1MDAwMFxcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD88IVtcXHVEODAwLVxcdURCRkZdKVtcXHVEQzAwLVxcdURGRkZdL3UudGVzdChjb250ZW50KTtcbmNvbnN0IHJlcXVpcmVWYWxpZCA9ICh2YWxpZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBpZighdmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdpbnZhbGlkX3JlcXVlc3QnKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWREdXJhYmxlTWVzc2FnZSA9IGFzeW5jIDxURGVjaXNpb24+KFxuICByZWFkOiBDaGF0UXVlcnksIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBQcm9taXNlPER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+PiA9PiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZWFkPER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+PignUkVUVVJOIERPQ1VNRU5UKFwibWVzc2FnZXNcIiwgQG1lc3NhZ2VJZCknLCB7bWVzc2FnZUlkfSk7XG4gIGlmKCFtZXNzYWdlIHx8IG1lc3NhZ2UuY29udmVyc2F0aW9uSWQgIT09IGNvbnZlcnNhdGlvbklkIHx8IG1lc3NhZ2UuY2hhdFNjaGVtYVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEdXJhYmxlTWVzc2FnZVBlcnNpc3RlbmNlID0gPFREZWNpc2lvbj4oaG9va3M6IER1cmFibGVNZXNzYWdlSG9va3M8VERlY2lzaW9uPikgPT4ge1xuICBjb25zdCBoYXNoID0gaG9va3MuaGFzaCB8fCBkZWZhdWx0SGFzaDtcbiAgY29uc3Qgbm93ID0gaG9va3Mubm93IHx8IERhdGUubm93O1xuICBjb25zdCB1dWlkID0gaG9va3MudXVpZCB8fCByYW5kb21VVUlEO1xuICBjb25zdCBhdXRob3JpemUgPSBhc3luYyAocmVhZDogQ2hhdFF1ZXJ5LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCBwdXJwb3NlOiAnaGlzdG9yeScgfCAnc2VuZCcgPSAnaGlzdG9yeScpID0+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwID0gYXdhaXQgaG9va3MuYXV0aG9yaXplTWVtYmVyc2hpcChyZWFkLCBob29rcy5pZGVudGl0eSwgY29udmVyc2F0aW9uSWQsIHB1cnBvc2UpO1xuICAgIGNvbnN0IGxlZ2FjeSA9IGF3YWl0IHJlYWQ8Ym9vbGVhbj4oYFJFVFVSTiBGSVJTVChGT1IgbWVzc2FnZSBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIG1lc3NhZ2UuY29udmVyc2F0aW9uSWQgPT0gQGNvbnZlcnNhdGlvbklkXG4gICAgICAgIEFORCAobWVzc2FnZS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxIE9SICFJU19OVU1CRVIobWVzc2FnZS5zZXF1ZW5jZSkgT1IgbWVzc2FnZS5zZXF1ZW5jZSA8IDEpXG4gICAgICBMSU1JVCAxIFJFVFVSTiB0cnVlKWAsIHtjb252ZXJzYXRpb25JZH0pO1xuICAgIGlmKGxlZ2FjeSA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbWJlcnNoaXA7XG4gIH07XG4gIGNvbnN0IHJlY2VpcHQgPSBhc3luYyA8VD4oXG4gICAgcmVhZDogQ2hhdFF1ZXJ5LCBhY3Rpb246IHN0cmluZywgY29udmVyc2F0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd25cbiAgKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gaGFzaChbYWN0aW9uLCBjb252ZXJzYXRpb25JZCwgaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCBrZXldKTtcbiAgICBjb25zdCBwYXlsb2FkSGFzaCA9IGhhc2gocGF5bG9hZCk7XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVhZDx7cmVhZG9ubHkgcGF5bG9hZEhhc2g6IHN0cmluZzsgcmVhZG9ubHkgcmVzdWx0OiBUOyByZWFkb25seSB1c2VySWQ6IHN0cmluZ30+KFxuICAgICAgJ1JFVFVSTiBET0NVTUVOVChcImNoYXRNZXNzYWdlUmVxdWVzdHNcIiwgQGtleSknLCB7a2V5OiByZXF1ZXN0SWR9KTtcbiAgICBpZihyZWNvcmQgJiYgKHJlY29yZC5wYXlsb2FkSGFzaCAhPT0gcGF5bG9hZEhhc2ggfHwgcmVjb3JkLnVzZXJJZCAhPT0gaG9va3MuaWRlbnRpdHkudXNlcklkKSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtwcmlvcjogcmVjb3JkPy5yZXN1bHQsIHNhdmU6IChyZXN1bHQ6IFQpID0+IHJlYWQ8Ym9vbGVhbj4oXG4gICAgICAnSU5TRVJUIEByZWNvcmQgSU4gY2hhdE1lc3NhZ2VSZXF1ZXN0cyBSRVRVUk4gdHJ1ZScsIHtyZWNvcmQ6IHtfa2V5OiByZXF1ZXN0SWQsIGFkZGVkOiBub3coKSwgY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHBheWxvYWRIYXNoLCBwZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwgcmVzdWx0LCB1c2VySWQ6IGhvb2tzLmlkZW50aXR5LnVzZXJJZH19KX07XG4gIH07XG4gIGNvbnN0IHJhdGVMaW1pdCA9IGFzeW5jIChyZWFkOiBDaGF0UXVlcnksIGFjdGlvbjogc3RyaW5nLCBsaW1pdDogbnVtYmVyLCBpbnRlcnZhbCA9IDYwMDAwKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qga2V5ID0gaGFzaChbaG9va3MuaWRlbnRpdHkudXNlcklkLCBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIGFjdGlvbiwgTWF0aC5mbG9vcihub3coKSAvIGludGVydmFsKV0pO1xuICAgIGNvbnN0IGFsbG93ZWQgPSBhd2FpdCByZWFkPGJvb2xlYW4+KGBMRVQgYnVja2V0ID0gRE9DVU1FTlQoJ2NoYXRSYXRlTGltaXRzJywgQGtleSlcbiAgICAgIEZJTFRFUiBidWNrZXQgPT0gbnVsbCBPUiBidWNrZXQuY291bnQgPCBAbGltaXRcbiAgICAgIFVQU0VSVCB7X2tleTogQGtleX0gSU5TRVJUIHtfa2V5OiBAa2V5LCBjb3VudDogMSwgcGVyc29uYUlkOiBAcGVyc29uYUlkLCB1c2VySWQ6IEB1c2VySWR9XG4gICAgICBVUERBVEUge2NvdW50OiBPTEQuY291bnQgKyAxLCBwZXJzb25hSWQ6IEBwZXJzb25hSWQsIHVzZXJJZDogQHVzZXJJZH1cbiAgICAgIElOIGNoYXRSYXRlTGltaXRzIFJFVFVSTiB0cnVlYCwge2tleSwgbGltaXQsIHBlcnNvbmFJZDogaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCB1c2VySWQ6IGhvb2tzLmlkZW50aXR5LnVzZXJJZH0pO1xuICAgIGlmKGFsbG93ZWQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3JhdGVfbGltaXRlZCcpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcnVuID0gPFQ+KG9wZXJhdGlvbjogKHJlYWQ6IENoYXRRdWVyeSkgPT4gUHJvbWlzZTxUPiwgd3JpdGUgPSB0cnVlKTogUHJvbWlzZTxUPiA9PiBob29rcy5ydW4oYXN5bmMgKHJlYWQpID0+IHtcbiAgICBhd2FpdCBob29rcy5hdXRob3JpemVJZGVudGl0eShyZWFkLCBob29rcy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbihyZWFkKTtcbiAgfSwgd3JpdGUpO1xuICBjb25zdCBzZW5kTWVzc2FnZSA9IChpbnB1dDogRHVyYWJsZVNlbmRNZXNzYWdlSW5wdXQpOiBQcm9taXNlPER1cmFibGVNZXNzYWdlQWNrbm93bGVkZ2VtZW50PiA9PiBydW4oYXN5bmMgKHJlYWQpID0+IHtcbiAgICByZXF1aXJlVmFsaWQoQm9vbGVhbihpbnB1dCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5jb252ZXJzYXRpb25JZCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5jbGllbnRNZXNzYWdlSWQpXG4gICAgICAmJiBpbnB1dC5zZW5kZXJQZXJzb25hSWQgPT09IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCAmJiB2YWxpZFRleHQoaW5wdXQuY29udGVudClcbiAgICAgICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuYXR0YWNobWVudElkcykgJiYgaW5wdXQuYXR0YWNobWVudElkcy5sZW5ndGggPD0gNFxuICAgICAgJiYgaW5wdXQuYXR0YWNobWVudElkcy5ldmVyeShpc0NoYXRJZGVudGlmaWVyKSAmJiBuZXcgU2V0KGlucHV0LmF0dGFjaG1lbnRJZHMpLnNpemUgPT09IGlucHV0LmF0dGFjaG1lbnRJZHMubGVuZ3RoXG4gICAgICAmJiAoaW5wdXQuY29udGVudC50cmltKCkubGVuZ3RoID4gMCB8fCBpbnB1dC5hdHRhY2htZW50SWRzLmxlbmd0aCA+IDApXG4gICAgICAmJiAoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCA9PT0gdW5kZWZpbmVkIHx8IGlzQ2hhdElkZW50aWZpZXIoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCkpKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgcmVjZWlwdDxEdXJhYmxlTWVzc2FnZUFja25vd2xlZGdlbWVudD4oXG4gICAgICByZWFkLCAnc2VuZCcsIGlucHV0LmNvbnZlcnNhdGlvbklkLCBpbnB1dC5jbGllbnRNZXNzYWdlSWQsIGlucHV0KTtcbiAgICBpZihyZXF1ZXN0LnByaW9yKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdC5wcmlvcjtcbiAgICB9XG4gICAgY29uc3QgbWVtYmVyc2hpcCA9IGF3YWl0IGF1dGhvcml6ZShyZWFkLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgJ3NlbmQnKTtcbiAgICBhd2FpdCByYXRlTGltaXQocmVhZCwgJ3NlbmQnLCA2MCk7XG4gICAgY29uc3QgYXR0YWNobWVudHM6IER1cmFibGVDaGF0QXR0YWNobWVudFtdID0gW107XG4gICAgZm9yKGNvbnN0IGltYWdlSWQgb2YgaW5wdXQuYXR0YWNobWVudElkcykge1xuICAgICAgYXR0YWNobWVudHMucHVzaChhd2FpdCBob29rcy5hdXRob3JpemVBdHRhY2htZW50KHJlYWQsIGltYWdlSWQpKTtcbiAgICB9XG4gICAgaWYoaW5wdXQucmVwbHlUb01lc3NhZ2VJZCkge1xuICAgICAgY29uc3QgcXVvdGVkID0gYXdhaXQgcmVhZER1cmFibGVNZXNzYWdlPFREZWNpc2lvbj4ocmVhZCwgaW5wdXQuY29udmVyc2F0aW9uSWQsIGlucHV0LnJlcGx5VG9NZXNzYWdlSWQpO1xuICAgICAgYXdhaXQgaG9va3MuYXV0aG9yaXplTWVzc2FnZVZpc2libGUocmVhZCwgaG9va3MuaWRlbnRpdHksIHF1b3RlZCwgbWVtYmVyc2hpcCk7XG4gICAgICBpZihxdW90ZWQuZGVsZXRlZCB8fCBxdW90ZWQubW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbiAhPT0gJ2FsbG93ZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2ZvcmJpZGRlbicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHJlYWQ8bnVtYmVyPihgRk9SIGNvbnZlcnNhdGlvbiBJTiBjb252ZXJzYXRpb25zIEZJTFRFUiBjb252ZXJzYXRpb24uX2tleSA9PSBAaWRcbiAgICAgIEFORCBjb252ZXJzYXRpb24uY2hhdFNjaGVtYVZlcnNpb24gPT0gMSBBTkQgY29udmVyc2F0aW9uLnN0YXRlID09ICdhY3RpdmUnXG4gICAgICBBTkQgSVNfTlVNQkVSKGNvbnZlcnNhdGlvbi5sYXN0U2VxdWVuY2UpIEFORCBjb252ZXJzYXRpb24ubGFzdFNlcXVlbmNlIDwgOTAwNzE5OTI1NDc0MDk5MVxuICAgICAgVVBEQVRFIGNvbnZlcnNhdGlvbiBXSVRIIHtsYXN0U2VxdWVuY2U6IGNvbnZlcnNhdGlvbi5sYXN0U2VxdWVuY2UgKyAxLCBtb2RpZmllZDogQG5vd31cbiAgICAgIElOIGNvbnZlcnNhdGlvbnMgUkVUVVJOIE5FVy5sYXN0U2VxdWVuY2VgLCB7aWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLCBub3c6IHRpbWVzdGFtcH0pO1xuICAgIGlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzZXF1ZW5jZSkgfHwgTnVtYmVyKHNlcXVlbmNlKSA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHV1aWQoKTtcbiAgICBjb25zdCBjb250ZW50VmVyc2lvbiA9IGhhc2goW21lc3NhZ2VJZCwgMSwgaW5wdXQuY29udGVudF0pO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBhd2FpdCBob29rcy5jbGFzc2lmeUNvbnRlbnQoe2NvbnRlbnQ6IGlucHV0LmNvbnRlbnQgfHwgJyAnLCBjb250ZW50VmVyc2lvbn0pO1xuICAgIGNvbnN0IHJlY29yZDogRHVyYWJsZUNoYXRNZXNzYWdlPFREZWNpc2lvbj4gPSB7X2tleTogbWVzc2FnZUlkLCBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgYXR0YWNobWVudElkczogaW5wdXQuYXR0YWNobWVudElkcywgYXR0YWNobWVudHMsIGNoYXRTY2hlbWFWZXJzaW9uOiAxLCBjbGllbnRNZXNzYWdlSWQ6IGlucHV0LmNsaWVudE1lc3NhZ2VJZCxcbiAgICAgIGNvbnRlbnQ6IGlucHV0LmNvbnRlbnQsIGNvbnRlbnRSZXZpc2lvbjogMSwgY29udmVyc2F0aW9uSWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLCBkZWxldGVkOiBmYWxzZSxcbiAgICAgIG1vYmlsZUNvbnRlbnRWZXJzaW9uOiBjb250ZW50VmVyc2lvbiwgbW9iaWxlRGVjaXNpb246IHByb2plY3Rpb24uZGVjaXNpb24sXG4gICAgICBtb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uOiBwcm9qZWN0aW9uLnBsYXRmb3JtRGlzcG9zaXRpb24gfHwgJ2FsbG93ZWQnLCBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcmVwbHlUb01lc3NhZ2VJZDogaW5wdXQucmVwbHlUb01lc3NhZ2VJZCwgcmV2aXNpb246IDEsIHNlbmRlclBlcnNvbmFJZDogaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLFxuICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlISwgdXNlcklkOiBob29rcy5pZGVudGl0eS51c2VySWR9O1xuICAgIGlmKGF3YWl0IHJlYWQ8Ym9vbGVhbj4oJ0lOU0VSVCBAcmVjb3JkIElOIG1lc3NhZ2VzIFJFVFVSTiB0cnVlJywge3JlY29yZH0pICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCd1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgICBhd2FpdCBob29rcy5hcHBlbmRFdmVudChyZWFkLCB7YWN0b3JQZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwgY29udmVyc2F0aW9uSWQ6IGlucHV0LmNvbnZlcnNhdGlvbklkLFxuICAgICAga2luZDogJ21lc3NhZ2UuY2hhbmdlZCcsIG1lbWJlcnNoaXBFcG9jaDogbWVtYmVyc2hpcC5lcG9jaCwgcmVzb3VyY2VJZDogbWVzc2FnZUlkLCByZXZpc2lvbjogMX0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtjbGllbnRNZXNzYWdlSWQ6IGlucHV0LmNsaWVudE1lc3NhZ2VJZCwgbWVzc2FnZUlkLCByZXZpc2lvbjogMSwgc2VxdWVuY2U6IHNlcXVlbmNlIX07XG4gICAgaWYoYXdhaXQgcmVxdWVzdC5zYXZlKHJlc3VsdCkgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuICBjb25zdCBtdXRhdGVNZXNzYWdlID0gKFxuICAgIGlucHV0OiBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCB8IER1cmFibGVEZWxldGVNZXNzYWdlSW5wdXQsIHJlbW92ZTogYm9vbGVhblxuICApOiBQcm9taXNlPER1cmFibGVNZXNzYWdlTXV0YXRpb25SZXN1bHQ+ID0+IHJ1bihhc3luYyAocmVhZCkgPT4ge1xuICAgIHJlcXVpcmVWYWxpZChCb29sZWFuKGlucHV0KSAmJiBpc0NoYXRJZGVudGlmaWVyKGlucHV0LmNvbnZlcnNhdGlvbklkKSAmJiBpc0NoYXRJZGVudGlmaWVyKGlucHV0Lm1lc3NhZ2VJZClcbiAgICAgICYmIGlzQ2hhdElkZW50aWZpZXIoaW5wdXQuaWRlbXBvdGVuY3lLZXkpICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGlucHV0LmV4cGVjdGVkUmV2aXNpb24pXG4gICAgICAmJiBpbnB1dC5leHBlY3RlZFJldmlzaW9uID49IDEgJiYgKHJlbW92ZSB8fCAoJ2NvbnRlbnQnIGluIGlucHV0ICYmIHZhbGlkVGV4dChpbnB1dC5jb250ZW50KSkpKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgcmVjZWlwdDxEdXJhYmxlTWVzc2FnZU11dGF0aW9uUmVzdWx0PihyZWFkLCByZW1vdmUgPyAnZGVsZXRlJyA6ICdlZGl0JyxcbiAgICAgIGlucHV0LmNvbnZlcnNhdGlvbklkLCBpbnB1dC5pZGVtcG90ZW5jeUtleSwgaW5wdXQpO1xuICAgIGlmKHJlcXVlc3QucHJpb3IpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0LnByaW9yO1xuICAgIH1cbiAgICBjb25zdCBtZW1iZXJzaGlwID0gYXdhaXQgYXV0aG9yaXplKHJlYWQsIGlucHV0LmNvbnZlcnNhdGlvbklkLCAnc2VuZCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZWFkRHVyYWJsZU1lc3NhZ2U8VERlY2lzaW9uPihyZWFkLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgaW5wdXQubWVzc2FnZUlkKTtcbiAgICBpZihtZXNzYWdlLnNlbmRlclBlcnNvbmFJZCAhPT0gaG9va3MuaWRlbnRpdHkucGVyc29uYUlkIHx8IG1lc3NhZ2UudXNlcklkICE9PSBob29rcy5pZGVudGl0eS51c2VySWRcbiAgICAgIHx8IG1lc3NhZ2Uuc2VxdWVuY2UgPCBtZW1iZXJzaGlwLmpvaW5TZXF1ZW5jZSB8fCBtZXNzYWdlLmRlbGV0ZWQgfHwgbWVzc2FnZS5tb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uICE9PSAnYWxsb3dlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2ZvcmJpZGRlbicpO1xuICAgIH1cbiAgICBpZihtZXNzYWdlLnJldmlzaW9uICE9PSBpbnB1dC5leHBlY3RlZFJldmlzaW9uIHx8ICghcmVtb3ZlICYmIG5vdygpIC0gbWVzc2FnZS5hZGRlZCA+IDE1ICogNjAwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdjb25mbGljdCcpO1xuICAgIH1cbiAgICBhd2FpdCByYXRlTGltaXQocmVhZCwgcmVtb3ZlID8gJ2RlbGV0ZScgOiAnZWRpdCcsIDYwKTtcbiAgICBjb25zdCBjb250ZW50ID0gIXJlbW92ZSAmJiAnY29udGVudCcgaW4gaW5wdXQgPyBpbnB1dC5jb250ZW50IDogJyc7XG4gICAgY29uc3QgcmV2aXNpb24gPSBtZXNzYWdlLnJldmlzaW9uICsgMTtcbiAgICBjb25zdCBjb250ZW50UmV2aXNpb24gPSBtZXNzYWdlLmNvbnRlbnRSZXZpc2lvbiArIDE7XG4gICAgY29uc3QgY29udGVudFZlcnNpb24gPSBoYXNoKFttZXNzYWdlLl9rZXksIGNvbnRlbnRSZXZpc2lvbiwgY29udGVudF0pO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBhd2FpdCBob29rcy5jbGFzc2lmeUNvbnRlbnQoe2NvbnRlbnQ6IGNvbnRlbnQgfHwgJyAnLCBjb250ZW50VmVyc2lvbn0pO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCByZWFkPGJvb2xlYW4+KGBGT1IgY3VycmVudCBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIGN1cnJlbnQuX2tleSA9PSBAaWQgQU5EIGN1cnJlbnQucmV2aXNpb24gPT0gQGV4cGVjdGVkUmV2aXNpb25cbiAgICAgIFVQREFURSBjdXJyZW50IFdJVEgge2NvbnRlbnQ6IEBjb250ZW50LCBjb250ZW50UmV2aXNpb246IEBjb250ZW50UmV2aXNpb24sIGRlbGV0ZWQ6IEBkZWxldGVkLFxuICAgICAgICBhdHRhY2htZW50SWRzOiBAYXR0YWNobWVudElkcywgYXR0YWNobWVudHM6IEBhdHRhY2htZW50cywgcmVwbHlUb01lc3NhZ2VJZDogQHJlcGx5LFxuICAgICAgICBtb2JpbGVDb250ZW50VmVyc2lvbjogQGNvbnRlbnRWZXJzaW9uLCBtb2JpbGVEZWNpc2lvbjogQGRlY2lzaW9uLFxuICAgICAgICBtb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uOiBAcGxhdGZvcm1EaXNwb3NpdGlvbiwgbW9kaWZpZWQ6IEBub3csIHJldmlzaW9uOiBAcmV2aXNpb259XG4gICAgICBJTiBtZXNzYWdlcyBSRVRVUk4gdHJ1ZWAsIHthdHRhY2htZW50SWRzOiByZW1vdmUgPyBbXSA6IG1lc3NhZ2UuYXR0YWNobWVudElkcyxcbiAgICAgIGF0dGFjaG1lbnRzOiByZW1vdmUgPyBbXSA6IG1lc3NhZ2UuYXR0YWNobWVudHMsIGNvbnRlbnQsIGNvbnRlbnRSZXZpc2lvbiwgY29udGVudFZlcnNpb24sXG4gICAgICBkZWNpc2lvbjogcHJvamVjdGlvbi5kZWNpc2lvbiwgZGVsZXRlZDogcmVtb3ZlLCBleHBlY3RlZFJldmlzaW9uOiBpbnB1dC5leHBlY3RlZFJldmlzaW9uLCBpZDogbWVzc2FnZS5fa2V5LFxuICAgICAgbm93OiBub3coKSwgcGxhdGZvcm1EaXNwb3NpdGlvbjogcHJvamVjdGlvbi5wbGF0Zm9ybURpc3Bvc2l0aW9uIHx8ICdhbGxvd2VkJyxcbiAgICAgIHJlcGx5OiByZW1vdmUgPyBudWxsIDogbWVzc2FnZS5yZXBseVRvTWVzc2FnZUlkIHx8IG51bGwsIHJldmlzaW9ufSk7XG4gICAgaWYodXBkYXRlZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgYXdhaXQgaG9va3MuYXBwZW5kRXZlbnQocmVhZCwge2FjdG9yUGVyc29uYUlkOiBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCxcbiAgICAgIGtpbmQ6ICdtZXNzYWdlLmNoYW5nZWQnLCBtZW1iZXJzaGlwRXBvY2g6IG1lbWJlcnNoaXAuZXBvY2gsIHJlc291cmNlSWQ6IG1lc3NhZ2UuX2tleSwgcmV2aXNpb259KTtcbiAgICBjb25zdCByZXN1bHQgPSB7bWVzc2FnZUlkOiBtZXNzYWdlLl9rZXksIHJldmlzaW9uLCBzZXF1ZW5jZTogbWVzc2FnZS5zZXF1ZW5jZX07XG4gICAgaWYoYXdhaXQgcmVxdWVzdC5zYXZlKHJlc3VsdCkgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuICByZXR1cm4ge2F1dGhvcml6ZSwgZGVsZXRlTWVzc2FnZTogKGlucHV0OiBEdXJhYmxlRGVsZXRlTWVzc2FnZUlucHV0KSA9PiBtdXRhdGVNZXNzYWdlKGlucHV0LCB0cnVlKSxcbiAgICBlZGl0TWVzc2FnZTogKGlucHV0OiBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCkgPT4gbXV0YXRlTWVzc2FnZShpbnB1dCwgZmFsc2UpLCByYXRlTGltaXQsIHJlY2VpcHQsIHJ1biwgc2VuZE1lc3NhZ2V9O1xufTtcblxuZXhwb3J0IHR5cGUgRHVyYWJsZU1lc3NhZ2VQZXJzaXN0ZW5jZTxURGVjaXNpb24gPSB1bmtub3duPiA9XG4gIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUR1cmFibGVNZXNzYWdlUGVyc2lzdGVuY2U8VERlY2lzaW9uPj47XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsInJhbmRvbVVVSUQiLCJDaGF0RXJyb3IiLCJpc0NoYXRJZGVudGlmaWVyIiwiZGVmYXVsdEhhc2giLCJ2YWx1ZSIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ2YWxpZFRleHQiLCJjb250ZW50IiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwidGVzdCIsInJlcXVpcmVWYWxpZCIsInZhbGlkIiwicmVhZER1cmFibGVNZXNzYWdlIiwicmVhZCIsImNvbnZlcnNhdGlvbklkIiwibWVzc2FnZUlkIiwibWVzc2FnZSIsImNoYXRTY2hlbWFWZXJzaW9uIiwiY3JlYXRlRHVyYWJsZU1lc3NhZ2VQZXJzaXN0ZW5jZSIsImhvb2tzIiwiaGFzaCIsIm5vdyIsIkRhdGUiLCJ1dWlkIiwiYXV0aG9yaXplIiwicHVycG9zZSIsIm1lbWJlcnNoaXAiLCJhdXRob3JpemVNZW1iZXJzaGlwIiwiaWRlbnRpdHkiLCJsZWdhY3kiLCJyZWNlaXB0IiwiYWN0aW9uIiwia2V5IiwicGF5bG9hZCIsInJlcXVlc3RJZCIsInBlcnNvbmFJZCIsInBheWxvYWRIYXNoIiwicmVjb3JkIiwidXNlcklkIiwicHJpb3IiLCJyZXN1bHQiLCJzYXZlIiwiX2tleSIsImFkZGVkIiwicmF0ZUxpbWl0IiwibGltaXQiLCJpbnRlcnZhbCIsIk1hdGgiLCJmbG9vciIsImFsbG93ZWQiLCJydW4iLCJvcGVyYXRpb24iLCJ3cml0ZSIsImF1dGhvcml6ZUlkZW50aXR5Iiwic2VuZE1lc3NhZ2UiLCJpbnB1dCIsIkJvb2xlYW4iLCJjbGllbnRNZXNzYWdlSWQiLCJzZW5kZXJQZXJzb25hSWQiLCJpc0FycmF5IiwiYXR0YWNobWVudElkcyIsImV2ZXJ5IiwiU2V0Iiwic2l6ZSIsInRyaW0iLCJyZXBseVRvTWVzc2FnZUlkIiwidW5kZWZpbmVkIiwicmVxdWVzdCIsImF0dGFjaG1lbnRzIiwiaW1hZ2VJZCIsInB1c2giLCJhdXRob3JpemVBdHRhY2htZW50IiwicXVvdGVkIiwiYXV0aG9yaXplTWVzc2FnZVZpc2libGUiLCJkZWxldGVkIiwibW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbiIsInRpbWVzdGFtcCIsInNlcXVlbmNlIiwiaWQiLCJOdW1iZXIiLCJpc1NhZmVJbnRlZ2VyIiwiY29udGVudFZlcnNpb24iLCJwcm9qZWN0aW9uIiwiY2xhc3NpZnlDb250ZW50IiwiY29udGVudFJldmlzaW9uIiwibW9iaWxlQ29udGVudFZlcnNpb24iLCJtb2JpbGVEZWNpc2lvbiIsImRlY2lzaW9uIiwicGxhdGZvcm1EaXNwb3NpdGlvbiIsIm1vZGlmaWVkIiwicmV2aXNpb24iLCJhcHBlbmRFdmVudCIsImFjdG9yUGVyc29uYUlkIiwia2luZCIsIm1lbWJlcnNoaXBFcG9jaCIsImVwb2NoIiwicmVzb3VyY2VJZCIsIm11dGF0ZU1lc3NhZ2UiLCJyZW1vdmUiLCJpZGVtcG90ZW5jeUtleSIsImV4cGVjdGVkUmV2aXNpb24iLCJqb2luU2VxdWVuY2UiLCJ1cGRhdGVkIiwicmVwbHkiLCJkZWxldGVNZXNzYWdlIiwiZWRpdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiJBQUFBLDJHQUEyRyxHQUMzRyxTQUFRQSxVQUFVLEVBQUVDLFVBQVUsUUFBTyxjQUFjO0FBRW5ELFNBQVFDLFNBQVMsUUFBTyxjQUFjO0FBQ3RDLFNBQVFDLGdCQUFnQixRQUFPLGtCQUFrQjtBQVFqRCxNQUFNQyxjQUFjLENBQUNDLFFBQTJCTCxXQUFXLFVBQVVNLE1BQU0sQ0FBQ0MsS0FBS0MsU0FBUyxDQUFDSCxRQUFRSSxNQUFNLENBQUM7QUFDMUcsTUFBTUMsWUFBWSxDQUFDQyxVQUF3QyxPQUFPQSxZQUFZLFlBQ3pFQyxNQUFNQyxJQUFJLENBQUNGLFNBQVNHLE1BQU0sSUFBSSxRQUM5QixDQUFDLGdGQUFnRkMsSUFBSSxDQUFDSjtBQUMzRixNQUFNSyxlQUFlLENBQUNDO0lBQ3BCLElBQUcsQ0FBQ0EsT0FBTztRQUNULE1BQU0sSUFBSWYsVUFBVTtJQUN0QjtBQUNGO0FBRUEsT0FBTyxNQUFNZ0IscUJBQXFCLE9BQ2hDQyxNQUFpQkMsZ0JBQXdCQztJQUV6QyxNQUFNQyxVQUFVLE1BQU1ILEtBQW9DLDJDQUEyQztRQUFDRTtJQUFTO0lBQy9HLElBQUcsQ0FBQ0MsV0FBV0EsUUFBUUYsY0FBYyxLQUFLQSxrQkFBa0JFLFFBQVFDLGlCQUFpQixLQUFLLEdBQUc7UUFDM0YsTUFBTSxJQUFJckIsVUFBVTtJQUN0QjtJQUNBLE9BQU9vQjtBQUNULEVBQUU7QUFFRixP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
@@ -0,0 +1,10 @@
1
+ import type { ApiContext } from '../types/auth.types.js';
2
+ import type { ChatQuery } from './membership.js';
3
+ export interface DurableTransactionCollections {
4
+ readonly exclusive?: readonly string[];
5
+ readonly read?: readonly string[];
6
+ readonly write?: readonly string[];
7
+ }
8
+ export declare const createDurableQuery: (context: ApiContext) => ChatQuery;
9
+ /** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */
10
+ export declare const createDurableTransaction: (context: ApiContext, collections: DurableTransactionCollections, query?: ChatQuery) => <T>(operation: (read: ChatQuery) => Promise<T>) => Promise<T>;
@@ -0,0 +1,53 @@
1
+ import { useDb } from '../utils/arangodbUtils.js';
2
+ export const createDurableQuery = (context)=>{
3
+ const db = useDb(context.databaseName);
4
+ return async (query, bindVars)=>{
5
+ const cursor = await db.query({
6
+ bindVars,
7
+ query
8
+ });
9
+ return cursor.next();
10
+ };
11
+ };
12
+ /** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */ export const createDurableTransaction = (context, collections, query)=>{
13
+ if (query) {
14
+ return (operation)=>operation(query);
15
+ }
16
+ const db = useDb(context.databaseName);
17
+ return async (operation)=>{
18
+ const transaction = await db.beginTransaction({
19
+ exclusive: [
20
+ ...collections.exclusive || []
21
+ ],
22
+ read: [
23
+ ...collections.read || []
24
+ ],
25
+ write: [
26
+ ...collections.write || []
27
+ ]
28
+ }, {
29
+ allowImplicit: false,
30
+ lockTimeout: 5,
31
+ waitForSync: true
32
+ });
33
+ const read = async (query, bindVars)=>{
34
+ const cursor = await transaction.step(()=>db.query({
35
+ bindVars,
36
+ query
37
+ }));
38
+ return cursor.next();
39
+ };
40
+ try {
41
+ const result = await operation(read);
42
+ await transaction.commit();
43
+ return result;
44
+ } catch (error) {
45
+ try {
46
+ await transaction.abort();
47
+ } catch {}
48
+ throw error;
49
+ }
50
+ };
51
+ };
52
+
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvdHJhbnNhY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDaGF0UXVlcnl9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZVRyYW5zYWN0aW9uQ29sbGVjdGlvbnMge1xuICByZWFkb25seSBleGNsdXNpdmU/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmVhZD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB3cml0ZT86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRHVyYWJsZVF1ZXJ5ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBDaGF0UXVlcnkgPT4ge1xuICBjb25zdCBkYiA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIGFzeW5jIDxUPihxdWVyeTogc3RyaW5nLCBiaW5kVmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBjdXJzb3IgPSBhd2FpdCBkYi5xdWVyeTxUPih7YmluZFZhcnMsIHF1ZXJ5fSk7XG4gICAgcmV0dXJuIGN1cnNvci5uZXh0KCk7XG4gIH07XG59O1xuXG4vKiogSW5qZWN0ZWQgcXVlcmllcyByZXRhaW4gY2FsbGVyLW93bmVkIHRyYW5zYWN0aW9uIGxpZmVjeWNsZTsgbmV2ZXIgZmFsbCBiYWNrIHRvIGFub3RoZXIgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVEdXJhYmxlVHJhbnNhY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbGxlY3Rpb25zOiBEdXJhYmxlVHJhbnNhY3Rpb25Db2xsZWN0aW9ucywgcXVlcnk/OiBDaGF0UXVlcnlcbikgPT4ge1xuICBpZihxdWVyeSkge1xuICAgIHJldHVybiA8VD4ob3BlcmF0aW9uOiAocmVhZDogQ2hhdFF1ZXJ5KSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiA9PiBvcGVyYXRpb24ocXVlcnkpO1xuICB9XG4gIGNvbnN0IGRiID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gYXN5bmMgPFQ+KG9wZXJhdGlvbjogKHJlYWQ6IENoYXRRdWVyeSkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgZGIuYmVnaW5UcmFuc2FjdGlvbih7XG4gICAgICBleGNsdXNpdmU6IFsuLi4oY29sbGVjdGlvbnMuZXhjbHVzaXZlIHx8IFtdKV0sIHJlYWQ6IFsuLi4oY29sbGVjdGlvbnMucmVhZCB8fCBbXSldLFxuICAgICAgd3JpdGU6IFsuLi4oY29sbGVjdGlvbnMud3JpdGUgfHwgW10pXVxuICAgIH0sIHthbGxvd0ltcGxpY2l0OiBmYWxzZSwgbG9ja1RpbWVvdXQ6IDUsIHdhaXRGb3JTeW5jOiB0cnVlfSk7XG4gICAgY29uc3QgcmVhZDogQ2hhdFF1ZXJ5ID0gYXN5bmMgPFI+KHF1ZXJ5OiBzdHJpbmcsIGJpbmRWYXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY29uc3QgY3Vyc29yID0gYXdhaXQgdHJhbnNhY3Rpb24uc3RlcCgoKSA9PiBkYi5xdWVyeTxSPih7YmluZFZhcnMsIHF1ZXJ5fSkpO1xuICAgICAgcmV0dXJuIGN1cnNvci5uZXh0KCk7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uKHJlYWQpO1xuICAgICAgYXdhaXQgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICB9IGNhdGNoeyAvKiBQcmVzZXJ2ZSBvcmlnaW5hbC9hbWJpZ3VvdXMgY29tbWl0IGVycm9yOyBuZXZlciByZXRyeSBtdXRhdGlvbnMuICovIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn07XG4iXSwibmFtZXMiOlsidXNlRGIiLCJjcmVhdGVEdXJhYmxlUXVlcnkiLCJjb250ZXh0IiwiZGIiLCJkYXRhYmFzZU5hbWUiLCJxdWVyeSIsImJpbmRWYXJzIiwiY3Vyc29yIiwibmV4dCIsImNyZWF0ZUR1cmFibGVUcmFuc2FjdGlvbiIsImNvbGxlY3Rpb25zIiwib3BlcmF0aW9uIiwidHJhbnNhY3Rpb24iLCJiZWdpblRyYW5zYWN0aW9uIiwiZXhjbHVzaXZlIiwicmVhZCIsIndyaXRlIiwiYWxsb3dJbXBsaWNpdCIsImxvY2tUaW1lb3V0Iiwid2FpdEZvclN5bmMiLCJzdGVwIiwicmVzdWx0IiwiY29tbWl0IiwiZXJyb3IiLCJhYm9ydCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsS0FBSyxRQUFPLDRCQUE0QjtBQVdoRCxPQUFPLE1BQU1DLHFCQUFxQixDQUFDQztJQUNqQyxNQUFNQyxLQUFLSCxNQUFNRSxRQUFRRSxZQUFZO0lBQ3JDLE9BQU8sT0FBVUMsT0FBZUM7UUFDOUIsTUFBTUMsU0FBUyxNQUFNSixHQUFHRSxLQUFLLENBQUk7WUFBQ0M7WUFBVUQ7UUFBSztRQUNqRCxPQUFPRSxPQUFPQyxJQUFJO0lBQ3BCO0FBQ0YsRUFBRTtBQUVGLHVHQUF1RyxHQUN2RyxPQUFPLE1BQU1DLDJCQUEyQixDQUN0Q1AsU0FBcUJRLGFBQTRDTDtJQUVqRSxJQUFHQSxPQUFPO1FBQ1IsT0FBTyxDQUFJTSxZQUEyREEsVUFBVU47SUFDbEY7SUFDQSxNQUFNRixLQUFLSCxNQUFNRSxRQUFRRSxZQUFZO0lBQ3JDLE9BQU8sT0FBVU87UUFDZixNQUFNQyxjQUFjLE1BQU1ULEdBQUdVLGdCQUFnQixDQUFDO1lBQzVDQyxXQUFXO21CQUFLSixZQUFZSSxTQUFTLElBQUksRUFBRTthQUFFO1lBQUVDLE1BQU07bUJBQUtMLFlBQVlLLElBQUksSUFBSSxFQUFFO2FBQUU7WUFDbEZDLE9BQU87bUJBQUtOLFlBQVlNLEtBQUssSUFBSSxFQUFFO2FBQUU7UUFDdkMsR0FBRztZQUFDQyxlQUFlO1lBQU9DLGFBQWE7WUFBR0MsYUFBYTtRQUFJO1FBQzNELE1BQU1KLE9BQWtCLE9BQVVWLE9BQWVDO1lBQy9DLE1BQU1DLFNBQVMsTUFBTUssWUFBWVEsSUFBSSxDQUFDLElBQU1qQixHQUFHRSxLQUFLLENBQUk7b0JBQUNDO29CQUFVRDtnQkFBSztZQUN4RSxPQUFPRSxPQUFPQyxJQUFJO1FBQ3BCO1FBQ0EsSUFBSTtZQUNGLE1BQU1hLFNBQVMsTUFBTVYsVUFBVUk7WUFDL0IsTUFBTUgsWUFBWVUsTUFBTTtZQUN4QixPQUFPRDtRQUNULEVBQUUsT0FBTUUsT0FBTztZQUNiLElBQUk7Z0JBQ0YsTUFBTVgsWUFBWVksS0FBSztZQUN6QixFQUFFLE9BQUssQ0FBeUU7WUFDaEYsTUFBTUQ7UUFDUjtJQUNGO0FBQ0YsRUFBRSJ9
@@ -0,0 +1,81 @@
1
+ export type ConversationKind = 'direct' | 'group';
2
+ export type ConversationState = 'active' | 'closed' | 'forming';
3
+ export type MembershipRole = 'admin' | 'member' | 'owner';
4
+ export type MembershipState = 'active' | 'left' | 'removed';
5
+ /** An epoch is a grant for a bounded history interval, never a client-selected identity. */
6
+ export interface ConversationMembership {
7
+ readonly conversationId: string;
8
+ readonly epoch: string;
9
+ readonly joinSequence: number;
10
+ readonly leftSequence?: number;
11
+ readonly personaId: string;
12
+ readonly revision: number;
13
+ readonly role: MembershipRole;
14
+ readonly state: MembershipState;
15
+ }
16
+ /** Names must pass the caller's audience projection before being serialized. */
17
+ export interface ConversationSummary {
18
+ readonly activeMemberCount: number;
19
+ readonly conversationId: string;
20
+ readonly kind: ConversationKind;
21
+ readonly membership: ConversationMembership;
22
+ readonly membershipRevision: number;
23
+ readonly name?: string;
24
+ readonly state: ConversationState;
25
+ }
26
+ export interface ConversationInvite {
27
+ readonly conversationId: string;
28
+ readonly expiresAt: number;
29
+ readonly inviteId: string;
30
+ readonly invitedByPersonaId: string;
31
+ readonly revision: number;
32
+ readonly state: 'accepted' | 'declined' | 'expired' | 'pending' | 'revoked';
33
+ }
34
+ export interface CreateDirectInput {
35
+ readonly participantPersonaId: string;
36
+ }
37
+ export interface CreateGroupInput {
38
+ readonly idempotencyKey: string;
39
+ readonly memberPersonaIds: readonly string[];
40
+ readonly name: string;
41
+ }
42
+ export interface InviteMemberInput {
43
+ readonly conversationId: string;
44
+ readonly expectedRevision: number;
45
+ readonly idempotencyKey: string;
46
+ readonly personaId: string;
47
+ }
48
+ export interface AcceptInviteInput {
49
+ readonly expectedRevision: number;
50
+ readonly idempotencyKey: string;
51
+ readonly inviteId: string;
52
+ }
53
+ export type DeclineInviteInput = AcceptInviteInput;
54
+ export interface ChangeMemberRoleInput {
55
+ readonly conversationId: string;
56
+ readonly expectedRevision: number;
57
+ readonly idempotencyKey: string;
58
+ readonly personaId: string;
59
+ readonly role: Exclude<MembershipRole, 'owner'>;
60
+ }
61
+ export interface RemoveMemberInput {
62
+ readonly conversationId: string;
63
+ readonly expectedRevision: number;
64
+ readonly idempotencyKey: string;
65
+ readonly personaId: string;
66
+ }
67
+ export interface LeaveConversationInput {
68
+ readonly conversationId: string;
69
+ readonly expectedRevision: number;
70
+ readonly idempotencyKey: string;
71
+ }
72
+ export type TransferOwnershipInput = RemoveMemberInput;
73
+ export interface ChatEvent {
74
+ readonly conversationId: string;
75
+ readonly eventId: string;
76
+ readonly eventSequence: number;
77
+ readonly kind: 'membership.changed' | 'message.changed' | 'receipt.changed';
78
+ readonly resourceId: string;
79
+ readonly revision: number;
80
+ }
81
+ export type { AuthorizedMembership, ChatIdentity, ChatQuery, MembershipAccessInput } from './membership.js';
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uS2luZCA9ICdkaXJlY3QnIHwgJ2dyb3VwJztcbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvblN0YXRlID0gJ2FjdGl2ZScgfCAnY2xvc2VkJyB8ICdmb3JtaW5nJztcbmV4cG9ydCB0eXBlIE1lbWJlcnNoaXBSb2xlID0gJ2FkbWluJyB8ICdtZW1iZXInIHwgJ293bmVyJztcbmV4cG9ydCB0eXBlIE1lbWJlcnNoaXBTdGF0ZSA9ICdhY3RpdmUnIHwgJ2xlZnQnIHwgJ3JlbW92ZWQnO1xuXG4vKiogQW4gZXBvY2ggaXMgYSBncmFudCBmb3IgYSBib3VuZGVkIGhpc3RvcnkgaW50ZXJ2YWwsIG5ldmVyIGEgY2xpZW50LXNlbGVjdGVkIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25NZW1iZXJzaGlwIHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXBvY2g6IHN0cmluZztcbiAgcmVhZG9ubHkgam9pblNlcXVlbmNlOiBudW1iZXI7XG4gIHJlYWRvbmx5IGxlZnRTZXF1ZW5jZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgcGVyc29uYUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvbGU6IE1lbWJlcnNoaXBSb2xlO1xuICByZWFkb25seSBzdGF0ZTogTWVtYmVyc2hpcFN0YXRlO1xufVxuXG4vKiogTmFtZXMgbXVzdCBwYXNzIHRoZSBjYWxsZXIncyBhdWRpZW5jZSBwcm9qZWN0aW9uIGJlZm9yZSBiZWluZyBzZXJpYWxpemVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25TdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYWN0aXZlTWVtYmVyQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogQ29udmVyc2F0aW9uS2luZDtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcDogQ29udmVyc2F0aW9uTWVtYmVyc2hpcDtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25JbnZpdGUge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW52aXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52aXRlZEJ5UGVyc29uYUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0YXRlOiAnYWNjZXB0ZWQnIHwgJ2RlY2xpbmVkJyB8ICdleHBpcmVkJyB8ICdwZW5kaW5nJyB8ICdyZXZva2VkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVEaXJlY3RJbnB1dCB7XG4gIHJlYWRvbmx5IHBhcnRpY2lwYW50UGVyc29uYUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlR3JvdXBJbnB1dCB7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lbWJlclBlcnNvbmFJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52aXRlTWVtYmVySW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2VwdEludml0ZUlucHV0IHtcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBpbnZpdGVJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBEZWNsaW5lSW52aXRlSW5wdXQgPSBBY2NlcHRJbnZpdGVJbnB1dDtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VNZW1iZXJSb2xlSW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlOiBFeGNsdWRlPE1lbWJlcnNoaXBSb2xlLCAnb3duZXInPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVNZW1iZXJJbnB1dCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcGVyc29uYUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVhdmVDb252ZXJzYXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmZXJPd25lcnNoaXBJbnB1dCA9IFJlbW92ZU1lbWJlcklucHV0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRFdmVudCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRTZXF1ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSBraW5kOiAnbWVtYmVyc2hpcC5jaGFuZ2VkJyB8ICdtZXNzYWdlLmNoYW5nZWQnIHwgJ3JlY2VpcHQuY2hhbmdlZCc7XG4gIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmV2aXNpb246IG51bWJlcjtcbn1cblxuXG5leHBvcnQgdHlwZSB7QXV0aG9yaXplZE1lbWJlcnNoaXAsIENoYXRJZGVudGl0eSwgQ2hhdFF1ZXJ5LCBNZW1iZXJzaGlwQWNjZXNzSW5wdXR9IGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0ZBLFdBQTBHIn0=
@@ -166,4 +166,4 @@ const applyMiddleware = (tc, middlewares)=>{
166
166
  };
167
167
  };
168
168
 
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvaGFuZGxlcnMvZ3JhcGhxbEhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtncmFwaHFsfSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5pbXBvcnQgdHlwZSB7T2JqZWN0VHlwZUNvbXBvc2VyLCBTY2hlbWFDb21wb3Nlcn0gZnJvbSAnZ3JhcGhxbC1jb21wb3NlJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdE11dGF0aW9uc30gZnJvbSAnLi4vbXV0YXRpb25zL2luZGV4LmpzJztcbmltcG9ydCB7cmVnaXN0ZXJEZWZhdWx0UXVlcmllc30gZnJvbSAnLi4vcXVlcmllcy9pbmRleC5qcyc7XG5pbXBvcnQge2V4dHJhY3RMYW5ndWFnZUNvbnRleHR9IGZyb20gJy4uL3V0aWxzL2NvbnRleHRVdGlscy5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIGdldEdxbEZpZWxkcywgZ2V0TGFtYmRhRGF0YSwgdHlwZSBMYW1iZGFEYXRhfSBmcm9tICcuLi91dGlscy9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBUElHYXRld2F5UHJveHlFdmVudFYyfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB0eXBlIHtFeGVjdXRpb25SZXN1bHR9IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBHcmFwaHFsUmVzb2x2ZXJNaWRkbGV3YXJlID0gKFxuICByZXNvbHZlOiAoc291cmNlOiB1bmtub3duLCBhcmdzOiB1bmtub3duLCBjb250ZXh0OiBBcGlDb250ZXh0LCBpbmZvOiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bixcbiAgc291cmNlOiB1bmtub3duLFxuICBhcmdzOiB1bmtub3duLFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbmZvOiB1bmtub3duXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG50eXBlIEdyYXBocWxGaWVsZENvbmZpZ01hcCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBHcmFwaHFsSGFuZGxlck9wdGlvbnMgPSB7XG4gIGNvbXBvc2VyPzogU2NoZW1hQ29tcG9zZXI8YW55PjtcbiAgY29udGV4dD86IEFwaUNvbnRleHQ7XG4gIGV4dHJhTXV0YXRpb25zPzogR3JhcGhxbEZpZWxkQ29uZmlnTWFwO1xuICBleHRyYVF1ZXJpZXM/OiBHcmFwaHFsRmllbGRDb25maWdNYXA7XG4gIGluY2x1ZGVEZWZhdWx0cz86IGJvb2xlYW47XG4gIG1pZGRsZXdhcmU/OiBHcmFwaHFsUmVzb2x2ZXJNaWRkbGV3YXJlIHwgR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZVtdO1xufTtcblxuY29uc3QgYWRkRmllbGRzTWlkZGxld2FyZTogR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZSA9IChyZXNvbHZlLCBzb3VyY2UsIGFyZ3MsIGNvbnRleHQ6IEFwaUNvbnRleHQsIGluZm8pID0+IHtcbiAgY29uc3QgZW5oYW5jZWRDb250ZXh0ID0ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgZmllbGRzOiBnZXRHcWxGaWVsZHMoaW5mbylcbiAgfTtcblxuICByZXR1cm4gcmVzb2x2ZShzb3VyY2UsIGFyZ3MsIGVuaGFuY2VkQ29udGV4dCwgaW5mbyk7XG59O1xuXG5jb25zdCBhZGRNaXNzaW5nRmllbGRzID0gKHRjOiBPYmplY3RUeXBlQ29tcG9zZXI8dW5rbm93biwgdW5rbm93bj4sIGZpZWxkczogR3JhcGhxbEZpZWxkQ29uZmlnTWFwKTogdm9pZCA9PiB7XG4gIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRDb25maWddKSA9PiB7XG4gICAgaWYoIXRjLmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgIHRjLnNldEZpZWxkKGZpZWxkTmFtZSwgZmllbGRDb25maWcgYXMgYW55KTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgYXBwbHlNaWRkbGV3YXJlID0gKFxuICB0YzogT2JqZWN0VHlwZUNvbXBvc2VyPHVua25vd24sIHVua25vd24+LFxuICBtaWRkbGV3YXJlczogR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZVtdXG4pOiB2b2lkID0+IHtcbiAgaWYobWlkZGxld2FyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgT2JqZWN0LmtleXModGMuZ2V0RmllbGRzKCkpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZih0Yy5oYXNSZXNvbHZlcihmaWVsZE5hbWUpKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUpID0+IHRjLndyYXBSZXNvbHZlcihmaWVsZE5hbWUsIG1pZGRsZXdhcmUgYXMgYW55KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwaW5nIGZpZWxkICR7ZmllbGROYW1lfSAtIG5vdCBhIHJlc29sdmVyOmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQVBJIEdhdGV3YXktY29tcGF0aWJsZSBHcmFwaFFMIGhhbmRsZXIgZm9yIFJlYWt0b3IuXG4gKlxuICogUmVxdWVzdCBleHBlY3RhdGlvbnM6XG4gKiAtIGBldmVudC5ib2R5LnF1ZXJ5YCBpcyBhIEdyYXBoUUwgb3BlcmF0aW9uIHN0cmluZy5cbiAqIC0gYGV2ZW50LmJvZHkudmFyaWFibGVzYCBpcyBvcHRpb25hbCBvcGVyYXRpb24gdmFyaWFibGVzLlxuICpcbiAqIFJ1bnRpbWUgYmVoYXZpb3I6XG4gKiAtIEJ1aWxkcyBwZXItcmVxdWVzdCBjb250ZXh0IChgY29uZmlnYCwgYXV0aC9zZXNzaW9uIGNvbnRleHQsIGxhbmd1YWdlIGNvbnRleHQsIHJlcXVlc3QpLlxuICogLSBBcHBsaWVzIHJlc29sdmVyIG1pZGRsZXdhcmUgdG8gZXhwb3NlIHNlbGVjdGVkIEdyYXBoUUwgZmllbGRzIG9uIGBjb250ZXh0LmZpZWxkc2AuXG4gKiAtIEV4ZWN1dGVzIG9wZXJhdGlvbiB1c2luZyB0aGUgY29tcG9zZWQgc2NoZW1hLlxuICpcbiAqIFJlc3BvbnNlIGNvbnRyYWN0OlxuICogLSBSZXR1cm5zIGB7c3RhdHVzQ29kZSwgaGVhZGVycywgYm9keX1gIHdpdGggSlNPTiBib2R5LlxuICogLSBSZXR1cm5zIGAyMDBgIGZvciBHcmFwaFFMIHJlc3BvbnNlcyAoaW5jbHVkaW5nIEdyYXBoUUwgZXJyb3JzIGluIGBlcnJvcnNgKS5cbiAqIC0gUmV0dXJucyBgNTAwYCBvbmx5IGZvciBoYW5kbGVyL3J1bnRpbWUgZmFpbHVyZXMuXG4gKlxuICogU2VlIFJFQURNRTogXCJHcmFwaFFMIEhhbmRsZXIgVXNhZ2VcIiBmb3IgaW50ZWdyYXRpb24gZXhhbXBsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVHcmFwaHFsSGFuZGxlciA9IChvcHRpb25zOiBHcmFwaHFsSGFuZGxlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBjb21wb3NlciA9IG9wdGlvbnMuY29tcG9zZXIgfHwgc2NoZW1hQ29tcG9zZXI7XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dCB8fCB7fSkgYXMgQXBpQ29udGV4dDtcbiAgY29uc3Qgc2hvdWxkSW5jbHVkZURlZmF1bHRzID0gb3B0aW9ucy5pbmNsdWRlRGVmYXVsdHMgIT09IGZhbHNlO1xuICBjb25zdCBtaWRkbGV3YXJlTGlzdCA9IFtcbiAgICBhZGRGaWVsZHNNaWRkbGV3YXJlLFxuICAgIC4uLihBcnJheS5pc0FycmF5KG9wdGlvbnMubWlkZGxld2FyZSlcbiAgICAgID8gb3B0aW9ucy5taWRkbGV3YXJlXG4gICAgICA6IG9wdGlvbnMubWlkZGxld2FyZSA/IFtvcHRpb25zLm1pZGRsZXdhcmVdIDogW10pXG4gIF07XG5cbiAgaWYoc2hvdWxkSW5jbHVkZURlZmF1bHRzKSB7XG4gICAgcmVnaXN0ZXJEZWZhdWx0UXVlcmllcyhjb21wb3Nlcik7XG4gICAgcmVnaXN0ZXJEZWZhdWx0TXV0YXRpb25zKGNvbXBvc2VyKTtcbiAgfVxuXG4gIGlmKG9wdGlvbnMuZXh0cmFRdWVyaWVzKSB7XG4gICAgYWRkTWlzc2luZ0ZpZWxkcyhjb21wb3Nlci5RdWVyeSwgb3B0aW9ucy5leHRyYVF1ZXJpZXMpO1xuICB9XG5cbiAgaWYob3B0aW9ucy5leHRyYU11dGF0aW9ucykge1xuICAgIGFkZE1pc3NpbmdGaWVsZHMoY29tcG9zZXIuTXV0YXRpb24sIG9wdGlvbnMuZXh0cmFNdXRhdGlvbnMpO1xuICB9XG5cbiAgYXBwbHlNaWRkbGV3YXJlKGNvbXBvc2VyLlF1ZXJ5LCBtaWRkbGV3YXJlTGlzdCk7XG4gIGFwcGx5TWlkZGxld2FyZShjb21wb3Nlci5NdXRhdGlvbiwgbWlkZGxld2FyZUxpc3QpO1xuXG4gIGNvbnN0IHNjaGVtYSA9IGNvbXBvc2VyLmJ1aWxkU2NoZW1hKCk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogQVBJR2F0ZXdheVByb3h5RXZlbnRWMik6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlZENvbnRleHQ6IEFwaUNvbnRleHQgPSBhd2FpdCBjcmVhdGVDb250ZXh0KGluaXRpYWxDb250ZXh0LCBldmVudCk7XG4gICAgICBjb25zdCBsYW5ndWFnZUNvbnRleHQgPSBleHRyYWN0TGFuZ3VhZ2VDb250ZXh0KGV2ZW50KTtcblxuICAgICAgY29uc3QgY29udGV4dFdpdGhMYW5ndWFnZSA9IHtcbiAgICAgICAgY29uZmlnOiBDb25maWcuZ2V0KCksXG4gICAgICAgIC4uLnVwZGF0ZWRDb250ZXh0LFxuICAgICAgICBsYW5ndWFnZUNvbnRleHQsXG4gICAgICAgIHJlcXVlc3Q6IGV2ZW50XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXJzZURhdGEgPSBnZXRMYW1iZGFEYXRhKGV2ZW50IGFzIHVua25vd24gYXMgTGFtYmRhRGF0YSk7XG4gICAgICBjb25zdCB7Ym9keX0gPSBwYXJzZURhdGE7XG5cbiAgICAgIGlmKCFib2R5Py5xdWVyeSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05vIEdyYXBoUUwgcXVlcnkgZm91bmQgaW4gcmVxdWVzdCBib2R5Jyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3JzOiBbe1xuICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gR3JhcGhRTCBxdWVyeSBmb3VuZCBpbiByZXF1ZXN0IGJvZHknXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoZ3JhcGhxbCh7XG4gICAgICAgICAgY29udGV4dFZhbHVlOiBjb250ZXh0V2l0aExhbmd1YWdlLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBzb3VyY2U6IGJvZHkucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVWYWx1ZXM6IGJvZHkudmFyaWFibGVzXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZihyZXN1bHQuZXJyb3JzICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0dyYXBoUUwgZXhlY3V0aW9uIGVycm9yczonLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDBcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2goZ3JhcGhxbEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBHcmFwaFFMIGV4ZWN1dGlvbjonLCBncmFwaHFsRXJyb3IpO1xuXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdyYXBocWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZ3JhcGhxbEVycm9yLm1lc3NhZ2UgOiAnR3JhcGhRTCBleGVjdXRpb24gZXJyb3InO1xuICAgICAgICBjb25zdCBlcnJvclN0YWNrID0gZ3JhcGhxbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBncmFwaHFsRXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3JzOiBbe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IGVycm9yU3RhY2sgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnI6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0hhbmRsZXIgZXJyb3I6Jywge1xuICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhhbmRsZXInO1xuICAgICAgY29uc3QgZXJyb3JTdGFjayA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcnM6IFt7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgPyBlcnJvclN0YWNrIDogdW5kZWZpbmVkXG4gICAgICAgICAgfV1cbiAgICAgICAgfSksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdyYXBocWwiLCJzY2hlbWFDb21wb3NlciIsIkNvbmZpZyIsInJlZ2lzdGVyRGVmYXVsdE11dGF0aW9ucyIsInJlZ2lzdGVyRGVmYXVsdFF1ZXJpZXMiLCJleHRyYWN0TGFuZ3VhZ2VDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImdldEdxbEZpZWxkcyIsImdldExhbWJkYURhdGEiLCJhZGRGaWVsZHNNaWRkbGV3YXJlIiwicmVzb2x2ZSIsInNvdXJjZSIsImFyZ3MiLCJjb250ZXh0IiwiaW5mbyIsImVuaGFuY2VkQ29udGV4dCIsImZpZWxkcyIsImFkZE1pc3NpbmdGaWVsZHMiLCJ0YyIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwiZmllbGROYW1lIiwiZmllbGRDb25maWciLCJoYXNGaWVsZCIsInNldEZpZWxkIiwiYXBwbHlNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJsZW5ndGgiLCJrZXlzIiwiZ2V0RmllbGRzIiwiaGFzUmVzb2x2ZXIiLCJtaWRkbGV3YXJlIiwid3JhcFJlc29sdmVyIiwiZXJyb3IiLCJjb25zb2xlIiwid2FybiIsIm1lc3NhZ2UiLCJjcmVhdGVHcmFwaHFsSGFuZGxlciIsIm9wdGlvbnMiLCJjb21wb3NlciIsImluaXRpYWxDb250ZXh0Iiwic2hvdWxkSW5jbHVkZURlZmF1bHRzIiwiaW5jbHVkZURlZmF1bHRzIiwibWlkZGxld2FyZUxpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJleHRyYVF1ZXJpZXMiLCJRdWVyeSIsImV4dHJhTXV0YXRpb25zIiwiTXV0YXRpb24iLCJzY2hlbWEiLCJidWlsZFNjaGVtYSIsImV2ZW50IiwidXBkYXRlZENvbnRleHQiLCJsYW5ndWFnZUNvbnRleHQiLCJjb250ZXh0V2l0aExhbmd1YWdlIiwiY29uZmlnIiwiZ2V0IiwicmVxdWVzdCIsInBhcnNlRGF0YSIsImJvZHkiLCJxdWVyeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwiZXJyb3JzIiwiaGVhZGVycyIsInN0YXR1c0NvZGUiLCJyZXN1bHQiLCJQcm9taXNlIiwiY29udGV4dFZhbHVlIiwidmFyaWFibGVWYWx1ZXMiLCJ2YXJpYWJsZXMiLCJncmFwaHFsRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJFcnJvciIsImVycm9yU3RhY2siLCJzdGFjayIsInVuZGVmaW5lZCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImVyciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsT0FBTyxRQUFPLFVBQVU7QUFDaEMsU0FBUUMsY0FBYyxRQUFPLGtCQUFrQjtBQUcvQyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyx3QkFBd0IsUUFBTyx3QkFBd0I7QUFDL0QsU0FBUUMsc0JBQXNCLFFBQU8sc0JBQXNCO0FBQzNELFNBQVFDLHNCQUFzQixRQUFPLDJCQUEyQjtBQUNoRSxTQUFRQyxhQUFhLEVBQUVDLFlBQVksRUFBRUMsYUFBYSxRQUF3QixvQkFBb0I7QUF5QjlGLE1BQU1DLHNCQUFpRCxDQUFDQyxTQUFTQyxRQUFRQyxNQUFNQyxTQUFxQkM7SUFDbEcsTUFBTUMsa0JBQWtCO1FBQ3RCLEdBQUdGLE9BQU87UUFDVkcsUUFBUVQsYUFBYU87SUFDdkI7SUFFQSxPQUFPSixRQUFRQyxRQUFRQyxNQUFNRyxpQkFBaUJEO0FBQ2hEO0FBRUEsTUFBTUcsbUJBQW1CLENBQUNDLElBQTBDRjtJQUNsRUcsT0FBT0MsT0FBTyxDQUFDSixRQUFRSyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxXQUFXQyxZQUFZO1FBQ3RELElBQUcsQ0FBQ0wsR0FBR00sUUFBUSxDQUFDRixZQUFZO1lBQzFCSixHQUFHTyxRQUFRLENBQUNILFdBQVdDO1FBQ3pCO0lBQ0Y7QUFDRjtBQUVBLE1BQU1HLGtCQUFrQixDQUN0QlIsSUFDQVM7SUFFQSxJQUFHQSxZQUFZQyxNQUFNLEtBQUssR0FBRztRQUMzQjtJQUNGO0lBRUFULE9BQU9VLElBQUksQ0FBQ1gsR0FBR1ksU0FBUyxJQUFJVCxPQUFPLENBQUMsQ0FBQ0M7UUFDbkMsSUFBSTtZQUNGLElBQUdKLEdBQUdhLFdBQVcsQ0FBQ1QsWUFBWTtnQkFDNUJLLFlBQVlOLE9BQU8sQ0FBQyxDQUFDVyxhQUFlZCxHQUFH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
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvaGFuZGxlcnMvZ3JhcGhxbEhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtncmFwaHFsfSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5pbXBvcnQgdHlwZSB7T2JqZWN0VHlwZUNvbXBvc2VyLCBTY2hlbWFDb21wb3Nlcn0gZnJvbSAnZ3JhcGhxbC1jb21wb3NlJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdE11dGF0aW9uc30gZnJvbSAnLi4vbXV0YXRpb25zL2luZGV4LmpzJztcbmltcG9ydCB7cmVnaXN0ZXJEZWZhdWx0UXVlcmllc30gZnJvbSAnLi4vcXVlcmllcy9pbmRleC5qcyc7XG5pbXBvcnQge2V4dHJhY3RMYW5ndWFnZUNvbnRleHR9IGZyb20gJy4uL3V0aWxzL2NvbnRleHRVdGlscy5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIGdldEdxbEZpZWxkcywgZ2V0TGFtYmRhRGF0YSwgdHlwZSBMYW1iZGFEYXRhfSBmcm9tICcuLi91dGlscy9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBUElHYXRld2F5UHJveHlFdmVudFYyfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB0eXBlIHtFeGVjdXRpb25SZXN1bHR9IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBHcmFwaHFsUmVzb2x2ZXJNaWRkbGV3YXJlID0gKFxuICByZXNvbHZlOiAoc291cmNlOiB1bmtub3duLCBhcmdzOiB1bmtub3duLCBjb250ZXh0OiBBcGlDb250ZXh0LCBpbmZvOiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bixcbiAgc291cmNlOiB1bmtub3duLFxuICBhcmdzOiB1bmtub3duLFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbmZvOiB1bmtub3duXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG50eXBlIEdyYXBocWxGaWVsZENvbmZpZ01hcCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBHcmFwaHFsSGFuZGxlck9wdGlvbnMgPSB7XG4gIGNvbXBvc2VyPzogU2NoZW1hQ29tcG9zZXI8YW55PjtcbiAgY29udGV4dD86IEFwaUNvbnRleHQ7XG4gIGV4dHJhTXV0YXRpb25zPzogR3JhcGhxbEZpZWxkQ29uZmlnTWFwO1xuICBleHRyYVF1ZXJpZXM/OiBHcmFwaHFsRmllbGRDb25maWdNYXA7XG4gIGluY2x1ZGVEZWZhdWx0cz86IGJvb2xlYW47XG4gIG1pZGRsZXdhcmU/OiBHcmFwaHFsUmVzb2x2ZXJNaWRkbGV3YXJlIHwgR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZVtdO1xufTtcblxuY29uc3QgYWRkRmllbGRzTWlkZGxld2FyZTogR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZSA9IChyZXNvbHZlLCBzb3VyY2UsIGFyZ3MsIGNvbnRleHQ6IEFwaUNvbnRleHQsIGluZm8pID0+IHtcbiAgY29uc3QgZW5oYW5jZWRDb250ZXh0ID0ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgZmllbGRzOiBnZXRHcWxGaWVsZHMoaW5mbylcbiAgfTtcblxuICByZXR1cm4gcmVzb2x2ZShzb3VyY2UsIGFyZ3MsIGVuaGFuY2VkQ29udGV4dCwgaW5mbyk7XG59O1xuXG5jb25zdCBhZGRNaXNzaW5nRmllbGRzID0gKHRjOiBPYmplY3RUeXBlQ29tcG9zZXI8dW5rbm93biwgdW5rbm93bj4sIGZpZWxkczogR3JhcGhxbEZpZWxkQ29uZmlnTWFwKTogdm9pZCA9PiB7XG4gIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRDb25maWddKSA9PiB7XG4gICAgaWYoIXRjLmhhc0ZpZWxkKGZpZWxkTmFtZSkpIHtcbiAgICAgIHRjLnNldEZpZWxkKGZpZWxkTmFtZSwgZmllbGRDb25maWcgYXMgYW55KTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgYXBwbHlNaWRkbGV3YXJlID0gKFxuICB0YzogT2JqZWN0VHlwZUNvbXBvc2VyPHVua25vd24sIHVua25vd24+LFxuICBtaWRkbGV3YXJlczogR3JhcGhxbFJlc29sdmVyTWlkZGxld2FyZVtdXG4pOiB2b2lkID0+IHtcbiAgaWYobWlkZGxld2FyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgT2JqZWN0LmtleXModGMuZ2V0RmllbGRzKCkpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZih0Yy5oYXNSZXNvbHZlcihmaWVsZE5hbWUpKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUpID0+IHRjLndyYXBSZXNvbHZlcihmaWVsZE5hbWUsIG1pZGRsZXdhcmUgYXMgYW55KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwaW5nIGZpZWxkICR7ZmllbGROYW1lfSAtIG5vdCBhIHJlc29sdmVyOmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQVBJIEdhdGV3YXktY29tcGF0aWJsZSBHcmFwaFFMIGhhbmRsZXIgZm9yIFJlYWt0b3IuXG4gKlxuICogUmVxdWVzdCBleHBlY3RhdGlvbnM6XG4gKiAtIGBldmVudC5ib2R5LnF1ZXJ5YCBpcyBhIEdyYXBoUUwgb3BlcmF0aW9uIHN0cmluZy5cbiAqIC0gYGV2ZW50LmJvZHkudmFyaWFibGVzYCBpcyBvcHRpb25hbCBvcGVyYXRpb24gdmFyaWFibGVzLlxuICpcbiAqIFJ1bnRpbWUgYmVoYXZpb3I6XG4gKiAtIEJ1aWxkcyBwZXItcmVxdWVzdCBjb250ZXh0IChgY29uZmlnYCwgYXV0aC9zZXNzaW9uIGNvbnRleHQsIGxhbmd1YWdlIGNvbnRleHQsIHJlcXVlc3QpLlxuICogLSBBcHBsaWVzIHJlc29sdmVyIG1pZGRsZXdhcmUgdG8gZXhwb3NlIHNlbGVjdGVkIEdyYXBoUUwgZmllbGRzIG9uIGBjb250ZXh0LmZpZWxkc2AuXG4gKiAtIEV4ZWN1dGVzIG9wZXJhdGlvbiB1c2luZyB0aGUgY29tcG9zZWQgc2NoZW1hLlxuICpcbiAqIFJlc3BvbnNlIGNvbnRyYWN0OlxuICogLSBSZXR1cm5zIGB7c3RhdHVzQ29kZSwgaGVhZGVycywgYm9keX1gIHdpdGggSlNPTiBib2R5LlxuICogLSBSZXR1cm5zIGAyMDBgIGZvciBHcmFwaFFMIHJlc3BvbnNlcyAoaW5jbHVkaW5nIEdyYXBoUUwgZXJyb3JzIGluIGBlcnJvcnNgKS5cbiAqIC0gUmV0dXJucyBgNTAwYCBvbmx5IGZvciBoYW5kbGVyL3J1bnRpbWUgZmFpbHVyZXMuXG4gKlxuICogU2VlIFJFQURNRTogXCJHcmFwaFFMIEhhbmRsZXIgVXNhZ2VcIiBmb3IgaW50ZWdyYXRpb24gZXhhbXBsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVHcmFwaHFsSGFuZGxlciA9IChvcHRpb25zOiBHcmFwaHFsSGFuZGxlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBjb21wb3NlciA9IG9wdGlvbnMuY29tcG9zZXIgfHwgc2NoZW1hQ29tcG9zZXI7XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dCB8fCB7fSkgYXMgQXBpQ29udGV4dDtcbiAgY29uc3Qgc2hvdWxkSW5jbHVkZURlZmF1bHRzID0gb3B0aW9ucy5pbmNsdWRlRGVmYXVsdHMgIT09IGZhbHNlO1xuICBjb25zdCBtaWRkbGV3YXJlTGlzdCA9IFtcbiAgICBhZGRGaWVsZHNNaWRkbGV3YXJlLFxuICAgIC4uLihBcnJheS5pc0FycmF5KG9wdGlvbnMubWlkZGxld2FyZSlcbiAgICAgID8gb3B0aW9ucy5taWRkbGV3YXJlXG4gICAgICA6IG9wdGlvbnMubWlkZGxld2FyZSA/IFtvcHRpb25zLm1pZGRsZXdhcmVdIDogW10pXG4gIF07XG5cbiAgaWYoc2hvdWxkSW5jbHVkZURlZmF1bHRzKSB7XG4gICAgcmVnaXN0ZXJEZWZhdWx0UXVlcmllcyhjb21wb3Nlcik7XG4gICAgcmVnaXN0ZXJEZWZhdWx0TXV0YXRpb25zKGNvbXBvc2VyKTtcbiAgfVxuXG4gIGlmKG9wdGlvbnMuZXh0cmFRdWVyaWVzKSB7XG4gICAgYWRkTWlzc2luZ0ZpZWxkcyhjb21wb3Nlci5RdWVyeSwgb3B0aW9ucy5leHRyYVF1ZXJpZXMpO1xuICB9XG5cbiAgaWYob3B0aW9ucy5leHRyYU11dGF0aW9ucykge1xuICAgIGFkZE1pc3NpbmdGaWVsZHMoY29tcG9zZXIuTXV0YXRpb24sIG9wdGlvbnMuZXh0cmFNdXRhdGlvbnMpO1xuICB9XG5cbiAgYXBwbHlNaWRkbGV3YXJlKGNvbXBvc2VyLlF1ZXJ5LCBtaWRkbGV3YXJlTGlzdCk7XG4gIGFwcGx5TWlkZGxld2FyZShjb21wb3Nlci5NdXRhdGlvbiwgbWlkZGxld2FyZUxpc3QpO1xuXG4gIGNvbnN0IHNjaGVtYSA9IGNvbXBvc2VyLmJ1aWxkU2NoZW1hKCk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogQVBJR2F0ZXdheVByb3h5RXZlbnRWMik6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlZENvbnRleHQ6IEFwaUNvbnRleHQgPSBhd2FpdCBjcmVhdGVDb250ZXh0KGluaXRpYWxDb250ZXh0LCBldmVudCk7XG4gICAgICBjb25zdCBsYW5ndWFnZUNvbnRleHQgPSBleHRyYWN0TGFuZ3VhZ2VDb250ZXh0KGV2ZW50KTtcblxuICAgICAgY29uc3QgY29udGV4dFdpdGhMYW5ndWFnZSA9IHtcbiAgICAgICAgY29uZmlnOiBDb25maWcuZ2V0KCksXG4gICAgICAgIC4uLnVwZGF0ZWRDb250ZXh0LFxuICAgICAgICBsYW5ndWFnZUNvbnRleHQsXG4gICAgICAgIHJlcXVlc3Q6IGV2ZW50XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXJzZURhdGEgPSBnZXRMYW1iZGFEYXRhKGV2ZW50IGFzIHVua25vd24gYXMgTGFtYmRhRGF0YSk7XG4gICAgICBjb25zdCB7Ym9keX0gPSBwYXJzZURhdGE7XG5cbiAgICAgIGlmKCFib2R5Py5xdWVyeSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05vIEdyYXBoUUwgcXVlcnkgZm91bmQgaW4gcmVxdWVzdCBib2R5Jyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3JzOiBbe1xuICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gR3JhcGhRTCBxdWVyeSBmb3VuZCBpbiByZXF1ZXN0IGJvZHknXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoZ3JhcGhxbCh7XG4gICAgICAgICAgY29udGV4dFZhbHVlOiBjb250ZXh0V2l0aExhbmd1YWdlLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBzb3VyY2U6IGJvZHkucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVWYWx1ZXM6IGJvZHkudmFyaWFibGVzXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZihyZXN1bHQuZXJyb3JzICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0dyYXBoUUwgZXhlY3V0aW9uIGVycm9yczonLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDBcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2goZ3JhcGhxbEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBHcmFwaFFMIGV4ZWN1dGlvbjonLCBncmFwaHFsRXJyb3IpO1xuXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdyYXBocWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZ3JhcGhxbEVycm9yLm1lc3NhZ2UgOiAnR3JhcGhRTCBleGVjdXRpb24gZXJyb3InO1xuICAgICAgICBjb25zdCBlcnJvclN0YWNrID0gZ3JhcGhxbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBncmFwaHFsRXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3JzOiBbe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IGVycm9yU3RhY2sgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnI6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0hhbmRsZXIgZXJyb3I6Jywge1xuICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhhbmRsZXInO1xuICAgICAgY29uc3QgZXJyb3JTdGFjayA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcnM6IFt7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgPyBlcnJvclN0YWNrIDogdW5kZWZpbmVkXG4gICAgICAgICAgfV1cbiAgICAgICAgfSksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdyYXBocWwiLCJzY2hlbWFDb21wb3NlciIsIkNvbmZpZyIsInJlZ2lzdGVyRGVmYXVsdE11dGF0aW9ucyIsInJlZ2lzdGVyRGVmYXVsdFF1ZXJpZXMiLCJleHRyYWN0TGFuZ3VhZ2VDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImdldEdxbEZpZWxkcyIsImdldExhbWJkYURhdGEiLCJhZGRGaWVsZHNNaWRkbGV3YXJlIiwicmVzb2x2ZSIsInNvdXJjZSIsImFyZ3MiLCJjb250ZXh0IiwiaW5mbyIsImVuaGFuY2VkQ29udGV4dCIsImZpZWxkcyIsImFkZE1pc3NpbmdGaWVsZHMiLCJ0YyIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwiZmllbGROYW1lIiwiZmllbGRDb25maWciLCJoYXNGaWVsZCIsInNldEZpZWxkIiwiYXBwbHlNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJsZW5ndGgiLCJrZXlzIiwiZ2V0RmllbGRzIiwiaGFzUmVzb2x2ZXIiLCJtaWRkbGV3YXJlIiwid3JhcFJlc29sdmVyIiwiZXJyb3IiLCJjb25zb2xlIiwid2FybiIsIm1lc3NhZ2UiLCJjcmVhdGVHcmFwaHFsSGFuZGxlciIsIm9wdGlvbnMiLCJjb21wb3NlciIsImluaXRpYWxDb250ZXh0Iiwic2hvdWxkSW5jbHVkZURlZmF1bHRzIiwiaW5jbHVkZURlZmF1bHRzIiwibWlkZGxld2FyZUxpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJleHRyYVF1ZXJpZXMiLCJRdWVyeSIsImV4dHJhTXV0YXRpb25zIiwiTXV0YXRpb24iLCJzY2hlbWEiLCJidWlsZFNjaGVtYSIsImV2ZW50IiwidXBkYXRlZENvbnRleHQiLCJsYW5ndWFnZUNvbnRleHQiLCJjb250ZXh0V2l0aExhbmd1YWdlIiwiY29uZmlnIiwiZ2V0IiwicmVxdWVzdCIsInBhcnNlRGF0YSIsImJvZHkiLCJxdWVyeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwiZXJyb3JzIiwiaGVhZGVycyIsInN0YXR1c0NvZGUiLCJyZXN1bHQiLCJQcm9taXNlIiwiY29udGV4dFZhbHVlIiwidmFyaWFibGVWYWx1ZXMiLCJ2YXJpYWJsZXMiLCJncmFwaHFsRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJFcnJvciIsImVycm9yU3RhY2siLCJzdGFjayIsInVuZGVmaW5lZCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImVyciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsT0FBTyxRQUFPLFVBQVU7QUFDaEMsU0FBUUMsY0FBYyxRQUFPLGtCQUFrQjtBQUcvQyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyx3QkFBd0IsUUFBTyx3QkFBd0I7QUFDL0QsU0FBUUMsc0JBQXNCLFFBQU8sc0JBQXNCO0FBQzNELFNBQVFDLHNCQUFzQixRQUFPLDJCQUEyQjtBQUNoRSxTQUFRQyxhQUFhLEVBQUVDLFlBQVksRUFBRUMsYUFBYSxRQUF3QixvQkFBb0I7QUF5QjlGLE1BQU1DLHNCQUFpRCxDQUFDQyxTQUFTQyxRQUFRQyxNQUFNQyxTQUFxQkM7SUFDbEcsTUFBTUMsa0JBQWtCO1FBQ3RCLEdBQUdGLE9BQU87UUFDVkcsUUFBUVQsYUFBYU87SUFDdkI7SUFFQSxPQUFPSixRQUFRQyxRQUFRQyxNQUFNRyxpQkFBaUJEO0FBQ2hEO0FBRUEsTUFBTUcsbUJBQW1CLENBQUNDLElBQTBDRjtJQUNsRUcsT0FBT0MsT0FBTyxDQUFDSixRQUFRSyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxXQUFXQyxZQUFZO1FBQ3RELElBQUcsQ0FBQ0wsR0FBR00sUUFBUSxDQUFDRixZQUFZO1lBQzFCSixHQUFHTyxRQUFRLENBQUNILFdBQVdDO1FBQ3pCO0lBQ0Y7QUFDRjtBQUVBLE1BQU1HLGtCQUFrQixDQUN0QlIsSUFDQVM7SUFFQSxJQUFHQSxZQUFZQyxNQUFNLEtBQUssR0FBRztRQUMzQjtJQUNGO0lBRUFULE9BQU9VLElBQUksQ0FBQ1gsR0FBR1ksU0FBUyxJQUFJVCxPQUFPLENBQUMsQ0FBQ0M7UUFDbkMsSUFBSTtZQUNGLElBQUdKLEdBQUdhLFdBQVcsQ0FBQ1QsWUFBWTtnQkFDNUJLLFlBQVlOLE9BQU8sQ0FBQyxDQUFDVyxhQUFlZCxH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
package/lib/index.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- /**
2
- * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
- * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
- */
5
1
  export { graphql, GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, graphqlSync, printSchema } from 'graphql';
6
2
  export type { ExecutionResult } from 'graphql';
7
3
  export type { InputTypeComposer, ObjectTypeComposer } from 'graphql-compose';
@@ -9,6 +5,8 @@ export { schemaComposer } from 'graphql-compose';
9
5
  export * from './actions/index.js';
10
6
  export * from './adapters/index.js';
11
7
  export * from './config.js';
8
+ export * from './durableChat/index.js';
9
+ export type { MembershipRole as DurableChatMembershipRole } from './durableChat/types.js';
12
10
  export type { DatabaseConnectionMetadata, DatabaseCredentialIdentity, DatabaseCredentialRequest, DatabaseCredentialSecret, DatabaseEnvironment, DatabaseProvisioningLease } from './types/databaseCredentials.types.js';
13
11
  export { getAppDatabaseName, getDatabaseCredentialIdentity, parseDatabaseCredentialSecret, toDatabaseConnectionMetadata } from './utils/databaseCredentials.js';
14
12
  export { COLLECTIONS, ConnectionType as ConnectionTypes, DEFAULT_DOCUMENT_COLLECTIONS, DEFAULT_EDGE_COLLECTIONS, EDGES, PrivacyLevel, ReactionType } from './constants/collections.js';
@@ -28,3 +26,5 @@ export declare const reaktorSchema = "";
28
26
  export declare const reaktorResolvers: import("graphql-compose/lib/SchemaComposer.js").GraphQLToolsResolveMethods<any>;
29
27
  export * from './adapters/higgsfieldModelCatalog.js';
30
28
  export * from './adapters/higgsfieldModels.js';
29
+ export * from './organizations/index.js';
30
+ export type { MembershipRole } from './organizations/types.js';
package/lib/index.js CHANGED
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
3
  * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
- */ export { graphql, GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, graphqlSync, printSchema } from 'graphql';
5
- import { schemaComposer } from 'graphql-compose';
4
+ */ import { schemaComposer } from 'graphql-compose';
5
+ export { graphql, GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, graphqlSync, printSchema } from 'graphql';
6
6
  export { schemaComposer } from 'graphql-compose';
7
7
  export * from './actions/index.js';
8
8
  export * from './adapters/index.js';
9
9
  export * from './config.js';
10
+ export * from './durableChat/index.js';
10
11
  export { getAppDatabaseName, getDatabaseCredentialIdentity, parseDatabaseCredentialSecret, toDatabaseConnectionMetadata } from './utils/databaseCredentials.js';
11
12
  export { COLLECTIONS, ConnectionType as ConnectionTypes, DEFAULT_DOCUMENT_COLLECTIONS, DEFAULT_EDGE_COLLECTIONS, EDGES, PrivacyLevel, ReactionType } from './constants/collections.js';
12
13
  export { notifyUser } from './lambdas/actions/websockets.js';
@@ -24,5 +25,6 @@ export const reaktorSchema = ''; // printSchema(schemaComposer.buildSchema());
24
25
  export const reaktorResolvers = schemaComposer.getResolveMethods();
25
26
  export * from './adapters/higgsfieldModelCatalog.js';
26
27
  export * from './adapters/higgsfieldModels.js';
28
+ export * from './organizations/index.js';
27
29
 
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmV4cG9ydCB7XG4gIGdyYXBocWwsIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMRmxvYXQsXG4gIEdyYXBoUUxJRCxcbiAgR3JhcGhRTEludCxcbiAgR3JhcGhRTExpc3QsIEdyYXBoUUxOb25OdWxsLCBHcmFwaFFMT2JqZWN0VHlwZSwgR3JhcGhRTFN0cmluZywgZ3JhcGhxbFN5bmMsXG4gIHByaW50U2NoZW1hXG59IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHtzY2hlbWFDb21wb3Nlcn0gZnJvbSAnZ3JhcGhxbC1jb21wb3NlJztcblxuXG5leHBvcnQgdHlwZSB7RXhlY3V0aW9uUmVzdWx0fSBmcm9tICdncmFwaHFsJztcbmV4cG9ydCB0eXBlIHtJbnB1dFR5cGVDb21wb3NlciwgT2JqZWN0VHlwZUNvbXBvc2VyfSBmcm9tICdncmFwaHFsLWNvbXBvc2UnO1xuXG5leHBvcnQge3NjaGVtYUNvbXBvc2VyfSBmcm9tICdncmFwaHFsLWNvbXBvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hY3Rpb25zL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYWRhcHRlcnMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcuanMnO1xuZXhwb3J0IHR5cGUge0RhdGFiYXNlQ29ubmVjdGlvbk1ldGFkYXRhLCBEYXRhYmFzZUNyZWRlbnRpYWxJZGVudGl0eSwgRGF0YWJhc2VDcmVkZW50aWFsUmVxdWVzdCwgRGF0YWJhc2VDcmVkZW50aWFsU2VjcmV0LCBEYXRhYmFzZUVudmlyb25tZW50LCBEYXRhYmFzZVByb3Zpc2lvbmluZ0xlYXNlfSBmcm9tICcuL3R5cGVzL2RhdGFiYXNlQ3JlZGVudGlhbHMudHlwZXMuanMnO1xuZXhwb3J0IHtnZXRBcHBEYXRhYmFzZU5hbWUsIGdldERhdGFiYXNlQ3JlZGVudGlhbElkZW50aXR5LCBwYXJzZURhdGFiYXNlQ3JlZGVudGlhbFNlY3JldCwgdG9EYXRhYmFzZUNvbm5lY3Rpb25NZXRhZGF0YX0gZnJvbSAnLi91dGlscy9kYXRhYmFzZUNyZWRlbnRpYWxzLmpzJztcbmV4cG9ydCB7XG4gIENPTExFQ1RJT05TLFxuICBDb25uZWN0aW9uVHlwZSBhcyBDb25uZWN0aW9uVHlwZXMsXG4gIERFRkFVTFRfRE9DVU1FTlRfQ09MTEVDVElPTlMsXG4gIERFRkFVTFRfRURHRV9DT0xMRUNUSU9OUyxcbiAgRURHRVMsXG4gIFByaXZhY3lMZXZlbCxcbiAgUmVhY3Rpb25UeXBlXG59IGZyb20gJy4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29ubmVjdGlvblR5cGVUeXBlIGFzIENvbm5lY3Rpb25UeXBlVmFsdWUsXG4gIFByaXZhY3lMZXZlbFR5cGUsXG4gIFJlYWN0aW9uVHlwZVR5cGVcbn0gZnJvbSAnLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuZXhwb3J0IHtub3RpZnlVc2VyfSBmcm9tICcuL2xhbWJkYXMvYWN0aW9ucy93ZWJzb2NrZXRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaGFuZGxlcnMvZ3JhcGhxbEhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sYW1iZGFzL2F1dGhvcml6ZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sYW1iZGFzL2Nvbm5lY3Rpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tdXRhdGlvbnMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vYmplY3RUeXBlcy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJpZXMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3VwbG9hZC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9Qcm9jZXNzaW5nLmpzJztcblxuZXhwb3J0IGNvbnN0IHJlYWt0b3JTY2hlbWEgPSAnJzsvLyBwcmludFNjaGVtYShzY2hlbWFDb21wb3Nlci5idWlsZFNjaGVtYSgpKTtcbmV4cG9ydCBjb25zdCByZWFrdG9yUmVzb2x2ZXJzID0gc2NoZW1hQ29tcG9zZXIuZ2V0UmVzb2x2ZU1ldGhvZHMoKTtcblxuZXhwb3J0ICogZnJvbSAnLi9hZGFwdGVycy9oaWdnc2ZpZWxkTW9kZWxDYXRhbG9nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYWRhcHRlcnMvaGlnZ3NmaWVsZE1vZGVscy5qcyc7XG4iXSwibmFtZXMiOlsiZ3JhcGhxbCIsIkdyYXBoUUxCb29sZWFuIiwiR3JhcGhRTEZsb2F0IiwiR3JhcGhRTElEIiwiR3JhcGhRTEludCIsIkdyYXBoUUxMaXN0IiwiR3JhcGhRTE5vbk51bGwiLCJHcmFwaFFMT2JqZWN0VHlwZSIsIkdyYXBoUUxTdHJpbmciLCJncmFwaHFsU3luYyIsInByaW50U2NoZW1hIiwic2NoZW1hQ29tcG9zZXIiLCJnZXRBcHBEYXRhYmFzZU5hbWUiLCJnZXREYXRhYmFzZUNyZWRlbnRpYWxJZGVudGl0eSIsInBhcnNlRGF0YWJhc2VDcmVkZW50aWFsU2VjcmV0IiwidG9EYXRhYmFzZUNvbm5lY3Rpb25NZXRhZGF0YSIsIkNPTExFQ1RJT05TIiwiQ29ubmVjdGlvblR5cGUiLCJDb25uZWN0aW9uVHlwZXMiLCJERUZBVUxUX0RPQ1VNRU5UX0NPTExFQ1RJT05TIiwiREVGQVVMVF9FREdFX0NPTExFQ1RJT05TIiwiRURHRVMiLCJQcml2YWN5TGV2ZWwiLCJSZWFjdGlvblR5cGUiLCJub3RpZnlVc2VyIiwicmVha3RvclNjaGVtYSIsInJlYWt0b3JSZXNvbHZlcnMiLCJnZXRSZXNvbHZlTWV0aG9kcyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FDRUEsT0FBTyxFQUFFQyxjQUFjLEVBQ3ZCQyxZQUFZLEVBQ1pDLFNBQVMsRUFDVEMsVUFBVSxFQUNWQyxXQUFXLEVBQUVDLGNBQWMsRUFBRUMsaUJBQWlCLEVBQUVDLGFBQWEsRUFBRUMsV0FBVyxFQUMxRUMsV0FBVyxRQUNOLFVBQVU7QUFDakIsU0FBUUMsY0FBYyxRQUFPLGtCQUFrQjtBQU0vQyxTQUFRQSxjQUFjLFFBQU8sa0JBQWtCO0FBQy9DLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsc0JBQXNCO0FBQ3BDLGNBQWMsY0FBYztBQUU1QixTQUFRQyxrQkFBa0IsRUFBRUMsNkJBQTZCLEVBQUVDLDZCQUE2QixFQUFFQyw0QkFBNEIsUUFBTyxpQ0FBaUM7QUFDOUosU0FDRUMsV0FBVyxFQUNYQyxrQkFBa0JDLGVBQWUsRUFDakNDLDRCQUE0QixFQUM1QkMsd0JBQXdCLEVBQ3hCQyxLQUFLLEVBQ0xDLFlBQVksRUFDWkMsWUFBWSxRQUNQLDZCQUE2QjtBQU1wQyxTQUFRQyxVQUFVLFFBQU8sa0NBQWtDO0FBQzNELGNBQWMsK0JBQStCO0FBQzdDLGNBQWMsMEJBQTBCO0FBQ3hDLGNBQWMsMEJBQTBCO0FBQ3hDLGNBQWMsdUJBQXVCO0FBQ3JDLGNBQWMseUJBQXlCO0FBQ3ZDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMsY0FBYztBQUM1QixjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLHVCQUF1QjtBQUVyQyxPQUFPLE1BQU1DLGdCQUFnQixHQUFHLENBQUEsNkNBQTZDO0FBQzdFLE9BQU8sTUFBTUMsbUJBQW1CZixlQUFlZ0IsaUJBQWlCLEdBQUc7QUFFbkUsY0FBYyx1Q0FBdUM7QUFDckQsY0FBYyxpQ0FBaUMifQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCB7XG4gIGdyYXBocWwsIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMRmxvYXQsXG4gIEdyYXBoUUxJRCxcbiAgR3JhcGhRTEludCxcbiAgR3JhcGhRTExpc3QsIEdyYXBoUUxOb25OdWxsLCBHcmFwaFFMT2JqZWN0VHlwZSwgR3JhcGhRTFN0cmluZywgZ3JhcGhxbFN5bmMsXG4gIHByaW50U2NoZW1hXG59IGZyb20gJ2dyYXBocWwnO1xuXG5cbmV4cG9ydCB0eXBlIHtFeGVjdXRpb25SZXN1bHR9IGZyb20gJ2dyYXBocWwnO1xuZXhwb3J0IHR5cGUge0lucHV0VHlwZUNvbXBvc2VyLCBPYmplY3RUeXBlQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbnMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hZGFwdGVycy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2R1cmFibGVDaGF0L2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHtNZW1iZXJzaGlwUm9sZSBhcyBEdXJhYmxlQ2hhdE1lbWJlcnNoaXBSb2xlfSBmcm9tICcuL2R1cmFibGVDaGF0L3R5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHtEYXRhYmFzZUNvbm5lY3Rpb25NZXRhZGF0YSwgRGF0YWJhc2VDcmVkZW50aWFsSWRlbnRpdHksIERhdGFiYXNlQ3JlZGVudGlhbFJlcXVlc3QsIERhdGFiYXNlQ3JlZGVudGlhbFNlY3JldCwgRGF0YWJhc2VFbnZpcm9ubWVudCwgRGF0YWJhc2VQcm92aXNpb25pbmdMZWFzZX0gZnJvbSAnLi90eXBlcy9kYXRhYmFzZUNyZWRlbnRpYWxzLnR5cGVzLmpzJztcbmV4cG9ydCB7Z2V0QXBwRGF0YWJhc2VOYW1lLCBnZXREYXRhYmFzZUNyZWRlbnRpYWxJZGVudGl0eSwgcGFyc2VEYXRhYmFzZUNyZWRlbnRpYWxTZWNyZXQsIHRvRGF0YWJhc2VDb25uZWN0aW9uTWV0YWRhdGF9IGZyb20gJy4vdXRpbHMvZGF0YWJhc2VDcmVkZW50aWFscy5qcyc7XG5leHBvcnQge1xuICBDT0xMRUNUSU9OUyxcbiAgQ29ubmVjdGlvblR5cGUgYXMgQ29ubmVjdGlvblR5cGVzLFxuICBERUZBVUxUX0RPQ1VNRU5UX0NPTExFQ1RJT05TLFxuICBERUZBVUxUX0VER0VfQ09MTEVDVElPTlMsXG4gIEVER0VTLFxuICBQcml2YWN5TGV2ZWwsXG4gIFJlYWN0aW9uVHlwZVxufSBmcm9tICcuL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbm5lY3Rpb25UeXBlVHlwZSBhcyBDb25uZWN0aW9uVHlwZVZhbHVlLFxuICBQcml2YWN5TGV2ZWxUeXBlLFxuICBSZWFjdGlvblR5cGVUeXBlXG59IGZyb20gJy4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmV4cG9ydCB7bm90aWZ5VXNlcn0gZnJvbSAnLi9sYW1iZGFzL2FjdGlvbnMvd2Vic29ja2V0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hhbmRsZXJzL2dyYXBocWxIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGFtYmRhcy9hdXRob3JpemVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGFtYmRhcy9jb25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbXV0YXRpb25zL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0VHlwZXMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyaWVzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi91cGxvYWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZGVvUHJvY2Vzc2luZy5qcyc7XG5cbmV4cG9ydCBjb25zdCByZWFrdG9yU2NoZW1hID0gJyc7Ly8gcHJpbnRTY2hlbWEoc2NoZW1hQ29tcG9zZXIuYnVpbGRTY2hlbWEoKSk7XG5leHBvcnQgY29uc3QgcmVha3RvclJlc29sdmVycyA9IHNjaGVtYUNvbXBvc2VyLmdldFJlc29sdmVNZXRob2RzKCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vYWRhcHRlcnMvaGlnZ3NmaWVsZE1vZGVsQ2F0YWxvZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXJzL2hpZ2dzZmllbGRNb2RlbHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmdhbml6YXRpb25zL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHtNZW1iZXJzaGlwUm9sZX0gZnJvbSAnLi9vcmdhbml6YXRpb25zL3R5cGVzLmpzJztcbiJdLCJuYW1lcyI6WyJzY2hlbWFDb21wb3NlciIsImdyYXBocWwiLCJHcmFwaFFMQm9vbGVhbiIsIkdyYXBoUUxGbG9hdCIsIkdyYXBoUUxJRCIsIkdyYXBoUUxJbnQiLCJHcmFwaFFMTGlzdCIsIkdyYXBoUUxOb25OdWxsIiwiR3JhcGhRTE9iamVjdFR5cGUiLCJHcmFwaFFMU3RyaW5nIiwiZ3JhcGhxbFN5bmMiLCJwcmludFNjaGVtYSIsImdldEFwcERhdGFiYXNlTmFtZSIsImdldERhdGFiYXNlQ3JlZGVudGlhbElkZW50aXR5IiwicGFyc2VEYXRhYmFzZUNyZWRlbnRpYWxTZWNyZXQiLCJ0b0RhdGFiYXNlQ29ubmVjdGlvbk1ldGFkYXRhIiwiQ09MTEVDVElPTlMiLCJDb25uZWN0aW9uVHlwZSIsIkNvbm5lY3Rpb25UeXBlcyIsIkRFRkFVTFRfRE9DVU1FTlRfQ09MTEVDVElPTlMiLCJERUZBVUxUX0VER0VfQ09MTEVDVElPTlMiLCJFREdFUyIsIlByaXZhY3lMZXZlbCIsIlJlYWN0aW9uVHlwZSIsIm5vdGlmeVVzZXIiLCJyZWFrdG9yU2NoZW1hIiwicmVha3RvclJlc29sdmVycyIsImdldFJlc29sdmVNZXRob2RzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxjQUFjLFFBQU8sa0JBQWtCO0FBRS9DLFNBQ0VDLE9BQU8sRUFBRUMsY0FBYyxFQUN2QkMsWUFBWSxFQUNaQyxTQUFTLEVBQ1RDLFVBQVUsRUFDVkMsV0FBVyxFQUFFQyxjQUFjLEVBQUVDLGlCQUFpQixFQUFFQyxhQUFhLEVBQUVDLFdBQVcsRUFDMUVDLFdBQVcsUUFDTixVQUFVO0FBTWpCLFNBQVFYLGNBQWMsUUFBTyxrQkFBa0I7QUFDL0MsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxzQkFBc0I7QUFDcEMsY0FBYyxjQUFjO0FBQzVCLGNBQWMseUJBQXlCO0FBR3ZDLFNBQVFZLGtCQUFrQixFQUFFQyw2QkFBNkIsRUFBRUMsNkJBQTZCLEVBQUVDLDRCQUE0QixRQUFPLGlDQUFpQztBQUM5SixTQUNFQyxXQUFXLEVBQ1hDLGtCQUFrQkMsZUFBZSxFQUNqQ0MsNEJBQTRCLEVBQzVCQyx3QkFBd0IsRUFDeEJDLEtBQUssRUFDTEMsWUFBWSxFQUNaQyxZQUFZLFFBQ1AsNkJBQTZCO0FBTXBDLFNBQVFDLFVBQVUsUUFBTyxrQ0FBa0M7QUFDM0QsY0FBYywrQkFBK0I7QUFDN0MsY0FBYywwQkFBMEI7QUFDeEMsY0FBYywwQkFBMEI7QUFDeEMsY0FBYyx1QkFBdUI7QUFDckMsY0FBYyx5QkFBeUI7QUFDdkMsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxtQkFBbUI7QUFDakMsY0FBYyxjQUFjO0FBQzVCLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMsdUJBQXVCO0FBRXJDLE9BQU8sTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQSw2Q0FBNkM7QUFDN0UsT0FBTyxNQUFNQyxtQkFBbUIxQixlQUFlMkIsaUJBQWlCLEdBQUc7QUFFbkUsY0FBYyx1Q0FBdUM7QUFDckQsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYywyQkFBMkIifQ==