@cartanova/qgrid-cli 2.10.9 → 2.11.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 (318) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +22 -20
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +43 -34
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -69
  24. package/bundle/dist/application/request-log/request-log.types.js +8 -2
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +40 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +2 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +2 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/migrations/20261018215031_alter_request_logs_add1_alter1.js +15 -0
  41. package/bundle/dist/server-bootstrap.js +4 -2
  42. package/bundle/dist/server-error-handler.js +1 -1
  43. package/bundle/dist/sonamu.config.js +37 -8
  44. package/bundle/dist/startup-migrations.js +17 -7
  45. package/bundle/dist/testing/global.js +1 -1
  46. package/bundle/dist/testing/schema-bench.js +0 -0
  47. package/bundle/dist/testing/test-database-name.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  49. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  50. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  51. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  52. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  53. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  54. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  55. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  56. package/bundle/dist/utils/providers/common/effort.js +3 -3
  57. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  58. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  59. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  60. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  61. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  62. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  63. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  64. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  65. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  66. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  67. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  68. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  69. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  70. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  71. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  72. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  73. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  74. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  75. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  76. package/bundle/dist/utils/providers/grok/index.js +11 -0
  77. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  78. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  79. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  80. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  81. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  82. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  83. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  84. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  85. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  86. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  87. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  88. package/bundle/dist/utils/quiet-hours.js +1 -1
  89. package/bundle/dist/utils/slack-notify.js +14 -8
  90. package/bundle/dist/utils/subset-loaders.js +4 -5
  91. package/bundle/src/application/monit/log-buffer.ts +23 -9
  92. package/bundle/src/application/monit/monit.frame.ts +22 -5
  93. package/bundle/src/application/monit/monit.types.ts +6 -0
  94. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  95. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  96. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  97. package/bundle/src/application/qgrid/oauth.ts +51 -15
  98. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  99. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +33 -0
  101. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +87 -40
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  103. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  104. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  105. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  106. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  107. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  108. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  109. package/bundle/src/application/qgrid/token-death.ts +4 -0
  110. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  111. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  112. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  113. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  114. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  115. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  116. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  117. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  118. package/bundle/src/application/request-log/request-log.entity.json +8 -0
  119. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  120. package/bundle/src/application/request-log/request-log.model.ts +279 -145
  121. package/bundle/src/application/request-log/request-log.types.ts +17 -0
  122. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  123. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  124. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  125. package/bundle/src/application/setting/setting.constant.ts +9 -0
  126. package/bundle/src/application/setting/setting.model.ts +12 -2
  127. package/bundle/src/application/setting/setting.store.ts +5 -1
  128. package/bundle/src/application/setting/setting.types.ts +8 -0
  129. package/bundle/src/application/sonamu.generated.http +135 -0
  130. package/bundle/src/application/sonamu.generated.sso.ts +3 -0
  131. package/bundle/src/application/sonamu.generated.ts +29 -0
  132. package/bundle/src/application/token/token.identity.test.ts +20 -0
  133. package/bundle/src/application/token/token.model.ts +66 -7
  134. package/bundle/src/application/token/token.types.ts +24 -1
  135. package/bundle/src/i18n/en.ts +19 -0
  136. package/bundle/src/i18n/ko.ts +21 -0
  137. package/bundle/src/i18n/sd.generated.ts +24 -2
  138. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  139. package/bundle/src/migrations/20261018215031_alter_request_logs_add1_alter1.ts +15 -0
  140. package/bundle/src/server-bootstrap.ts +4 -2
  141. package/bundle/src/server-error-handler.ts +1 -0
  142. package/bundle/src/sonamu.config.ts +69 -7
  143. package/bundle/src/startup-migrations.ts +27 -9
  144. package/bundle/src/testing/global.ts +20 -0
  145. package/bundle/src/testing/schema-bench.ts +105 -30
  146. package/bundle/src/testing/test-database-name.ts +2 -0
  147. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  148. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  149. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  150. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  151. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  152. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  153. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  154. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  155. package/bundle/src/utils/providers/common/effort.ts +9 -2
  156. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  157. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  158. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  159. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  160. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  161. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  162. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  163. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  164. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  165. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  166. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  167. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  168. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  169. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  170. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  171. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  172. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  173. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  174. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  175. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  176. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  177. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  178. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  179. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  180. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  181. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  182. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  183. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  184. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  185. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  186. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  187. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  188. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  189. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  190. package/bundle/src/utils/providers/grok/index.ts +20 -0
  191. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  192. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  193. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  194. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  195. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  196. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  197. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  198. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  199. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  200. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  201. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  202. package/bundle/src/utils/quiet-hours.ts +12 -1
  203. package/bundle/src/utils/slack-notify.ts +44 -13
  204. package/bundle/src/utils/subset-loaders.ts +7 -7
  205. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  206. package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
  207. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  208. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  209. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  210. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  211. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  212. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  213. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  214. package/bundle/web-dist/client/assets/{services.generated-BsieU37H.js → services.generated-CefiDXEv.js} +5 -5
  215. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  216. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  217. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  218. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  219. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  220. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  221. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  222. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  223. package/bundle/web-dist/client/index.html +6 -6
  224. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  225. package/bundle/web-dist/server/assets/{lazyRouteComponent-Dtd0NR4r.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  226. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  227. package/bundle/web-dist/server/assets/{monit-DvzribSE.js → monit-B2hqorPe.js} +385 -126
  228. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  229. package/bundle/web-dist/server/assets/{react-dom-B4a6-uuR.js → react-dom-BIYQzBqG.js} +2 -129
  230. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  231. package/bundle/web-dist/server/assets/{request-model-CbqfnQOJ.js → request-model-I6OdODSH.js} +15 -6
  232. package/bundle/web-dist/server/assets/{routes-BAPWTizT.js → routes-B95YlUv2.js} +760 -213
  233. package/bundle/web-dist/server/assets/{services.generated-CEbGjsI0.js → services.generated-DQATJ6qf.js} +12821 -12194
  234. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  235. package/bundle/web-dist/server/assets/{show-CxVZTAdv.js → show-Bxaj3rhH.js} +1355 -419
  236. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  237. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  238. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  239. package/bundle/web-dist/server/assets/{use-update-token-mutation-CfYmk_4_.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  240. package/bundle/web-dist/server/entry-server.generated.js +4303 -22810
  241. package/dist/cli.js +9 -9
  242. package/package.json +4 -11
  243. package/postinstall.mjs +12 -0
  244. package/skills/qgrid/SKILL.md +1 -0
  245. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  246. package/skills/qgrid/references/decision-rationale.md +24 -1
  247. package/skills/qgrid/references/grok-runtime.md +89 -0
  248. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  249. package/skills/qgrid/references/repo-map.md +10 -0
  250. package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
  251. package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
  252. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  253. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  254. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  255. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  256. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  257. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  258. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  259. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  260. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  266. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  267. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  268. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  269. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  270. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  271. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  272. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  273. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  274. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  275. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  276. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  277. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  278. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  279. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  280. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  281. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  282. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  283. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  284. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  285. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  286. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  287. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  288. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  289. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  290. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  291. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  292. package/bundle/dist/testing/setup-mocks.js +0 -16
  293. package/bundle/src/testing/setup-mocks.ts +0 -44
  294. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  295. package/bundle/web-dist/client/assets/index-CrXKu_J8.js +0 -106
  296. package/bundle/web-dist/client/assets/logs-B2SmWJXA.js +0 -1
  297. package/bundle/web-dist/client/assets/monit-D-JwXXoA.js +0 -1
  298. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  299. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  300. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  301. package/bundle/web-dist/client/assets/routes-C5r4gTvY.js +0 -5
  302. package/bundle/web-dist/client/assets/settings-D3tDSAck.js +0 -1
  303. package/bundle/web-dist/client/assets/show-Cah_kUKC.js +0 -2
  304. package/bundle/web-dist/client/assets/tokens-DU2Iyxxd.js +0 -1
  305. package/bundle/web-dist/client/assets/use-oauth-login-flow-D0UaR9_e.js +0 -1
  306. package/bundle/web-dist/client/assets/use-update-token-mutation-DAq0F8p-.js +0 -1
  307. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  308. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  309. package/bundle/web-dist/server/assets/logs-l91avYif.js +0 -509
  310. package/bundle/web-dist/server/assets/plus-KZrECewT.js +0 -19
  311. package/bundle/web-dist/server/assets/refresh-cw-BND93JrF.js +0 -23
  312. package/bundle/web-dist/server/assets/settings-BZR5HSAL.js +0 -461
  313. package/bundle/web-dist/server/assets/tokens-D1hb4eKk.js +0 -448
  314. package/bundle/web-dist/server/assets/use-oauth-login-flow-Cvdy0zF8.js +0 -178
  315. package/dist/cli.d.ts +0 -10
  316. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  317. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  318. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -0,0 +1,119 @@
1
+ import { grokProxyGet } from "./grok-direct-client.js";
2
+ import { buildGrokProxyGetHeaders } from "./grok-headers.js";
3
+ import { GrokBillingConfig, GrokSettings, GrokUserSubscription } from "./grok-types.js";
4
+ //#region src/utils/providers/grok/grok-quota.ts
5
+ function reasonOf(cause) {
6
+ return cause instanceof Error ? cause.message : String(cause);
7
+ }
8
+ function proxyHeaders(credentials) {
9
+ return buildGrokProxyGetHeaders({
10
+ bearer: credentials.accessToken,
11
+ userId: credentials.userId
12
+ });
13
+ }
14
+ function numberOrNull(value) {
15
+ if (value === void 0) return null;
16
+ const parsed = Number(value);
17
+ return Number.isFinite(parsed) ? parsed : null;
18
+ }
19
+ /** `GET {proxy}/billing?format=credits` (camelCase; U0 item 3). */
20
+ async function readGrokBilling(credentials, options = {}) {
21
+ try {
22
+ const { json } = await grokProxyGet("/billing?format=credits", {
23
+ headers: proxyHeaders(credentials),
24
+ ...options
25
+ });
26
+ const parsed = GrokBillingConfig.safeParse(json);
27
+ if (!parsed.success) return {
28
+ kind: "lookup_failed",
29
+ reason: `unexpected billing shape: ${parsed.error.message}`
30
+ };
31
+ const config = parsed.data.config;
32
+ if (!Number.isFinite(config.creditUsagePercent)) return {
33
+ kind: "lookup_failed",
34
+ reason: "creditUsagePercent unavailable"
35
+ };
36
+ const start = Date.parse(config.currentPeriod.start);
37
+ const end = Date.parse(config.currentPeriod.end);
38
+ const endMs = Number.isNaN(end) ? null : end;
39
+ return {
40
+ kind: "ok",
41
+ utilizationPct: config.creditUsagePercent,
42
+ cacheAgeMs: 0,
43
+ windowDurationMins: endMs !== null && !Number.isNaN(start) && endMs > start ? Math.round((endMs - start) / 6e4) : null,
44
+ resetsAt: endMs === null ? null : Math.floor(endMs / 1e3),
45
+ limitId: config.currentPeriod.type,
46
+ periodType: config.currentPeriod.type,
47
+ periodStart: config.currentPeriod.start,
48
+ periodEnd: config.currentPeriod.end,
49
+ periodEndMs: endMs,
50
+ prepaidBalance: numberOrNull(config.prepaidBalance?.val),
51
+ raw: parsed.data
52
+ };
53
+ } catch (error) {
54
+ return {
55
+ kind: "lookup_failed",
56
+ reason: reasonOf(error)
57
+ };
58
+ }
59
+ }
60
+ /** `GET {proxy}/settings`. */
61
+ async function readGrokSettings(credentials, options = {}) {
62
+ try {
63
+ const { json } = await grokProxyGet("/settings", {
64
+ headers: proxyHeaders(credentials),
65
+ ...options
66
+ });
67
+ const parsed = GrokSettings.safeParse(json);
68
+ if (!parsed.success) return {
69
+ kind: "lookup_failed",
70
+ reason: `unexpected settings shape: ${parsed.error.message}`
71
+ };
72
+ const settings = parsed.data;
73
+ return {
74
+ kind: "ok",
75
+ onDemandEnabled: settings.on_demand_enabled ?? null,
76
+ minClientVersion: settings.min_client_version ?? null,
77
+ defaultModel: settings.default_model ?? null,
78
+ subscriptionTierDisplay: settings.subscription_tier_display ?? null,
79
+ imageGenEnabled: settings.image_gen_enabled ?? null,
80
+ videoGenEnabled: settings.video_gen_enabled ?? null,
81
+ voiceModeEnabled: settings.voice_mode_enabled ?? null
82
+ };
83
+ } catch (error) {
84
+ return {
85
+ kind: "lookup_failed",
86
+ reason: reasonOf(error)
87
+ };
88
+ }
89
+ }
90
+ /** `GET {proxy}/user?include=subscription`. */
91
+ async function readGrokSubscription(credentials, options = {}) {
92
+ try {
93
+ const { json } = await grokProxyGet("/user?include=subscription", {
94
+ headers: proxyHeaders(credentials),
95
+ ...options
96
+ });
97
+ const parsed = GrokUserSubscription.safeParse(json);
98
+ if (!parsed.success) return {
99
+ kind: "lookup_failed",
100
+ reason: `unexpected user shape: ${parsed.error.message}`
101
+ };
102
+ return {
103
+ kind: "ok",
104
+ userId: parsed.data.userId,
105
+ tier: parsed.data.subscriptionTier ?? null,
106
+ hasGrokCodeAccess: parsed.data.hasGrokCodeAccess ?? null,
107
+ dataRetentionOptOut: parsed.data.codingDataRetentionOptOut ?? null
108
+ };
109
+ } catch (error) {
110
+ return {
111
+ kind: "lookup_failed",
112
+ reason: reasonOf(error)
113
+ };
114
+ }
115
+ }
116
+ //#endregion
117
+ export { readGrokBilling, readGrokSettings, readGrokSubscription };
118
+
119
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jvay1xdW90YS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2dyb2svZ3Jvay1xdW90YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncm9rUHJveHlHZXQgfSBmcm9tIFwiLi9ncm9rLWRpcmVjdC1jbGllbnRcIjtcbmltcG9ydCB7IGJ1aWxkR3Jva1Byb3h5R2V0SGVhZGVycyB9IGZyb20gXCIuL2dyb2staGVhZGVyc1wiO1xuaW1wb3J0IHtcbiAgR3Jva0JpbGxpbmdDb25maWcsXG4gIEdyb2tTZXR0aW5ncyxcbiAgR3Jva1VzZXJTdWJzY3JpcHRpb24sXG4gIHR5cGUgR3Jva0NyZWRlbnRpYWxzLFxufSBmcm9tIFwiLi9ncm9rLXR5cGVzXCI7XG5cbi8vIENoYXQtcHJveHkgcmVhZHMgZm9yIHRoZSBxdW90YSBnYXRlICjCpzUuMykuIEV2ZXJ5IHJlYWRlciByZXR1cm5zIGEgcmVzdWx0IHVuaW9uIGFuZCBuZXZlclxuLy8gdGhyb3dzLCBzbyBjYWxsZXJzIGNhbiBmYWlsIG9wZW4uIFRoZSBgb2tgIGJpbGxpbmcgc2hhcGUgY2FycmllcyB0aGUgc2FtZSBmaWVsZHMgYXNcbi8vIE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQgc28gdXNhZ2Ugdmlld3MgY2FuIHRyZWF0IGJvdGggcHJvdmlkZXJzIGFsaWtlLlxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tQcm94eVJlYWRPcHRpb25zIHtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBub3c/OiAoKSA9PiBudW1iZXI7XG59XG5cbnR5cGUgUHJveHlDcmVkZW50aWFscyA9IFBpY2s8R3Jva0NyZWRlbnRpYWxzLCBcImFjY2Vzc1Rva2VuXCIgfCBcInVzZXJJZFwiPjtcblxuZXhwb3J0IHR5cGUgR3Jva1F1b3RhVXNhZ2VSZXN1bHQgPVxuICB8IHtcbiAgICAgIGtpbmQ6IFwib2tcIjtcbiAgICAgIC8vIFNhbWUgbmFtZXMgYXMgT3BlbkFJUXVvdGFVc2FnZVJlc3VsdC5cbiAgICAgIHV0aWxpemF0aW9uUGN0OiBudW1iZXI7XG4gICAgICBjYWNoZUFnZU1zOiBudW1iZXI7XG4gICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IG51bWJlciB8IG51bGw7XG4gICAgICAvKiogVW5peCBzZWNvbmRzLCBsaWtlIHRoZSBPcGVuQUkgd2hhbSBgcmVzZXRzQXRgLiAqL1xuICAgICAgcmVzZXRzQXQ6IG51bWJlciB8IG51bGw7XG4gICAgICBsaW1pdElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgLy8gR3JvayBzcGVjaWZpY3MuXG4gICAgICBwZXJpb2RUeXBlOiBzdHJpbmc7XG4gICAgICBwZXJpb2RTdGFydDogc3RyaW5nO1xuICAgICAgcGVyaW9kRW5kOiBzdHJpbmc7XG4gICAgICAvKiogRXBvY2ggbXMgb2YgcGVyaW9kRW5kLCBvciBudWxsIHdoZW4gdGhlIHRpbWVzdGFtcCBpcyB1bnBhcnNlYWJsZS4gKi9cbiAgICAgIHBlcmlvZEVuZE1zOiBudW1iZXIgfCBudWxsO1xuICAgICAgcHJlcGFpZEJhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgICByYXc6IEdyb2tCaWxsaW5nQ29uZmlnO1xuICAgIH1cbiAgfCB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiOyByZWFzb246IHN0cmluZyB9O1xuXG5mdW5jdGlvbiByZWFzb25PZihjYXVzZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSk7XG59XG5cbmZ1bmN0aW9uIHByb3h5SGVhZGVycyhjcmVkZW50aWFsczogUHJveHlDcmVkZW50aWFscyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4gYnVpbGRHcm9rUHJveHlHZXRIZWFkZXJzKHsgYmVhcmVyOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgdXNlcklkOiBjcmVkZW50aWFscy51c2VySWQgfSk7XG59XG5cbmZ1bmN0aW9uIG51bWJlck9yTnVsbCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgLy8gTnVtYmVyKCkgcmV0dXJucyBhIG51bWJlciBhcmd1bWVudCB1bmNoYW5nZWQgYW5kIHBhcnNlcyBhIG51bWVyaWMgc3RyaW5nLlxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGw7XG59XG5cbi8qKiBgR0VUIHtwcm94eX0vYmlsbGluZz9mb3JtYXQ9Y3JlZGl0c2AgKGNhbWVsQ2FzZTsgVTAgaXRlbSAzKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR3Jva0JpbGxpbmcoXG4gIGNyZWRlbnRpYWxzOiBQcm94eUNyZWRlbnRpYWxzLFxuICBvcHRpb25zOiBHcm9rUHJveHlSZWFkT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxHcm9rUXVvdGFVc2FnZVJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsganNvbiB9ID0gYXdhaXQgZ3Jva1Byb3h5R2V0KFwiL2JpbGxpbmc/Zm9ybWF0PWNyZWRpdHNcIiwge1xuICAgICAgaGVhZGVyczogcHJveHlIZWFkZXJzKGNyZWRlbnRpYWxzKSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwYXJzZWQgPSBHcm9rQmlsbGluZ0NvbmZpZy5zYWZlUGFyc2UoanNvbik7XG5cbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiBgdW5leHBlY3RlZCBiaWxsaW5nIHNoYXBlOiAke3BhcnNlZC5lcnJvci5tZXNzYWdlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBwYXJzZWQuZGF0YS5jb25maWc7XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb25maWcuY3JlZGl0VXNhZ2VQZXJjZW50KSkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb29rdXBfZmFpbGVkXCIsIHJlYXNvbjogXCJjcmVkaXRVc2FnZVBlcmNlbnQgdW5hdmFpbGFibGVcIiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5wYXJzZShjb25maWcuY3VycmVudFBlcmlvZC5zdGFydCk7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5wYXJzZShjb25maWcuY3VycmVudFBlcmlvZC5lbmQpO1xuICAgIGNvbnN0IGVuZE1zID0gTnVtYmVyLmlzTmFOKGVuZCkgPyBudWxsIDogZW5kO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwib2tcIixcbiAgICAgIHV0aWxpemF0aW9uUGN0OiBjb25maWcuY3JlZGl0VXNhZ2VQZXJjZW50LFxuICAgICAgY2FjaGVBZ2VNczogMCxcbiAgICAgIHdpbmRvd0R1cmF0aW9uTWluczpcbiAgICAgICAgZW5kTXMgIT09IG51bGwgJiYgIU51bWJlci5pc05hTihzdGFydCkgJiYgZW5kTXMgPiBzdGFydFxuICAgICAgICAgID8gTWF0aC5yb3VuZCgoZW5kTXMgLSBzdGFydCkgLyA2MF8wMDApXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgcmVzZXRzQXQ6IGVuZE1zID09PSBudWxsID8gbnVsbCA6IE1hdGguZmxvb3IoZW5kTXMgLyAxMDAwKSxcbiAgICAgIGxpbWl0SWQ6IGNvbmZpZy5jdXJyZW50UGVyaW9kLnR5cGUsXG4gICAgICBwZXJpb2RUeXBlOiBjb25maWcuY3VycmVudFBlcmlvZC50eXBlLFxuICAgICAgcGVyaW9kU3RhcnQ6IGNvbmZpZy5jdXJyZW50UGVyaW9kLnN0YXJ0LFxuICAgICAgcGVyaW9kRW5kOiBjb25maWcuY3VycmVudFBlcmlvZC5lbmQsXG4gICAgICBwZXJpb2RFbmRNczogZW5kTXMsXG4gICAgICBwcmVwYWlkQmFsYW5jZTogbnVtYmVyT3JOdWxsKGNvbmZpZy5wcmVwYWlkQmFsYW5jZT8udmFsKSxcbiAgICAgIHJhdzogcGFyc2VkLmRhdGEsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiByZWFzb25PZihlcnJvcikgfTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBHcm9rU2V0dGluZ3NSZXN1bHQgPVxuICB8IHtcbiAgICAgIGtpbmQ6IFwib2tcIjtcbiAgICAgIC8qKiBENjogYHRydWVgIGV4Y2x1ZGVzIHRoZSB0b2tlbjsgbnVsbC9mYWxzZS9hYnNlbnQgYWxsb3dzIGl0LiAqL1xuICAgICAgb25EZW1hbmRFbmFibGVkOiBib29sZWFuIHwgbnVsbDtcbiAgICAgIG1pbkNsaWVudFZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gICAgICBkZWZhdWx0TW9kZWw6IHN0cmluZyB8IG51bGw7XG4gICAgICBzdWJzY3JpcHRpb25UaWVyRGlzcGxheTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGltYWdlR2VuRW5hYmxlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgICB2aWRlb0dlbkVuYWJsZWQ6IGJvb2xlYW4gfCBudWxsO1xuICAgICAgdm9pY2VNb2RlRW5hYmxlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuICB8IHsga2luZDogXCJsb29rdXBfZmFpbGVkXCI7IHJlYXNvbjogc3RyaW5nIH07XG5cbi8qKiBgR0VUIHtwcm94eX0vc2V0dGluZ3NgLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRHcm9rU2V0dGluZ3MoXG4gIGNyZWRlbnRpYWxzOiBQcm94eUNyZWRlbnRpYWxzLFxuICBvcHRpb25zOiBHcm9rUHJveHlSZWFkT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxHcm9rU2V0dGluZ3NSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGpzb24gfSA9IGF3YWl0IGdyb2tQcm94eUdldChcIi9zZXR0aW5nc1wiLCB7XG4gICAgICBoZWFkZXJzOiBwcm94eUhlYWRlcnMoY3JlZGVudGlhbHMpLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IEdyb2tTZXR0aW5ncy5zYWZlUGFyc2UoanNvbik7XG5cbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBcImxvb2t1cF9mYWlsZWRcIixcbiAgICAgICAgcmVhc29uOiBgdW5leHBlY3RlZCBzZXR0aW5ncyBzaGFwZTogJHtwYXJzZWQuZXJyb3IubWVzc2FnZX1gLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlZC5kYXRhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwib2tcIixcbiAgICAgIG9uRGVtYW5kRW5hYmxlZDogc2V0dGluZ3Mub25fZGVtYW5kX2VuYWJsZWQgPz8gbnVsbCxcbiAgICAgIG1pbkNsaWVudFZlcnNpb246IHNldHRpbmdzLm1pbl9jbGllbnRfdmVyc2lvbiA/PyBudWxsLFxuICAgICAgZGVmYXVsdE1vZGVsOiBzZXR0aW5ncy5kZWZhdWx0X21vZGVsID8/IG51bGwsXG4gICAgICBzdWJzY3JpcHRpb25UaWVyRGlzcGxheTogc2V0dGluZ3Muc3Vic2NyaXB0aW9uX3RpZXJfZGlzcGxheSA/PyBudWxsLFxuICAgICAgaW1hZ2VHZW5FbmFibGVkOiBzZXR0aW5ncy5pbWFnZV9nZW5fZW5hYmxlZCA/PyBudWxsLFxuICAgICAgdmlkZW9HZW5FbmFibGVkOiBzZXR0aW5ncy52aWRlb19nZW5fZW5hYmxlZCA/PyBudWxsLFxuICAgICAgdm9pY2VNb2RlRW5hYmxlZDogc2V0dGluZ3Mudm9pY2VfbW9kZV9lbmFibGVkID8/IG51bGwsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiByZWFzb25PZihlcnJvcikgfTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBHcm9rU3Vic2NyaXB0aW9uUmVzdWx0ID1cbiAgfCB7XG4gICAgICBraW5kOiBcIm9rXCI7XG4gICAgICB1c2VySWQ6IHN0cmluZztcbiAgICAgIHRpZXI6IHN0cmluZyB8IG51bGw7XG4gICAgICBoYXNHcm9rQ29kZUFjY2VzczogYm9vbGVhbiB8IG51bGw7XG4gICAgICAvKiogYGNvZGluZ0RhdGFSZXRlbnRpb25PcHRPdXRgOiB0cnVlIG1lYW5zIFplcm8gRGF0YSBSZXRlbnRpb24gaXMgb247IG51bGwgd2hlbiBhYnNlbnQuICovXG4gICAgICBkYXRhUmV0ZW50aW9uT3B0T3V0OiBib29sZWFuIHwgbnVsbDtcbiAgICB9XG4gIHwgeyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIjsgcmVhc29uOiBzdHJpbmcgfTtcblxuLyoqIGBHRVQge3Byb3h5fS91c2VyP2luY2x1ZGU9c3Vic2NyaXB0aW9uYC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR3Jva1N1YnNjcmlwdGlvbihcbiAgY3JlZGVudGlhbHM6IFByb3h5Q3JlZGVudGlhbHMsXG4gIG9wdGlvbnM6IEdyb2tQcm94eVJlYWRPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPEdyb2tTdWJzY3JpcHRpb25SZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGpzb24gfSA9IGF3YWl0IGdyb2tQcm94eUdldChcIi91c2VyP2luY2x1ZGU9c3Vic2NyaXB0aW9uXCIsIHtcbiAgICAgIGhlYWRlcnM6IHByb3h5SGVhZGVycyhjcmVkZW50aWFscyksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyc2VkID0gR3Jva1VzZXJTdWJzY3JpcHRpb24uc2FmZVBhcnNlKGpzb24pO1xuXG4gICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb29rdXBfZmFpbGVkXCIsIHJlYXNvbjogYHVuZXhwZWN0ZWQgdXNlciBzaGFwZTogJHtwYXJzZWQuZXJyb3IubWVzc2FnZX1gIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwib2tcIixcbiAgICAgIHVzZXJJZDogcGFyc2VkLmRhdGEudXNlcklkLFxuICAgICAgdGllcjogcGFyc2VkLmRhdGEuc3Vic2NyaXB0aW9uVGllciA/PyBudWxsLFxuICAgICAgaGFzR3Jva0NvZGVBY2Nlc3M6IHBhcnNlZC5kYXRhLmhhc0dyb2tDb2RlQWNjZXNzID8/IG51bGwsXG4gICAgICBkYXRhUmV0ZW50aW9uT3B0T3V0OiBwYXJzZWQuZGF0YS5jb2RpbmdEYXRhUmV0ZW50aW9uT3B0T3V0ID8/IG51bGwsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiByZWFzb25PZihlcnJvcikgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBMkNBLFNBQVMsU0FBUyxPQUF3QjtDQUN4QyxPQUFPLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDOUQ7QUFFQSxTQUFTLGFBQWEsYUFBdUQ7Q0FDM0UsT0FBTyx5QkFBeUI7RUFBRSxRQUFRLFlBQVk7RUFBYSxRQUFRLFlBQVk7Q0FBTyxDQUFDO0FBQ2pHO0FBRUEsU0FBUyxhQUFhLE9BQW1EO0NBQ3ZFLElBQUksVUFBVSxRQUFXLE9BQU87Q0FFaEMsTUFBTSxTQUFTLE9BQU8sS0FBSztDQUUzQixPQUFPLE9BQU8sU0FBUyxNQUFNLElBQUksU0FBUztBQUM1Qzs7QUFHQSxlQUFzQixnQkFDcEIsYUFDQSxVQUFnQyxDQUFDLEdBQ0Y7Q0FDL0IsSUFBSTtFQUNGLE1BQU0sRUFBRSxTQUFTLE1BQU0sYUFBYSwyQkFBMkI7R0FDN0QsU0FBUyxhQUFhLFdBQVc7R0FDakMsR0FBRztFQUNMLENBQUM7RUFFRCxNQUFNLFNBQVMsa0JBQWtCLFVBQVUsSUFBSTtFQUUvQyxJQUFJLENBQUMsT0FBTyxTQUNWLE9BQU87R0FB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
@@ -0,0 +1,192 @@
1
+ import { grokShellUserAgent } from "./grok-headers.js";
2
+ import { GrokCredentials, decodeGrokJwt } from "./grok-types.js";
3
+ import { GrokTokenResponse, getGrokOAuthEndpoints, readGrokOAuthErrorCode } from "./grok-oauth.js";
4
+ import { getLogger } from "@logtape/logtape";
5
+ import { createHash } from "node:crypto";
6
+ //#region src/utils/providers/grok/grok-refresh.ts
7
+ const logger = getLogger(["qgrid", "grok-refresh"]);
8
+ /** model.rs:9 DEFAULT_EARLY_INVALIDATION_SECS. */
9
+ const GROK_REFRESH_MARGIN_MS = 3e5;
10
+ /** Upper bound of the per-account jitter added to the margin (inclusive). */
11
+ const GROK_REFRESH_JITTER_MAX_MS = 6e4;
12
+ const REFRESH_TIMEOUT_MS = 15e3;
13
+ /** oidc/refresh.rs:21-27: the only codes that end a refresh token's life. */
14
+ const TERMINAL_ERROR_CODES = /* @__PURE__ */ new Set(["invalid_grant", "invalid_client"]);
15
+ /** The refresh token is dead; only a new login recovers. Never retry. */
16
+ var GrokReauthRequiredError = class extends Error {
17
+ oauthError;
18
+ status;
19
+ name = "GrokReauthRequiredError";
20
+ constructor(oauthError, status) {
21
+ super(`Grok refresh rejected: HTTP ${status} ${oauthError}`);
22
+ this.oauthError = oauthError;
23
+ this.status = status;
24
+ }
25
+ };
26
+ /** Network failure, timeout, 5xx, 429, or an unrecognized error; the refresh token still lives. */
27
+ var GrokRefreshTransientError = class extends Error {
28
+ status;
29
+ oauthError;
30
+ name = "GrokRefreshTransientError";
31
+ constructor(message, status, oauthError) {
32
+ super(message);
33
+ this.status = status;
34
+ this.oauthError = oauthError;
35
+ }
36
+ };
37
+ /** Stable jitter in [0, 60 s] derived from a per-account seed. */
38
+ function grokRefreshJitterMs(seed) {
39
+ return createHash("sha256").update(`grok-refresh:${seed}`).digest().readUInt32BE(0) % 60001;
40
+ }
41
+ /** True once `expiresAt - 300 s - jitter(userId)` is at or before `now`. */
42
+ function grokNeedsRefresh(credentials, now = Date.now()) {
43
+ const expiresAt = Date.parse(credentials.expiresAt);
44
+ if (!Number.isFinite(expiresAt)) return true;
45
+ return expiresAt - GROK_REFRESH_MARGIN_MS - grokRefreshJitterMs(credentials.userId) <= now;
46
+ }
47
+ function abortable(promise, signal) {
48
+ if (!signal) return promise;
49
+ if (signal.aborted) return Promise.reject(signal.reason);
50
+ return new Promise((resolve, reject) => {
51
+ const onAbort = () => reject(signal.reason);
52
+ signal.addEventListener("abort", onAbort, { once: true });
53
+ promise.then((value) => {
54
+ signal.removeEventListener("abort", onAbort);
55
+ resolve(value);
56
+ }, (cause) => {
57
+ signal.removeEventListener("abort", onAbort);
58
+ reject(cause);
59
+ });
60
+ });
61
+ }
62
+ var GrokRefreshCoordinator = class {
63
+ fetchImpl;
64
+ now;
65
+ persistPort;
66
+ inflight = /* @__PURE__ */ new Map();
67
+ latest = /* @__PURE__ */ new Map();
68
+ constructor(options = {}) {
69
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
70
+ this.now = options.now ?? Date.now;
71
+ this.persistPort = options.persist;
72
+ }
73
+ needsRefresh(credentials, now = this.now()) {
74
+ return grokNeedsRefresh(credentials, now);
75
+ }
76
+ /**
77
+ * Refreshes `tokenId`, coalescing concurrent calls into one HTTP request. Resolves only after
78
+ * `persist` has stored the new credentials.
79
+ */
80
+ refresh(tokenId, credentials, persist) {
81
+ const existing = this.inflight.get(tokenId);
82
+ if (existing) return existing;
83
+ const promise = this.doRefresh(tokenId, this.newest(tokenId, credentials), persist).finally(() => this.inflight.delete(tokenId));
84
+ this.inflight.set(tokenId, promise);
85
+ return promise;
86
+ }
87
+ async ensureFresh(token, signal) {
88
+ const current = this.newest(token.tokenId, token.credentials);
89
+ if (!this.needsRefresh(current)) return current;
90
+ return abortable(this.refresh(token.tokenId, current, this.portPersist(token.tokenId)), signal);
91
+ }
92
+ async refreshAfterUnauthorized(token, signal) {
93
+ const inflight = this.inflight.get(token.tokenId);
94
+ const latest = this.latest.get(token.tokenId);
95
+ if (!inflight && latest && latest.accessToken !== token.credentials.accessToken && !this.needsRefresh(latest)) return {
96
+ status: "refreshed",
97
+ credentials: latest
98
+ };
99
+ try {
100
+ return {
101
+ status: "refreshed",
102
+ credentials: await abortable(this.refresh(token.tokenId, token.credentials, this.portPersist(token.tokenId)), signal)
103
+ };
104
+ } catch (error) {
105
+ if (error instanceof GrokReauthRequiredError) return {
106
+ status: "reauth_required",
107
+ reason: error.oauthError
108
+ };
109
+ throw error;
110
+ }
111
+ }
112
+ portPersist(tokenId) {
113
+ const persist = this.persistPort;
114
+ if (!persist) return () => Promise.reject(/* @__PURE__ */ new Error("GrokRefreshCoordinator was created without a persist port"));
115
+ return (next) => persist(tokenId, next);
116
+ }
117
+ newest(tokenId, credentials) {
118
+ const latest = this.latest.get(tokenId);
119
+ if (!latest || latest.userId !== credentials.userId) return credentials;
120
+ return Date.parse(latest.expiresAt) > Date.parse(credentials.expiresAt) ? latest : credentials;
121
+ }
122
+ async doRefresh(tokenId, credentials, persist) {
123
+ const { tokenEndpoint } = await getGrokOAuthEndpoints({
124
+ fetch: this.fetchImpl,
125
+ now: this.now
126
+ });
127
+ let response;
128
+ try {
129
+ response = await this.fetchImpl(tokenEndpoint, {
130
+ method: "POST",
131
+ headers: {
132
+ "user-agent": grokShellUserAgent(),
133
+ "content-type": "application/x-www-form-urlencoded",
134
+ accept: "application/json"
135
+ },
136
+ body: new URLSearchParams([
137
+ ["grant_type", "refresh_token"],
138
+ ["refresh_token", credentials.refreshToken],
139
+ ["client_id", credentials.clientId]
140
+ ]),
141
+ signal: AbortSignal.timeout(REFRESH_TIMEOUT_MS)
142
+ });
143
+ } catch (error) {
144
+ const reason = error instanceof Error ? error.name : "unknown";
145
+ logger.warn(`grok refresh network failure token=${tokenId} reason=${reason}`);
146
+ throw new GrokRefreshTransientError(`Grok refresh request failed (${reason})`);
147
+ }
148
+ if (!response.ok) {
149
+ const oauthError = await readGrokOAuthErrorCode(response);
150
+ logger.warn(`grok refresh failed token=${tokenId} status=${response.status} code=${oauthError ?? "unknown"}`);
151
+ if (response.status < 500 && response.status !== 429 && oauthError !== void 0 && TERMINAL_ERROR_CODES.has(oauthError)) throw new GrokReauthRequiredError(oauthError, response.status);
152
+ throw new GrokRefreshTransientError(`Grok refresh failed: HTTP ${response.status} ${oauthError ?? "unknown"}`, response.status, oauthError);
153
+ }
154
+ let body;
155
+ try {
156
+ body = await response.json();
157
+ } catch {
158
+ throw new GrokRefreshTransientError("Grok refresh response is not JSON", response.status);
159
+ }
160
+ const tokens = GrokTokenResponse.safeParse(body);
161
+ if (!tokens.success) throw new GrokRefreshTransientError("Grok refresh response failed validation", response.status);
162
+ const rotated = Boolean(tokens.data.refresh_token);
163
+ const exp = decodeGrokJwt(tokens.data.access_token)?.payload.exp;
164
+ const expiresIn = tokens.data.expires_in;
165
+ const expiresAtMs = expiresIn !== void 0 && expiresIn !== null ? this.now() + expiresIn * 1e3 : exp !== void 0 ? exp * 1e3 : void 0;
166
+ if (expiresAtMs === void 0 || !Number.isFinite(expiresAtMs)) throw new GrokRefreshTransientError("Grok refresh response has no expiry", response.status);
167
+ const next = GrokCredentials.safeParse({
168
+ ...credentials,
169
+ accessToken: tokens.data.access_token,
170
+ refreshToken: tokens.data.refresh_token ?? credentials.refreshToken,
171
+ expiresAt: new Date(expiresAtMs).toISOString()
172
+ });
173
+ if (!next.success) {
174
+ logger.error(`grok refresh returned unusable credentials token=${tokenId} rotated=${rotated}`);
175
+ throw new GrokRefreshTransientError("Grok refresh returned an access token that is not an auth.x.ai at+jwt", response.status);
176
+ }
177
+ try {
178
+ await persist(next.data);
179
+ } catch (error) {
180
+ if (rotated) this.latest.set(tokenId, next.data);
181
+ logger.error(`grok refresh persist FAILED token=${tokenId} rotated=${rotated} err=${error instanceof Error ? error.name : "unknown"}`);
182
+ throw error;
183
+ }
184
+ this.latest.set(tokenId, next.data);
185
+ logger.info(`grok token ${tokenId} refreshed (rotated=${rotated})`);
186
+ return next.data;
187
+ }
188
+ };
189
+ //#endregion
190
+ export { GROK_REFRESH_JITTER_MAX_MS, GROK_REFRESH_MARGIN_MS, GrokReauthRequiredError, GrokRefreshCoordinator, GrokRefreshTransientError, grokNeedsRefresh, grokRefreshJitterMs };
191
+
192
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jvay1yZWZyZXNoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvZ3Jvay9ncm9rLXJlZnJlc2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gR3JvayAoeEFJKSB0b2tlbiByZWZyZXNoOiBzaW5nbGUtZmxpZ2h0IHBlciB0b2tlbiwgZWFybHkgcmVmcmVzaCB3aXRoIGEgc3RhYmxlIHBlci1hY2NvdW50XG4vLyBqaXR0ZXIsIHJlZnJlc2gtdG9rZW4gcmV0ZW50aW9uIHdoZW4gdGhlIElkUCBkb2VzIG5vdCByb3RhdGUsIHBlcnNpc3QtYmVmb3JlLXJlc29sdmUuXG4vLyBNZWNoYW5pc20gZm9sbG93cyBncm9rLWJ1aWxkIDEuMC40NSB4YWktZ3Jvay1sb2dpbi9zcmMgKG9pZGMvcHJvdG9jb2wucnM6NDEzLTUyMCxcbi8vIG9pZGMvcmVmcmVzaC5yczoyMS0yNywyNjAtMjY0LCBtb2RlbC5yczo5KS4gZ3Jvay1idWlsZCByZXRyaWVzIHRyYW5zaWVudCBmYWlsdXJlcyBpbiBwbGFjZVxuLy8gKDMgYXR0ZW1wdHMpOyBxZ3JpZCBkb2VzIG5vdCwgYmVjYXVzZSB0aGUgZGlzcGF0Y2hlciBvd25zIHRoZSBwZXItcmVxdWVzdCBhdHRlbXB0IGJ1ZGdldC5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgZ3Jva1NoZWxsVXNlckFnZW50IH0gZnJvbSBcIi4vZ3Jvay1oZWFkZXJzXCI7XG5pbXBvcnQge1xuICB0eXBlIEdyb2tGZXRjaCxcbiAgR3Jva1Rva2VuUmVzcG9uc2UsXG4gIGdldEdyb2tPQXV0aEVuZHBvaW50cyxcbiAgcmVhZEdyb2tPQXV0aEVycm9yQ29kZSxcbn0gZnJvbSBcIi4vZ3Jvay1vYXV0aFwiO1xuaW1wb3J0IHtcbiAgR3Jva0NyZWRlbnRpYWxzLFxuICB0eXBlIEdyb2tSZWZyZXNoUmVzdWx0LFxuICB0eXBlIEdyb2tSZWZyZXNoZXIsXG4gIHR5cGUgR3Jva1Rva2VuUmVmLFxuICBkZWNvZGVHcm9rSnd0LFxufSBmcm9tIFwiLi9ncm9rLXR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcImdyb2stcmVmcmVzaFwiXSk7XG5cbi8qKiBtb2RlbC5yczo5IERFRkFVTFRfRUFSTFlfSU5WQUxJREFUSU9OX1NFQ1MuICovXG5leHBvcnQgY29uc3QgR1JPS19SRUZSRVNIX01BUkdJTl9NUyA9IDMwMF8wMDA7XG5cbi8qKiBVcHBlciBib3VuZCBvZiB0aGUgcGVyLWFjY291bnQgaml0dGVyIGFkZGVkIHRvIHRoZSBtYXJnaW4gKGluY2x1c2l2ZSkuICovXG5leHBvcnQgY29uc3QgR1JPS19SRUZSRVNIX0pJVFRFUl9NQVhfTVMgPSA2MF8wMDA7XG5jb25zdCBSRUZSRVNIX1RJTUVPVVRfTVMgPSAxNV8wMDA7XG5cbi8qKiBvaWRjL3JlZnJlc2gucnM6MjEtMjc6IHRoZSBvbmx5IGNvZGVzIHRoYXQgZW5kIGEgcmVmcmVzaCB0b2tlbidzIGxpZmUuICovXG5jb25zdCBURVJNSU5BTF9FUlJPUl9DT0RFUyA9IG5ldyBTZXQoW1wiaW52YWxpZF9ncmFudFwiLCBcImludmFsaWRfY2xpZW50XCJdKTtcblxuLyoqIFRoZSByZWZyZXNoIHRva2VuIGlzIGRlYWQ7IG9ubHkgYSBuZXcgbG9naW4gcmVjb3ZlcnMuIE5ldmVyIHJldHJ5LiAqL1xuZXhwb3J0IGNsYXNzIEdyb2tSZWF1dGhSZXF1aXJlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lID0gXCJHcm9rUmVhdXRoUmVxdWlyZWRFcnJvclwiO1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBvYXV0aEVycm9yOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKGBHcm9rIHJlZnJlc2ggcmVqZWN0ZWQ6IEhUVFAgJHtzdGF0dXN9ICR7b2F1dGhFcnJvcn1gKTtcbiAgfVxufVxuXG4vKiogTmV0d29yayBmYWlsdXJlLCB0aW1lb3V0LCA1eHgsIDQyOSwgb3IgYW4gdW5yZWNvZ25pemVkIGVycm9yOyB0aGUgcmVmcmVzaCB0b2tlbiBzdGlsbCBsaXZlcy4gKi9cbmV4cG9ydCBjbGFzcyBHcm9rUmVmcmVzaFRyYW5zaWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lID0gXCJHcm9rUmVmcmVzaFRyYW5zaWVudEVycm9yXCI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICByZWFkb25seSBzdGF0dXM/OiBudW1iZXIsXG4gICAgcmVhZG9ubHkgb2F1dGhFcnJvcj86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqIFN0YWJsZSBqaXR0ZXIgaW4gWzAsIDYwIHNdIGRlcml2ZWQgZnJvbSBhIHBlci1hY2NvdW50IHNlZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZ3Jva1JlZnJlc2hKaXR0ZXJNcyhzZWVkOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShgZ3Jvay1yZWZyZXNoOiR7c2VlZH1gKS5kaWdlc3QoKTtcblxuICByZXR1cm4gZGlnZXN0LnJlYWRVSW50MzJCRSgwKSAlIChHUk9LX1JFRlJFU0hfSklUVEVSX01BWF9NUyArIDEpO1xufVxuXG4vKiogVHJ1ZSBvbmNlIGBleHBpcmVzQXQgLSAzMDAgcyAtIGppdHRlcih1c2VySWQpYCBpcyBhdCBvciBiZWZvcmUgYG5vd2AuICovXG5leHBvcnQgZnVuY3Rpb24gZ3Jva05lZWRzUmVmcmVzaChjcmVkZW50aWFsczogR3Jva0NyZWRlbnRpYWxzLCBub3c6IG51bWJlciA9IERhdGUubm93KCkpOiBib29sZWFuIHtcbiAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5wYXJzZShjcmVkZW50aWFscy5leHBpcmVzQXQpO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGV4cGlyZXNBdCkpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBleHBpcmVzQXQgLSBHUk9LX1JFRlJFU0hfTUFSR0lOX01TIC0gZ3Jva1JlZnJlc2hKaXR0ZXJNcyhjcmVkZW50aWFscy51c2VySWQpIDw9IG5vdztcbn1cblxuZnVuY3Rpb24gYWJvcnRhYmxlPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBwcm9taXNlO1xuXG4gIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuIFByb21pc2UucmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKGNhdXNlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVzZSk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG5leHBvcnQgdHlwZSBHcm9rUGVyc2lzdENyZWRlbnRpYWxzID0gKG5leHQ6IEdyb2tDcmVkZW50aWFscykgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBHcm9rUmVmcmVzaENvb3JkaW5hdG9yT3B0aW9ucyB7XG4gIGZldGNoPzogR3Jva0ZldGNoO1xuICBub3c/OiAoKSA9PiBudW1iZXI7XG4gIC8qKiBQZXJzaXN0ZW5jZSB1c2VkIGJ5IHRoZSBgR3Jva1JlZnJlc2hlcmAgcG9ydCBtZXRob2RzIChgZW5zdXJlRnJlc2hgLCBgcmVmcmVzaEFmdGVyVW5hdXRob3JpemVkYCkuICovXG4gIHBlcnNpc3Q/OiAodG9rZW5JZDogbnVtYmVyLCBuZXh0OiBHcm9rQ3JlZGVudGlhbHMpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjbGFzcyBHcm9rUmVmcmVzaENvb3JkaW5hdG9yIGltcGxlbWVudHMgR3Jva1JlZnJlc2hlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hJbXBsOiBHcm9rRmV0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdFBvcnQ6IEdyb2tSZWZyZXNoQ29vcmRpbmF0b3JPcHRpb25zW1wicGVyc2lzdFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmZsaWdodCA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPEdyb2tDcmVkZW50aWFscz4+KCk7XG4gIC8vIExhc3QgY3JlZGVudGlhbHMgdGhpcyBwcm9jZXNzIHBlcnNpc3RlZCBwZXIgdG9rZW4uIEEgY2FsbGVyIGhvbGRpbmcgYW4gb2xkZXIgc25hcHNob3QgbXVzdCBub3RcbiAgLy8gcHJlc2VudCBhIHJlZnJlc2ggdG9rZW4gdGhlIElkUCBoYXMgYWxyZWFkeSByb3RhdGVkIGF3YXkgKHRoYXQgcmVhZHMgYXMgaW52YWxpZF9ncmFudCkuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGF0ZXN0ID0gbmV3IE1hcDxudW1iZXIsIEdyb2tDcmVkZW50aWFscz4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHcm9rUmVmcmVzaENvb3JkaW5hdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mZXRjaEltcGwgPSBvcHRpb25zLmZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2g7XG4gICAgdGhpcy5ub3cgPSBvcHRpb25zLm5vdyA/PyBEYXRlLm5vdztcbiAgICB0aGlzLnBlcnNpc3RQb3J0ID0gb3B0aW9ucy5wZXJzaXN0O1xuICB9XG5cbiAgbmVlZHNSZWZyZXNoKGNyZWRlbnRpYWxzOiBHcm9rQ3JlZGVudGlhbHMsIG5vdzogbnVtYmVyID0gdGhpcy5ub3coKSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBncm9rTmVlZHNSZWZyZXNoKGNyZWRlbnRpYWxzLCBub3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyBgdG9rZW5JZGAsIGNvYWxlc2NpbmcgY29uY3VycmVudCBjYWxscyBpbnRvIG9uZSBIVFRQIHJlcXVlc3QuIFJlc29sdmVzIG9ubHkgYWZ0ZXJcbiAgICogYHBlcnNpc3RgIGhhcyBzdG9yZWQgdGhlIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIHJlZnJlc2goXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIGNyZWRlbnRpYWxzOiBHcm9rQ3JlZGVudGlhbHMsXG4gICAgcGVyc2lzdDogR3Jva1BlcnNpc3RDcmVkZW50aWFscyxcbiAgKTogUHJvbWlzZTxHcm9rQ3JlZGVudGlhbHM+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW5mbGlnaHQuZ2V0KHRva2VuSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5kb1JlZnJlc2godG9rZW5JZCwgdGhpcy5uZXdlc3QodG9rZW5JZCwgY3JlZGVudGlhbHMpLCBwZXJzaXN0KS5maW5hbGx5KFxuICAgICAgKCkgPT4gdGhpcy5pbmZsaWdodC5kZWxldGUodG9rZW5JZCksXG4gICAgKTtcblxuICAgIHRoaXMuaW5mbGlnaHQuc2V0KHRva2VuSWQsIHByb21pc2UpO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBhc3luYyBlbnN1cmVGcmVzaCh0b2tlbjogR3Jva1Rva2VuUmVmLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8R3Jva0NyZWRlbnRpYWxzPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3ZXN0KHRva2VuLnRva2VuSWQsIHRva2VuLmNyZWRlbnRpYWxzKTtcblxuICAgIGlmICghdGhpcy5uZWVkc1JlZnJlc2goY3VycmVudCkpIHJldHVybiBjdXJyZW50O1xuXG4gICAgcmV0dXJuIGFib3J0YWJsZSh0aGlzLnJlZnJlc2godG9rZW4udG9rZW5JZCwgY3VycmVudCwgdGhpcy5wb3J0UGVyc2lzdCh0b2tlbi50b2tlbklkKSksIHNpZ25hbCk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoQWZ0ZXJVbmF1dGhvcml6ZWQoXG4gICAgdG9rZW46IEdyb2tUb2tlblJlZixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxHcm9rUmVmcmVzaFJlc3VsdD4ge1xuICAgIGNvbnN0IGluZmxpZ2h0ID0gdGhpcy5pbmZsaWdodC5nZXQodG9rZW4udG9rZW5JZCk7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5sYXRlc3QuZ2V0KHRva2VuLnRva2VuSWQpO1xuXG4gICAgLy8gQW5vdGhlciBjYWxsZXIgYWxyZWFkeSByZXBsYWNlZCB0aGUgcmVqZWN0ZWQgYWNjZXNzIHRva2VuOiByZXVzZSBpdCBpbnN0ZWFkIG9mIHJlZnJlc2hpbmcuXG4gICAgaWYgKFxuICAgICAgIWluZmxpZ2h0ICYmXG4gICAgICBsYXRlc3QgJiZcbiAgICAgIGxhdGVzdC5hY2Nlc3NUb2tlbiAhPT0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4gJiZcbiAgICAgICF0aGlzLm5lZWRzUmVmcmVzaChsYXRlc3QpXG4gICAgKVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInJlZnJlc2hlZFwiLCBjcmVkZW50aWFsczogbGF0ZXN0IH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBhYm9ydGFibGUoXG4gICAgICAgIHRoaXMucmVmcmVzaCh0b2tlbi50b2tlbklkLCB0b2tlbi5jcmVkZW50aWFscywgdGhpcy5wb3J0UGVyc2lzdCh0b2tlbi50b2tlbklkKSksXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJyZWZyZXNoZWRcIiwgY3JlZGVudGlhbHMgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgR3Jva1JlYXV0aFJlcXVpcmVkRXJyb3IpXG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJyZWF1dGhfcmVxdWlyZWRcIiwgcmVhc29uOiBlcnJvci5vYXV0aEVycm9yIH07XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvcnRQZXJzaXN0KHRva2VuSWQ6IG51bWJlcik6IEdyb2tQZXJzaXN0Q3JlZGVudGlhbHMge1xuICAgIGNvbnN0IHBlcnNpc3QgPSB0aGlzLnBlcnNpc3RQb3J0O1xuXG4gICAgaWYgKCFwZXJzaXN0KVxuICAgICAgcmV0dXJuICgpID0+XG4gICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkdyb2tSZWZyZXNoQ29vcmRpbmF0b3Igd2FzIGNyZWF0ZWQgd2l0aG91dCBhIHBlcnNpc3QgcG9ydFwiKSk7XG5cbiAgICByZXR1cm4gKG5leHQpID0+IHBlcnNpc3QodG9rZW5JZCwgbmV4dCk7XG4gIH1cblxuICBwcml2YXRlIG5ld2VzdCh0b2tlbklkOiBudW1iZXIsIGNyZWRlbnRpYWxzOiBHcm9rQ3JlZGVudGlhbHMpOiBHcm9rQ3JlZGVudGlhbHMge1xuICAgIGNvbnN0IGxhdGVzdCA9IHRoaXMubGF0ZXN0LmdldCh0b2tlbklkKTtcblxuICAgIGlmICghbGF0ZXN0IHx8IGxhdGVzdC51c2VySWQgIT09IGNyZWRlbnRpYWxzLnVzZXJJZCkgcmV0dXJuIGNyZWRlbnRpYWxzO1xuXG4gICAgcmV0dXJuIERhdGUucGFyc2UobGF0ZXN0LmV4cGlyZXNBdCkgPiBEYXRlLnBhcnNlKGNyZWRlbnRpYWxzLmV4cGlyZXNBdCkgPyBsYXRlc3QgOiBjcmVkZW50aWFscztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9SZWZyZXNoKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICBjcmVkZW50aWFsczogR3Jva0NyZWRlbnRpYWxzLFxuICAgIHBlcnNpc3Q6IEdyb2tQZXJzaXN0Q3JlZGVudGlhbHMsXG4gICk6IFByb21pc2U8R3Jva0NyZWRlbnRpYWxzPiB7XG4gICAgY29uc3QgeyB0b2tlbkVuZHBvaW50IH0gPSBhd2FpdCBnZXRHcm9rT0F1dGhFbmRwb2ludHMoe1xuICAgICAgZmV0Y2g6IHRoaXMuZmV0Y2hJbXBsLFxuICAgICAgbm93OiB0aGlzLm5vdyxcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoSW1wbCh0b2tlbkVuZHBvaW50LCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIC8vIG9pZGMvcHJvdG9jb2wucnM6NDkzLTUxMjogZm9ybSBib2R5IG9ubHk7IHRoZSBzaGFyZWQgY2xpZW50IGNvbnRyaWJ1dGVzIHRoZSBVQS5cbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwidXNlci1hZ2VudFwiOiBncm9rU2hlbGxVc2VyQWdlbnQoKSxcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuICAgICAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoW1xuICAgICAgICAgIFtcImdyYW50X3R5cGVcIiwgXCJyZWZyZXNoX3Rva2VuXCJdLFxuICAgICAgICAgIFtcInJlZnJlc2hfdG9rZW5cIiwgY3JlZGVudGlhbHMucmVmcmVzaFRva2VuXSxcbiAgICAgICAgICBbXCJjbGllbnRfaWRcIiwgY3JlZGVudGlhbHMuY2xpZW50SWRdLFxuICAgICAgICBdKSxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KFJFRlJFU0hfVElNRU9VVF9NUyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm5hbWUgOiBcInVua25vd25cIjtcbiAgICAgIGxvZ2dlci53YXJuKGBncm9rIHJlZnJlc2ggbmV0d29yayBmYWlsdXJlIHRva2VuPSR7dG9rZW5JZH0gcmVhc29uPSR7cmVhc29ufWApO1xuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoYEdyb2sgcmVmcmVzaCByZXF1ZXN0IGZhaWxlZCAoJHtyZWFzb259KWApO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IG9hdXRoRXJyb3IgPSBhd2FpdCByZWFkR3Jva09BdXRoRXJyb3JDb2RlKHJlc3BvbnNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgZ3JvayByZWZyZXNoIGZhaWxlZCB0b2tlbj0ke3Rva2VuSWR9IHN0YXR1cz0ke3Jlc3BvbnNlLnN0YXR1c30gY29kZT0ke29hdXRoRXJyb3IgPz8gXCJ1bmtub3duXCJ9YCxcbiAgICAgICk7XG5cbiAgICAgIC8vIG9pZGMvcHJvdG9jb2wucnM6NDEzLTQzMDogNXh4IGFuZCA0MjkgYXJlIGFsd2F5cyB0cmFuc2llbnQ7IG90aGVyd2lzZSBvbmx5IGEgdGVybWluYWwgY29kZVxuICAgICAgLy8gZW5kcyB0aGUgdG9rZW4uXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyA8IDUwMCAmJlxuICAgICAgICByZXNwb25zZS5zdGF0dXMgIT09IDQyOSAmJlxuICAgICAgICBvYXV0aEVycm9yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgVEVSTUlOQUxfRVJST1JfQ09ERVMuaGFzKG9hdXRoRXJyb3IpXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBHcm9rUmVhdXRoUmVxdWlyZWRFcnJvcihvYXV0aEVycm9yLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoXG4gICAgICAgIGBHcm9rIHJlZnJlc2ggZmFpbGVkOiBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSAke29hdXRoRXJyb3IgPz8gXCJ1bmtub3duXCJ9YCxcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBvYXV0aEVycm9yLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYm9keTogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICBib2R5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoXCJHcm9rIHJlZnJlc2ggcmVzcG9uc2UgaXMgbm90IEpTT05cIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBHcm9rVG9rZW5SZXNwb25zZS5zYWZlUGFyc2UoYm9keSk7XG5cbiAgICBpZiAoIXRva2Vucy5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoXG4gICAgICAgIFwiR3JvayByZWZyZXNoIHJlc3BvbnNlIGZhaWxlZCB2YWxpZGF0aW9uXCIsXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICk7XG5cbiAgICBjb25zdCByb3RhdGVkID0gQm9vbGVhbih0b2tlbnMuZGF0YS5yZWZyZXNoX3Rva2VuKTtcbiAgICBjb25zdCBleHAgPSBkZWNvZGVHcm9rSnd0KHRva2Vucy5kYXRhLmFjY2Vzc190b2tlbik/LnBheWxvYWQuZXhwO1xuXG4gICAgY29uc3QgZXhwaXJlc0luID0gdG9rZW5zLmRhdGEuZXhwaXJlc19pbjtcblxuICAgIGNvbnN0IGV4cGlyZXNBdE1zID1cbiAgICAgIGV4cGlyZXNJbiAhPT0gdW5kZWZpbmVkICYmIGV4cGlyZXNJbiAhPT0gbnVsbFxuICAgICAgICA/IHRoaXMubm93KCkgKyBleHBpcmVzSW4gKiAxMDAwXG4gICAgICAgIDogZXhwICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGV4cCAqIDEwMDBcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChleHBpcmVzQXRNcyA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoZXhwaXJlc0F0TXMpKVxuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoXCJHcm9rIHJlZnJlc2ggcmVzcG9uc2UgaGFzIG5vIGV4cGlyeVwiLCByZXNwb25zZS5zdGF0dXMpO1xuXG4gICAgY29uc3QgbmV4dCA9IEdyb2tDcmVkZW50aWFscy5zYWZlUGFyc2Uoe1xuICAgICAgLi4uY3JlZGVudGlhbHMsXG4gICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmRhdGEuYWNjZXNzX3Rva2VuLFxuICAgICAgLy8gb2lkYy9yZWZyZXNoLnJzOjI2MC0yNjQ6IGtlZXAgdGhlIG9sZCByZWZyZXNoIHRva2VuIHdoZW4gdGhlIElkUCBkaWQgbm90IHJvdGF0ZSBpdC5cbiAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLmRhdGEucmVmcmVzaF90b2tlbiA/PyBjcmVkZW50aWFscy5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKGV4cGlyZXNBdE1zKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgaWYgKCFuZXh0LnN1Y2Nlc3MpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYGdyb2sgcmVmcmVzaCByZXR1cm5lZCB1bnVzYWJsZSBjcmVkZW50aWFscyB0b2tlbj0ke3Rva2VuSWR9IHJvdGF0ZWQ9JHtyb3RhdGVkfWAsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEdyb2tSZWZyZXNoVHJhbnNpZW50RXJyb3IoXG4gICAgICAgIFwiR3JvayByZWZyZXNoIHJldHVybmVkIGFuIGFjY2VzcyB0b2tlbiB0aGF0IGlzIG5vdCBhbiBhdXRoLnguYWkgYXQrand0XCIsXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBlcnNpc3QobmV4dC5kYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSByb3RhdGVkIHJlZnJlc2ggdG9rZW4gdGhhdCBpcyBub3QgcGVyc2lzdGVkIGlzIGxvc3Q6IHRoZSBuZXh0IHJlZnJlc2ggd2l0aCB0aGUgb2xkIG9uZVxuICAgICAgLy8gZmFpbHMgd2l0aCBpbnZhbGlkX2dyYW50LiBLZWVwIGl0IGluIG1lbW9yeSBzbyB0aGlzIHByb2Nlc3MgY2FuIHN0aWxsIHVzZSBpdC5cbiAgICAgIGlmIChyb3RhdGVkKSB0aGlzLmxhdGVzdC5zZXQodG9rZW5JZCwgbmV4dC5kYXRhKTtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYGdyb2sgcmVmcmVzaCBwZXJzaXN0IEZBSUxFRCB0b2tlbj0ke3Rva2VuSWR9IHJvdGF0ZWQ9JHtyb3RhdGVkfSBlcnI9JHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IFwidW5rbm93blwifWAsXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgdGhpcy5sYXRlc3Quc2V0KHRva2VuSWQsIG5leHQuZGF0YSk7XG4gICAgbG9nZ2VyLmluZm8oYGdyb2sgdG9rZW4gJHt0b2tlbklkfSByZWZyZXNoZWQgKHJvdGF0ZWQ9JHtyb3RhdGVkfSlgKTtcblxuICAgIHJldHVybiBuZXh0LmRhdGE7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBd0JBLE1BQU0sU0FBUyxVQUFVLENBQUMs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
@@ -0,0 +1,186 @@
1
+ import { GROK_AUTH_ISSUER } from "./grok-constants.js";
2
+ import { z } from "zod";
3
+ //#region src/utils/providers/grok/grok-types.ts
4
+ const JwtHeader = z.looseObject({
5
+ typ: z.string(),
6
+ alg: z.string().optional()
7
+ });
8
+ const JwtPayload = z.looseObject({
9
+ iss: z.string(),
10
+ sub: z.string().optional(),
11
+ exp: z.number().optional()
12
+ });
13
+ const BASE64URL_SEGMENT = /^[A-Za-z0-9_-]+$/;
14
+ function decodeSegment(segment) {
15
+ if (!BASE64URL_SEGMENT.test(segment)) return void 0;
16
+ try {
17
+ return JSON.parse(Buffer.from(segment, "base64url").toString("utf8"));
18
+ } catch {
19
+ return;
20
+ }
21
+ }
22
+ /** Decodes a compact JWT's header and payload. The signature is never verified. */
23
+ function decodeGrokJwt(token) {
24
+ const parts = token.split(".");
25
+ if (parts.length !== 3 || !parts[0] || !parts[1] || !parts[2]) return void 0;
26
+ const header = JwtHeader.safeParse(decodeSegment(parts[0]));
27
+ const payload = JwtPayload.safeParse(decodeSegment(parts[1]));
28
+ if (!header.success || !payload.success) return void 0;
29
+ return {
30
+ header: header.data,
31
+ payload: payload.data
32
+ };
33
+ }
34
+ /** An RFC 9068 access token (`typ: at+jwt`) issued by auth.x.ai. API keys are rejected. */
35
+ function isGrokAccessToken(token) {
36
+ const decoded = decodeGrokJwt(token);
37
+ if (!decoded) return false;
38
+ const typ = decoded.header.typ.toLowerCase();
39
+ return (typ === "at+jwt" || typ === "application/at+jwt") && decoded.payload.iss === "https://auth.x.ai";
40
+ }
41
+ const GrokId = z.guid();
42
+ const GrokCredentials = z.object({
43
+ authMode: z.literal("oauth"),
44
+ accessToken: z.string().refine(isGrokAccessToken, { message: "accessToken must be an at+jwt access token issued by https://auth.x.ai" }),
45
+ refreshToken: z.string().min(1),
46
+ expiresAt: z.iso.datetime({ offset: true }),
47
+ issuer: z.literal(GROK_AUTH_ISSUER),
48
+ clientId: z.string().min(1),
49
+ scopes: z.array(z.string().min(1)),
50
+ userId: GrokId,
51
+ sessionId: GrokId,
52
+ agentId: GrokId,
53
+ subscriptionTier: z.string().optional()
54
+ });
55
+ /** `GET /billing?format=credits` (camelCase, no on-demand field; U0 item 3). */
56
+ const GrokBillingConfig = z.looseObject({ config: z.looseObject({
57
+ creditUsagePercent: z.number(),
58
+ currentPeriod: z.looseObject({
59
+ type: z.string(),
60
+ start: z.string(),
61
+ end: z.string()
62
+ }),
63
+ prepaidBalance: z.looseObject({ val: z.union([z.number(), z.string()]) }).optional(),
64
+ isUnifiedBillingUser: z.boolean().optional(),
65
+ productUsage: z.array(z.looseObject({
66
+ product: z.string(),
67
+ usagePercent: z.number()
68
+ })).optional()
69
+ }) });
70
+ /** `GET /settings`. `on_demand_enabled: true` excludes the token (D6); null/absent allows. */
71
+ const GrokSettings = z.looseObject({
72
+ min_client_version: z.string().optional(),
73
+ force_update: z.boolean().nullish(),
74
+ default_model: z.string().nullish(),
75
+ subscription_tier_display: z.string().nullish(),
76
+ on_demand_enabled: z.boolean().nullish(),
77
+ image_gen_enabled: z.boolean().nullish(),
78
+ video_gen_enabled: z.boolean().nullish(),
79
+ voice_mode_enabled: z.boolean().nullish(),
80
+ accept_request_encodings: z.array(z.string()).nullish()
81
+ });
82
+ /** `GET /user?include=subscription`. `userId` is the account identity key. */
83
+ const GrokUserSubscription = z.looseObject({
84
+ userId: GrokId,
85
+ email: z.string().optional(),
86
+ subscriptionTier: z.string().nullish(),
87
+ hasGrokCodeAccess: z.boolean().optional(),
88
+ /** Zero Data Retention opt-out; `true` was observed while ZDR was on (plan §11). */
89
+ codingDataRetentionOptOut: z.boolean().nullish()
90
+ });
91
+ const GrokModelReasoningEffort = z.looseObject({
92
+ id: z.string(),
93
+ value: z.string(),
94
+ label: z.string().optional(),
95
+ default: z.boolean().optional()
96
+ });
97
+ const GrokProxyModel = z.looseObject({
98
+ id: z.string(),
99
+ context_window: z.number().int().positive(),
100
+ context_windows: z.array(z.number().int().positive()).optional(),
101
+ api_backend: z.string(),
102
+ reasoning_effort: z.string().nullish(),
103
+ reasoning_efforts: z.array(GrokModelReasoningEffort).optional(),
104
+ supports_reasoning_effort: z.boolean().optional()
105
+ });
106
+ /** `GET /models` on the proxy (`{object: "list", data: [...]}`). */
107
+ const GrokModelsResponse = z.looseObject({
108
+ object: z.string().optional(),
109
+ data: z.array(GrokProxyModel)
110
+ });
111
+ const ticks = z.number().nonnegative();
112
+ const GrokApiLanguageModel = z.looseObject({
113
+ id: z.string(),
114
+ aliases: z.array(z.string()).optional(),
115
+ context_length: z.number().int().positive().optional(),
116
+ prompt_text_token_price: ticks,
117
+ cached_prompt_text_token_price: ticks.optional(),
118
+ completion_text_token_price: ticks,
119
+ prompt_image_token_price: ticks.optional(),
120
+ prompt_text_token_price_long_context: ticks.optional(),
121
+ cached_prompt_text_token_price_long_context: ticks.optional(),
122
+ completion_text_token_price_long_context: ticks.optional(),
123
+ long_context_threshold: z.number().int().positive().optional()
124
+ });
125
+ const GrokApiLanguageModelCatalog = z.union([z.looseObject({ models: z.array(GrokApiLanguageModel) }), z.looseObject({ data: z.array(GrokApiLanguageModel) })]);
126
+ const GrokApiImageModel = z.looseObject({
127
+ id: z.string(),
128
+ aliases: z.array(z.string()).optional(),
129
+ image_price: ticks.optional(),
130
+ pricing: z.array(z.looseObject({
131
+ quality: z.string().optional(),
132
+ resolution: z.string().optional(),
133
+ price_per_image: ticks
134
+ })).optional()
135
+ });
136
+ const GrokApiImageModelCatalog = z.union([z.looseObject({ models: z.array(GrokApiImageModel) }), z.looseObject({ data: z.array(GrokApiImageModel) })]);
137
+ /** Model list of either catalog, whichever envelope key the API used. */
138
+ function grokCatalogModels(catalog) {
139
+ return "models" in catalog ? catalog.models : catalog.data;
140
+ }
141
+ const ticksUsage = z.looseObject({ cost_in_usd_ticks: z.number().int().nonnegative().optional() });
142
+ /** `POST /images/generations` and `/images/edits` with `response_format: "b64_json"`. */
143
+ const GrokImageResponse = z.looseObject({
144
+ data: z.array(z.looseObject({
145
+ b64_json: z.string().min(1),
146
+ mime_type: z.string().optional(),
147
+ revised_prompt: z.string().nullish(),
148
+ respect_moderation: z.boolean().optional()
149
+ })).min(1),
150
+ usage: ticksUsage.optional()
151
+ });
152
+ /** `POST /videos/generations`. */
153
+ const GrokVideoStart = z.looseObject({ request_id: z.string().min(1) });
154
+ /**
155
+ * `GET /videos/{request_id}`. The result is a URL: `video.url`, else
156
+ * `video.file_output.public_url` (@ai-sdk/xai xai-video-model.ts:693-694, 782-799).
157
+ */
158
+ const GrokVideoStatus = z.looseObject({
159
+ status: z.string(),
160
+ video: z.looseObject({
161
+ url: z.string().nullish(),
162
+ duration: z.number().nullish(),
163
+ file_output: z.looseObject({ public_url: z.string().nullish() }).nullish()
164
+ }).nullish(),
165
+ usage: ticksUsage.nullish()
166
+ });
167
+ function grokVideoUrl(status) {
168
+ return status.video?.url ?? status.video?.file_output?.public_url ?? void 0;
169
+ }
170
+ /** `POST /stt` (multipart). */
171
+ const GrokSttResponse = z.looseObject({
172
+ text: z.string(),
173
+ language: z.string().optional(),
174
+ duration: z.number().nonnegative().optional()
175
+ });
176
+ /** `POST /tts` body; the API answers 422 without `language` (U0). */
177
+ const GrokTtsRequest = z.object({
178
+ text: z.string().min(1),
179
+ voice: z.string().min(1),
180
+ language: z.string().min(1),
181
+ format: z.string().min(1)
182
+ });
183
+ //#endregion
184
+ export { GrokApiImageModel, GrokApiImageModelCatalog, GrokApiLanguageModel, GrokApiLanguageModelCatalog, GrokBillingConfig, GrokCredentials, GrokImageResponse, GrokModelReasoningEffort, GrokModelsResponse, GrokProxyModel, GrokSettings, GrokSttResponse, GrokTtsRequest, GrokUserSubscription, GrokVideoStart, GrokVideoStatus, decodeGrokJwt, grokCatalogModels, grokVideoUrl, isGrokAccessToken };
185
+
186
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jvay10eXBlcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2dyb2svZ3Jvay10eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7IEdST0tfQVVUSF9JU1NVRVIgfSBmcm9tIFwiLi9ncm9rLWNvbnN0YW50c1wiO1xuXG4vLyBFeHRlcm5hbCBkYXRhIChzdG9yZWQgY3JlZGVudGlhbHMsIHByb3h5IGFuZCBhcGkueC5haSBKU09OKSBpcyB2YWxpZGF0ZWQgd2l0aCB0aGVzZSBzY2hlbWFzLFxuLy8gbmV2ZXIgY2FzdC4gUmVzcG9uc2Ugc2NoZW1hcyBhcmUgbG9vc2U6IHVua25vd24ga2V5cyBwYXNzIHRocm91Z2ggc28gdGhlIHByb3h5IGNhbiBhZGRcbi8vIGZpZWxkcyB3aXRob3V0IGJyZWFraW5nIHFncmlkLlxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyZWRlbnRpYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgSnd0SGVhZGVyID0gei5sb29zZU9iamVjdCh7IHR5cDogei5zdHJpbmcoKSwgYWxnOiB6LnN0cmluZygpLm9wdGlvbmFsKCkgfSk7XG5cbmNvbnN0IEp3dFBheWxvYWQgPSB6Lmxvb3NlT2JqZWN0KHtcbiAgaXNzOiB6LnN0cmluZygpLFxuICBzdWI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXhwOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBEZWNvZGVkR3Jva0p3dCB7XG4gIGhlYWRlcjogei5pbmZlcjx0eXBlb2YgSnd0SGVhZGVyPjtcbiAgcGF5bG9hZDogei5pbmZlcjx0eXBlb2YgSnd0UGF5bG9hZD47XG59XG5cbmNvbnN0IEJBU0U2NFVSTF9TRUdNRU5UID0gL15bQS1aYS16MC05Xy1dKyQvO1xuXG5mdW5jdGlvbiBkZWNvZGVTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghQkFTRTY0VVJMX1NFR01FTlQudGVzdChzZWdtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIEpTT04ucGFyc2Ugd2l0aG91dCBhIHJldml2ZXIgeWllbGRzIG9ubHkgSlNPTiB2YWx1ZXMuXG4gICAgY29uc3QgZGVjb2RlZDogSnNvblZhbHVlID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShzZWdtZW50LCBcImJhc2U2NHVybFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuXG4gICAgcmV0dXJuIGRlY29kZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIERlY29kZXMgYSBjb21wYWN0IEpXVCdzIGhlYWRlciBhbmQgcGF5bG9hZC4gVGhlIHNpZ25hdHVyZSBpcyBuZXZlciB2ZXJpZmllZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVHcm9rSnd0KHRva2VuOiBzdHJpbmcpOiBEZWNvZGVkR3Jva0p3dCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpO1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgIXBhcnRzWzBdIHx8ICFwYXJ0c1sxXSB8fCAhcGFydHNbMl0pIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IEp3dEhlYWRlci5zYWZlUGFyc2UoZGVjb2RlU2VnbWVudChwYXJ0c1swXSkpO1xuICBjb25zdCBwYXlsb2FkID0gSnd0UGF5bG9hZC5zYWZlUGFyc2UoZGVjb2RlU2VnbWVudChwYXJ0c1sxXSkpO1xuXG4gIGlmICghaGVhZGVyLnN1Y2Nlc3MgfHwgIXBheWxvYWQuc3VjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBoZWFkZXI6IGhlYWRlci5kYXRhLCBwYXlsb2FkOiBwYXlsb2FkLmRhdGEgfTtcbn1cblxuLyoqIEFuIFJGQyA5MDY4IGFjY2VzcyB0b2tlbiAoYHR5cDogYXQrand0YCkgaXNzdWVkIGJ5IGF1dGgueC5haS4gQVBJIGtleXMgYXJlIHJlamVjdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3Jva0FjY2Vzc1Rva2VuKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUdyb2tKd3QodG9rZW4pO1xuXG4gIGlmICghZGVjb2RlZCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0eXAgPSBkZWNvZGVkLmhlYWRlci50eXAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gKFxuICAgICh0eXAgPT09IFwiYXQrand0XCIgfHwgdHlwID09PSBcImFwcGxpY2F0aW9uL2F0K2p3dFwiKSAmJiBkZWNvZGVkLnBheWxvYWQuaXNzID09PSBHUk9LX0FVVEhfSVNTVUVSXG4gICk7XG59XG5cbi8vIHhBSSBpZHMgZG8gbm90IGFsd2F5cyBjYXJyeSBSRkMgOTU2MiB2ZXJzaW9uL3ZhcmlhbnQgYml0cyAob2JzZXJ2ZWQgeC1yZXF1ZXN0LWlkXG4vLyBgMTliZmExYjItYTE2My05ZTBjLS4uLmApLCBzbyBpZHMgYXJlIGNoZWNrZWQgZm9yIHRoZSA4LTQtNC00LTEyIGhleCBzaGFwZSBvbmx5LlxuY29uc3QgR3Jva0lkID0gei5ndWlkKCk7XG5cbmV4cG9ydCBjb25zdCBHcm9rQ3JlZGVudGlhbHMgPSB6Lm9iamVjdCh7XG4gIGF1dGhNb2RlOiB6LmxpdGVyYWwoXCJvYXV0aFwiKSxcbiAgYWNjZXNzVG9rZW46IHouc3RyaW5nKCkucmVmaW5lKGlzR3Jva0FjY2Vzc1Rva2VuLCB7XG4gICAgbWVzc2FnZTogXCJhY2Nlc3NUb2tlbiBtdXN0IGJlIGFuIGF0K2p3dCBhY2Nlc3MgdG9rZW4gaXNzdWVkIGJ5IGh0dHBzOi8vYXV0aC54LmFpXCIsXG4gIH0pLFxuICByZWZyZXNoVG9rZW46IHouc3RyaW5nKCkubWluKDEpLFxuICBleHBpcmVzQXQ6IHouaXNvLmRhdGV0aW1lKHsgb2Zmc2V0OiB0cnVlIH0pLFxuICBpc3N1ZXI6IHoubGl0ZXJhbChHUk9LX0FVVEhfSVNTVUVSKSxcbiAgY2xpZW50SWQ6IHouc3RyaW5nKCkubWluKDEpLFxuICBzY29wZXM6IHouYXJyYXkoei5zdHJpbmcoKS5taW4oMSkpLFxuICB1c2VySWQ6IEdyb2tJZCxcbiAgc2Vzc2lvbklkOiBHcm9rSWQsXG4gIGFnZW50SWQ6IEdyb2tJZCxcbiAgc3Vic2NyaXB0aW9uVGllcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tDcmVkZW50aWFscyA9IHouaW5mZXI8dHlwZW9mIEdyb2tDcmVkZW50aWFscz47XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hhdCBwcm94eSBKU09OIChjbGktY2hhdC1wcm94eS5ncm9rLmNvbS92MSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYEdFVCAvYmlsbGluZz9mb3JtYXQ9Y3JlZGl0c2AgKGNhbWVsQ2FzZSwgbm8gb24tZGVtYW5kIGZpZWxkOyBVMCBpdGVtIDMpLiAqL1xuZXhwb3J0IGNvbnN0IEdyb2tCaWxsaW5nQ29uZmlnID0gei5sb29zZU9iamVjdCh7XG4gIGNvbmZpZzogei5sb29zZU9iamVjdCh7XG4gICAgY3JlZGl0VXNhZ2VQZXJjZW50OiB6Lm51bWJlcigpLFxuICAgIGN1cnJlbnRQZXJpb2Q6IHoubG9vc2VPYmplY3Qoe1xuICAgICAgdHlwZTogei5zdHJpbmcoKSxcbiAgICAgIHN0YXJ0OiB6LnN0cmluZygpLFxuICAgICAgZW5kOiB6LnN0cmluZygpLFxuICAgIH0pLFxuICAgIHByZXBhaWRCYWxhbmNlOiB6Lmxvb3NlT2JqZWN0KHsgdmFsOiB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkgfSkub3B0aW9uYWwoKSxcbiAgICBpc1VuaWZpZWRCaWxsaW5nVXNlcjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBwcm9kdWN0VXNhZ2U6IHpcbiAgICAgIC5hcnJheSh6Lmxvb3NlT2JqZWN0KHsgcHJvZHVjdDogei5zdHJpbmcoKSwgdXNhZ2VQZXJjZW50OiB6Lm51bWJlcigpIH0pKVxuICAgICAgLm9wdGlvbmFsKCksXG4gIH0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tCaWxsaW5nQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgR3Jva0JpbGxpbmdDb25maWc+O1xuXG4vKiogYEdFVCAvc2V0dGluZ3NgLiBgb25fZGVtYW5kX2VuYWJsZWQ6IHRydWVgIGV4Y2x1ZGVzIHRoZSB0b2tlbiAoRDYpOyBudWxsL2Fic2VudCBhbGxvd3MuICovXG5leHBvcnQgY29uc3QgR3Jva1NldHRpbmdzID0gei5sb29zZU9iamVjdCh7XG4gIG1pbl9jbGllbnRfdmVyc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBmb3JjZV91cGRhdGU6IHouYm9vbGVhbigpLm51bGxpc2goKSxcbiAgZGVmYXVsdF9tb2RlbDogei5zdHJpbmcoKS5udWxsaXNoKCksXG4gIHN1YnNjcmlwdGlvbl90aWVyX2Rpc3BsYXk6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICBvbl9kZW1hbmRfZW5hYmxlZDogei5ib29sZWFuKCkubnVsbGlzaCgpLFxuICBpbWFnZV9nZW5fZW5hYmxlZDogei5ib29sZWFuKCkubnVsbGlzaCgpLFxuICB2aWRlb19nZW5fZW5hYmxlZDogei5ib29sZWFuKCkubnVsbGlzaCgpLFxuICB2b2ljZV9tb2RlX2VuYWJsZWQ6IHouYm9vbGVhbigpLm51bGxpc2goKSxcbiAgYWNjZXB0X3JlcXVlc3RfZW5jb2RpbmdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxpc2goKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBHcm9rU2V0dGluZ3MgPSB6LmluZmVyPHR5cGVvZiBHcm9rU2V0dGluZ3M+O1xuXG4vKiogYEdFVCAvdXNlcj9pbmNsdWRlPXN1YnNjcmlwdGlvbmAuIGB1c2VySWRgIGlzIHRoZSBhY2NvdW50IGlkZW50aXR5IGtleS4gKi9cbmV4cG9ydCBjb25zdCBHcm9rVXNlclN1YnNjcmlwdGlvbiA9IHoubG9vc2VPYmplY3Qoe1xuICB1c2VySWQ6IEdyb2tJZCxcbiAgZW1haWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3Vic2NyaXB0aW9uVGllcjogei5zdHJpbmcoKS5udWxsaXNoKCksXG4gIGhhc0dyb2tDb2RlQWNjZXNzOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogWmVybyBEYXRhIFJldGVudGlvbiBvcHQtb3V0OyBgdHJ1ZWAgd2FzIG9ic2VydmVkIHdoaWxlIFpEUiB3YXMgb24gKHBsYW4gwqcxMSkuICovXG4gIGNvZGluZ0RhdGFSZXRlbnRpb25PcHRPdXQ6IHouYm9vbGVhbigpLm51bGxpc2goKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBHcm9rVXNlclN1YnNjcmlwdGlvbiA9IHouaW5mZXI8dHlwZW9mIEdyb2tVc2VyU3Vic2NyaXB0aW9uPjtcblxuZXhwb3J0IGNvbnN0IEdyb2tNb2RlbFJlYXNvbmluZ0VmZm9ydCA9IHoubG9vc2VPYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHouc3RyaW5nKCksXG4gIGxhYmVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRlZmF1bHQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IEdyb2tQcm94eU1vZGVsID0gei5sb29zZU9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjb250ZXh0X3dpbmRvdzogei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpLFxuICBjb250ZXh0X3dpbmRvd3M6IHouYXJyYXkoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKS5vcHRpb25hbCgpLFxuICBhcGlfYmFja2VuZDogei5zdHJpbmcoKSxcbiAgcmVhc29uaW5nX2VmZm9ydDogei5zdHJpbmcoKS5udWxsaXNoKCksXG4gIHJlYXNvbmluZ19lZmZvcnRzOiB6LmFycmF5KEdyb2tNb2RlbFJlYXNvbmluZ0VmZm9ydCkub3B0aW9uYWwoKSxcbiAgc3VwcG9ydHNfcmVhc29uaW5nX2VmZm9ydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBHcm9rUHJveHlNb2RlbCA9IHouaW5mZXI8dHlwZW9mIEdyb2tQcm94eU1vZGVsPjtcblxuLyoqIGBHRVQgL21vZGVsc2Agb24gdGhlIHByb3h5IChge29iamVjdDogXCJsaXN0XCIsIGRhdGE6IFsuLi5dfWApLiAqL1xuZXhwb3J0IGNvbnN0IEdyb2tNb2RlbHNSZXNwb25zZSA9IHoubG9vc2VPYmplY3Qoe1xuICBvYmplY3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZGF0YTogei5hcnJheShHcm9rUHJveHlNb2RlbCksXG59KTtcblxuZXhwb3J0IHR5cGUgR3Jva01vZGVsc1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR3Jva01vZGVsc1Jlc3BvbnNlPjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJIEpTT04gKGFwaS54LmFpL3YxKS4gUHJpY2VzIGFyZSB0aWNrcyAoMWUtMTAgVVNEKSBwZXIgdG9rZW4gb3IgcGVyIGltYWdlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHRpY2tzID0gei5udW1iZXIoKS5ub25uZWdhdGl2ZSgpO1xuXG5leHBvcnQgY29uc3QgR3Jva0FwaUxhbmd1YWdlTW9kZWwgPSB6Lmxvb3NlT2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGFsaWFzZXM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgY29udGV4dF9sZW5ndGg6IHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKS5vcHRpb25hbCgpLFxuICBwcm9tcHRfdGV4dF90b2tlbl9wcmljZTogdGlja3MsXG4gIGNhY2hlZF9wcm9tcHRfdGV4dF90b2tlbl9wcmljZTogdGlja3Mub3B0aW9uYWwoKSxcbiAgY29tcGxldGlvbl90ZXh0X3Rva2VuX3ByaWNlOiB0aWNrcyxcbiAgcHJvbXB0X2ltYWdlX3Rva2VuX3ByaWNlOiB0aWNrcy5vcHRpb25hbCgpLFxuICBwcm9tcHRfdGV4dF90b2tlbl9wcmljZV9sb25nX2NvbnRleHQ6IHRpY2tzLm9wdGlvbmFsKCksXG4gIGNhY2hlZF9wcm9tcHRfdGV4dF90b2tlbl9wcmljZV9sb25nX2NvbnRleHQ6IHRpY2tzLm9wdGlvbmFsKCksXG4gIGNvbXBsZXRpb25fdGV4dF90b2tlbl9wcmljZV9sb25nX2NvbnRleHQ6IHRpY2tzLm9wdGlvbmFsKCksXG4gIGxvbmdfY29udGV4dF90aHJlc2hvbGQ6IHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tBcGlMYW5ndWFnZU1vZGVsID0gei5pbmZlcjx0eXBlb2YgR3Jva0FwaUxhbmd1YWdlTW9kZWw+O1xuXG4vLyBUaGUgbGl2ZSBlbnZlbG9wZSBvZiAvbGFuZ3VhZ2UtbW9kZWxzIHdhcyBub3QgY2FwdHVyZWQ7IGFjY2VwdCBlaXRoZXIgbGlzdCBrZXkuXG5leHBvcnQgY29uc3QgR3Jva0FwaUxhbmd1YWdlTW9kZWxDYXRhbG9nID0gei51bmlvbihbXG4gIHoubG9vc2VPYmplY3QoeyBtb2RlbHM6IHouYXJyYXkoR3Jva0FwaUxhbmd1YWdlTW9kZWwpIH0pLFxuICB6Lmxvb3NlT2JqZWN0KHsgZGF0YTogei5hcnJheShHcm9rQXBpTGFuZ3VhZ2VNb2RlbCkgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgR3Jva0FwaUxhbmd1YWdlTW9kZWxDYXRhbG9nID0gei5pbmZlcjx0eXBlb2YgR3Jva0FwaUxhbmd1YWdlTW9kZWxDYXRhbG9nPjtcblxuZXhwb3J0IGNvbnN0IEdyb2tBcGlJbWFnZU1vZGVsID0gei5sb29zZU9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBhbGlhc2VzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIGltYWdlX3ByaWNlOiB0aWNrcy5vcHRpb25hbCgpLFxuICBwcmljaW5nOiB6XG4gICAgLmFycmF5KFxuICAgICAgei5sb29zZU9iamVjdCh7XG4gICAgICAgIHF1YWxpdHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgcmVzb2x1dGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBwcmljZV9wZXJfaW1hZ2U6IHRpY2tzLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tBcGlJbWFnZU1vZGVsID0gei5pbmZlcjx0eXBlb2YgR3Jva0FwaUltYWdlTW9kZWw+O1xuXG5leHBvcnQgY29uc3QgR3Jva0FwaUltYWdlTW9kZWxDYXRhbG9nID0gei51bmlvbihbXG4gIHoubG9vc2VPYmplY3QoeyBtb2RlbHM6IHouYXJyYXkoR3Jva0FwaUltYWdlTW9kZWwpIH0pLFxuICB6Lmxvb3NlT2JqZWN0KHsgZGF0YTogei5hcnJheShHcm9rQXBpSW1hZ2VNb2RlbCkgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgR3Jva0FwaUltYWdlTW9kZWxDYXRhbG9nID0gei5pbmZlcjx0eXBlb2YgR3Jva0FwaUltYWdlTW9kZWxDYXRhbG9nPjtcblxuLyoqIE1vZGVsIGxpc3Qgb2YgZWl0aGVyIGNhdGFsb2csIHdoaWNoZXZlciBlbnZlbG9wZSBrZXkgdGhlIEFQSSB1c2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb2tDYXRhbG9nTW9kZWxzPFQ+KGNhdGFsb2c6IHsgbW9kZWxzOiBUW10gfSB8IHsgZGF0YTogVFtdIH0pOiBUW10ge1xuICByZXR1cm4gXCJtb2RlbHNcIiBpbiBjYXRhbG9nID8gY2F0YWxvZy5tb2RlbHMgOiBjYXRhbG9nLmRhdGE7XG59XG5cbmNvbnN0IHRpY2tzVXNhZ2UgPSB6Lmxvb3NlT2JqZWN0KHsgY29zdF9pbl91c2RfdGlja3M6IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKS5vcHRpb25hbCgpIH0pO1xuXG4vKiogYFBPU1QgL2ltYWdlcy9nZW5lcmF0aW9uc2AgYW5kIGAvaW1hZ2VzL2VkaXRzYCB3aXRoIGByZXNwb25zZV9mb3JtYXQ6IFwiYjY0X2pzb25cImAuICovXG5leHBvcnQgY29uc3QgR3Jva0ltYWdlUmVzcG9uc2UgPSB6Lmxvb3NlT2JqZWN0KHtcbiAgZGF0YTogelxuICAgIC5hcnJheShcbiAgICAgIHoubG9vc2VPYmplY3Qoe1xuICAgICAgICBiNjRfanNvbjogei5zdHJpbmcoKS5taW4oMSksXG4gICAgICAgIG1pbWVfdHlwZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICByZXZpc2VkX3Byb21wdDogei5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgIHJlc3BlY3RfbW9kZXJhdGlvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAubWluKDEpLFxuICB1c2FnZTogdGlja3NVc2FnZS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tJbWFnZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR3Jva0ltYWdlUmVzcG9uc2U+O1xuXG4vKiogYFBPU1QgL3ZpZGVvcy9nZW5lcmF0aW9uc2AuICovXG5leHBvcnQgY29uc3QgR3Jva1ZpZGVvU3RhcnQgPSB6Lmxvb3NlT2JqZWN0KHsgcmVxdWVzdF9pZDogei5zdHJpbmcoKS5taW4oMSkgfSk7XG5cbmV4cG9ydCB0eXBlIEdyb2tWaWRlb1N0YXJ0ID0gei5pbmZlcjx0eXBlb2YgR3Jva1ZpZGVvU3RhcnQ+O1xuXG4vKipcbiAqIGBHRVQgL3ZpZGVvcy97cmVxdWVzdF9pZH1gLiBUaGUgcmVzdWx0IGlzIGEgVVJMOiBgdmlkZW8udXJsYCwgZWxzZVxuICogYHZpZGVvLmZpbGVfb3V0cHV0LnB1YmxpY191cmxgIChAYWktc2RrL3hhaSB4YWktdmlkZW8tbW9kZWwudHM6NjkzLTY5NCwgNzgyLTc5OSkuXG4gKi9cbmV4cG9ydCBjb25zdCBHcm9rVmlkZW9TdGF0dXMgPSB6Lmxvb3NlT2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICB2aWRlbzogelxuICAgIC5sb29zZU9iamVjdCh7XG4gICAgICB1cmw6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgZHVyYXRpb246IHoubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgZmlsZV9vdXRwdXQ6IHoubG9vc2VPYmplY3QoeyBwdWJsaWNfdXJsOiB6LnN0cmluZygpLm51bGxpc2goKSB9KS5udWxsaXNoKCksXG4gICAgfSlcbiAgICAubnVsbGlzaCgpLFxuICB1c2FnZTogdGlja3NVc2FnZS5udWxsaXNoKCksXG59KTtcblxuZXhwb3J0IHR5cGUgR3Jva1ZpZGVvU3RhdHVzID0gei5pbmZlcjx0eXBlb2YgR3Jva1ZpZGVvU3RhdHVzPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdyb2tWaWRlb1VybChzdGF0dXM6IEdyb2tWaWRlb1N0YXR1cyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdGF0dXMudmlkZW8/LnVybCA/PyBzdGF0dXMudmlkZW8/LmZpbGVfb3V0cHV0Py5wdWJsaWNfdXJsID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIGBQT1NUIC9zdHRgIChtdWx0aXBhcnQpLiAqL1xuZXhwb3J0IGNvbnN0IEdyb2tTdHRSZXNwb25zZSA9IHoubG9vc2VPYmplY3Qoe1xuICB0ZXh0OiB6LnN0cmluZygpLFxuICBsYW5ndWFnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkdXJhdGlvbjogei5udW1iZXIoKS5ub25uZWdhdGl2ZSgpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IHR5cGUgR3Jva1N0dFJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgR3Jva1N0dFJlc3BvbnNlPjtcblxuLyoqIGBQT1NUIC90dHNgIGJvZHk7IHRoZSBBUEkgYW5zd2VycyA0MjIgd2l0aG91dCBgbGFuZ3VhZ2VgIChVMCkuICovXG5leHBvcnQgY29uc3QgR3Jva1R0c1JlcXVlc3QgPSB6Lm9iamVjdCh7XG4gIHRleHQ6IHouc3RyaW5nKCkubWluKDEpLFxuICB2b2ljZTogei5zdHJpbmcoKS5taW4oMSksXG4gIGxhbmd1YWdlOiB6LnN0cmluZygpLm1pbigxKSxcbiAgZm9ybWF0OiB6LnN0cmluZygpLm1pbigxKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBHcm9rVHRzUmVxdWVzdCA9IHouaW5mZXI8dHlwZW9mIEdyb2tUdHNSZXF1ZXN0PjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQb3J0cyAoaW1wbGVtZW50ZWQgYnkgZ3Jvay1yZWZyZXNoLCBncm9rLW1lZGlhLWNsaWVudCwgZ3Jvay12b2ljZS1jbGllbnQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBHcm9rVG9rZW5SZWYge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIGNyZWRlbnRpYWxzOiBHcm9rQ3JlZGVudGlhbHM7XG59XG5cbmV4cG9ydCB0eXBlIEdyb2tSZWZyZXNoUmVzdWx0ID1cbiAgfCB7IHN0YXR1czogXCJyZWZyZXNoZWRcIjsgY3JlZGVudGlhbHM6IEdyb2tDcmVkZW50aWFscyB9XG4gIHwgeyBzdGF0dXM6IFwicmVhdXRoX3JlcXVpcmVkXCI7IHJlYXNvbjogc3RyaW5nIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Jva1JlZnJlc2hlciB7XG4gIC8qKiBTaW5nbGUtZmxpZ2h0IHBlciB0b2tlbjsgcmV0dXJucyBjcmVkZW50aWFscyBzdGlsbCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhlIHJlZnJlc2ggbWFyZ2luLiAqL1xuICBlbnN1cmVGcmVzaCh0b2tlbjogR3Jva1Rva2VuUmVmLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8R3Jva0NyZWRlbnRpYWxzPjtcbiAgLyoqIEZvcmNlZCByZWZyZXNoIGFmdGVyIGEgNDAxOyBuZXZlciByZXVzZXMgdGhlIHJlamVjdGVkIGFjY2VzcyB0b2tlbi4gKi9cbiAgcmVmcmVzaEFmdGVyVW5hdXRob3JpemVkKHRva2VuOiBHcm9rVG9rZW5SZWYsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxHcm9rUmVmcmVzaFJlc3VsdD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Jva0ltYWdlR2VuZXJhdGVSZXF1ZXN0IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgcHJvbXB0OiBzdHJpbmc7XG4gIG4/OiBudW1iZXI7XG4gIGFzcGVjdFJhdGlvPzogc3RyaW5nO1xuICByZXNvbHV0aW9uPzogc3RyaW5nO1xuICBxdWFsaXR5Pzogc3RyaW5nO1xuICBvdXRwdXRGb3JtYXQ/OiBzdHJpbmc7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tJbWFnZUVkaXRSZXF1ZXN0IGV4dGVuZHMgR3Jva0ltYWdlR2VuZXJhdGVSZXF1ZXN0IHtcbiAgLyoqIERhdGEgVVJMcyBvciBodHRwcyBVUkxzIG9mIHRoZSByZWZlcmVuY2UgaW1hZ2VzLiAqL1xuICBpbWFnZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tWaWRlb1N0YXJ0UmVxdWVzdCB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHByb21wdDogc3RyaW5nO1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgYXNwZWN0UmF0aW8/OiBzdHJpbmc7XG4gIHJlc29sdXRpb24/OiBcIjQ4MHBcIiB8IFwiNzIwcFwiIHwgXCIxMDgwcFwiO1xuICBpbWFnZT86IHN0cmluZztcbiAgbGFzdEZyYW1lPzogc3RyaW5nO1xuICByZWZlcmVuY2VJbWFnZXM/OiBzdHJpbmdbXTtcbiAgbW9kZT86IFwicmVmZXJlbmNlLXRvLXZpZGVvXCI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogUGVyLXJlcXVlc3QgaWRlbnRpdHkgZm9yIGFwaS54LmFpIEltYWdpbmUgY2FsbHM6IHRoZSBiZWFyZXIgYW5kIHRoZSBgeC1ncm9rLXNlc3Npb24taWRgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcm9rTWVkaWFBdXRoIHtcbiAgYmVhcmVyOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tNZWRpYVBvcnQge1xuICBnZW5lcmF0ZUltYWdlcyhcbiAgICBhdXRoOiBHcm9rTWVkaWFBdXRoLFxuICAgIHJlcXVlc3Q6IEdyb2tJbWFnZUdlbmVyYXRlUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxHcm9rSW1hZ2VSZXNwb25zZT47XG4gIGVkaXRJbWFnZXMoYXV0aDogR3Jva01lZGlhQXV0aCwgcmVxdWVzdDogR3Jva0ltYWdlRWRpdFJlcXVlc3QpOiBQcm9taXNlPEdyb2tJbWFnZVJlc3BvbnNlPjtcbiAgc3RhcnRWaWRlbyhhdXRoOiBHcm9rTWVkaWFBdXRoLCByZXF1ZXN0OiBHcm9rVmlkZW9TdGFydFJlcXVlc3QpOiBQcm9taXNlPEdyb2tWaWRlb1N0YXJ0PjtcbiAgZ2V0VmlkZW8oYXV0aDogR3Jva01lZGlhQXV0aCwgcmVxdWVzdElkOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxHcm9rVmlkZW9TdGF0dXM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tUcmFuc2NyaWJlUmVxdWVzdCB7XG4gIGF1ZGlvOiBVaW50OEFycmF5O1xuICBtZWRpYVR5cGU6IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm9rU3BlZWNoUmVzdWx0IHtcbiAgYXVkaW86IFVpbnQ4QXJyYXk7XG4gIG1lZGlhVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tWb2ljZVBvcnQge1xuICB0cmFuc2NyaWJlKGJlYXJlcjogc3RyaW5nLCByZXF1ZXN0OiBHcm9rVHJhbnNjcmliZVJlcXVlc3QpOiBQcm9taXNlPEdyb2tTdHRSZXNwb25zZT47XG4gIHNwZWFrKFxuICAgIGJlYXJlcjogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IEdyb2tUdHNSZXF1ZXN0ICYgeyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9LFxuICApOiBQcm9taXNlPEdyb2tTcGVlY2hSZXN1bHQ+O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFhQSxNQUFNLFlBQVksRUFBRSxZQUFZO0NBQUUsS0FBSyxFQUFFLE9BQU87Q0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztBQUFFLENBQUM7QUFFL0UsTUFBTSxhQUFhLEVBQUUsWUFBWTtDQUMvQixLQUFLLEVBQUUsT0FBTztDQUNkLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQ3pCLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQzNCLENBQUM7QUFPRCxNQUFNLG9CQUFvQjtBQUUxQixTQUFTLGNBQWMsU0FBd0M7Q0FDN0QsSUFBSSxDQUFDLGtCQUFrQixLQUFLLE9BQU8sR0FBRyxPQUFPO0NBRTdDLElBQUk7RUFJRixPQUYyQixLQUFLLE1BQU0sT0FBTyxLQUFLLFNBQVMsV0FBVyxDQUFDLENBQUMsU0FBUyxNQUFNLENBRWhGO0NBQ1QsUUFB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