@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.2-dev.d2aa5ca

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 (319) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +264 -2
  3. package/dist/connectors/dell-techdirect/connector.json +39 -0
  4. package/dist/connectors/dell-techdirect/index.d.ts +8 -0
  5. package/dist/connectors/dell-techdirect/index.js +7 -0
  6. package/dist/connectors/dell-techdirect/index.js.map +1 -0
  7. package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
  8. package/dist/connectors/dell-techdirect/tools.js +49 -0
  9. package/dist/connectors/dell-techdirect/tools.js.map +1 -0
  10. package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
  11. package/dist/connectors/dell-techdirect/vendor.js +57 -0
  12. package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
  13. package/dist/connectors/dynamics-365/connector.json +213 -0
  14. package/dist/connectors/dynamics-365/index.d.ts +11 -0
  15. package/dist/connectors/dynamics-365/index.js +10 -0
  16. package/dist/connectors/dynamics-365/index.js.map +1 -0
  17. package/dist/connectors/dynamics-365/tools.d.ts +35 -0
  18. package/dist/connectors/dynamics-365/tools.js +806 -0
  19. package/dist/connectors/dynamics-365/tools.js.map +1 -0
  20. package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
  21. package/dist/connectors/dynamics-365/vendor.js +110 -0
  22. package/dist/connectors/dynamics-365/vendor.js.map +1 -0
  23. package/dist/connectors/entra/connector.json +85 -0
  24. package/dist/connectors/entra/index.d.ts +2 -0
  25. package/dist/connectors/entra/index.js +4 -0
  26. package/dist/connectors/entra/index.js.map +1 -0
  27. package/dist/connectors/entra/tools.d.ts +14 -0
  28. package/dist/connectors/entra/tools.js +262 -0
  29. package/dist/connectors/entra/tools.js.map +1 -0
  30. package/dist/connectors/fedex/connector.json +118 -0
  31. package/dist/connectors/fedex/index.d.ts +8 -0
  32. package/dist/connectors/fedex/index.js +7 -0
  33. package/dist/connectors/fedex/index.js.map +1 -0
  34. package/dist/connectors/fedex/tools.d.ts +3 -0
  35. package/dist/connectors/fedex/tools.js +152 -0
  36. package/dist/connectors/fedex/tools.js.map +1 -0
  37. package/dist/connectors/fedex/vendor.d.ts +7 -0
  38. package/dist/connectors/fedex/vendor.js +98 -0
  39. package/dist/connectors/fedex/vendor.js.map +1 -0
  40. package/dist/connectors/gong/connector.json +127 -0
  41. package/dist/connectors/gong/index.d.ts +8 -0
  42. package/dist/connectors/gong/index.js +7 -0
  43. package/dist/connectors/gong/index.js.map +1 -0
  44. package/dist/connectors/gong/tools.d.ts +8 -0
  45. package/dist/connectors/gong/tools.js +424 -0
  46. package/dist/connectors/gong/tools.js.map +1 -0
  47. package/dist/connectors/gong/vendor.d.ts +4 -0
  48. package/dist/connectors/gong/vendor.js +97 -0
  49. package/dist/connectors/gong/vendor.js.map +1 -0
  50. package/dist/connectors/http/index.d.ts +38 -0
  51. package/dist/connectors/http/index.js +322 -0
  52. package/dist/connectors/http/index.js.map +1 -0
  53. package/dist/connectors/intune/connector.json +106 -0
  54. package/dist/connectors/intune/index.d.ts +2 -0
  55. package/dist/connectors/intune/index.js +4 -0
  56. package/dist/connectors/intune/index.js.map +1 -0
  57. package/dist/connectors/intune/tools.d.ts +12 -0
  58. package/dist/connectors/intune/tools.js +416 -0
  59. package/dist/connectors/intune/tools.js.map +1 -0
  60. package/dist/connectors/jamf/connector.json +182 -0
  61. package/dist/connectors/jamf/index.d.ts +8 -0
  62. package/dist/connectors/jamf/index.js +7 -0
  63. package/dist/connectors/jamf/index.js.map +1 -0
  64. package/dist/connectors/jamf/tools.d.ts +7 -0
  65. package/dist/connectors/jamf/tools.js +659 -0
  66. package/dist/connectors/jamf/tools.js.map +1 -0
  67. package/dist/connectors/jamf/vendor.d.ts +5 -0
  68. package/dist/connectors/jamf/vendor.js +66 -0
  69. package/dist/connectors/jamf/vendor.js.map +1 -0
  70. package/dist/connectors/jira/connector.json +272 -0
  71. package/dist/connectors/jira/index.d.ts +8 -0
  72. package/dist/connectors/jira/index.js +7 -0
  73. package/dist/connectors/jira/index.js.map +1 -0
  74. package/dist/connectors/jira/jql.d.ts +4 -0
  75. package/dist/connectors/jira/jql.js +67 -0
  76. package/dist/connectors/jira/jql.js.map +1 -0
  77. package/dist/connectors/jira/tools.d.ts +3 -0
  78. package/dist/connectors/jira/tools.js +464 -0
  79. package/dist/connectors/jira/tools.js.map +1 -0
  80. package/dist/connectors/jira/vendor.d.ts +3 -0
  81. package/dist/connectors/jira/vendor.js +94 -0
  82. package/dist/connectors/jira/vendor.js.map +1 -0
  83. package/dist/connectors/microsoft/client.d.ts +58 -0
  84. package/dist/connectors/microsoft/client.js +434 -0
  85. package/dist/connectors/microsoft/client.js.map +1 -0
  86. package/dist/connectors/microsoft/provider.json +118 -0
  87. package/dist/connectors/netsuite/connector.json +315 -0
  88. package/dist/connectors/netsuite/index.d.ts +8 -0
  89. package/dist/connectors/netsuite/index.js +7 -0
  90. package/dist/connectors/netsuite/index.js.map +1 -0
  91. package/dist/connectors/netsuite/tools.d.ts +24 -0
  92. package/dist/connectors/netsuite/tools.js +447 -0
  93. package/dist/connectors/netsuite/tools.js.map +1 -0
  94. package/dist/connectors/netsuite/vendor.d.ts +26 -0
  95. package/dist/connectors/netsuite/vendor.js +248 -0
  96. package/dist/connectors/netsuite/vendor.js.map +1 -0
  97. package/dist/connectors/odata/index.d.ts +36 -0
  98. package/dist/connectors/odata/index.js +460 -0
  99. package/dist/connectors/odata/index.js.map +1 -0
  100. package/dist/connectors/okta/connector.json +193 -0
  101. package/dist/connectors/okta/index.d.ts +8 -0
  102. package/dist/connectors/okta/index.js +7 -0
  103. package/dist/connectors/okta/index.js.map +1 -0
  104. package/dist/connectors/okta/tools.d.ts +6 -0
  105. package/dist/connectors/okta/tools.js +429 -0
  106. package/dist/connectors/okta/tools.js.map +1 -0
  107. package/dist/connectors/okta/vendor.d.ts +14 -0
  108. package/dist/connectors/okta/vendor.js +203 -0
  109. package/dist/connectors/okta/vendor.js.map +1 -0
  110. package/dist/connectors/outlook-calendar/connector.json +136 -0
  111. package/dist/connectors/outlook-calendar/index.d.ts +2 -0
  112. package/dist/connectors/outlook-calendar/index.js +4 -0
  113. package/dist/connectors/outlook-calendar/index.js.map +1 -0
  114. package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
  115. package/dist/connectors/outlook-calendar/tools.js +398 -0
  116. package/dist/connectors/outlook-calendar/tools.js.map +1 -0
  117. package/dist/connectors/outlook-mail/connector.json +154 -0
  118. package/dist/connectors/outlook-mail/index.d.ts +2 -0
  119. package/dist/connectors/outlook-mail/index.js +4 -0
  120. package/dist/connectors/outlook-mail/index.js.map +1 -0
  121. package/dist/connectors/outlook-mail/tools.d.ts +8 -0
  122. package/dist/connectors/outlook-mail/tools.js +236 -0
  123. package/dist/connectors/outlook-mail/tools.js.map +1 -0
  124. package/dist/connectors/salesforce/connector.json +122 -0
  125. package/dist/connectors/salesforce/index.d.ts +8 -0
  126. package/dist/connectors/salesforce/index.js +7 -0
  127. package/dist/connectors/salesforce/index.js.map +1 -0
  128. package/dist/connectors/salesforce/soql.d.ts +3 -0
  129. package/dist/connectors/salesforce/soql.js +60 -0
  130. package/dist/connectors/salesforce/soql.js.map +1 -0
  131. package/dist/connectors/salesforce/tools.d.ts +9 -0
  132. package/dist/connectors/salesforce/tools.js +234 -0
  133. package/dist/connectors/salesforce/tools.js.map +1 -0
  134. package/dist/connectors/salesforce/vendor.d.ts +3 -0
  135. package/dist/connectors/salesforce/vendor.js +107 -0
  136. package/dist/connectors/salesforce/vendor.js.map +1 -0
  137. package/dist/connectors/sap-s4hana/connector.json +263 -0
  138. package/dist/connectors/sap-s4hana/index.d.ts +8 -0
  139. package/dist/connectors/sap-s4hana/index.js +7 -0
  140. package/dist/connectors/sap-s4hana/index.js.map +1 -0
  141. package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
  142. package/dist/connectors/sap-s4hana/tools.js +761 -0
  143. package/dist/connectors/sap-s4hana/tools.js.map +1 -0
  144. package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
  145. package/dist/connectors/sap-s4hana/vendor.js +176 -0
  146. package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
  147. package/dist/connectors/servicenow/connector.json +228 -0
  148. package/dist/connectors/servicenow/index.d.ts +8 -0
  149. package/dist/connectors/servicenow/index.js +7 -0
  150. package/dist/connectors/servicenow/index.js.map +1 -0
  151. package/dist/connectors/servicenow/tools.d.ts +4 -0
  152. package/dist/connectors/servicenow/tools.js +884 -0
  153. package/dist/connectors/servicenow/tools.js.map +1 -0
  154. package/dist/connectors/servicenow/vendor.d.ts +4 -0
  155. package/dist/connectors/servicenow/vendor.js +109 -0
  156. package/dist/connectors/servicenow/vendor.js.map +1 -0
  157. package/dist/connectors/sharepoint-files/connector.json +194 -0
  158. package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
  159. package/dist/connectors/sharepoint-files/excel.js +300 -0
  160. package/dist/connectors/sharepoint-files/excel.js.map +1 -0
  161. package/dist/connectors/sharepoint-files/index.d.ts +11 -0
  162. package/dist/connectors/sharepoint-files/index.js +12 -0
  163. package/dist/connectors/sharepoint-files/index.js.map +1 -0
  164. package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
  165. package/dist/connectors/sharepoint-files/tools.js +365 -0
  166. package/dist/connectors/sharepoint-files/tools.js.map +1 -0
  167. package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
  168. package/dist/connectors/sharepoint-files/vendor.js +167 -0
  169. package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
  170. package/dist/connectors/slack/connector.json +148 -0
  171. package/dist/connectors/slack/index.d.ts +8 -0
  172. package/dist/connectors/slack/index.js +7 -0
  173. package/dist/connectors/slack/index.js.map +1 -0
  174. package/dist/connectors/slack/tools.d.ts +3 -0
  175. package/dist/connectors/slack/tools.js +355 -0
  176. package/dist/connectors/slack/tools.js.map +1 -0
  177. package/dist/connectors/slack/vendor.d.ts +17 -0
  178. package/dist/connectors/slack/vendor.js +195 -0
  179. package/dist/connectors/slack/vendor.js.map +1 -0
  180. package/dist/connectors/soap/index.d.ts +19 -0
  181. package/dist/connectors/soap/index.js +248 -0
  182. package/dist/connectors/soap/index.js.map +1 -0
  183. package/dist/connectors/soap/xml.d.ts +12 -0
  184. package/dist/connectors/soap/xml.js +126 -0
  185. package/dist/connectors/soap/xml.js.map +1 -0
  186. package/dist/connectors/sql/engines.d.ts +58 -0
  187. package/dist/connectors/sql/engines.js +292 -0
  188. package/dist/connectors/sql/engines.js.map +1 -0
  189. package/dist/connectors/sql/index.d.ts +19 -0
  190. package/dist/connectors/sql/index.js +212 -0
  191. package/dist/connectors/sql/index.js.map +1 -0
  192. package/dist/connectors/teams/connector.json +298 -0
  193. package/dist/connectors/teams/index.d.ts +2 -0
  194. package/dist/connectors/teams/index.js +5 -0
  195. package/dist/connectors/teams/index.js.map +1 -0
  196. package/dist/connectors/teams/tools.d.ts +2 -0
  197. package/dist/connectors/teams/tools.js +391 -0
  198. package/dist/connectors/teams/tools.js.map +1 -0
  199. package/dist/connectors/workday/connector.json +186 -0
  200. package/dist/connectors/workday/index.d.ts +8 -0
  201. package/dist/connectors/workday/index.js +7 -0
  202. package/dist/connectors/workday/index.js.map +1 -0
  203. package/dist/connectors/workday/tools.d.ts +33 -0
  204. package/dist/connectors/workday/tools.js +410 -0
  205. package/dist/connectors/workday/tools.js.map +1 -0
  206. package/dist/connectors/workday/vendor.d.ts +18 -0
  207. package/dist/connectors/workday/vendor.js +195 -0
  208. package/dist/connectors/workday/vendor.js.map +1 -0
  209. package/dist/packages/connector-kit/src/branding.d.ts +57 -0
  210. package/dist/packages/connector-kit/src/branding.js +102 -0
  211. package/dist/packages/connector-kit/src/branding.js.map +1 -0
  212. package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
  213. package/dist/packages/connector-kit/src/certificate.js +84 -0
  214. package/dist/packages/connector-kit/src/certificate.js.map +1 -0
  215. package/dist/packages/connector-kit/src/common.d.ts +40 -0
  216. package/dist/packages/connector-kit/src/common.js +107 -0
  217. package/dist/packages/connector-kit/src/common.js.map +1 -0
  218. package/dist/packages/connector-kit/src/connector.d.ts +1346 -0
  219. package/dist/packages/connector-kit/src/connector.js +1034 -0
  220. package/dist/packages/connector-kit/src/connector.js.map +1 -0
  221. package/dist/packages/connector-kit/src/index.d.ts +5 -0
  222. package/dist/packages/connector-kit/src/index.js +5 -0
  223. package/dist/packages/connector-kit/src/index.js.map +1 -0
  224. package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
  225. package/dist/packages/connector-kit/src/oauth.js +96 -0
  226. package/dist/packages/connector-kit/src/oauth.js.map +1 -0
  227. package/dist/packages/connector-kit/src/types.d.ts +85 -0
  228. package/dist/packages/connector-kit/src/types.js +20 -0
  229. package/dist/packages/connector-kit/src/types.js.map +1 -0
  230. package/dist/packages/server/migrations/0001_tables.sql +268 -0
  231. package/dist/packages/server/migrations/0002_organizations.sql +72 -0
  232. package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
  233. package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
  234. package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
  235. package/dist/packages/server/migrations/0006_approvals.sql +36 -0
  236. package/dist/packages/server/migrations/0007_app_events.sql +110 -0
  237. package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
  238. package/dist/packages/server/src/api.d.ts +3714 -0
  239. package/dist/packages/server/src/api.js +818 -0
  240. package/dist/packages/server/src/api.js.map +1 -0
  241. package/dist/packages/server/src/app.d.ts +23 -0
  242. package/dist/packages/server/src/app.js +467 -0
  243. package/dist/packages/server/src/app.js.map +1 -0
  244. package/dist/packages/server/src/builtin.d.ts +4 -0
  245. package/dist/packages/server/src/builtin.js +42 -0
  246. package/dist/packages/server/src/builtin.js.map +1 -0
  247. package/dist/packages/server/src/consent.d.ts +27 -0
  248. package/dist/packages/server/src/consent.js +36 -0
  249. package/dist/packages/server/src/consent.js.map +1 -0
  250. package/dist/packages/server/src/events/admin.d.ts +156 -0
  251. package/dist/packages/server/src/events/admin.js +255 -0
  252. package/dist/packages/server/src/events/admin.js.map +1 -0
  253. package/dist/packages/server/src/events/deliver.d.ts +43 -0
  254. package/dist/packages/server/src/events/deliver.js +129 -0
  255. package/dist/packages/server/src/events/deliver.js.map +1 -0
  256. package/dist/packages/server/src/events/runtime.d.ts +28 -0
  257. package/dist/packages/server/src/events/runtime.js +397 -0
  258. package/dist/packages/server/src/events/runtime.js.map +1 -0
  259. package/dist/packages/server/src/events/store.d.ts +172 -0
  260. package/dist/packages/server/src/events/store.js +275 -0
  261. package/dist/packages/server/src/events/store.js.map +1 -0
  262. package/dist/packages/server/src/index.d.ts +40 -0
  263. package/dist/packages/server/src/index.js +185 -0
  264. package/dist/packages/server/src/index.js.map +1 -0
  265. package/dist/packages/server/src/migrate.d.ts +11 -0
  266. package/dist/packages/server/src/migrate.js +134 -0
  267. package/dist/packages/server/src/migrate.js.map +1 -0
  268. package/dist/packages/server/src/openapi.d.ts +4 -0
  269. package/dist/packages/server/src/openapi.js +101 -0
  270. package/dist/packages/server/src/openapi.js.map +1 -0
  271. package/dist/packages/server/src/queue.d.ts +10 -0
  272. package/dist/packages/server/src/queue.js +45 -0
  273. package/dist/packages/server/src/queue.js.map +1 -0
  274. package/dist/packages/server/src/secrets.d.ts +19 -0
  275. package/dist/packages/server/src/secrets.js +76 -0
  276. package/dist/packages/server/src/secrets.js.map +1 -0
  277. package/dist/packages/server/src/server.d.ts +1 -0
  278. package/dist/packages/server/src/server.js +82 -0
  279. package/dist/packages/server/src/server.js.map +1 -0
  280. package/dist/packages/server/src/service.d.ts +760 -0
  281. package/dist/packages/server/src/service.js +918 -0
  282. package/dist/packages/server/src/service.js.map +1 -0
  283. package/dist/packages/server/src/store.d.ts +158 -0
  284. package/dist/packages/server/src/store.js +415 -0
  285. package/dist/packages/server/src/store.js.map +1 -0
  286. package/dist/packages/server/src/teams/activity.d.ts +123 -0
  287. package/dist/packages/server/src/teams/activity.js +188 -0
  288. package/dist/packages/server/src/teams/activity.js.map +1 -0
  289. package/dist/packages/server/src/teams/admin.d.ts +335 -0
  290. package/dist/packages/server/src/teams/admin.js +699 -0
  291. package/dist/packages/server/src/teams/admin.js.map +1 -0
  292. package/dist/packages/server/src/teams/approval.d.ts +57 -0
  293. package/dist/packages/server/src/teams/approval.js +118 -0
  294. package/dist/packages/server/src/teams/approval.js.map +1 -0
  295. package/dist/packages/server/src/teams/bot.d.ts +25 -0
  296. package/dist/packages/server/src/teams/bot.js +124 -0
  297. package/dist/packages/server/src/teams/bot.js.map +1 -0
  298. package/dist/packages/server/src/teams/claude.d.ts +46 -0
  299. package/dist/packages/server/src/teams/claude.js +165 -0
  300. package/dist/packages/server/src/teams/claude.js.map +1 -0
  301. package/dist/packages/server/src/teams/jwt.d.ts +17 -0
  302. package/dist/packages/server/src/teams/jwt.js +121 -0
  303. package/dist/packages/server/src/teams/jwt.js.map +1 -0
  304. package/dist/packages/server/src/teams/package.d.ts +79 -0
  305. package/dist/packages/server/src/teams/package.js +319 -0
  306. package/dist/packages/server/src/teams/package.js.map +1 -0
  307. package/dist/packages/server/src/teams/provision.d.ts +84 -0
  308. package/dist/packages/server/src/teams/provision.js +505 -0
  309. package/dist/packages/server/src/teams/provision.js.map +1 -0
  310. package/dist/packages/server/src/teams/runner.d.ts +80 -0
  311. package/dist/packages/server/src/teams/runner.js +187 -0
  312. package/dist/packages/server/src/teams/runner.js.map +1 -0
  313. package/dist/packages/server/src/teams/runtime.d.ts +91 -0
  314. package/dist/packages/server/src/teams/runtime.js +679 -0
  315. package/dist/packages/server/src/teams/runtime.js.map +1 -0
  316. package/dist/packages/server/src/teams/store.d.ts +233 -0
  317. package/dist/packages/server/src/teams/store.js +507 -0
  318. package/dist/packages/server/src/teams/store.js.map +1 -0
  319. package/package.json +68 -4
@@ -0,0 +1,391 @@
1
+ import { z } from "zod";
2
+ import { hashReplyToken, looksLikeReplyToken } from "../../packages/server/src/teams/activity.js";
3
+ import { APPROVAL_DAYS, approvalCard, approvalStatus, hashApprovalToken, looksLikeApprovalToken, newApprovalToken, } from "../../packages/server/src/teams/approval.js";
4
+ import { simplify, } from "../../packages/server/src/teams/runtime.js";
5
+ import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
6
+ // Teams, as the agent's own bot. Every tool reaches only where that bot is installed, within
7
+ // the key's `teams` and `channels` limits. A key with either limit reaches teams only, never
8
+ // chats. No tool takes a bot: the key's bot is the only one.
9
+ const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
10
+ const CHANNEL = /^19:[A-Za-z0-9_.-]+@thread\.(tacv2|skype)$/;
11
+ const CHAT = /^(19:[A-Za-z0-9_.-]+@(thread\.v2|unq\.gbl\.spaces)|a:[A-Za-z0-9_.-]+)$/;
12
+ const MESSAGE = /^\d{1,20}$/;
13
+ const MAX_TEXT = 20_000;
14
+ function access(ctx) {
15
+ if (!ctx.teams)
16
+ throw new Error("Teams tools need the agent's bot");
17
+ return ctx.teams;
18
+ }
19
+ const teamsLimit = (ctx) => listLimit(ctx.limits, "teams");
20
+ const channelsLimit = (ctx) => listLimit(ctx.limits, "channels");
21
+ const confined = (ctx) => Boolean(teamsLimit(ctx) || channelsLimit(ctx));
22
+ async function places(ctx) {
23
+ const all = await access(ctx).places();
24
+ const allowed = teamsLimit(ctx);
25
+ return {
26
+ teams: all.filter((p) => p.kind === "team" &&
27
+ p.teamGroupId &&
28
+ (!allowed || allowed.includes(p.teamGroupId.toLowerCase()))),
29
+ chats: confined(ctx) ? [] : all.filter((p) => p.kind !== "team"),
30
+ };
31
+ }
32
+ async function team(ctx, id) {
33
+ if (!GUID.test(id))
34
+ throw new Denied("Give a team id from teams_list_teams");
35
+ const found = (await places(ctx)).teams.find((t) => t.teamGroupId === id.toLowerCase());
36
+ if (!found)
37
+ throw new Denied("This agent cannot reach that team");
38
+ return found;
39
+ }
40
+ // Posts and reads address a channel by its id alone, so it must be one of the team's
41
+ // channels, or a key limited to one team could reach another team's channel.
42
+ async function channel(ctx, place, id, mark) {
43
+ if (!CHANNEL.test(id))
44
+ throw new Denied("Give a channel id from teams_list_channels");
45
+ const allowed = channelsLimit(ctx);
46
+ if (allowed && !allowed.includes(id))
47
+ throw new Denied("This agent cannot reach that channel");
48
+ const data = ok(await access(ctx).listChannels(place), mark);
49
+ if (!(data?.conversations ?? []).some((c) => c.id === id))
50
+ throw new Denied("That channel is not in this team");
51
+ return id;
52
+ }
53
+ async function chat(ctx, id, { readable = false } = {}) {
54
+ if (!CHAT.test(id))
55
+ throw new Denied("Give a chat id from teams_list_teams");
56
+ const found = (await places(ctx)).chats.find((c) => c.conversationId === id);
57
+ if (!found)
58
+ throw new Denied("This agent cannot reach that chat");
59
+ if (readable && found.kind === "personal")
60
+ throw new Denied("Direct chats can't be read; earlier turns are in this session");
61
+ return found;
62
+ }
63
+ function ok(res, mark) {
64
+ mark(res.status);
65
+ if (res.status < 200 || res.status >= 300) {
66
+ const d = res.data;
67
+ const message = d?.error?.message ?? d?.message;
68
+ throw new VendorFailed(res.status, `Microsoft Teams answered ${res.status}${message ? `: ${message}` : ""}`);
69
+ }
70
+ return res.data;
71
+ }
72
+ // Who sent a message: Graph's chatMessageFromIdentitySet names a user (teamworkUserIdentity, its
73
+ // id the person's Entra object id) or an application (a bot). A display name can be anything, so
74
+ // from_id is what identifies a person; it is left null for anyone Graph does not call an Entra
75
+ // user (anonymous, federated, consumer or phone users: their id is no object in this directory).
76
+ const ENTRA_USER = new Set(["aadUser", "onPremiseAadUser"]);
77
+ function sender(m) {
78
+ const user = m.from?.user;
79
+ if (user)
80
+ return {
81
+ from_id: typeof user.id === "string" &&
82
+ GUID.test(user.id) &&
83
+ (user.userIdentityType === undefined || ENTRA_USER.has(user.userIdentityType))
84
+ ? user.id.toLowerCase()
85
+ : null,
86
+ from_kind: "user",
87
+ };
88
+ return { from_id: null, from_kind: m.from?.application ? "application" : null };
89
+ }
90
+ const message = (m) => ({
91
+ id: m.id,
92
+ created: m.createdDateTime ?? null,
93
+ ...simplify([m])[0],
94
+ ...sender(m),
95
+ ...(m.replies ? { replies: m.replies.length } : {}),
96
+ });
97
+ // A place given as a team and channel, or as a chat.
98
+ const where = {
99
+ team: z.string().optional().describe("Team id, with channel."),
100
+ channel: z.string().optional().describe("Channel id in that team."),
101
+ chat: z.string().optional().describe("Chat id, instead of a team and channel."),
102
+ };
103
+ async function resolve(ctx, input, mark, opts = {}) {
104
+ if (input.chat && !input.team && !input.channel)
105
+ return { kind: "chat", place: await chat(ctx, input.chat, opts) };
106
+ if (input.team && input.channel && !input.chat) {
107
+ const place = await team(ctx, input.team);
108
+ return {
109
+ kind: "channel",
110
+ place,
111
+ channel: await channel(ctx, place, input.channel, mark),
112
+ };
113
+ }
114
+ throw new Denied("Give either a team and a channel, or a chat");
115
+ }
116
+ // A sign-in name (UPN, guests' #EXT# form too) or an Entra object id.
117
+ const SIGN_IN = /^[A-Za-z0-9._%+'#-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
118
+ // The approver as the Microsoft connection's directory knows them (User.ReadBasic.All, which
119
+ // every Teams ceiling expects): their object id, whatever was given, and their name. The agent
120
+ // names them, so this tells it whether a sign-in name exists here (docs/teams.md "Approval
121
+ // cards").
122
+ async function approver(ctx, value, mark) {
123
+ const given = value.trim();
124
+ if (!GUID.test(given) && !SIGN_IN.test(given))
125
+ throw new Denied("Give the approver's sign-in name (e.g. ann@contoso.com) or Entra object id");
126
+ const res = await ctx.call({
127
+ method: "GET",
128
+ path: `/v1.0/users/${encodeURIComponent(given)}?$select=id,displayName`,
129
+ });
130
+ if (res.status === 404) {
131
+ mark(res.status);
132
+ throw new Denied(`No one in this organization signs in as ${given}`);
133
+ }
134
+ const user = ok(res, mark);
135
+ if (!user?.id || !GUID.test(user.id))
136
+ throw new Error("Microsoft Graph answered a user with no id");
137
+ return { id: user.id.toLowerCase(), name: (user.displayName ?? given).slice(0, 200) };
138
+ }
139
+ function text(value) {
140
+ if (!value.trim())
141
+ throw new Denied("The message is empty");
142
+ if (value.length > MAX_TEXT)
143
+ throw new Denied(`Messages are at most ${MAX_TEXT} characters`);
144
+ return value;
145
+ }
146
+ export const teamsTools = {
147
+ names: [
148
+ "teams_list_teams",
149
+ "teams_list_channels",
150
+ "teams_read_messages",
151
+ "teams_read_thread",
152
+ "teams_post_message",
153
+ "teams_reply",
154
+ "teams_request_approval",
155
+ "teams_get_approval",
156
+ ],
157
+ register(server, ctx, allowed) {
158
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
159
+ const sends = { readOnlyHint: false, destructiveHint: false, openWorldHint: true };
160
+ if (allowed.has("teams_list_teams"))
161
+ server.registerTool("teams_list_teams", {
162
+ description: "List the teams and chats this agent's bot was added to and may use. Team ids are what other Teams tools take. " +
163
+ "A direct chat carries user: the Entra object id of the person in it (Teams gives such chats no name).",
164
+ inputSchema: z.object({}),
165
+ annotations: readOnly,
166
+ }, () => audited(ctx, "teams_list_teams", null, async () => {
167
+ const { teams, chats } = await places(ctx);
168
+ return json({
169
+ teams: teams.map((t) => ({ team: t.teamGroupId, name: t.name })),
170
+ chats: chats.map((c) => ({
171
+ chat: c.conversationId,
172
+ kind: c.kind === "personal" ? "direct" : "group",
173
+ name: c.name,
174
+ user: c.kind === "personal" ? c.userAadId : null,
175
+ })),
176
+ });
177
+ }));
178
+ if (allowed.has("teams_list_channels"))
179
+ server.registerTool("teams_list_channels", {
180
+ description: "List the channels of a team this agent may use.",
181
+ inputSchema: z.object({ team: z.string().describe("Team id from teams_list_teams.") }),
182
+ annotations: readOnly,
183
+ }, ({ team: id }) => audited(ctx, "teams_list_channels", id, async (mark) => {
184
+ const place = await team(ctx, id);
185
+ const data = ok(await access(ctx).listChannels(place), mark);
186
+ const allowedChannels = channelsLimit(ctx);
187
+ const channels = (data?.conversations ?? [])
188
+ .filter((c) => !allowedChannels || allowedChannels.includes(c.id))
189
+ .map((c) => ({ channel: c.id, name: c.name ?? "General" }));
190
+ return json({ channels });
191
+ }));
192
+ if (allowed.has("teams_read_messages"))
193
+ server.registerTool("teams_read_messages", {
194
+ description: "Read recent messages in a channel (top-level posts, newest first, with reply counts) or a group chat. Direct chats can't be read. " +
195
+ "Each message has from (a display name, which anyone can set), from_id (the sender's Microsoft Entra object id; null for apps) and from_kind (user or application).",
196
+ inputSchema: z.object({
197
+ ...where,
198
+ max_results: z.number().int().min(1).max(50).default(20),
199
+ }),
200
+ annotations: readOnly,
201
+ }, (input) => audited(ctx, "teams_read_messages", input.chat ?? `${input.team ?? ""}/${input.channel ?? ""}`, async (mark) => {
202
+ const r = await resolve(ctx, input, mark, { readable: true });
203
+ const path = r.kind === "chat"
204
+ ? `/v1.0/chats/${encodeURIComponent(r.place.conversationId)}/messages?$top=${input.max_results}&$orderby=createdDateTime desc`
205
+ : `/v1.0/teams/${r.place.teamGroupId}/channels/${encodeURIComponent(r.channel)}/messages?$top=${input.max_results}&$expand=replies`;
206
+ const data = ok(await access(ctx).graph(path), mark);
207
+ const messages = (data?.value ?? [])
208
+ .filter((m) => (m.messageType ?? "message") === "message")
209
+ .map(message);
210
+ return json({ messages, more: Boolean(data?.["@odata.nextLink"]) });
211
+ }));
212
+ if (allowed.has("teams_read_thread"))
213
+ server.registerTool("teams_read_thread", {
214
+ description: "Read a channel post and its replies, oldest first. Each message has from, from_id (the sender's Microsoft Entra object id; null for apps) and from_kind (user or application).",
215
+ inputSchema: z.object({
216
+ team: z.string().describe("Team id from teams_list_teams."),
217
+ channel: z.string().describe("Channel id from teams_list_channels."),
218
+ message_id: z.string().describe("The post's id, from teams_read_messages."),
219
+ }),
220
+ annotations: readOnly,
221
+ }, (input) => audited(ctx, "teams_read_thread", `${input.channel}/${input.message_id}`, async (mark) => {
222
+ const place = await team(ctx, input.team);
223
+ const ch = await channel(ctx, place, input.channel, mark);
224
+ if (!MESSAGE.test(input.message_id))
225
+ throw new Denied("Give a message id from teams_read_messages");
226
+ const base = `/v1.0/teams/${place.teamGroupId}/channels/${encodeURIComponent(ch)}/messages/${input.message_id}`;
227
+ const root = ok(await access(ctx).graph(base), mark);
228
+ const replies = ok(await access(ctx).graph(`${base}/replies?$top=50`), mark);
229
+ const list = (replies?.value ?? []).reverse();
230
+ return json({
231
+ post: message(root),
232
+ replies: list
233
+ .filter((m) => (m.messageType ?? "message") === "message")
234
+ .map(message),
235
+ });
236
+ }));
237
+ if (allowed.has("teams_post_message"))
238
+ server.registerTool("teams_post_message", {
239
+ description: "Post a message as this agent's bot: a new post in a channel (or a reply to a post with reply_to), or a message in a chat. Markdown is supported.",
240
+ inputSchema: z.object({
241
+ ...where,
242
+ text: z.string(),
243
+ reply_to: z.string().optional().describe("A channel post's id, to reply under it."),
244
+ }),
245
+ annotations: sends,
246
+ }, (input) => audited(ctx, "teams_post_message", input.chat ?? `${input.channel ?? ""}${input.reply_to ? `/${input.reply_to}` : ""}`, async (mark) => {
247
+ const body = text(input.text);
248
+ const r = await resolve(ctx, input, mark);
249
+ const teams = access(ctx);
250
+ let data;
251
+ if (r.kind === "chat") {
252
+ if (input.reply_to)
253
+ throw new Denied("reply_to is for channel posts");
254
+ data = ok(await teams.post(r.place.serviceUrl, r.place.conversationId, body), mark);
255
+ }
256
+ else if (input.reply_to) {
257
+ if (!MESSAGE.test(input.reply_to))
258
+ throw new Denied("Give a post id from teams_read_messages");
259
+ data = ok(await teams.post(r.place.serviceUrl, `${r.channel};messageid=${input.reply_to}`, body, input.reply_to), mark);
260
+ }
261
+ else
262
+ data = ok(await teams.newThread(r.place, r.channel, body), mark);
263
+ return json({ posted: true, id: data?.activityId ?? data?.id ?? null });
264
+ }));
265
+ if (allowed.has("teams_request_approval"))
266
+ server.registerTool("teams_request_approval", {
267
+ description: "Ask one person to approve or reject something: posts a card as this agent's bot, in a channel (a new post) or a chat, with Approve and Reject buttons and an optional comment. " +
268
+ "Only that person's click counts, in that team or chat: the click arrives in a request authenticated by a Bot Framework token, and the approver is matched on the Entra object id Teams sends. " +
269
+ "You choose the approver; nothing here checks that they are the right person to approve this. The guarantee is that the person you named clicked, not that this is the right person. " +
270
+ "Returns approval_id: read the answer later with teams_get_approval. Requests expire after 7 days.",
271
+ inputSchema: z.object({
272
+ ...where,
273
+ approver: z
274
+ .string()
275
+ .max(320)
276
+ .describe("The person's sign-in name (e.g. ann@contoso.com) or Entra object id."),
277
+ title: z.string().min(1).max(200),
278
+ text: z.string().min(1).max(4000).describe("What is asked, shown on the card."),
279
+ facts: z
280
+ .array(z.object({ name: z.string().min(1).max(100), value: z.string().max(1000) }))
281
+ .max(20)
282
+ .optional()
283
+ .describe("Name and value pairs shown on the card, e.g. Amount: 1,200 USD."),
284
+ }),
285
+ annotations: sends,
286
+ }, (input) => audited(ctx, "teams_request_approval", `${input.chat ?? `${input.team ?? ""}/${input.channel ?? ""}`} → ${input.approver}`, async (mark, retarget) => {
287
+ if (!input.title.trim() || !input.text.trim())
288
+ throw new Denied("The card is empty");
289
+ const r = await resolve(ctx, input, mark);
290
+ const person = await approver(ctx, input.approver, mark);
291
+ const where = r.kind === "chat" ? r.place.conversationId : r.channel;
292
+ retarget(`${where} → ${person.id}`);
293
+ const teams = access(ctx);
294
+ const token = newApprovalToken();
295
+ const row = await teams.createApproval({
296
+ tokenHash: hashApprovalToken(token),
297
+ conversationId: r.place.conversationId,
298
+ serviceUrl: r.place.serviceUrl,
299
+ approverAadId: person.id,
300
+ approverName: person.name,
301
+ title: input.title.trim(),
302
+ body: input.text.trim(),
303
+ facts: input.facts ?? [],
304
+ days: APPROVAL_DAYS,
305
+ });
306
+ let threadId;
307
+ let messageId;
308
+ try {
309
+ if (r.kind === "chat") {
310
+ const data = ok(await teams.postCard(r.place.serviceUrl, r.place.conversationId, approvalCard(row)), mark);
311
+ threadId = r.place.conversationId;
312
+ messageId = data?.id ?? null;
313
+ }
314
+ else {
315
+ const data = ok(await teams.newThreadCard(r.place, r.channel, approvalCard(row)), mark);
316
+ messageId = data?.activityId ?? null;
317
+ threadId =
318
+ data?.id ?? (messageId ? `${r.channel};messageid=${messageId}` : r.channel);
319
+ }
320
+ }
321
+ catch (error) {
322
+ await teams.discardApproval(row.id);
323
+ throw error;
324
+ }
325
+ // Without the message id the card cannot be edited later; the answer still counts.
326
+ if (messageId)
327
+ await teams.approvalPosted(row.id, threadId, messageId);
328
+ return json({ approval_id: token, message_id: messageId, expires: row.expiresAt });
329
+ }));
330
+ if (allowed.has("teams_get_approval"))
331
+ server.registerTool("teams_get_approval", {
332
+ description: "Read the answer to an approval this agent asked for with teams_request_approval: pending, approved, rejected or expired, who answered (their Entra object id and name), when, and their comment.",
333
+ inputSchema: z.object({ approval_id: z.string().max(100) }),
334
+ annotations: readOnly,
335
+ }, (input) => audited(ctx, "teams_get_approval", null, async (_mark, retarget) => {
336
+ if (!looksLikeApprovalToken(input.approval_id))
337
+ throw new Denied("That approval id is not valid");
338
+ // Another agent's id finds nothing, the same as a made-up one.
339
+ const a = await access(ctx).approval(hashApprovalToken(input.approval_id));
340
+ if (!a)
341
+ throw new Denied("No approval of this agent has that id");
342
+ retarget(a.id);
343
+ return json({
344
+ status: approvalStatus(a),
345
+ title: a.title,
346
+ approver: { id: a.approverAadId, name: a.approverName },
347
+ decided_by: a.decidedByAadId ? { id: a.decidedByAadId, name: a.decidedByName } : null,
348
+ decided_at: a.decidedAt,
349
+ comment: a.comment,
350
+ expires: a.expiresAt,
351
+ });
352
+ }));
353
+ if (allowed.has("teams_reply"))
354
+ server.registerTool("teams_reply", {
355
+ description: "Answer the Teams message that started this session, in the same thread. Use the reply_token given with the message.",
356
+ inputSchema: z.object({ reply_token: z.string(), text: z.string() }),
357
+ annotations: sends,
358
+ }, (input) => audited(ctx, "teams_reply", null, async (mark, retarget) => {
359
+ const body = text(input.text);
360
+ if (!looksLikeReplyToken(input.reply_token))
361
+ throw new Denied("That reply token is not valid");
362
+ const teams = access(ctx);
363
+ // Another agent's token, an old one or a made-up one all find nothing.
364
+ const run = await teams.runForReply(hashReplyToken(input.reply_token));
365
+ if (!run)
366
+ throw new Denied("That reply token is not valid or has expired");
367
+ retarget(run.threadId);
368
+ const place = (await teams.places()).find((p) => p.conversationId === run.conversationId);
369
+ if (!place)
370
+ throw new Denied("The bot is no longer in that conversation");
371
+ // The key's limits may have changed since the message arrived.
372
+ if (place.kind === "team") {
373
+ await channel(ctx, await team(ctx, place.teamGroupId ?? ""), run.threadId.split(";")[0], mark);
374
+ }
375
+ else if (confined(ctx))
376
+ throw new Denied("This agent cannot reach that chat");
377
+ // A reply is used only by a post that went through.
378
+ if (!(await teams.claimReply(run.id)))
379
+ throw new Denied("That reply token is not valid or has expired");
380
+ try {
381
+ ok(await teams.post(place.serviceUrl, run.threadId, body, run.triggerActivityId), mark);
382
+ }
383
+ catch (error) {
384
+ await teams.releaseReply(run.id);
385
+ throw error;
386
+ }
387
+ return json({ replied: true });
388
+ }));
389
+ },
390
+ };
391
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/teams/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClG,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,QAAQ,GAGT,MAAM,4CAA4C,CAAC;AAGpD,OAAO,EACL,OAAO,EACP,MAAM,EACN,IAAI,EACJ,SAAS,EACT,YAAY,GAGb,MAAM,4CAA4C,CAAC;AAEpD,6FAA6F;AAC7F,6FAA6F;AAC7F,6DAA6D;AAE7D,MAAM,IAAI,GAAG,iEAAiE,CAAC;AAC/E,MAAM,OAAO,GAAG,4CAA4C,CAAC;AAC7D,MAAM,IAAI,GAAG,wEAAwE,CAAC;AACtF,MAAM,OAAO,GAAG,YAAY,CAAC;AAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB,SAAS,MAAM,CAAC,GAAgB;IAC9B,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxE,MAAM,aAAa,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9E,MAAM,QAAQ,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtF,KAAK,UAAU,MAAM,CAAC,GAAgB;IACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,MAAM,CACf,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,MAAM;YACjB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAC9D;QACD,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAgB,EAAE,EAAU;IAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,MAAM,CAAC,sCAAsC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACxF,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qFAAqF;AACrF,6EAA6E;AAC7E,KAAK,UAAU,OAAO,CACpB,GAAgB,EAChB,KAAsB,EACtB,EAAU,EACV,IAAyB;IAEzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,MAAM,CAAC,4CAA4C,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,MAAM,CAAC,sCAAsC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAE,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7E,MAAM,IAAI,MAAM,CAAC,kCAAkC,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAgB,EAAE,EAAU,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,EAAE;IACzE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,MAAM,CAAC,sCAAsC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAClE,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QACvC,MAAM,IAAI,MAAM,CAAC,+DAA+D,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,EAAE,CAAC,GAAmB,EAAE,IAAyB;IACxD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAgF,CAAC;QAC/F,MAAM,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,CAAC;QAChD,MAAM,IAAI,YAAY,CACpB,GAAG,CAAC,MAAM,EACV,4BAA4B,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,IAAW,CAAC;AACzB,CAAC;AAED,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,iGAAiG;AACjG,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC5D,SAAS,MAAM,CAAC,CAAe;IAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;IAC1B,IAAI,IAAI;QACN,OAAO;YACL,OAAO,EACL,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC5E,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;gBACvB,CAAC,CAAC,IAAI;YACV,SAAS,EAAE,MAAe;SAC3B,CAAC;IACJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE,aAAuB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAA8C,EAAE,EAAE,CAAC,CAAC;IACnE,EAAE,EAAE,CAAC,CAAC,EAAE;IACR,OAAO,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;IAClC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,GAAG,MAAM,CAAC,CAAC,CAAC;IACZ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH,qDAAqD;AACrD,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC9D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAChF,CAAC;AAEF,KAAK,UAAU,OAAO,CACpB,GAAgB,EAChB,KAAyD,EACzD,IAAyB,EACzB,OAA+B,EAAE;IAEjC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;QAC7C,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;IAC7E,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,SAAkB;YACxB,KAAK;YACL,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;SACxD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,MAAM,CAAC,6CAA6C,CAAC,CAAC;AAClE,CAAC;AAED,sEAAsE;AACtE,MAAM,OAAO,GAAG,oDAAoD,CAAC;AAErE,6FAA6F;AAC7F,+FAA+F;AAC/F,2FAA2F;AAC3F,WAAW;AACX,KAAK,UAAU,QAAQ,CAAC,GAAgB,EAAE,KAAa,EAAE,IAAyB;IAChF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3C,MAAM,IAAI,MAAM,CAAC,4EAA4E,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,eAAe,kBAAkB,CAAC,KAAK,CAAC,yBAAyB;KACxE,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,MAAM,IAAI,MAAM,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAA0C,CAAC;IACpE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;QAAE,MAAM,IAAI,MAAM,CAAC,wBAAwB,QAAQ,aAAa,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAY;IACjC,KAAK,EAAE;QACL,kBAAkB;QAClB,qBAAqB;QACrB,qBAAqB;QACrB,mBAAmB;QACnB,oBAAoB;QACpB,aAAa;QACb,wBAAwB;QACxB,oBAAoB;KACrB;IAED,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO;QAC3B,MAAM,QAAQ,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC;QACtE,MAAM,KAAK,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC;QAE5F,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACjC,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;gBACE,WAAW,EACT,gHAAgH;oBAChH,uGAAuG;gBACzG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,WAAW,EAAE,QAAQ;aACtB,EACD,GAAG,EAAE,CACH,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;gBAChD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACvB,IAAI,EAAE,CAAC,CAAC,cAAc;wBACtB,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;wBAChD,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;qBACjD,CAAC,CAAC;iBACJ,CAAC,CAAC;YACL,CAAC,CAAC,CACL,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YACpC,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;gBACE,WAAW,EAAE,iDAAiD;gBAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;gBACtF,WAAW,EAAE,QAAQ;aACtB,EACD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CACf,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAI,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAqC;qBAC9E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;qBACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC,CACL,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YACpC,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;gBACE,WAAW,EACT,oIAAoI;oBACpI,oKAAoK;gBACtK,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpB,GAAG,KAAK;oBACR,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;iBACzD,CAAC;gBACF,WAAW,EAAE,QAAQ;aACtB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CACL,GAAG,EACH,qBAAqB,EACrB,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,EAC1D,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM,IAAI,GACR,CAAC,CAAC,IAAI,KAAK,MAAM;oBACf,CAAC,CAAC,eAAe,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,KAAK,CAAC,WAAW,gCAAgC;oBAC9H,CAAC,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,WAAW,aAAa,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,KAAK,CAAC,WAAW,kBAAkB,CAAC;gBACxI,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACrD,MAAM,QAAQ,GAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAoB;qBACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,SAAS,CAAC;qBACzD,GAAG,CAAC,OAAO,CAAC,CAAC;gBAChB,OAAO,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC,CACF,CACJ,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAClC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;gBACE,WAAW,EACT,gLAAgL;gBAClL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;oBAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;oBACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;iBAC5E,CAAC;gBACF,WAAW,EAAE,QAAQ;aACtB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CACL,GAAG,EACH,mBAAmB,EACnB,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,EAAE,EACtC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;oBACjC,MAAM,IAAI,MAAM,CAAC,4CAA4C,CAAC,CAAC;gBACjE,MAAM,IAAI,GAAG,eAAe,KAAK,CAAC,WAAW,aAAa,kBAAkB,CAAC,EAAE,CAAC,aAAa,KAAK,CAAC,UAAU,EAAE,CAAC;gBAChH,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAiB,CAAC;gBACrE,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC7E,MAAM,IAAI,GAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAoB,CAAC,OAAO,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC;oBACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,IAAI;yBACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,SAAS,CAAC;yBACzD,GAAG,CAAC,OAAO,CAAC;iBAChB,CAAC,CAAC;YACL,CAAC,CACF,CACJ,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;YACnC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;gBACE,WAAW,EACT,kJAAkJ;gBACpJ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpB,GAAG,KAAK;oBACR,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;iBACpF,CAAC;gBACF,WAAW,EAAE,KAAK;aACnB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CACL,GAAG,EACH,oBAAoB,EACpB,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACnF,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,IAAI,CAAC;gBACT,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACtB,IAAI,KAAK,CAAC,QAAQ;wBAAE,MAAM,IAAI,MAAM,CAAC,+BAA+B,CAAC,CAAC;oBACtE,IAAI,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtF,CAAC;qBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;wBAC/B,MAAM,IAAI,MAAM,CAAC,yCAAyC,CAAC,CAAC;oBAC9D,IAAI,GAAG,EAAE,CACP,MAAM,KAAK,CAAC,IAAI,CACd,CAAC,CAAC,KAAK,CAAC,UAAU,EAClB,GAAG,CAAC,CAAC,OAAO,cAAc,KAAK,CAAC,QAAQ,EAAE,EAC1C,IAAI,EACJ,KAAK,CAAC,QAAQ,CACf,EACD,IAAI,CACL,CAAC;gBACJ,CAAC;;oBAAM,IAAI,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACxE,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC,CACF,CACJ,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YACvC,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;gBACE,WAAW,EACT,iLAAiL;oBACjL,gMAAgM;oBAChM,sLAAsL;oBACtL,mGAAmG;gBACrG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpB,GAAG,KAAK;oBACR,QAAQ,EAAE,CAAC;yBACR,MAAM,EAAE;yBACR,GAAG,CAAC,GAAG,CAAC;yBACR,QAAQ,CAAC,sEAAsE,CAAC;oBACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;oBACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;oBAC/E,KAAK,EAAE,CAAC;yBACL,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;yBAClF,GAAG,CAAC,EAAE,CAAC;yBACP,QAAQ,EAAE;yBACV,QAAQ,CAAC,iEAAiE,CAAC;iBAC/E,CAAC;gBACF,WAAW,EAAE,KAAK;aACnB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CACL,GAAG,EACH,wBAAwB,EACxB,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,EACnF,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,MAAM,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACrF,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACrE,QAAQ,CAAC,GAAG,KAAK,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC;oBACrC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;oBACnC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc;oBACtC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU;oBAC9B,aAAa,EAAE,MAAM,CAAC,EAAE;oBACxB,YAAY,EAAE,MAAM,CAAC,IAAI;oBACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;oBACzB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;oBACvB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;oBACxB,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;gBACH,IAAI,QAAgB,CAAC;gBACrB,IAAI,SAAwB,CAAC;gBAC7B,IAAI,CAAC;oBACH,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBACtB,MAAM,IAAI,GAAG,EAAE,CACb,MAAM,KAAK,CAAC,QAAQ,CAClB,CAAC,CAAC,KAAK,CAAC,UAAU,EAClB,CAAC,CAAC,KAAK,CAAC,cAAc,EACtB,YAAY,CAAC,GAAG,CAAC,CAClB,EACD,IAAI,CACL,CAAC;wBACF,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;wBAClC,SAAS,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,EAAE,CACb,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,EAChE,IAAI,CACL,CAAC;wBACF,SAAS,GAAG,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC;wBACrC,QAAQ;4BACN,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAChF,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACpC,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,mFAAmF;gBACnF,IAAI,SAAS;oBAAE,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACvE,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACrF,CAAC,CACF,CACJ,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;YACnC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;gBACE,WAAW,EACT,kMAAkM;gBACpM,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3D,WAAW,EAAE,QAAQ;aACtB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC5C,MAAM,IAAI,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBACpD,+DAA+D;gBAC/D,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,MAAM,CAAC,uCAAuC,CAAC,CAAC;gBAClE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACf,OAAO,IAAI,CAAC;oBACV,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE;oBACvD,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI;oBACrF,UAAU,EAAE,CAAC,CAAC,SAAS;oBACvB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,SAAS;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CACL,CAAC;QAEJ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YAC5B,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;gBACE,WAAW,EACT,qHAAqH;gBACvH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpE,WAAW,EAAE,KAAK;aACnB,EACD,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC;oBACzC,MAAM,IAAI,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBACpD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,uEAAuE;gBACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBACvE,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,MAAM,CAAC,8CAA8C,CAAC,CAAC;gBAC3E,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc,CAC/C,CAAC;gBACF,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,MAAM,CAAC,2CAA2C,CAAC,CAAC;gBAC1E,+DAA+D;gBAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,OAAO,CACX,GAAG,EACH,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EACxC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAC1B,IAAI,CACL,CAAC;gBACJ,CAAC;qBAAM,IAAI,QAAQ,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBAChF,oDAAoD;gBACpD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnC,MAAM,IAAI,MAAM,CAAC,8CAA8C,CAAC,CAAC;gBACnE,IAAI,CAAC;oBACH,EAAE,CACA,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAC7E,IAAI,CACL,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjC,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,CAAC,CAAC,CACL,CAAC;IACN,CAAC;CACF,CAAC"}
@@ -0,0 +1,186 @@
1
+ {
2
+ "id": "workday",
3
+ "name": "Workday",
4
+ "description": "Let agents look up workers, managers and organizations, read time off, and run the Workday reports you choose. Pay and personal data stay out unless a report you add includes them.",
5
+ "logo": "/brand/registry/workday.svg",
6
+ "identity": "An integration system user named \"{brand.microsoft.appName}\" in a security group of its own, signing in through an API client for integrations.",
7
+ "accountKey": "account",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create an integration system user",
12
+ "body": "In Workday, create an integration system user named \"{brand.microsoft.appName}\" that cannot sign in to the Workday website. Give it a long random password; it is never typed again. Then exempt it from password expiry, so the connection does not stop when the password would expire.",
13
+ "click": [
14
+ "Search: Create Integration System User > User Name: {brand.microsoft.appName} > Session Timeout Minutes: 0 > Do Not Allow UI Sessions: on > OK",
15
+ "Search: Maintain Password Rules > System Users exempt from password expiration > add {brand.microsoft.appName} > OK"
16
+ ]
17
+ },
18
+ {
19
+ "title": "Put it in a security group of its own",
20
+ "body": "Create an integration system security group and add the user to it. Choose Constrained if Workday itself should also keep the account to some organizations; Unconstrained reaches every worker your domain permissions allow, and you can still narrow each agent to organizations here.",
21
+ "click": [
22
+ "Search: Create Security Group > Type: Integration System Security Group (Unconstrained) or (Constrained) > Name: {brand.microsoft.appName} > OK",
23
+ "Integration System Users: {brand.microsoft.appName} > OK"
24
+ ]
25
+ },
26
+ {
27
+ "title": "Give the group these domain permissions",
28
+ "body": "Give the security group View (Get) on the domains below, or Modify (Put) where it says so, then activate the pending security policy changes. Without them Workday answers with empty lists or refuses the call.",
29
+ "click": [
30
+ "Search: Maintain Permissions for Security Group > {brand.microsoft.appName} > Domain Security Policy Permissions > add each domain below",
31
+ "Search: Activate Pending Security Policy Changes > Comment: {brand.microsoft.appName} > OK > Confirm > OK"
32
+ ],
33
+ "permissions": true
34
+ },
35
+ {
36
+ "title": "Register an API client for integrations",
37
+ "body": "Register an API client for integrations named \"{brand.microsoft.appName}\" with non-expiring refresh tokens and these functional area scopes. Copy the client ID and secret: Workday shows the secret only once.",
38
+ "click": [
39
+ "Search: Register API Client for Integrations > Client Name: {brand.microsoft.appName} > Non-Expiring Refresh Tokens: on > Scope (Functional Areas): the areas below > OK"
40
+ ],
41
+ "copy": ["{scope}"]
42
+ },
43
+ {
44
+ "title": "Make its refresh token",
45
+ "body": "Make a refresh token that signs the API client in as the integration system user, and copy it. Also copy the Workday REST API Endpoint shown at the top of View API Clients; it names your tenant.",
46
+ "click": [
47
+ "Search: View API Clients > API Clients for Integrations > {brand.microsoft.appName} > Related Actions > API Client > Manage Refresh Tokens for Integrations",
48
+ "Workday Account: {brand.microsoft.appName} > Generate New Refresh Token: on > OK > copy the refresh token"
49
+ ]
50
+ },
51
+ {
52
+ "title": "Add reports (optional)",
53
+ "body": "Most companies keep their own data, such as open job requisitions, headcount or cost centers, in custom reports. For each report agents may run: make it an advanced report enabled as a web service, share it with the integration system user, and copy its JSON link. Any prompts the report has become filters agents can set. Agents see every column the report has, so leave out pay, national IDs and anything else they should not read.",
54
+ "click": [
55
+ "The report > Related Actions > Custom Report > Edit > Advanced > Enable As Web Service: on",
56
+ "Share > Share with specific authorized groups and users: {brand.microsoft.appName} > OK",
57
+ "The report > Related Actions > Web Service > View URLs > JSON > copy the link"
58
+ ]
59
+ }
60
+ ],
61
+ "afterConnect": [],
62
+ "fields": [
63
+ {
64
+ "id": "endpoint",
65
+ "label": "Workday REST API endpoint",
66
+ "help": "Shown at the top of View API Clients in Workday.",
67
+ "placeholder": "https://wd5-services1.myworkday.com/ccx/api/v1/acme",
68
+ "secret": false
69
+ },
70
+ {
71
+ "id": "client_id",
72
+ "label": "Client ID",
73
+ "secret": false
74
+ },
75
+ {
76
+ "id": "client_secret",
77
+ "label": "Client secret",
78
+ "secret": true
79
+ },
80
+ {
81
+ "id": "refresh_token",
82
+ "label": "Refresh token",
83
+ "secret": true
84
+ },
85
+ {
86
+ "id": "reports",
87
+ "label": "Reports",
88
+ "help": "Optional. Each report's JSON link from Workday, separated by spaces or new lines. Leave empty for none.",
89
+ "placeholder": "https://wd5-services1.myworkday.com/ccx/service/customreport2/acme/jsmith/Open_Requisitions?format=json",
90
+ "secret": false
91
+ },
92
+ {
93
+ "id": "report_org_column",
94
+ "label": "Organization column in reports",
95
+ "help": "Optional. The column holding each row's organization Workday ID, in every report above. Agents narrowed to some organizations see only their rows, and cannot run reports while this is empty.",
96
+ "placeholder": "Supervisory_Organization_ID",
97
+ "secret": false
98
+ }
99
+ ],
100
+ "capabilities": [
101
+ {
102
+ "id": "workers",
103
+ "label": "Look up workers",
104
+ "description": "Find workers and read their title, organization, location, work email, manager chain and direct reports, and read supervisory organizations. No pay or personal data.",
105
+ "required": true,
106
+ "scopes": ["Staffing", "Organizations and Roles"],
107
+ "permissions": [
108
+ "Worker Data: Public Worker Reports (View)",
109
+ "Reports: Organization (View)",
110
+ "Reports: Manager (View)"
111
+ ],
112
+ "forbidden": "The integration system user's security group needs View on Worker Data: Public Worker Reports, Reports: Organization and Reports: Manager, and the API client the Staffing and Organizations and Roles scopes.",
113
+ "tools": [
114
+ "workday_search_workers",
115
+ "workday_get_worker",
116
+ "workday_list_direct_reports",
117
+ "workday_get_management_chain",
118
+ "workday_get_organization",
119
+ "workday_list_organization_workers"
120
+ ]
121
+ },
122
+ {
123
+ "id": "time_off",
124
+ "label": "Read time off",
125
+ "description": "Read workers' time off balances and their requested, approved and taken time off.",
126
+ "scopes": ["Time Off and Leave"],
127
+ "permissions": [
128
+ "Worker Data: Time Off (Time Off) (View)",
129
+ "Worker Data: Time Off (Time Off Balances) (View)"
130
+ ],
131
+ "forbidden": "The integration system user's security group needs View on Worker Data: Time Off (Time Off) and Worker Data: Time Off (Time Off Balances), and the API client the Time Off and Leave scope.",
132
+ "tools": ["workday_get_time_off_balances", "workday_list_time_off"]
133
+ },
134
+ {
135
+ "id": "request_time_off",
136
+ "label": "Request time off",
137
+ "description": "Submit time off requests for workers. Each request goes through your Request Time Off approvals as if the worker had asked.",
138
+ "note": "Agents with this can submit requests in any allowed worker's name. Keep each agent to the organizations it needs.",
139
+ "scopes": ["Time Off and Leave"],
140
+ "permissions": [
141
+ "Request Time Off (REST Service) (Modify)",
142
+ "Request Time Off business process: let the security group initiate it"
143
+ ],
144
+ "forbidden": "The integration system user's security group needs Modify on Request Time Off (REST Service) and may need to be allowed to initiate the Request Time Off business process.",
145
+ "tools": ["workday_list_time_off_types", "workday_request_time_off"]
146
+ },
147
+ {
148
+ "id": "reports",
149
+ "label": "Run reports",
150
+ "description": "Run the reports added to this connection, filtered by their prompts.",
151
+ "scopes": [],
152
+ "permissions": [
153
+ "Each report shared with the integration system user, and View on the domains securing its data"
154
+ ],
155
+ "forbidden": "Share the report with the integration system user, enable it as a web service, and give its security group View on the domains securing the report's data.",
156
+ "tools": ["workday_list_reports", "workday_run_report"]
157
+ }
158
+ ],
159
+ "limits": [
160
+ {
161
+ "id": "organizations",
162
+ "label": "Organizations",
163
+ "help": "Workday IDs of supervisory organizations (their sub-organizations included) or companies. The agent reaches only workers in them. Find an ID on the organization: Related Actions > Integration IDs > View Reference IDs (the Workday ID). Leave empty to allow every worker the account can see.",
164
+ "kind": "list",
165
+ "required": false,
166
+ "pattern": "^[0-9a-f]{32}$"
167
+ },
168
+ {
169
+ "id": "reports",
170
+ "label": "Reports",
171
+ "help": "Leave empty to allow every report added to this connection.",
172
+ "kind": "list",
173
+ "required": false,
174
+ "pattern": "^[A-Za-z0-9_.-]{1,200}$"
175
+ }
176
+ ],
177
+ "verify": {
178
+ "label": "Workday tenant reached",
179
+ "check": "tenant"
180
+ },
181
+ "discover": {
182
+ "label": "Reports agents can run",
183
+ "check": "reports"
184
+ },
185
+ "revoke": "In Workday, open View API Clients, then API Clients for Integrations, then {brand.microsoft.appName}, and revoke its refresh token under Manage Refresh Tokens for Integrations, or inactivate the integration system user."
186
+ }
@@ -0,0 +1,8 @@
1
+ declare const _default: {
2
+ id: string;
3
+ create: () => {
4
+ vendor: import("../../packages/connector-kit/src/types.js").Vendor;
5
+ toolset: import("../../packages/connector-kit/src/common.js").Toolset;
6
+ };
7
+ };
8
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { workdayTools } from "./tools.js";
2
+ import { workdayVendor } from "./vendor.js";
3
+ export default {
4
+ id: "workday",
5
+ create: () => ({ vendor: workdayVendor(), toolset: workdayTools }),
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../connectors/workday/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAe;IACb,EAAE,EAAE,SAAS;IACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;CACzC,CAAC"}