@juspay/shooter 1.10.0 → 1.12.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 (163) hide show
  1. package/.claude/hooks/notifier.cjs +24 -242
  2. package/bin/lib/tunnel-discovery.cjs +519 -0
  3. package/bin/shooter.cjs +204 -49
  4. package/build/client/_app/immutable/chunks/{CmtInjm0.js → DTGtOxE1.js} +1 -1
  5. package/build/client/_app/immutable/chunks/DTGtOxE1.js.br +0 -0
  6. package/build/client/_app/immutable/chunks/DTGtOxE1.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{DfKeHoAm.js → DfsJh23H.js} +1 -1
  8. package/build/client/_app/immutable/chunks/DfsJh23H.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/DfsJh23H.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/DlSs5Yra.js +3 -0
  11. package/build/client/_app/immutable/chunks/DlSs5Yra.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/DlSs5Yra.js.gz +0 -0
  13. package/build/client/_app/immutable/entry/{app.Dp9YhfEg.js → app.B-sEFuLK.js} +2 -2
  14. package/build/client/_app/immutable/entry/app.B-sEFuLK.js.br +0 -0
  15. package/build/client/_app/immutable/entry/app.B-sEFuLK.js.gz +0 -0
  16. package/build/client/_app/immutable/entry/start.A2buqyYO.js +1 -0
  17. package/build/client/_app/immutable/entry/start.A2buqyYO.js.br +2 -0
  18. package/build/client/_app/immutable/entry/start.A2buqyYO.js.gz +0 -0
  19. package/build/client/_app/immutable/nodes/{0.B-M6sgow.js → 0.-0SstbRm.js} +1 -1
  20. package/build/client/_app/immutable/nodes/0.-0SstbRm.js.br +0 -0
  21. package/build/client/_app/immutable/nodes/0.-0SstbRm.js.gz +0 -0
  22. package/build/client/_app/immutable/nodes/{1.C8aY7Yn3.js → 1.BVLzPogE.js} +1 -1
  23. package/build/client/_app/immutable/nodes/1.BVLzPogE.js.br +0 -0
  24. package/build/client/_app/immutable/nodes/1.BVLzPogE.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/{2.YJZruh1H.js → 2.CiUyTQg5.js} +1 -1
  26. package/build/client/_app/immutable/nodes/2.CiUyTQg5.js.br +0 -0
  27. package/build/client/_app/immutable/nodes/2.CiUyTQg5.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{3.VV-tRemY.js → 3.C9vlOBU0.js} +1 -1
  29. package/build/client/_app/immutable/nodes/3.C9vlOBU0.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/3.C9vlOBU0.js.gz +0 -0
  31. package/build/client/_app/immutable/nodes/{6.CDJA8Na9.js → 6.BSsUBbIT.js} +1 -1
  32. package/build/client/_app/immutable/nodes/6.BSsUBbIT.js.br +0 -0
  33. package/build/client/_app/immutable/nodes/6.BSsUBbIT.js.gz +0 -0
  34. package/build/client/_app/immutable/nodes/{7.BX9znBYU.js → 7.BIQq9Yuz.js} +1 -1
  35. package/build/client/_app/immutable/nodes/7.BIQq9Yuz.js.br +0 -0
  36. package/build/client/_app/immutable/nodes/7.BIQq9Yuz.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/{8.CmdrNdfj.js → 8.BU_sJ5_M.js} +1 -1
  38. package/build/client/_app/immutable/nodes/8.BU_sJ5_M.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/8.BU_sJ5_M.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/{9.BSleOtKF.js → 9.C1vJI771.js} +1 -1
  41. package/build/client/_app/immutable/nodes/9.C1vJI771.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/9.C1vJI771.js.gz +0 -0
  43. package/build/client/_app/version.json +1 -1
  44. package/build/client/_app/version.json.br +0 -0
  45. package/build/client/_app/version.json.gz +0 -0
  46. package/build/server/chunks/{0-vSdphvn2.js → 0-DgzcVTc0.js} +3 -3
  47. package/build/server/chunks/{0-vSdphvn2.js.map → 0-DgzcVTc0.js.map} +1 -1
  48. package/build/server/chunks/{1-B5tn1ob0.js → 1-iMvE8O_M.js} +3 -3
  49. package/build/server/chunks/{1-B5tn1ob0.js.map → 1-iMvE8O_M.js.map} +1 -1
  50. package/build/server/chunks/{2-CUbzGnZ8.js → 2-BJrmwHii.js} +3 -3
  51. package/build/server/chunks/{2-CUbzGnZ8.js.map → 2-BJrmwHii.js.map} +1 -1
  52. package/build/server/chunks/{3-BR90tKg7.js → 3-Ds3b4DfT.js} +3 -3
  53. package/build/server/chunks/{3-BR90tKg7.js.map → 3-Ds3b4DfT.js.map} +1 -1
  54. package/build/server/chunks/{4-CbejE1SC.js → 4-BtYdKCVW.js} +2 -2
  55. package/build/server/chunks/{4-CbejE1SC.js.map → 4-BtYdKCVW.js.map} +1 -1
  56. package/build/server/chunks/{5-BwqumuR1.js → 5-CvJK3PiH.js} +2 -2
  57. package/build/server/chunks/{5-BwqumuR1.js.map → 5-CvJK3PiH.js.map} +1 -1
  58. package/build/server/chunks/{6-cW7umWCt.js → 6-DEbZkQEO.js} +3 -3
  59. package/build/server/chunks/{6-cW7umWCt.js.map → 6-DEbZkQEO.js.map} +1 -1
  60. package/build/server/chunks/{7-D3cb9T2g.js → 7-BrQeR-CO.js} +3 -3
  61. package/build/server/chunks/{7-D3cb9T2g.js.map → 7-BrQeR-CO.js.map} +1 -1
  62. package/build/server/chunks/{8-BEgZo4wA.js → 8-e5TDwEpx.js} +3 -3
  63. package/build/server/chunks/{8-BEgZo4wA.js.map → 8-e5TDwEpx.js.map} +1 -1
  64. package/build/server/chunks/{9-Dy8aTTtf.js → 9-1iqRqatJ.js} +3 -3
  65. package/build/server/chunks/{9-Dy8aTTtf.js.map → 9-1iqRqatJ.js.map} +1 -1
  66. package/build/server/chunks/{Button-Dpueno77.js → Button-B5dU-ntz.js} +2 -2
  67. package/build/server/chunks/{Button-Dpueno77.js.map → Button-B5dU-ntz.js.map} +1 -1
  68. package/build/server/chunks/{Icon-aOLx5ELI.js → Icon-C7Ml3GX6.js} +3 -3
  69. package/build/server/chunks/{Icon-aOLx5ELI.js.map → Icon-C7Ml3GX6.js.map} +1 -1
  70. package/build/server/chunks/{Input-Cq7ZdLxS.js → Input-CPGO0sbS.js} +2 -2
  71. package/build/server/chunks/{Input-Cq7ZdLxS.js.map → Input-CPGO0sbS.js.map} +1 -1
  72. package/build/server/chunks/{Pill-Bn597jm0.js → Pill-CcrtCejm.js} +3 -3
  73. package/build/server/chunks/{Pill-Bn597jm0.js.map → Pill-CcrtCejm.js.map} +1 -1
  74. package/build/server/chunks/{Shimmer-5o7MVwXF.js → Shimmer-C5jkvGr1.js} +2 -2
  75. package/build/server/chunks/{Shimmer-5o7MVwXF.js.map → Shimmer-C5jkvGr1.js.map} +1 -1
  76. package/build/server/chunks/{_error.svelte-C85mEsv9.js → _error.svelte-CSIxs-ab.js} +8 -8
  77. package/build/server/chunks/{_error.svelte-C85mEsv9.js.map → _error.svelte-CSIxs-ab.js.map} +1 -1
  78. package/build/server/chunks/{_layout.svelte-rpYLLajc.js → _layout.svelte-noB4j-v2.js} +10 -10
  79. package/build/server/chunks/{_layout.svelte-rpYLLajc.js.map → _layout.svelte-noB4j-v2.js.map} +1 -1
  80. package/build/server/chunks/{_page.svelte-BfCXobKv.js → _page.svelte-B6qyh-K-.js} +11 -11
  81. package/build/server/chunks/{_page.svelte-BfCXobKv.js.map → _page.svelte-B6qyh-K-.js.map} +1 -1
  82. package/build/server/chunks/{_page.svelte-CA46TyHk.js → _page.svelte-BUkm2304.js} +5 -5
  83. package/build/server/chunks/{_page.svelte-CA46TyHk.js.map → _page.svelte-BUkm2304.js.map} +1 -1
  84. package/build/server/chunks/{_page.svelte-B6O0uTrK.js → _page.svelte-BV0XyYJZ.js} +4 -4
  85. package/build/server/chunks/{_page.svelte-B6O0uTrK.js.map → _page.svelte-BV0XyYJZ.js.map} +1 -1
  86. package/build/server/chunks/{_page.svelte-CCpVmMpU.js → _page.svelte-BfB8maoc.js} +9 -9
  87. package/build/server/chunks/{_page.svelte-CCpVmMpU.js.map → _page.svelte-BfB8maoc.js.map} +1 -1
  88. package/build/server/chunks/{_page.svelte-DjADcbfZ.js → _page.svelte-C60lAagP.js} +8 -8
  89. package/build/server/chunks/{_page.svelte-DjADcbfZ.js.map → _page.svelte-C60lAagP.js.map} +1 -1
  90. package/build/server/chunks/{_page.svelte-DUj1mSq0.js → _page.svelte-Dmg-RFCg.js} +7 -7
  91. package/build/server/chunks/{_page.svelte-DUj1mSq0.js.map → _page.svelte-Dmg-RFCg.js.map} +1 -1
  92. package/build/server/chunks/{_page.svelte-fkR4xqGu.js → _page.svelte-DnTpPnPR.js} +5 -5
  93. package/build/server/chunks/{_page.svelte-fkR4xqGu.js.map → _page.svelte-DnTpPnPR.js.map} +1 -1
  94. package/build/server/chunks/{_page.svelte-D0FBtMtH.js → _page.svelte-DuzZr5dA.js} +11 -11
  95. package/build/server/chunks/{_page.svelte-D0FBtMtH.js.map → _page.svelte-DuzZr5dA.js.map} +1 -1
  96. package/build/server/chunks/{_server.ts-HGYjOWF2.js → _server.ts-C-W5J15L.js} +2 -2
  97. package/build/server/chunks/{_server.ts-HGYjOWF2.js.map → _server.ts-C-W5J15L.js.map} +1 -1
  98. package/build/server/chunks/_server.ts-CvJKTS3Z.js +35 -0
  99. package/build/server/chunks/_server.ts-CvJKTS3Z.js.map +1 -0
  100. package/build/server/chunks/{_server.ts-BBLuxvp6.js → _server.ts-tChyh9FX.js} +43 -8
  101. package/build/server/chunks/_server.ts-tChyh9FX.js.map +1 -0
  102. package/build/server/chunks/{cache-5_eamjtv.js → cache-Me3zUAaD.js} +2 -2
  103. package/build/server/chunks/{cache-5_eamjtv.js.map → cache-Me3zUAaD.js.map} +1 -1
  104. package/build/server/chunks/{client-w1WsLDGu.js → client-CfNnl32g.js} +4 -4
  105. package/build/server/chunks/{client-w1WsLDGu.js.map → client-CfNnl32g.js.map} +1 -1
  106. package/build/server/chunks/client2-DDP30_vY.js +7 -0
  107. package/build/server/chunks/{client2-B5wCRDQi.js.map → client2-DDP30_vY.js.map} +1 -1
  108. package/build/server/chunks/{index-DMikC9Qy.js → index-CJrGuxuM.js} +2 -2
  109. package/build/server/chunks/{index-DMikC9Qy.js.map → index-CJrGuxuM.js.map} +1 -1
  110. package/build/server/chunks/{index-server-DHNcb_Bd.js → index-server--49oHtA0.js} +2 -2
  111. package/build/server/chunks/{index-server-DHNcb_Bd.js.map → index-server--49oHtA0.js.map} +1 -1
  112. package/build/server/chunks/{index2-BTTf6mSG.js → index2-MY7PXeAc.js} +2 -2
  113. package/build/server/chunks/{index2-BTTf6mSG.js.map → index2-MY7PXeAc.js.map} +1 -1
  114. package/build/server/chunks/pending-requests-C9p57WoU.js +174 -0
  115. package/build/server/chunks/pending-requests-C9p57WoU.js.map +1 -0
  116. package/build/server/chunks/{root-DhBbA8QD.js → root-xvQIR1Bt.js} +2 -2
  117. package/build/server/chunks/{root-DhBbA8QD.js.map → root-xvQIR1Bt.js.map} +1 -1
  118. package/build/server/chunks/{state.svelte-M8y8rROy.js → state.svelte-RCtlkrNH.js} +3 -3
  119. package/build/server/chunks/{state.svelte-M8y8rROy.js.map → state.svelte-RCtlkrNH.js.map} +1 -1
  120. package/build/server/chunks/{stores-CwkRmCHA.js → stores-C-LqoonT.js} +4 -4
  121. package/build/server/chunks/{stores-CwkRmCHA.js.map → stores-C-LqoonT.js.map} +1 -1
  122. package/build/server/index.js +4 -4
  123. package/build/server/index.js.map +1 -1
  124. package/build/server/manifest.js +20 -13
  125. package/build/server/manifest.js.map +1 -1
  126. package/package.json +2 -2
  127. package/src/lib/modules/server/apn/pending-requests.ts +156 -33
  128. package/src/lib/types/decision.ts +114 -0
  129. package/src/lib/types/index.ts +1 -0
  130. package/src/routes/api/decide/[requestId]/+server.ts +46 -0
  131. package/src/routes/api/response/+server.ts +61 -11
  132. package/build/client/_app/immutable/chunks/BFXEYMV8.js +0 -3
  133. package/build/client/_app/immutable/chunks/BFXEYMV8.js.br +0 -0
  134. package/build/client/_app/immutable/chunks/BFXEYMV8.js.gz +0 -0
  135. package/build/client/_app/immutable/chunks/CmtInjm0.js.br +0 -0
  136. package/build/client/_app/immutable/chunks/CmtInjm0.js.gz +0 -0
  137. package/build/client/_app/immutable/chunks/DfKeHoAm.js.br +0 -0
  138. package/build/client/_app/immutable/chunks/DfKeHoAm.js.gz +0 -0
  139. package/build/client/_app/immutable/entry/app.Dp9YhfEg.js.br +0 -0
  140. package/build/client/_app/immutable/entry/app.Dp9YhfEg.js.gz +0 -0
  141. package/build/client/_app/immutable/entry/start.Bc5yZsyK.js +0 -1
  142. package/build/client/_app/immutable/entry/start.Bc5yZsyK.js.br +0 -2
  143. package/build/client/_app/immutable/entry/start.Bc5yZsyK.js.gz +0 -0
  144. package/build/client/_app/immutable/nodes/0.B-M6sgow.js.br +0 -0
  145. package/build/client/_app/immutable/nodes/0.B-M6sgow.js.gz +0 -0
  146. package/build/client/_app/immutable/nodes/1.C8aY7Yn3.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/1.C8aY7Yn3.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/2.YJZruh1H.js.br +0 -0
  149. package/build/client/_app/immutable/nodes/2.YJZruh1H.js.gz +0 -0
  150. package/build/client/_app/immutable/nodes/3.VV-tRemY.js.br +0 -0
  151. package/build/client/_app/immutable/nodes/3.VV-tRemY.js.gz +0 -0
  152. package/build/client/_app/immutable/nodes/6.CDJA8Na9.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/6.CDJA8Na9.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/7.BX9znBYU.js.br +0 -0
  155. package/build/client/_app/immutable/nodes/7.BX9znBYU.js.gz +0 -0
  156. package/build/client/_app/immutable/nodes/8.CmdrNdfj.js.br +0 -0
  157. package/build/client/_app/immutable/nodes/8.CmdrNdfj.js.gz +0 -0
  158. package/build/client/_app/immutable/nodes/9.BSleOtKF.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/9.BSleOtKF.js.gz +0 -0
  160. package/build/server/chunks/_server.ts-BBLuxvp6.js.map +0 -1
  161. package/build/server/chunks/client2-B5wCRDQi.js +0 -7
  162. package/build/server/chunks/pending-requests-B-JNGxpk.js +0 -96
  163. package/build/server/chunks/pending-requests-B-JNGxpk.js.map +0 -1
@@ -1,11 +1,31 @@
1
- import { cleanup, getDecision, setDecision } from '$lib/modules/server/apn/pending-requests';
1
+ import {
2
+ cleanup,
3
+ getDecision,
4
+ getRichRequest,
5
+ setDecision,
6
+ } from '$lib/modules/server/apn/pending-requests';
2
7
  import { validateAuth } from '$lib/modules/server/auth';
3
8
  import { toErrorMessage } from '$lib/modules/server/utils/error';
9
+ import { type DecisionKind, isDecisionKind } from '$lib/types';
4
10
  import { json } from '@sveltejs/kit';
5
11
 
6
12
  import type { RequestHandler } from './$types';
7
13
 
8
- // POST /api/response — iOS app sends the user's decision
14
+ // POST /api/response — iOS app sends the user's decision.
15
+ //
16
+ // Accepts the full DecisionKind union (allow/deny/option_1..4/plan_*).
17
+ // Routing of the decision back to Claude Code depends on the stored
18
+ // `response_kind` on the pending request:
19
+ //
20
+ // - 'hook' (default): notifier.cjs is in a GET poll loop on this
21
+ // same endpoint; setDecision() flips the row and the next poll
22
+ // returns 'decided' so the hook can write its stdout response.
23
+ // - 'pty' : the active Claude Code session is in a Shooter-managed
24
+ // PTY; the user's choice will be written to that PTY's stdin so
25
+ // Claude Code sees it as if the user typed at the laptop. Wired up
26
+ // in PR-3; for PR-1 we accept the decision and stub the routing.
27
+ // - 'info': no routing back to Claude Code. Decision is recorded for
28
+ // audit / UI feedback only.
9
29
  export const POST: RequestHandler = async ({ request }) => {
10
30
  cleanup();
11
31
 
@@ -14,9 +34,9 @@ export const POST: RequestHandler = async ({ request }) => {
14
34
  return authError;
15
35
  }
16
36
 
17
- let body: { decision?: string; requestId?: string };
37
+ let body: { decision?: unknown; requestId?: unknown };
18
38
  try {
19
- body = (await request.json()) as { decision?: string; requestId?: string };
39
+ body = (await request.json()) as { decision?: unknown; requestId?: unknown };
20
40
  } catch {
21
41
  return json({ error: 'Invalid JSON in request body' }, { status: 400 });
22
42
  }
@@ -24,23 +44,53 @@ export const POST: RequestHandler = async ({ request }) => {
24
44
  try {
25
45
  const { decision, requestId } = body;
26
46
 
27
- if (!requestId || !decision) {
28
- return json({ error: 'requestId and decision are required' }, { status: 400 });
47
+ if (typeof requestId !== 'string' || requestId.length === 0) {
48
+ return json({ error: 'requestId must be a non-empty string' }, { status: 400 });
29
49
  }
30
-
31
- if (decision !== 'allow' && decision !== 'deny') {
32
- return json({ error: 'decision must be "allow" or "deny"' }, { status: 400 });
50
+ if (!isDecisionKind(decision)) {
51
+ return json(
52
+ {
53
+ error:
54
+ 'decision must be one of allow, deny, option_1..4, plan_auto, plan_accept, plan_review, plan_keep',
55
+ },
56
+ { status: 400 }
57
+ );
33
58
  }
34
59
 
35
- const found = setDecision(requestId, decision);
60
+ // Persist first so polling notifier.cjs picks it up regardless of
61
+ // which response_kind we route on. The 'pty' branch is additive —
62
+ // it ALSO writes to the PTY but the row remains the source of truth.
63
+ const decisionTyped: DecisionKind = decision;
64
+ const found = setDecision(requestId, decisionTyped);
36
65
  if (!found) {
37
66
  return json({ error: 'Request not found or expired' }, { status: 404 });
38
67
  }
39
68
 
40
- console.log(`[response] Decision received: ${decision} for request ${requestId}`);
69
+ // Routing dispatch. For PR-1 only the 'hook' path is functional;
70
+ // 'pty' and 'info' are accepted but don't yet forward anywhere
71
+ // (PR-3 wires PTY; 'info' is intentionally no-op).
72
+ const entry = getRichRequest(requestId);
73
+ const responseKind = entry?.responseKind ?? 'hook';
74
+
75
+ console.log(
76
+ `[response] Decision received: ${decisionTyped} for request ${requestId} (responseKind=${responseKind})`
77
+ );
78
+
79
+ if (responseKind === 'pty') {
80
+ // PR-3 will write the chosen option to the matching PTY's stdin.
81
+ // For PR-1 we accept and persist so the user gets a "Decision
82
+ // recorded" confirmation — the laptop just won't act on it yet.
83
+ return json({
84
+ message: 'Decision recorded; PTY routing not yet implemented',
85
+ responseKind,
86
+ success: true,
87
+ timestamp: new Date().toISOString(),
88
+ });
89
+ }
41
90
 
42
91
  return json({
43
92
  message: 'Decision recorded',
93
+ responseKind,
44
94
  success: true,
45
95
  timestamp: new Date().toISOString(),
46
96
  });
@@ -1,3 +0,0 @@
1
- import{bv as Te,v as Ve,s as P,g as j,b as N,P as oe,bw as At}from"./DYuMZGL5.js";class pe{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Le{constructor(t,n){this.status=t,this.location=n}}class Pe extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Et(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function kt(e){return e.split("%25").map(decodeURI).join("%25")}function Rt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function ye({href:e}){return e.split("#")[0]}function St(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;const It=new TextDecoder;function Ut(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}const Tt=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&z.delete(je(e)),Tt(e,t));const z=new Map;function Lt(e,t){const n=je(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&z.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=Ut(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Pt(e,t,n){if(z.size>0){const r=je(e,n),a=z.get(r);if(a){if(performance.now()<a.ttl&&["default","force-cache","only-if-cached",void 0].includes(n?.cache))return new Response(a.body,a.init);z.delete(r)}}return window.fetch(t,n)}function je(e,t){let r=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){const a=[];t.headers&&a.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&a.push(t.body),r+=`[data-hash="${St(...a)}"]`}return r}const jt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Nt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${xt(e).map(r=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return t.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return t.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((i,l)=>{if(l%2){if(i.startsWith("x+"))return ve(String.fromCharCode(parseInt(i.slice(2),16)));if(i.startsWith("u+"))return ve(String.fromCharCode(...i.slice(2).split("-").map(g=>parseInt(g,16))));const u=jt.exec(i),[,d,p,h,f]=u;return t.push({name:h,matcher:f,optional:!!d,rest:!!p,chained:p?l===1&&o[0]==="":!1}),p?"([^]*?)":d?"([^/]*)?":"([^/]+?)"}return ve(i)}).join("")}).join("")}/?$`),params:t}}function Ot(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Ot)}function Ct(e,t,n){const r={},a=e.slice(1),s=a.filter(c=>c!==void 0);let o=0;for(let c=0;c<t.length;c+=1){const i=t[c];let l=a[c-o];if(i.chained&&i.rest&&o&&(l=a.slice(c-o,c+1).filter(u=>u).join("/"),o=0),l===void 0)if(i.rest)l="";else continue;if(!i.matcher||n[i.matcher](l)){r[i.name]=l;const u=t[c+1],d=a[c+1];u&&!u.rest&&u.optional&&d&&i.chained&&(o=0),!u&&!d&&Object.keys(r).length===s.length&&(o=0);continue}if(i.optional&&i.chained){o++;continue}return}if(!o)return r}function ve(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Dt({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([c,[i,l,u]])=>{const{pattern:d,params:p}=Nt(c),h={id:c,exec:f=>{const g=d.exec(f);if(g)return Ct(g,p,r)},errors:[1,...u||[]].map(f=>e[f]),layouts:[0,...l||[]].map(o),leaf:s(i)};return h.errors.length=h.layouts.length=Math.max(h.errors.length,h.layouts.length),h});function s(c){const i=c<0;return i&&(c=~c),[i,e[c]]}function o(c){return c===void 0?c:[a.has(c),e[c]]}}function Qe(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function qe(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const U=globalThis.__sveltekit_1owhp6n?.base??"",$t=globalThis.__sveltekit_1owhp6n?.assets??U??"",Bt="1778878918703",et="sveltekit:snapshot",tt="sveltekit:scroll",nt="sveltekit:states",Ft="sveltekit:pageurl",q="sveltekit:history",Q="sveltekit:navigation",B={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},re=location.origin;function Ne(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function M(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ye={...B,"":B.hover};function rt(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function at(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=rt(e)}}function Ee(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const c=location.hash.split("#")[1]||"/";r.hash=`#${c}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||_e(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=r?.origin===re&&e.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function se(e){let t=null,n=null,r=null,a=null,s=null,o=null,c=e;for(;c&&c!==document.documentElement;)r===null&&(r=V(c,"preload-code")),a===null&&(a=V(c,"preload-data")),t===null&&(t=V(c,"keepfocus")),n===null&&(n=V(c,"noscroll")),s===null&&(s=V(c,"reload")),o===null&&(o=V(c,"replacestate")),c=rt(c);function i(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ye[r??"off"],preload_data:Ye[a??"off"],keepfocus:i(t),noscroll:i(n),reload:i(s),replace_state:i(o)}}function Ge(e){const t=Te(e);let n=!0;function r(){n=!0,t.update(o=>o)}function a(o){n=!1,t.set(o)}function s(o){let c;return t.subscribe(i=>{(c===void 0||n&&i!==c)&&o(c=i)})}return{notify:r,set:a,subscribe:s}}const ot={v:()=>{}};function Mt(){const{set:e,subscribe:t}=Te(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${$t}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==Bt;return o&&(e(!0),ot.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:r}}function _e(e,t,n){return e.origin!==re||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function jn(e){}const Vt=-1,qt=-2,Yt=-3,Gt=-4,Kt=-5,Wt=-6,Ht=-7,st=2**32-1,ke=st-1;function Xt(e){return!(!Number.isInteger(e)||e<0||e>ke)}function zt(e){return!(!Number.isInteger(e)||e<0||e>st)}function Jt(e){return Uint8Array.fromBase64(e).buffer}function Zt(e){return Uint8Array.from(Buffer.from(e,"base64")).buffer}function Qt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let a=0;a<n;a++)r[a]=t.charCodeAt(a);return r.buffer}const en=typeof Uint8Array.fromBase64=="function",tn=typeof process=="object"&&process.versions?.node!==void 0,nn=en?Jt:tn?Zt:Qt;function rn(e,t){if(typeof e=="number")return s(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);let a=null;function s(o,c=!1){if(o===Vt)return;if(o===Yt)return NaN;if(o===Gt)return 1/0;if(o===Kt)return-1/0;if(o===Wt)return-0;if(c||typeof o!="number")throw new Error("Invalid input");if(o in r)return r[o];const i=n[o];if(!i||typeof i!="object")r[o]=i;else if(Array.isArray(i))if(typeof i[0]=="string"){const l=i[0],u=t&&Object.hasOwn(t,l)?t[l]:void 0;if(u){let d=i[1];if(typeof d!="number"&&(d=n.push(i[1])-1),a??=new Set,a.has(d))throw new Error("Invalid circular reference");return a.add(d),r[o]=u(s(d)),a.delete(d),r[o]}switch(l){case"Date":r[o]=new Date(i[1]);break;case"Set":const d=new Set;r[o]=d;for(let f=1;f<i.length;f+=1)d.add(s(i[f]));break;case"Map":const p=new Map;r[o]=p;for(let f=1;f<i.length;f+=2)p.set(s(i[f]),s(i[f+1]));break;case"RegExp":r[o]=new RegExp(i[1],i[2]);break;case"Object":{const f=i[1];if(typeof n[f]=="object"&&n[f][0]!=="BigInt")throw new Error("Invalid input");r[o]=Object(s(f));break}case"BigInt":r[o]=BigInt(i[1]);break;case"null":const h=Object.create(null);r[o]=h;for(let f=1;f<i.length;f+=2){if(i[f]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");h[i[f]]=s(i[f+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(n[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const f=globalThis[l],g=s(i[1]);r[o]=i[2]!==void 0?new f(g,i[2],i[3]):new f(g);break}case"ArrayBuffer":{const f=i[1];if(typeof f!="string")throw new Error("Invalid ArrayBuffer encoding");const g=nn(f);r[o]=g;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const f=l.slice(9);r[o]=Temporal[f].from(i[1]);break}case"URL":{const f=new URL(i[1]);r[o]=f;break}case"URLSearchParams":{const f=new URLSearchParams(i[1]);r[o]=f;break}default:throw new Error(`Unknown type ${l}`)}}else if(i[0]===Ht){const l=i[1];if(!zt(l))throw new Error("Invalid input");const u=[];r[o]=u,u[ke]=void 0,delete u[ke];for(let d=2;d<i.length;d+=2){const p=i[d];if(!Xt(p)||p>=l)throw new Error("Invalid input");u[p]=s(i[d+1])}u.length=l}else{const l=new Array(i.length);r[o]=l;for(let u=0;u<i.length;u+=1){const d=i[u];d!==qt&&(l[u]=s(d))}}else{const l={};r[o]=l;for(const u of Object.keys(i)){if(u==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const d=i[u];l[u]=s(d)}}return r[o]}return s(0)}const it=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...it];const an=new Set([...it]);[...an];function on(e){return e.filter(t=>t!=null)}const sn="x-sveltekit-invalidated",cn="x-sveltekit-trailing-slash";function ie(e){return e instanceof pe||e instanceof Pe?e.status:500}function ln(e){return e instanceof Pe?e.text:"Internal Error"}let S,ee,be;const fn=Ve.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ve.toString()),Ke="a:";fn?(S={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ke)},ee={current:null},be={current:!1}):(S=new class{#e=P({});get data(){return j(this.#e)}set data(t){N(this.#e,t)}#t=P(null);get form(){return j(this.#t)}set form(t){N(this.#t,t)}#n=P(null);get error(){return j(this.#n)}set error(t){N(this.#n,t)}#r=P({});get params(){return j(this.#r)}set params(t){N(this.#r,t)}#a=P({id:null});get route(){return j(this.#a)}set route(t){N(this.#a,t)}#o=P({});get state(){return j(this.#o)}set state(t){N(this.#o,t)}#s=P(-1);get status(){return j(this.#s)}set status(t){N(this.#s,t)}#i=P(new URL(Ke));get url(){return j(this.#i)}set url(t){N(this.#i,t)}},ee=new class{#e=P(null);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},be=new class{#e=P(!1);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},ot.v=()=>be.current=!0);function un(e){Object.assign(S,e)}const dn="/__data.json",hn=".html__data.json";function pn(e){return e.endsWith(".html")?e.replace(/\.html$/,hn):e.replace(/\/$/,"")+dn}const _n=new Set(["icon","shortcut icon","apple-touch-icon"]);let H=null;const D=Qe(tt)??{},te=Qe(et)??{},C={url:Ge({}),page:Ge({}),navigating:Te(null),updated:Mt()};function Oe(e){D[e]=M()}function gn(e,t){let n=e+1;for(;D[n];)delete D[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function K(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function ct(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function We(){}let xe,Re,ce,x,Se,A;const le=[],fe=[];let L=null;function Ie(){L?.fork?.then(e=>e?.discard()),L=null}const ae=new Map,lt=new Set,mn=new Set,J=new Set;let w={branch:[],error:null,url:null},Ce=!1,ue=!1,He=!0,ne=!1,X=!1,ft=!1,De=!1,ut,R,I,F;const Z=new Set,Xe=new Map;async function Cn(e,t,n){globalThis.__sveltekit_1owhp6n?.data&&globalThis.__sveltekit_1owhp6n.data,document.URL!==location.href&&(location.href=location.href),A=e,await e.hooks.init?.(),xe=Dt(e),x=document.documentElement,Se=t,Re=e.nodes[0],ce=e.nodes[1],Re(),ce(),R=history.state?.[q],I=history.state?.[Q],R||(R=I=Date.now(),history.replaceState({...history.state,[q]:R,[Q]:I},""));const r=D[R];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await Un(Se,n)):(await Y({type:"enter",url:Ne(A.hash?Ln(new URL(location.href)):location.href),replace_state:!0}),a()),In()}function wn(){le.length=0,De=!1}function dt(e){fe.some(t=>t?.snapshot)&&(te[e]=fe.map(t=>t?.snapshot?.capture()))}function ht(e){te[e]?.forEach((t,n)=>{fe[n]?.snapshot?.restore(t)})}function ze(){Oe(R),qe(tt,D),dt(I),qe(et,te)}async function pt(e,t,n,r){let a;t.invalidateAll&&Ie(),await Y({type:"goto",url:Ne(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(De=!0,a=[...Xe.keys()]),t.invalidate&&t.invalidate.forEach(Sn)}}),t.invalidateAll&&oe().then(oe).then(()=>{Xe.forEach(({resource:s},o)=>{a?.includes(o)&&s.refresh?.()})})}async function yn(e){if(e.id!==L?.id){Ie();const t={};Z.add(t),L={id:e.id,token:t,promise:gt({...e,preload:t}).then(n=>(Z.delete(t),n.type==="loaded"&&n.state.error&&Ie(),n)),fork:null}}return L.promise}async function Ae(e){const t=(await me(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function _t(e,t,n){const r={params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)};w={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(S,e.props.page),ut=new A.root({target:t,props:{...e.props,stores:C,components:fe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ht(I),n){const s={from:null,to:{...r,scroll:D[R]??M()},willUnload:!1,type:"enter",complete:Promise.resolve()};J.forEach(o=>o(s))}ue=!0}async function de({url:e,params:t,branch:n,errors:r,status:a,error:s,route:o,form:c}){let i="never";if(U&&(e.pathname===U||e.pathname===U+"/"))i="always";else for(const f of n)f?.slash!==void 0&&(i=f.slash);e.pathname=Et(e.pathname,i),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:s,route:o},props:{constructors:on(n).map(f=>f.node.component),page:Me(S)}};c!==void 0&&(l.props.form=c);let u={},d=!S,p=0;for(let f=0;f<Math.max(n.length,w.branch.length);f+=1){const g=n[f],b=w.branch[f];g?.data!==b?.data&&(d=!0),g&&(u={...u,...g.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!w.url||e.href!==w.url.href||w.error!==s||c!==void 0&&c!==S.form||d)&&(l.props.page={error:s,params:t,route:{id:o?.id??null},state:{},status:a,url:new URL(e),form:c??null,data:d?u:S.data}),l}async function $e({loader:e,parent:t,url:n,params:r,route:a,server_data_node:s}){let o=null;const c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},i=await e();return{node:i,loader:e,server:s,universal:i.universal?.load?{type:"data",data:o,uses:c}:null,data:o??s?.data??null,slash:i.universal?.trailingSlash??s?.slash}}function vn(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=ue?Pt(r,a.href,t):Lt(r,t);return{resolved:a,promise:s}}function Je(e,t,n,r,a,s){if(De)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const o of a.search_params)if(r.has(o))return!0;for(const o of a.params)if(s[o]!==w.params[o])return!0;for(const o of a.dependencies)if(le.some(c=>c(new URL(o))))return!0;return!1}function Be(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function bn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function Ze({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Me(S),constructors:[]}}}async function gt({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(L?.id===e)return Z.delete(L.token),L.promise;const{errors:o,layouts:c,leaf:i}=a,l=[...c,i];o.forEach(m=>m?.().catch(()=>{})),l.forEach(m=>m?.[1]().catch(()=>{}));let u=null;const d=w.url?e!==he(w.url):!1,p=w.route?a.id!==w.route.id:!1,h=bn(w.url,n);let f=!1;{const m=l.map((y,E)=>{const k=w.branch[E],v=!!y?.[0]&&(k?.loader!==y[1]||Je(f,p,d,h,k.server?.uses,r));return v&&(f=!0),v});if(m.some(Boolean)){try{u=await yt(n,m)}catch(y){const E=await G(y,{url:n,params:r,route:{id:e}});return Z.has(s)?Ze({error:E,url:n,params:r,route:a}):ge({status:ie(y),error:E,url:n,route:a})}if(u.type==="redirect")return u}}const g=u?.nodes;let b=!1;const _=l.map(async(m,y)=>{if(!m)return;const E=w.branch[y],k=g?.[y];if((!k||k.type==="skip")&&m[1]===E?.loader&&!Je(b,p,d,h,E.universal?.uses,r))return E;if(b=!0,k?.type==="error")throw k;return $e({loader:m[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let $=0;$<y;$+=1)Object.assign(O,(await _[$])?.data);return O},server_data_node:Be(k===void 0&&m[0]?{type:"skip"}:k??null,m[0]?E?.server:void 0)})});for(const m of _)m.catch(()=>{});const T=[];for(let m=0;m<l.length;m+=1)if(l[m])try{T.push(await _[m])}catch(y){if(y instanceof Le)return{type:"redirect",location:y.location};if(Z.has(s))return Ze({error:await G(y,{params:r,url:n,route:{id:a.id}}),url:n,params:r,route:a});let E=ie(y),k;if(g?.includes(y))E=y.status??E,k=y.error;else if(y instanceof pe)k=y.body;else{if(await C.updated.check())return await ct(),await K(n);k=await G(y,{params:r,url:n,route:{id:a.id}})}const v=await An(m,T,o);return v?de({url:n,params:r,branch:T.slice(0,v.idx).concat(v.node),errors:o,status:E,error:k,route:a}):await wt(n,{id:a.id},k,E)}else T.push(void 0);return de({url:n,params:r,branch:T,errors:o,status:200,error:null,route:a,form:t?void 0:null})}async function An(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)r-=1;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function ge({status:e,error:t,url:n,route:r}){const a={};let s=null;if(A.server_loads[0]===0)try{const c=await yt(n,[!0]);if(c.type!=="data"||c.nodes[0]&&c.nodes[0].type!=="data")throw 0;s=c.nodes[0]??null}catch{(n.origin!==re||n.pathname!==location.pathname||Ce)&&await K(n)}try{const o=await $e({loader:Re,url:n,params:a,route:r,parent:()=>Promise.resolve({}),server_data_node:Be(s)}),c={node:await ce(),loader:ce,universal:null,server:null,data:null};return de({url:n,params:a,branch:[o,c],status:e,error:t,errors:[],route:null})}catch(o){if(o instanceof Le)return pt(new URL(o.location,location.href),{},0);throw o}}async function En(e){const t=e.href;if(ae.has(t))return ae.get(t);let n;try{const r=(async()=>{let a=await A.hooks.reroute({url:new URL(e),fetch:async(s,o)=>vn(s,o,e).promise})??e;if(typeof a=="string"){const s=new URL(e);A.hash?s.hash=a:s.pathname=a,a=s}return a})();ae.set(t,r),n=await r}catch{ae.delete(t);return}return n}async function me(e,t){if(e&&!_e(e,U,A.hash)){const n=await En(e);if(!n)return;const r=kn(n);for(const a of xe){const s=a.exec(r);if(s)return{id:he(e),invalidating:t,route:a,params:Rt(s),url:e}}}}function kn(e){return kt(A.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function he(e){return(A.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function mt({url:e,type:t,intent:n,delta:r,event:a,scroll:s}){let o=!1;const c=Fe(w,n,e,t,s??null);r!==void 0&&(c.navigation.delta=r),a!==void 0&&(c.navigation.event=a);const i={...c.navigation,cancel:()=>{o=!0,c.reject(new Error("navigation cancelled"))}};return ne||lt.forEach(l=>l(i)),o?null:c}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:c=0,nav_token:i={},accept:l=We,block:u=We,event:d}){const p=F;F=i;const h=await me(t,!1),f=e==="enter"?Fe(w,h,t,e):mt({url:t,type:e,delta:n?.delta,intent:h,scroll:n?.scroll,event:d});if(!f){u(),F===i&&(F=p);return}const g=R,b=I;l(),ne=!0,ue&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let _=h&&await gt(h);if(!_){if(_e(t,U,A.hash))return await K(t,s);_=await wt(t,{id:null},await G(new Pe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=h?.url||t,F!==i)return f.reject(new Error("navigation aborted")),!1;if(_.type==="redirect"){if(c<20){await Y({type:e,url:new URL(_.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:c+1,nav_token:i}),f.fulfil(void 0);return}_=await ge({status:500,error:await G(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else _.props.page.status>=400&&await C.updated.check()&&(await ct(),await K(t,s));if(wn(),Oe(g),dt(b),_.props.page.url.pathname!==t.pathname&&(t.pathname=_.props.page.url.pathname),o=n?n.state:o,!n){const v=s?0:1,O={[q]:R+=v,[Q]:I+=v,[nt]:o};(s?history.replaceState:history.pushState).call(history,O,"",t),s||gn(R,I)}const T=h&&L?.id===h.id?L.fork:null;L=null,_.props.page.state=o;let m;if(ue){const v=(await Promise.all(Array.from(mn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(v.length>0){let W=function(){v.forEach(we=>{J.delete(we)})};v.push(W),v.forEach(we=>{J.add(we)})}const O=f.navigation.to;w={..._.state,nav:{params:O.params,route:O.route,url:O.url}},_.props.page&&(_.props.page.url=t);const $=T&&await T;$?m=$.commit():(H=null,ut.$set(_.props),H&&Object.assign(_.props.page,H),un(_.props.page),m=At?.()),ft=!0}else await _t(_,Se,!1);const{activeElement:y}=document;await m,await oe(),await oe();let E=null;if(He){const v=n?n.scroll:a?M():null;v?scrollTo(v.x,v.y):(E=t.hash&&document.getElementById(bt(t)))?E.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==y&&document.activeElement!==document.body;!r&&!k&&Tn(t,!E),He=!0,_.props.page&&(H&&Object.assign(_.props.page,H),Object.assign(S,_.props.page)),ne=!1,e==="popstate"&&ht(I),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=M()),J.forEach(v=>v(f.navigation)),C.navigating.set(ee.current=null)}async function wt(e,t,n,r,a){return e.origin===re&&e.pathname===location.pathname&&!Ce?await ge({status:r,error:n,url:e,route:t}):await K(e,a)}function Rn(){let e,t={element:void 0,href:void 0},n;x.addEventListener("mousemove",c=>{const i=c.target;clearTimeout(e),e=setTimeout(()=>{s(i,B.hover)},20)});function r(c){c.defaultPrevented||s(c.composedPath()[0],B.tap)}x.addEventListener("mousedown",r),x.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(c=>{for(const i of c)i.isIntersecting&&(Ae(new URL(i.target.href)),a.unobserve(i.target))},{threshold:0});async function s(c,i){const l=at(c,x),u=l===t.element&&l?.href===t.href&&i>=n;if(!l||u)return;const{url:d,external:p,download:h}=Ee(l,U,A.hash);if(p||h)return;const f=se(l),g=d&&he(w.url)===he(d);if(!(f.reload||g))if(i<=f.preload_data){t={element:l,href:l.href},n=B.tap;const b=await me(d,!1);if(!b)return;yn(b)}else i<=f.preload_code&&(t={element:l,href:l.href},n=i,Ae(d))}function o(){a.disconnect();for(const c of x.querySelectorAll("a")){const{url:i,external:l,download:u}=Ee(c,U,A.hash);if(l||u)continue;const d=se(c);d.reload||(d.preload_code===B.viewport&&a.observe(c),d.preload_code===B.eager&&Ae(i))}}J.add(o),o()}function G(e,t){if(e instanceof pe)return e.body;const n=ie(e),r=ln(e);return A.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Dn(e,t={}){return e=new URL(Ne(e)),e.origin!==re?Promise.reject(new Error("goto: invalid URL")):pt(e,t,0)}function Sn(e){if(typeof e=="function")le.push(e);else{const{href:t}=new URL(e,location.href);le.push(n=>n.href===t)}}function In(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(ze(),!ne){const r=Fe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};lt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ze()}),navigator.connection?.saveData||Rn(),x.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=at(t.composedPath()[0],x);if(!n)return;const{url:r,external:a,target:s,download:o}=Ee(n,U,A.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[l,u]=(A.hash?r.hash.replace(/^#/,""):r.href).split("#"),d=l===ye(location);if(a||c.reload&&(!d||!u)){mt({url:r,type:"link",event:t})?ne=!0:t.preventDefault();return}if(u!==void 0&&d){const[,p]=w.url.href.split("#");if(p===u){if(t.preventDefault(),u===""||u==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=n.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(X=!0,Oe(R),e(r),!c.replace_state)return;X=!1}t.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await Y({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??r.href===location.href,event:t})}),x.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const o=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(_e(o,U,!1))return;const c=t.target,i=se(c);if(i.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(c,r);o.search=new URLSearchParams(l).toString(),Y({type:"form",url:o,keepfocus:i.keepfocus,noscroll:i.noscroll,replace_state:i.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!Ue){if(t.state?.[q]){const n=t.state[q];if(F={},n===R)return;const r=D[n],a=t.state[nt]??{},s=new URL(t.state[Ft]??location.href),o=t.state[Q],c=w.url?ye(location)===ye(w.url):!1;if(o===I&&(ft||c)){a!==S.state&&(S.state=a),e(s),D[R]=M(),r&&scrollTo(r.x,r.y),R=n;return}const l=n-R;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:l},accept:()=>{R=n,I=o},block:()=>{history.go(-l)},nav_token:F,event:t})}else if(!X){const n=new URL(location.href);e(n),A.hash&&location.reload()}}}),addEventListener("hashchange",()=>{X&&(X=!1,history.replaceState({...history.state,[q]:++R,[Q]:I},"",location.href))});for(const t of document.querySelectorAll("link"))_n.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&C.navigating.set(ee.current=null)});function e(t){w.url=S.url=t,C.page.set(Me(S)),C.page.notify()}}async function Un(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:c,form:i}){Ce=!0;const l=new URL(location.href);let u;({params:a={},route:s={id:null}}=await me(l,!1)||{}),u=xe.find(({id:h})=>h===s.id);let d,p=!0;try{const h=r.map(async(g,b)=>{const _=c[b];return _?.uses&&(_.uses=vt(_.uses)),$e({loader:A.nodes[g],url:l,params:a,route:s,parent:async()=>{const T={};for(let m=0;m<b;m+=1)Object.assign(T,(await h[m]).data);return T},server_data_node:Be(_)})}),f=await Promise.all(h);if(u){const g=u.layouts;for(let b=0;b<g.length;b++)g[b]||f.splice(b,0,void 0)}d=await de({url:l,params:a,branch:f,status:t,error:n,errors:u?.errors,form:i,route:u??null})}catch(h){if(h instanceof Le){await K(new URL(h.location,location.href));return}d=await ge({status:ie(h),error:await G(h,{url:l,params:a,route:s}),url:l,route:s}),e.textContent="",p=!1}d.props.page&&(d.props.page.state={}),await _t(d,e,p)}async function yt(e,t){const n=new URL(e);n.pathname=pn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(cn,"1"),n.searchParams.append(sn,t.map(s=>s?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new pe(a.status,s)}return new Promise(async s=>{const o=new Map,c=a.body.getReader();function i(u){return rn(u,{...A.decoders,Promise:d=>new Promise((p,h)=>{o.set(d,{fulfil:p,reject:h})})})}let l="";for(;;){const{done:u,value:d}=await c.read();if(u&&!l)break;for(l+=!d&&l?`
2
- `:It.decode(d,{stream:!0});;){const p=l.indexOf(`
3
- `);if(p===-1)break;const h=JSON.parse(l.slice(0,p));if(l=l.slice(p+1),h.type==="redirect")return s(h);if(h.type==="data")h.nodes?.forEach(f=>{f?.type==="data"&&(f.uses=vt(f.uses),f.data=i(f.data))}),s(h);else if(h.type==="chunk"){const{id:f,data:g,error:b}=h,_=o.get(f);o.delete(f),b?_.reject(i(b)):_.fulfil(i(g))}}}})}function vt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}let Ue=!1;function Tn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const r=bt(e);if(r&&document.getElementById(r)){const{x:s,y:o}=M();setTimeout(()=>{const c=history.state;Ue=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(s,o),Ue=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o<a.rangeCount;o+=1)s.push(a.getRangeAt(o));setTimeout(()=>{if(a.rangeCount===s.length){for(let o=0;o<a.rangeCount;o+=1){const c=s[o],i=a.getRangeAt(o);if(c.commonAncestorContainer!==i.commonAncestorContainer||c.startContainer!==i.startContainer||c.endContainer!==i.endContainer||c.startOffset!==i.startOffset||c.endOffset!==i.endOffset)return}a.removeAllRanges()}})}}}function Fe(e,t,n,r,a=null){let s,o;const c=new Promise((l,u)=>{s=l,o=u});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:M()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:a},willUnload:!t,type:r,complete:c},fulfil:s,reject:o}}function Me(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ln(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function bt(e){let t;if(A.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Cn as a,Dn as g,jn as l,S as p,C as s};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/BFXEYMV8.js";export{o as load_css,r as start};
@@ -1,2 +0,0 @@
1
- )�import{l as o,a as r}from"../chunks/BFXEYMV8.js";export{o as load_css,r as start};
2
- 
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-BBLuxvp6.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/response/_server.ts.js"],"sourcesContent":["import { a as cleanup, g as getDecision, s as setDecision } from \"../../../../chunks/pending-requests.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nconst POST = async ({ request }) => {\n cleanup();\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { decision, requestId } = body;\n if (!requestId || !decision) {\n return json({ error: \"requestId and decision are required\" }, { status: 400 });\n }\n if (decision !== \"allow\" && decision !== \"deny\") {\n return json({ error: 'decision must be \"allow\" or \"deny\"' }, { status: 400 });\n }\n const found = setDecision(requestId, decision);\n if (!found) {\n return json({ error: \"Request not found or expired\" }, { status: 404 });\n }\n console.log(`[response] Decision received: ${decision} for request ${requestId}`);\n return json({\n message: \"Decision recorded\",\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[response] Failed to process response:\", toErrorMessage(error));\n return json({ error: \"Failed to process response\" }, { status: 500 });\n }\n};\nconst GET = ({ request, url }) => {\n cleanup();\n const authErr = validateAuth(request);\n if (authErr) {\n return authErr;\n }\n const requestId = url.searchParams.get(\"requestId\");\n if (!requestId) {\n return json({ error: \"requestId query parameter is required\" }, { status: 400 });\n }\n const result = getDecision(requestId);\n if (result.status === \"not_found\") {\n return json({ error: \"Request not found or expired\" }, { status: 404 });\n }\n return json({\n decision: result.decision ?? null,\n status: result.status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import './state.svelte-M8y8rROy.js';
2
- import { s as stores } from './client-w1WsLDGu.js';
3
-
4
- ({
5
- check: stores.updated.check
6
- });
7
- //# sourceMappingURL=client2-B5wCRDQi.js.map
@@ -1,96 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import * as fs from 'fs';
3
- import * as path from 'path';
4
-
5
- const MAX_AGE_MS = 5 * 60 * 1e3;
6
- const DB_DIR = path.join(process.env.HOME || "", ".shooter");
7
- const DB_PATH = path.join(DB_DIR, "shooter.db");
8
- class PendingRequestsStore {
9
- db;
10
- constructor() {
11
- fs.mkdirSync(DB_DIR, { recursive: true });
12
- this.db = new Database(DB_PATH);
13
- this.db.pragma("journal_mode = WAL");
14
- this.db.exec(`
15
- CREATE TABLE IF NOT EXISTS pending_requests (
16
- request_id TEXT PRIMARY KEY,
17
- session_id TEXT NOT NULL,
18
- tool_name TEXT NOT NULL,
19
- tool_input TEXT NOT NULL DEFAULT '{}',
20
- decision TEXT,
21
- created_at INTEGER NOT NULL,
22
- decided_at INTEGER
23
- )
24
- `);
25
- }
26
- cleanup(maxAgeMs) {
27
- const cutoff = Date.now() - maxAgeMs;
28
- const result = this.db.prepare("DELETE FROM pending_requests WHERE created_at < ?").run(cutoff);
29
- return result.changes;
30
- }
31
- delete(requestId) {
32
- this.db.prepare("DELETE FROM pending_requests WHERE request_id = ?").run(requestId);
33
- }
34
- get(requestId) {
35
- const row = this.db.prepare("SELECT * FROM pending_requests WHERE request_id = ?").get(requestId);
36
- return row ? rowToRecord(row) : null;
37
- }
38
- insert(requestId, data) {
39
- this.db.prepare(
40
- `INSERT OR REPLACE INTO pending_requests
41
- (request_id, session_id, tool_name, tool_input, decision, created_at, decided_at)
42
- VALUES (?, ?, ?, ?, NULL, ?, NULL)`
43
- ).run(requestId, data.sessionId, data.toolName, JSON.stringify(data.toolInput), Date.now());
44
- }
45
- setDecision(requestId, decision) {
46
- const result = this.db.prepare("UPDATE pending_requests SET decision = ?, decided_at = ? WHERE request_id = ?").run(decision, Date.now(), requestId);
47
- return result.changes > 0;
48
- }
49
- }
50
- function rowToRecord(row) {
51
- let toolInput = {};
52
- if (typeof row.tool_input === "string" && row.tool_input.length > 0) {
53
- try {
54
- const parsed = JSON.parse(row.tool_input);
55
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
56
- toolInput = parsed;
57
- }
58
- } catch {
59
- }
60
- }
61
- return {
62
- createdAt: row.created_at,
63
- decidedAt: row.decided_at ?? null,
64
- decision: row.decision ?? null,
65
- sessionId: row.session_id,
66
- toolInput,
67
- toolName: row.tool_name
68
- };
69
- }
70
- const PR_GLOBAL_KEY = "__shooter_pending_requests_store";
71
- const pendingRequestsStore = globalThis[PR_GLOBAL_KEY] || new PendingRequestsStore();
72
- globalThis[PR_GLOBAL_KEY] = pendingRequestsStore;
73
- function cleanup(maxAgeMs = MAX_AGE_MS) {
74
- pendingRequestsStore.cleanup(maxAgeMs);
75
- }
76
- function createPendingRequest(requestId, data) {
77
- cleanup();
78
- pendingRequestsStore.insert(requestId, data);
79
- }
80
- function getDecision(requestId) {
81
- const entry = pendingRequestsStore.get(requestId);
82
- if (!entry) {
83
- return { status: "not_found" };
84
- }
85
- if (entry.decision) {
86
- pendingRequestsStore.delete(requestId);
87
- return { decision: entry.decision, status: "decided" };
88
- }
89
- return { status: "pending" };
90
- }
91
- function setDecision(requestId, decision) {
92
- return pendingRequestsStore.setDecision(requestId, decision);
93
- }
94
-
95
- export { cleanup as a, createPendingRequest as c, getDecision as g, setDecision as s };
96
- //# sourceMappingURL=pending-requests-B-JNGxpk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pending-requests-B-JNGxpk.js","sources":["../../../.svelte-kit/adapter-node/chunks/pending-requests.js"],"sourcesContent":["import Database from \"better-sqlite3\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nconst MAX_AGE_MS = 5 * 60 * 1e3;\nconst DB_DIR = path.join(process.env.HOME || \"\", \".shooter\");\nconst DB_PATH = path.join(DB_DIR, \"shooter.db\");\nclass PendingRequestsStore {\n db;\n constructor() {\n fs.mkdirSync(DB_DIR, { recursive: true });\n this.db = new Database(DB_PATH);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS pending_requests (\n request_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n tool_name TEXT NOT NULL,\n tool_input TEXT NOT NULL DEFAULT '{}',\n decision TEXT,\n created_at INTEGER NOT NULL,\n decided_at INTEGER\n )\n `);\n }\n cleanup(maxAgeMs) {\n const cutoff = Date.now() - maxAgeMs;\n const result = this.db.prepare(\"DELETE FROM pending_requests WHERE created_at < ?\").run(cutoff);\n return result.changes;\n }\n delete(requestId) {\n this.db.prepare(\"DELETE FROM pending_requests WHERE request_id = ?\").run(requestId);\n }\n get(requestId) {\n const row = this.db.prepare(\"SELECT * FROM pending_requests WHERE request_id = ?\").get(requestId);\n return row ? rowToRecord(row) : null;\n }\n insert(requestId, data) {\n this.db.prepare(\n `INSERT OR REPLACE INTO pending_requests\n (request_id, session_id, tool_name, tool_input, decision, created_at, decided_at)\n VALUES (?, ?, ?, ?, NULL, ?, NULL)`\n ).run(requestId, data.sessionId, data.toolName, JSON.stringify(data.toolInput), Date.now());\n }\n setDecision(requestId, decision) {\n const result = this.db.prepare(\"UPDATE pending_requests SET decision = ?, decided_at = ? WHERE request_id = ?\").run(decision, Date.now(), requestId);\n return result.changes > 0;\n }\n}\nfunction rowToRecord(row) {\n let toolInput = {};\n if (typeof row.tool_input === \"string\" && row.tool_input.length > 0) {\n try {\n const parsed = JSON.parse(row.tool_input);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n toolInput = parsed;\n }\n } catch {\n }\n }\n return {\n createdAt: row.created_at,\n decidedAt: row.decided_at ?? null,\n decision: row.decision ?? null,\n sessionId: row.session_id,\n toolInput,\n toolName: row.tool_name\n };\n}\nconst PR_GLOBAL_KEY = \"__shooter_pending_requests_store\";\nconst pendingRequestsStore = globalThis[PR_GLOBAL_KEY] || new PendingRequestsStore();\nglobalThis[PR_GLOBAL_KEY] = pendingRequestsStore;\nfunction cleanup(maxAgeMs = MAX_AGE_MS) {\n pendingRequestsStore.cleanup(maxAgeMs);\n}\nfunction createPendingRequest(requestId, data) {\n cleanup();\n pendingRequestsStore.insert(requestId, data);\n}\nfunction getDecision(requestId) {\n const entry = pendingRequestsStore.get(requestId);\n if (!entry) {\n return { status: \"not_found\" };\n }\n if (entry.decision) {\n pendingRequestsStore.delete(requestId);\n return { decision: entry.decision, status: \"decided\" };\n }\n return { status: \"pending\" };\n}\nfunction setDecision(requestId, decision) {\n return pendingRequestsStore.setDecision(requestId, decision);\n}\nexport {\n cleanup as a,\n createPendingRequest as c,\n getDecision as g,\n setDecision as s\n};\n"],"names":[],"mappings":"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"}