recce-nightly 1.15.0.20250806__py3-none-any.whl → 1.26.0.20251124__py3-none-any.whl

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.

Potentially problematic release.


This version of recce-nightly might be problematic. Click here for more details.

Files changed (167) hide show
  1. recce/VERSION +1 -1
  2. recce/__init__.py +5 -0
  3. recce/adapter/dbt_adapter/__init__.py +12 -3
  4. recce/artifact.py +74 -1
  5. recce/cli.py +642 -101
  6. recce/config.py +2 -2
  7. recce/connect_to_cloud.py +1 -1
  8. recce/core.py +2 -2
  9. recce/data/404.html +1 -1
  10. recce/data/__next.__PAGE__.txt +10 -0
  11. recce/data/__next._full.txt +23 -0
  12. recce/data/__next._head.txt +8 -0
  13. recce/data/__next._index.txt +8 -0
  14. recce/data/__next._tree.txt +5 -0
  15. recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_buildManifest.js +11 -0
  16. recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_clientMiddlewareManifest.json +1 -0
  17. recce/data/_next/static/chunks/02b996c7f6a29a06.js +4 -0
  18. recce/data/_next/static/chunks/19c10d219a6a21ff.js +1 -0
  19. recce/data/_next/static/chunks/2df9ec28a061971d.js +11 -0
  20. recce/data/_next/static/chunks/3098c987393bda15.js +1 -0
  21. recce/data/_next/static/chunks/393dc43e483f717a.css +2 -0
  22. recce/data/_next/static/chunks/399e8d91a7e45073.js +2 -0
  23. recce/data/_next/static/chunks/4d0186f631230245.js +1 -0
  24. recce/data/_next/static/chunks/5794ba9e10a9c060.js +11 -0
  25. recce/data/_next/static/chunks/715761c929a3f28b.js +110 -0
  26. recce/data/_next/static/chunks/71f88fcc615bf282.js +1 -0
  27. recce/data/_next/static/chunks/80d2a95eaf1201ea.js +1 -0
  28. recce/data/_next/static/chunks/9979c6109bbbee35.js +1 -0
  29. recce/data/_next/static/chunks/99d638224186c118.js +1 -0
  30. recce/data/_next/static/chunks/d003eb36240e92f3.js +1 -0
  31. recce/data/_next/static/chunks/d3167cdfec4fc351.js +1 -0
  32. recce/data/_next/static/chunks/e124bccf574a3361.css +1 -0
  33. recce/data/_next/static/chunks/f40141db1bdb46f0.css +6 -0
  34. recce/data/_next/static/chunks/fcc53a88741a52f9.js +1 -0
  35. recce/data/_next/static/chunks/turbopack-b1920d28cfb1f28d.js +3 -0
  36. recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  37. recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  38. recce/data/_next/static/media/{montserrat-cyrillic-800-normal.bd5c9f50.woff → montserrat-cyrillic-800-normal.f9d58125.woff} +0 -0
  39. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  40. recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  41. recce/data/_next/static/media/{montserrat-latin-800-normal.fc315020.woff → montserrat-latin-800-normal.d5761935.woff} +0 -0
  42. recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  43. recce/data/_next/static/media/{montserrat-latin-ext-800-normal.2e5381b2.woff → montserrat-latin-ext-800-normal.b671449b.woff} +0 -0
  44. recce/data/_next/static/media/{montserrat-vietnamese-800-normal.20c545e6.woff → montserrat-vietnamese-800-normal.9f7b8541.woff} +0 -0
  45. recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  46. recce/data/_not-found/__next._full.txt +17 -0
  47. recce/data/_not-found/__next._head.txt +8 -0
  48. recce/data/_not-found/__next._index.txt +8 -0
  49. recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
  50. recce/data/_not-found/__next._not-found.txt +4 -0
  51. recce/data/_not-found/__next._tree.txt +3 -0
  52. recce/data/_not-found.html +1 -0
  53. recce/data/_not-found.txt +17 -0
  54. recce/data/index.html +1 -1
  55. recce/data/index.txt +21 -23
  56. recce/event/__init__.py +9 -8
  57. recce/event/collector.py +3 -1
  58. recce/event/track.py +10 -0
  59. recce/github.py +1 -1
  60. recce/mcp_server.py +716 -0
  61. recce/models/types.py +35 -2
  62. recce/pull_request.py +1 -1
  63. recce/run.py +2 -2
  64. recce/server.py +105 -3
  65. recce/state/__init__.py +31 -0
  66. recce/state/cloud.py +632 -0
  67. recce/state/const.py +26 -0
  68. recce/state/local.py +56 -0
  69. recce/state/state.py +119 -0
  70. recce/state/state_loader.py +174 -0
  71. recce/summary.py +21 -1
  72. recce/tasks/dataframe.py +63 -1
  73. recce/tasks/rowcount.py +4 -1
  74. recce/tasks/schema.py +4 -1
  75. recce/util/api_token.py +9 -2
  76. recce/util/breaking.py +1 -1
  77. recce/util/io.py +2 -2
  78. recce/util/lineage.py +14 -18
  79. recce/util/recce_cloud.py +187 -7
  80. recce/yaml/__init__.py +2 -2
  81. recce_cloud/__init__.py +24 -0
  82. recce_cloud/api/__init__.py +17 -0
  83. recce_cloud/api/base.py +111 -0
  84. recce_cloud/api/client.py +150 -0
  85. recce_cloud/api/exceptions.py +26 -0
  86. recce_cloud/api/factory.py +63 -0
  87. recce_cloud/api/github.py +76 -0
  88. recce_cloud/api/gitlab.py +82 -0
  89. recce_cloud/artifact.py +57 -0
  90. recce_cloud/ci_providers/__init__.py +9 -0
  91. recce_cloud/ci_providers/base.py +82 -0
  92. recce_cloud/ci_providers/detector.py +147 -0
  93. recce_cloud/ci_providers/github_actions.py +136 -0
  94. recce_cloud/ci_providers/gitlab_ci.py +130 -0
  95. recce_cloud/cli.py +245 -0
  96. recce_cloud/upload.py +214 -0
  97. {recce_nightly-1.15.0.20250806.dist-info → recce_nightly-1.26.0.20251124.dist-info}/METADATA +54 -28
  98. recce_nightly-1.26.0.20251124.dist-info/RECORD +180 -0
  99. {recce_nightly-1.15.0.20250806.dist-info → recce_nightly-1.26.0.20251124.dist-info}/top_level.txt +1 -0
  100. tests/adapter/dbt_adapter/test_dbt_cll.py +4 -2
  101. tests/recce_cloud/__init__.py +0 -0
  102. tests/recce_cloud/test_ci_providers.py +351 -0
  103. tests/recce_cloud/test_cli.py +372 -0
  104. tests/recce_cloud/test_client.py +273 -0
  105. tests/recce_cloud/test_platform_clients.py +333 -0
  106. tests/test_cli.py +106 -3
  107. tests/test_cli_mcp_optional.py +45 -0
  108. tests/test_cloud_listing_cli.py +324 -0
  109. tests/test_core.py +147 -0
  110. tests/test_mcp_server.py +332 -0
  111. tests/test_server.py +6 -6
  112. tests/test_summary.py +14 -6
  113. recce/data/_next/static/Q_5ThPsmamd4VAGXuqwgi/_buildManifest.js +0 -1
  114. recce/data/_next/static/chunks/0376eeba-3db2196398d62270.js +0 -1
  115. recce/data/_next/static/chunks/068b80ea-833a129468ee1622.js +0 -1
  116. recce/data/_next/static/chunks/0ddaf06c-c7961285f66460f6.js +0 -1
  117. recce/data/_next/static/chunks/1268aea1-6dc1251c01bd724b.js +0 -54
  118. recce/data/_next/static/chunks/12f8fac4-16838e42d28d45c3.js +0 -1
  119. recce/data/_next/static/chunks/235b8375-8c84c51d7bd4f6aa.js +0 -1
  120. recce/data/_next/static/chunks/2541941f-2cd3a7c2d629bd33.js +0 -1
  121. recce/data/_next/static/chunks/273-f3fa401bd2b6fc91.js +0 -10
  122. recce/data/_next/static/chunks/2fc37c1e-910deebeb3d77c90.js +0 -1
  123. recce/data/_next/static/chunks/338-2e7eed5135c64550.js +0 -30
  124. recce/data/_next/static/chunks/367-ab8b16dd5f8586ca.js +0 -1
  125. recce/data/_next/static/chunks/3a92ee20-0400ffe460c7c803.js +0 -1
  126. recce/data/_next/static/chunks/62446465-423c03bb8c1f59b6.js +0 -1
  127. recce/data/_next/static/chunks/6af7f9e9-60aa8706f49dae45.js +0 -1
  128. recce/data/_next/static/chunks/6cf54382-49d52ae6e564e2ac.js +0 -1
  129. recce/data/_next/static/chunks/6dc81886-78e2efe4538794ae.js +0 -1
  130. recce/data/_next/static/chunks/715e4acc-9e2e6df4eb3809d1.js +0 -1
  131. recce/data/_next/static/chunks/72-181b430654230f0e.js +0 -1
  132. recce/data/_next/static/chunks/786-774e3e3ed70a41b3.js +0 -1
  133. recce/data/_next/static/chunks/8d700b6a.7fe2c8c3f4e333a6.js +0 -1
  134. recce/data/_next/static/chunks/a69d64b4-d6890125a87b0aba.js +0 -1
  135. recce/data/_next/static/chunks/ae307f12-01100009689ace61.js +0 -1
  136. recce/data/_next/static/chunks/app/_not-found/page-c7ef8ed6dc07aaeb.js +0 -1
  137. recce/data/_next/static/chunks/app/layout-744f0a78e9e50e60.js +0 -1
  138. recce/data/_next/static/chunks/app/page-e8f798c2ae3f59c2.js +0 -1
  139. recce/data/_next/static/chunks/c0015c5c-82c219792582c104.js +0 -1
  140. recce/data/_next/static/chunks/d90cfbaa-e7d779b3912afeec.js +0 -1
  141. recce/data/_next/static/chunks/e07c302e-cd170429646873e1.js +0 -1
  142. recce/data/_next/static/chunks/fa5fb511-15fb438349ad5b97.js +0 -1
  143. recce/data/_next/static/chunks/framework-7950757d31580329.js +0 -1
  144. recce/data/_next/static/chunks/main-app-4df79eb11c34d43c.js +0 -1
  145. recce/data/_next/static/chunks/main-cd6c104af638214a.js +0 -1
  146. recce/data/_next/static/chunks/pages/_app-73008661edbd5e05.js +0 -1
  147. recce/data/_next/static/chunks/pages/_error-cf8bbdc3cf76c83f.js +0 -1
  148. recce/data/_next/static/chunks/webpack-84df6dd5ae3cf908.js +0 -1
  149. recce/data/_next/static/css/188a3a1687e2a064.css +0 -1
  150. recce/data/_next/static/css/8edca58d4abcf908.css +0 -14
  151. recce/data/_next/static/css/abdb9814a3dd18bb.css +0 -1
  152. recce/data/_next/static/css/c21263c1520b615b.css +0 -1
  153. recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  154. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  155. recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  156. recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  157. recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  158. recce/state.py +0 -865
  159. recce_nightly-1.15.0.20250806.dist-info/RECORD +0 -156
  160. tests/test_state.py +0 -134
  161. /recce/data/_next/static/{Q_5ThPsmamd4VAGXuqwgi → 52aV_JrNUZU6dMFgvTQEO}/_ssgManifest.js +0 -0
  162. /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
  163. /recce/data/_next/static/media/{montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff → montserrat-cyrillic-ext-800-normal.a4fa76b5.woff} +0 -0
  164. /recce/data/_next/static/media/{reload-image.79aabb7d.svg → reload-image.7aa931c7.svg} +0 -0
  165. {recce_nightly-1.15.0.20250806.dist-info → recce_nightly-1.26.0.20251124.dist-info}/WHEEL +0 -0
  166. {recce_nightly-1.15.0.20250806.dist-info → recce_nightly-1.26.0.20251124.dist-info}/entry_points.txt +0 -0
  167. {recce_nightly-1.15.0.20250806.dist-info → recce_nightly-1.26.0.20251124.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,332 @@
1
+ from unittest.mock import MagicMock, patch
2
+
3
+ import pytest
4
+
5
+ # Skip all tests in this module if mcp is not available
6
+ pytest.importorskip("mcp")
7
+
8
+ from recce.core import RecceContext # noqa: E402
9
+ from recce.mcp_server import RecceMCPServer, run_mcp_server # noqa: E402
10
+ from recce.models.types import LineageDiff # noqa: E402
11
+ from recce.server import RecceServerMode # noqa: E402
12
+ from recce.tasks.profile import ProfileDiffTask # noqa: E402
13
+ from recce.tasks.query import QueryDiffTask, QueryTask # noqa: E402
14
+ from recce.tasks.rowcount import RowCountDiffTask # noqa: E402
15
+
16
+
17
+ @pytest.fixture
18
+ def mcp_server():
19
+ """Fixture to create a RecceMCPServer instance for testing"""
20
+ mock_context = MagicMock(spec=RecceContext)
21
+ return RecceMCPServer(mock_context), mock_context
22
+
23
+
24
+ class TestRecceMCPServer:
25
+ """Test cases for the RecceMCPServer class"""
26
+
27
+ def test_server_initialization(self, mcp_server):
28
+ """Test that the MCP server initializes correctly"""
29
+ server, mock_context = mcp_server
30
+ assert server.context == mock_context
31
+ assert server.server is not None
32
+ assert server.server.name == "recce"
33
+
34
+ @pytest.mark.asyncio
35
+ async def test_tool_lineage_diff(self, mcp_server):
36
+ """Test the lineage_diff tool"""
37
+ server, mock_context = mcp_server
38
+ # Mock the lineage diff response
39
+ mock_lineage_diff = MagicMock(spec=LineageDiff)
40
+ mock_lineage_diff.model_dump.return_value = {
41
+ "base": {
42
+ "nodes": {
43
+ "model.project.model_a": {
44
+ "name": "model_a",
45
+ "resource_type": "model",
46
+ "config": {"materialized": "view"},
47
+ },
48
+ "model.project.model_b": {
49
+ "name": "model_b",
50
+ "resource_type": "model",
51
+ },
52
+ },
53
+ "parent_map": {
54
+ "model.project.model_a": [],
55
+ "model.project.model_b": ["model.project.model_a"],
56
+ },
57
+ },
58
+ "current": {
59
+ "nodes": {
60
+ "model.project.model_a": {
61
+ "name": "model_a",
62
+ "resource_type": "model",
63
+ "config": {"materialized": "view"},
64
+ },
65
+ "model.project.model_b": {
66
+ "name": "model_b",
67
+ "resource_type": "model",
68
+ },
69
+ },
70
+ "parent_map": {
71
+ "model.project.model_a": [],
72
+ "model.project.model_b": ["model.project.model_a"],
73
+ },
74
+ },
75
+ "diff": {
76
+ "model.project.model_a": {"change_status": "modified"},
77
+ },
78
+ }
79
+ mock_context.get_lineage_diff.return_value = mock_lineage_diff
80
+ mock_context.adapter.select_nodes.return_value = {
81
+ "model.project.model_a",
82
+ "model.project.model_b",
83
+ }
84
+
85
+ # Execute the method
86
+ result = await server._tool_lineage_diff({})
87
+
88
+ # Verify the result structure
89
+ assert "nodes" in result
90
+ assert "parent_map" in result
91
+
92
+ # Verify nodes is a DataFrame dict with columns and data
93
+ nodes = result["nodes"]
94
+ assert "columns" in nodes
95
+ assert "data" in nodes
96
+
97
+ # Verify data is a list with 2 rows
98
+ assert isinstance(nodes["data"], list)
99
+ assert len(nodes["data"]) == 2
100
+
101
+ mock_context.get_lineage_diff.assert_called_once()
102
+ mock_context.adapter.select_nodes.assert_called()
103
+
104
+ @pytest.mark.asyncio
105
+ async def test_tool_schema_diff(self, mcp_server):
106
+ """Test the schema_diff tool"""
107
+ server, mock_context = mcp_server
108
+ # Mock the lineage diff response with schema information
109
+ mock_lineage_diff = MagicMock(spec=LineageDiff)
110
+ mock_lineage_diff.model_dump.return_value = {
111
+ "base": {
112
+ "nodes": {
113
+ "model.project.model_a": {
114
+ "name": "model_a",
115
+ "resource_type": "model",
116
+ "columns": {
117
+ "id": {"name": "id", "type": "integer"},
118
+ "name": {"name": "name", "type": "text"},
119
+ },
120
+ },
121
+ },
122
+ },
123
+ "current": {
124
+ "nodes": {
125
+ "model.project.model_a": {
126
+ "name": "model_a",
127
+ "resource_type": "model",
128
+ "columns": {
129
+ "id": {"name": "id", "type": "integer"},
130
+ "name": {"name": "name", "type": "text"},
131
+ "age": {"name": "age", "type": "integer"},
132
+ },
133
+ },
134
+ },
135
+ },
136
+ }
137
+ mock_context.get_lineage_diff.return_value = mock_lineage_diff
138
+ mock_context.adapter.select_nodes.return_value = {"model.project.model_a"}
139
+
140
+ # Execute the method
141
+ result = await server._tool_schema_diff({})
142
+
143
+ # Verify the result is a DataFrame dict with columns and data
144
+ assert "columns" in result
145
+ assert "data" in result
146
+ assert "limit" in result
147
+ assert "more" in result
148
+
149
+ # Verify limit and more fields
150
+ assert result["limit"] == 100
151
+ assert isinstance(result["more"], bool)
152
+ assert isinstance(result["data"], list)
153
+ # Verify the data contains the added column
154
+ assert len(result["data"]) > 0
155
+
156
+ mock_context.get_lineage_diff.assert_called_once()
157
+
158
+ @pytest.mark.asyncio
159
+ async def test_tool_row_count_diff(self, mcp_server):
160
+ """Test the row_count_diff tool"""
161
+ server, _ = mcp_server
162
+ # Mock the task execution
163
+ mock_result = {"results": [{"node_id": "model.project.my_model", "base": 100, "current": 105, "diff": 5}]}
164
+
165
+ with patch.object(RowCountDiffTask, "execute", return_value=mock_result):
166
+ result = await server._tool_row_count_diff({"node_names": ["my_model"]})
167
+
168
+ # Verify the result
169
+ assert result == mock_result
170
+ assert "results" in result
171
+
172
+ @pytest.mark.asyncio
173
+ async def test_tool_query(self, mcp_server):
174
+ """Test the query tool"""
175
+ server, _ = mcp_server
176
+ # Mock the task execution
177
+ mock_result = MagicMock()
178
+ mock_result.model_dump.return_value = {
179
+ "columns": ["id", "name"],
180
+ "data": [[1, "Alice"], [2, "Bob"]],
181
+ }
182
+
183
+ with patch.object(QueryTask, "execute", return_value=mock_result):
184
+ result = await server._tool_query({"sql_template": "SELECT * FROM {{ ref('my_model') }}", "base": False})
185
+
186
+ # Verify the result
187
+ assert "columns" in result
188
+ assert "data" in result
189
+ mock_result.model_dump.assert_called_once_with(mode="json")
190
+
191
+ @pytest.mark.asyncio
192
+ async def test_tool_query_with_base_flag(self, mcp_server):
193
+ """Test the query tool with base environment flag"""
194
+ server, _ = mcp_server
195
+ mock_result = {"columns": ["id"], "data": [[1]]}
196
+
197
+ with patch.object(QueryTask, "execute", return_value=mock_result) as mock_execute:
198
+ with patch.object(QueryTask, "__init__", return_value=None):
199
+ task = QueryTask(params={"sql_template": "SELECT 1"})
200
+ task.is_base = True
201
+ task.execute = mock_execute
202
+
203
+ result = await server._tool_query({"sql_template": "SELECT 1", "base": True})
204
+
205
+ # Verify base flag was set (would need to inspect task creation)
206
+ assert result == mock_result
207
+
208
+ @pytest.mark.asyncio
209
+ async def test_tool_query_diff(self, mcp_server):
210
+ """Test the query_diff tool"""
211
+ server, _ = mcp_server
212
+ # Mock the task execution
213
+ mock_result = MagicMock()
214
+ mock_result.model_dump.return_value = {
215
+ "diff": {
216
+ "added": [[3, "Charlie"]],
217
+ "removed": [[1, "Alice"]],
218
+ "modified": [],
219
+ }
220
+ }
221
+
222
+ with patch.object(QueryDiffTask, "execute", return_value=mock_result):
223
+ result = await server._tool_query_diff(
224
+ {
225
+ "sql_template": "SELECT * FROM {{ ref('my_model') }}",
226
+ "primary_keys": ["id"],
227
+ }
228
+ )
229
+
230
+ # Verify the result
231
+ assert "diff" in result
232
+ mock_result.model_dump.assert_called_once_with(mode="json")
233
+
234
+ @pytest.mark.asyncio
235
+ async def test_tool_profile_diff(self, mcp_server):
236
+ """Test the profile_diff tool"""
237
+ server, _ = mcp_server
238
+ # Mock the task execution
239
+ mock_result = MagicMock()
240
+ mock_result.model_dump.return_value = {
241
+ "columns": {
242
+ "id": {
243
+ "base": {"min": 1, "max": 100, "avg": 50.5},
244
+ "current": {"min": 1, "max": 105, "avg": 53.0},
245
+ }
246
+ }
247
+ }
248
+
249
+ with patch.object(ProfileDiffTask, "execute", return_value=mock_result):
250
+ result = await server._tool_profile_diff({"model": "my_model", "columns": ["id"]})
251
+
252
+ # Verify the result
253
+ assert "columns" in result
254
+ mock_result.model_dump.assert_called_once_with(mode="json")
255
+
256
+ @pytest.mark.asyncio
257
+ async def test_error_handling(self, mcp_server):
258
+ """Test error handling in tool execution"""
259
+ server, mock_context = mcp_server
260
+ # Make get_lineage_diff raise an exception
261
+ mock_context.get_lineage_diff.side_effect = Exception("Test error")
262
+
263
+ # The method should raise the exception
264
+ with pytest.raises(Exception, match="Test error"):
265
+ await server._tool_lineage_diff({})
266
+
267
+
268
+ class TestRunMCPServer:
269
+ """Test cases for the run_mcp_server function"""
270
+
271
+ @pytest.mark.asyncio
272
+ @patch("recce.mcp_server.load_context")
273
+ @patch.object(RecceMCPServer, "run")
274
+ async def test_run_mcp_server(self, mock_run, mock_load_context):
275
+ """Test the run_mcp_server entry point"""
276
+ # Mock the context
277
+ mock_context = MagicMock(spec=RecceContext)
278
+ mock_load_context.return_value = mock_context
279
+
280
+ # Mock the server run method
281
+ mock_run.return_value = None
282
+
283
+ # Run the server
284
+ await run_mcp_server(project_dir="/test/path")
285
+
286
+ # Verify context was loaded with correct kwargs
287
+ mock_load_context.assert_called_once_with(project_dir="/test/path")
288
+
289
+ # Verify server was run
290
+ mock_run.assert_called_once()
291
+
292
+ @pytest.mark.asyncio
293
+ @patch("recce.mcp_server.load_context")
294
+ async def test_run_mcp_server_context_error(self, mock_load_context):
295
+ """Test run_mcp_server handles context loading errors"""
296
+ # Make load_context raise an exception
297
+ mock_load_context.side_effect = FileNotFoundError("manifest.json not found")
298
+
299
+ # The function should raise the exception
300
+ with pytest.raises(FileNotFoundError):
301
+ await run_mcp_server()
302
+
303
+
304
+ def test_mcp_cli_command_exists():
305
+ """Test that the mcp-server CLI command is registered"""
306
+ from recce.cli import cli
307
+
308
+ # Check that mcp_server is in the CLI commands
309
+ commands = [cmd.name for cmd in cli.commands.values()]
310
+ assert "mcp_server" in commands or "mcp-server" in commands
311
+
312
+
313
+ class TestMCPServerModes:
314
+ """Test cases for MCP server mode functionality"""
315
+
316
+ def test_server_mode_default(self):
317
+ """Test that server mode is the default when not specified"""
318
+ mock_context = MagicMock(spec=RecceContext)
319
+ server = RecceMCPServer(mock_context)
320
+
321
+ # Default mode should be server
322
+ assert server.mode == RecceServerMode.server
323
+
324
+ def test_non_server_mode_restricts_tools(self):
325
+ """Test that non-server mode (preview, read-only) restricts diff tools"""
326
+ mock_context = MagicMock(spec=RecceContext)
327
+ server = RecceMCPServer(mock_context, mode=RecceServerMode.preview)
328
+
329
+ # Verify mode is set correctly
330
+ assert server.mode == RecceServerMode.preview
331
+ # Verify it's not server mode
332
+ assert server.mode != RecceServerMode.server
tests/test_server.py CHANGED
@@ -31,9 +31,9 @@ def test_health():
31
31
 
32
32
  def test_stateless(dbt_test_helper):
33
33
  context = default_context()
34
- from recce.state import RecceStateLoader
34
+ from recce.state import FileStateLoader
35
35
 
36
- context.state_loader = RecceStateLoader()
36
+ context.state_loader = FileStateLoader()
37
37
  client = TestClient(app)
38
38
  response = client.get("/api/info")
39
39
  assert response.status_code == 200
@@ -44,9 +44,9 @@ def test_stateless(dbt_test_helper):
44
44
 
45
45
  def test_file_mode(dbt_test_helper):
46
46
  context = default_context()
47
- from recce.state import RecceStateLoader
47
+ from recce.state import FileStateLoader
48
48
 
49
- context.state_loader = RecceStateLoader(state_file="/tmp/recce_state.json")
49
+ context.state_loader = FileStateLoader(state_file="/tmp/recce_state.json")
50
50
  client = TestClient(app)
51
51
  response = client.get("/api/info")
52
52
  assert response.status_code == 200
@@ -63,9 +63,9 @@ def test_saveas_and_rename(dbt_test_helper, temp_folder):
63
63
  state_file3 = os.path.join(temp_folder, "recce_state3.json")
64
64
  os.makedirs(os.path.join(temp_folder, "dir.json"))
65
65
 
66
- from recce.state import RecceStateLoader
66
+ from recce.state import FileStateLoader
67
67
 
68
- context.state_loader = RecceStateLoader(state_file=state_file)
68
+ context.state_loader = FileStateLoader(state_file=state_file)
69
69
  client = TestClient(app)
70
70
 
71
71
  response = client.post("/api/save", json={"filename": "recce_state2.json"})
tests/test_summary.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import os
2
- import unittest
2
+
3
+ import pytest
3
4
 
4
5
  from recce.adapter.dbt_adapter import DbtAdapter, DbtVersion, load_manifest
5
6
  from recce.core import RecceContext, set_default_context
@@ -13,11 +14,12 @@ current_dir = os.path.dirname(os.path.abspath(__file__))
13
14
  base_manifest_dir = os.path.join(current_dir, "data", "manifest", "base")
14
15
  pr2_manifest_dir = os.path.join(current_dir, "data", "manifest", "pr2") # Pull Request 2l
15
16
 
16
- dbt_version = DbtVersion()
17
-
18
17
 
19
- @unittest.skipIf(dbt_version < "1.8.1", "Dbt version is less than 1.8.1")
20
18
  def test_generate_summary_metadata():
19
+ dbt_version = DbtVersion()
20
+ if dbt_version < "1.8.1":
21
+ pytest.skip("Dbt version is less than 1.8.1")
22
+
21
23
  manifest = load_manifest(path=os.path.join(current_dir, "manifest.json"))
22
24
  assert manifest is not None
23
25
  dbt_adapter = DbtAdapter(curr_manifest=manifest)
@@ -35,8 +37,11 @@ def test_generate_summary_metadata():
35
37
  generate_summary_metadata(curr_lineage, base_lineage)
36
38
 
37
39
 
38
- @unittest.skipIf(dbt_version < "v1.8.1", "Dbt version is less than 1.8.1")
39
40
  def test_build_lineage_graph():
41
+ dbt_version = DbtVersion()
42
+ if dbt_version < "1.8.1":
43
+ pytest.skip("Dbt version is less than 1.8.1")
44
+
40
45
  base_manifest = load_manifest(path=os.path.join(base_manifest_dir, "manifest.json"))
41
46
  curr_manifest = load_manifest(path=os.path.join(pr2_manifest_dir, "manifest.json"))
42
47
  dbt_adapter = DbtAdapter(curr_manifest=curr_manifest, base_manifest=base_manifest)
@@ -51,8 +56,11 @@ def test_build_lineage_graph():
51
56
  assert len(lineage_graph.modified_set) == 3
52
57
 
53
58
 
54
- @unittest.skipIf(dbt_version < "v1.8.1", "Dbt version is less than 1.8.1")
55
59
  def test_generate_mermaid_lineage_graph():
60
+ dbt_version = DbtVersion()
61
+ if dbt_version < "1.8.1":
62
+ pytest.skip("Dbt version is less than 1.8.1")
63
+
56
64
  set_default_context(RecceContext())
57
65
  base_manifest = load_manifest(path=os.path.join(base_manifest_dir, "manifest.json"))
58
66
  curr_manifest = load_manifest(path=os.path.join(pr2_manifest_dir, "manifest.json"))
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:3,errorRate:1e-4,numBits:58,numHashes:14,bitArray:[1,1,0,e,0,e,e,r,e,e,r,e,e,e,r,e,r,r,e,r,r,r,e,r,r,r,r,r,e,r,e,e,e,e,r,e,e,r,e,e,e,r,e,r,e,r,r,e,e,e,r,r,e,e,e,r,e,e]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-cf8bbdc3cf76c83f.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[462],{24138:(e,t,n)=>{n.d(t,{Cz:()=>em,Fp:()=>es,Gc:()=>ng,Jo:()=>ef,Ln:()=>nr,Mi:()=>z,PI:()=>v,Pj:()=>E,VH:()=>tn,Zk:()=>M,ck:()=>np,fM:()=>nm,h7:()=>eI,tE:()=>Y,yX:()=>s});var o,r,a,l,i,s,d=n(80905),c=n(53082),u=n(74832),g=n(63971),h=n(22973),p=n(75678),m=n(89058),f=n(21783);n(28636);let y=(0,d.createContext)(null),x=y.Provider,S={error001:()=>"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,t)=>`Couldn't create edge for ${!e?"source":"target"} handle id: "${!e?t.sourceHandle:t.targetHandle}", edge id: ${t.id}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`,error012:e=>`Node with id "${e}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`},b=S.error001();function E(e,t){let n=(0,d.useContext)(y);if(null===n)throw Error(b);return(0,u.n)(n,e,t)}let v=()=>{let e=(0,d.useContext)(y);if(null===e)throw Error(b);return(0,d.useMemo)(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe,destroy:e.destroy}),[e])},w=e=>e.userSelectionActive?"none":"all";function M({position:e,children:t,className:n,style:o,...r}){let a=E(w),l=`${e}`.split("-");return d.createElement("div",{className:(0,c.A)(["react-flow__panel",n,...l]),style:{...o,pointerEvents:a},...r},t)}function C({proOptions:e,position:t="bottom-right"}){return e?.hideAttribution?null:d.createElement(M,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://reactflow.dev/pro"},d.createElement("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution"},"React Flow"))}var N=(0,d.memo)(({x:e,y:t,label:n,labelStyle:o={},labelShowBg:r=!0,labelBgStyle:a={},labelBgPadding:l=[2,4],labelBgBorderRadius:i=2,children:s,className:u,...g})=>{let h=(0,d.useRef)(null),[p,m]=(0,d.useState)({x:0,y:0,width:0,height:0}),f=(0,c.A)(["react-flow__edge-textwrapper",u]);return((0,d.useEffect)(()=>{if(h.current){let e=h.current.getBBox();m({x:e.x,y:e.y,width:e.width,height:e.height})}},[n]),void 0!==n&&n)?d.createElement("g",{transform:`translate(${e-p.width/2} ${t-p.height/2})`,className:f,visibility:p.width?"visible":"hidden",...g},r&&d.createElement("rect",{width:p.width+2*l[0],x:-l[0],y:-l[1],height:p.height+2*l[1],className:"react-flow__edge-textbg",style:a,rx:i,ry:i}),d.createElement("text",{className:"react-flow__edge-text",y:p.height/2,dy:"0.3em",ref:h,style:o},n),s):null});let k=e=>({width:e.offsetWidth,height:e.offsetHeight}),A=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),P=(e={x:0,y:0},t)=>({x:A(e.x,t[0][0],t[1][0]),y:A(e.y,t[0][1],t[1][1])}),R=(e,t,n)=>e<t?A(Math.abs(e-t),1,50)/50:e>n?-A(Math.abs(e-n),1,50)/50:0,I=(e,t)=>[20*R(e.x,35,t.width-35),20*R(e.y,35,t.height-35)],$=e=>e.getRootNode?.()||window?.document,_=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),O=({x:e,y:t,width:n,height:o})=>({x:e,y:t,x2:e+n,y2:t+o}),B=({x:e,y:t,x2:n,y2:o})=>({x:e,y:t,width:n-e,height:o-t}),D=e=>({...e.positionAbsolute||{x:0,y:0},width:e.width||0,height:e.height||0}),z=(e,t)=>B(_(O(e),O(t))),L=(e,t)=>Math.ceil(Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))),H=e=>!isNaN(e)&&isFinite(e),T=Symbol.for("internals"),F=["Enter"," ","Escape"],V=(e,t)=>{};function K(e){let t="nativeEvent"in e?e.nativeEvent:e,n=t.composedPath?.()?.[0]||e.target;return["INPUT","SELECT","TEXTAREA"].includes(n?.nodeName)||n?.hasAttribute("contenteditable")||!!n?.closest(".nokey")}let Z=(e,t)=>{let n="clientX"in e,o=n?e.clientX:e.touches?.[0].clientX,r=n?e.clientY:e.touches?.[0].clientY;return{x:o-(t?.left??0),y:r-(t?.top??0)}},X=()=>"undefined"!=typeof navigator&&navigator?.userAgent?.indexOf("Mac")>=0,Y=({id:e,path:t,labelX:n,labelY:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:s,labelBgBorderRadius:c,style:u,markerEnd:g,markerStart:h,interactionWidth:p=20})=>d.createElement(d.Fragment,null,d.createElement("path",{id:e,style:u,d:t,fill:"none",className:"react-flow__edge-path",markerEnd:g,markerStart:h}),p&&d.createElement("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:p,className:"react-flow__edge-interaction"}),r&&H(n)&&H(o)?d.createElement(N,{x:n,y:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:s,labelBgBorderRadius:c}):null);function W(e,t,n){return void 0===n?n:o=>{let r=t().edges.find(t=>t.id===e);r&&n(o,{...r})}}function j({sourceX:e,sourceY:t,targetX:n,targetY:o}){let r=Math.abs(n-e)/2,a=Math.abs(o-t)/2;return[n<e?n+r:n-r,o<t?o+a:o-a,r,a]}function U({sourceX:e,sourceY:t,targetX:n,targetY:o,sourceControlX:r,sourceControlY:a,targetControlX:l,targetControlY:i}){let s=.125*e+.375*r+.375*l+.125*n,d=.125*t+.375*a+.375*i+.125*o,c=Math.abs(s-e),u=Math.abs(d-t);return[s,d,c,u]}function G({pos:e,x1:t,y1:n,x2:o,y2:r}){return e===s.Left||e===s.Right?[.5*(t+o),n]:[t,.5*(n+r)]}function q({sourceX:e,sourceY:t,sourcePosition:n=s.Bottom,targetX:o,targetY:r,targetPosition:a=s.Top}){let[l,i]=G({pos:n,x1:e,y1:t,x2:o,y2:r}),[d,c]=G({pos:a,x1:o,y1:r,x2:e,y2:t}),[u,g,h,p]=U({sourceX:e,sourceY:t,targetX:o,targetY:r,sourceControlX:l,sourceControlY:i,targetControlX:d,targetControlY:c});return[`M${e},${t} C${l},${i} ${d},${c} ${o},${r}`,u,g,h,p]}Y.displayName="BaseEdge",function(e){e.Strict="strict",e.Loose="loose"}(o||(o={})),function(e){e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal"}(r||(r={})),function(e){e.Partial="partial",e.Full="full"}(a||(a={})),function(e){e.Bezier="default",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e.SimpleBezier="simplebezier"}(l||(l={})),function(e){e.Arrow="arrow",e.ArrowClosed="arrowclosed"}(i||(i={})),function(e){e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom"}(s||(s={}));let Q=(0,d.memo)(({sourceX:e,sourceY:t,targetX:n,targetY:o,sourcePosition:r=s.Bottom,targetPosition:a=s.Top,label:l,labelStyle:i,labelShowBg:c,labelBgStyle:u,labelBgPadding:g,labelBgBorderRadius:h,style:p,markerEnd:m,markerStart:f,interactionWidth:y})=>{let[x,S,b]=q({sourceX:e,sourceY:t,sourcePosition:r,targetX:n,targetY:o,targetPosition:a});return d.createElement(Y,{path:x,labelX:S,labelY:b,label:l,labelStyle:i,labelShowBg:c,labelBgStyle:u,labelBgPadding:g,labelBgBorderRadius:h,style:p,markerEnd:m,markerStart:f,interactionWidth:y})});Q.displayName="SimpleBezierEdge";let J={[s.Left]:{x:-1,y:0},[s.Right]:{x:1,y:0},[s.Top]:{x:0,y:-1},[s.Bottom]:{x:0,y:1}},ee=({source:e,sourcePosition:t=s.Bottom,target:n})=>t===s.Left||t===s.Right?e.x<n.x?{x:1,y:0}:{x:-1,y:0}:e.y<n.y?{x:0,y:1}:{x:0,y:-1},et=(e,t)=>Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function en({sourceX:e,sourceY:t,sourcePosition:n=s.Bottom,targetX:o,targetY:r,targetPosition:a=s.Top,borderRadius:l=5,centerX:i,centerY:d,offset:c=20}){let[u,g,h,p,m]=function({source:e,sourcePosition:t=s.Bottom,target:n,targetPosition:o=s.Top,center:r,offset:a}){let l,i,d=J[t],c=J[o],u={x:e.x+d.x*a,y:e.y+d.y*a},g={x:n.x+c.x*a,y:n.y+c.y*a},h=ee({source:u,sourcePosition:t,target:g}),p=0!==h.x?"x":"y",m=h[p],f=[],y={x:0,y:0},x={x:0,y:0},[S,b,E,v]=j({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(d[p]*c[p]==-1){l=r.x??S,i=r.y??b;let e=[{x:l,y:u.y},{x:l,y:g.y}],t=[{x:u.x,y:i},{x:g.x,y:i}];f=d[p]===m?"x"===p?e:t:"x"===p?t:e}else{let r=[{x:u.x,y:g.y}],s=[{x:g.x,y:u.y}];if(f="x"===p?d.x===m?s:r:d.y===m?r:s,t===o){let t=Math.abs(e[p]-n[p]);if(t<=a){let o=Math.min(a-1,a-t);d[p]===m?y[p]=(u[p]>e[p]?-1:1)*o:x[p]=(g[p]>n[p]?-1:1)*o}}if(t!==o){let e="x"===p?"y":"x",t=d[p]===c[e],n=u[e]>g[e],o=u[e]<g[e];(1===d[p]&&(!t&&n||t&&o)||1!==d[p]&&(!t&&o||t&&n))&&(f="x"===p?r:s)}let h={x:u.x+y.x,y:u.y+y.y},S={x:g.x+x.x,y:g.y+x.y};Math.max(Math.abs(h.x-f[0].x),Math.abs(S.x-f[0].x))>=Math.max(Math.abs(h.y-f[0].y),Math.abs(S.y-f[0].y))?(l=(h.x+S.x)/2,i=f[0].y):(l=f[0].x,i=(h.y+S.y)/2)}return[[e,{x:u.x+y.x,y:u.y+y.y},...f,{x:g.x+x.x,y:g.y+x.y},n],l,i,E,v]}({source:{x:e,y:t},sourcePosition:n,target:{x:o,y:r},targetPosition:a,center:{x:i,y:d},offset:c});return[u.reduce((e,t,n)=>e+(n>0&&n<u.length-1?function(e,t,n,o){let r=Math.min(et(e,t)/2,et(t,n)/2,o),{x:a,y:l}=t;if(e.x===a&&a===n.x||e.y===l&&l===n.y)return`L${a} ${l}`;if(e.y===l){let t=e.x<n.x?-1:1,o=e.y<n.y?1:-1;return`L ${a+r*t},${l}Q ${a},${l} ${a},${l+r*o}`}let i=e.x<n.x?1:-1,s=e.y<n.y?-1:1;return`L ${a},${l+r*s}Q ${a},${l} ${a+r*i},${l}`}(u[n-1],t,u[n+1],l):`${0===n?"M":"L"}${t.x} ${t.y}`),""),g,h,p,m]}let eo=(0,d.memo)(({sourceX:e,sourceY:t,targetX:n,targetY:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:c,labelBgBorderRadius:u,style:g,sourcePosition:h=s.Bottom,targetPosition:p=s.Top,markerEnd:m,markerStart:f,pathOptions:y,interactionWidth:x})=>{let[S,b,E]=en({sourceX:e,sourceY:t,sourcePosition:h,targetX:n,targetY:o,targetPosition:p,borderRadius:y?.borderRadius,offset:y?.offset});return d.createElement(Y,{path:S,labelX:b,labelY:E,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:c,labelBgBorderRadius:u,style:g,markerEnd:m,markerStart:f,interactionWidth:x})});eo.displayName="SmoothStepEdge";let er=(0,d.memo)(e=>d.createElement(eo,{...e,pathOptions:(0,d.useMemo)(()=>({borderRadius:0,offset:e.pathOptions?.offset}),[e.pathOptions?.offset])}));er.displayName="StepEdge";let ea=(0,d.memo)(({sourceX:e,sourceY:t,targetX:n,targetY:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:s,labelBgBorderRadius:c,style:u,markerEnd:g,markerStart:h,interactionWidth:p})=>{let[m,f,y]=function({sourceX:e,sourceY:t,targetX:n,targetY:o}){let[r,a,l,i]=j({sourceX:e,sourceY:t,targetX:n,targetY:o});return[`M ${e},${t}L ${n},${o}`,r,a,l,i]}({sourceX:e,sourceY:t,targetX:n,targetY:o});return d.createElement(Y,{path:m,labelX:f,labelY:y,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:i,labelBgPadding:s,labelBgBorderRadius:c,style:u,markerEnd:g,markerStart:h,interactionWidth:p})});function el(e,t){return e>=0?.5*e:25*t*Math.sqrt(-e)}function ei({pos:e,x1:t,y1:n,x2:o,y2:r,c:a}){switch(e){case s.Left:return[t-el(t-o,a),n];case s.Right:return[t+el(o-t,a),n];case s.Top:return[t,n-el(n-r,a)];case s.Bottom:return[t,n+el(r-n,a)]}}function es({sourceX:e,sourceY:t,sourcePosition:n=s.Bottom,targetX:o,targetY:r,targetPosition:a=s.Top,curvature:l=.25}){let[i,d]=ei({pos:n,x1:e,y1:t,x2:o,y2:r,c:l}),[c,u]=ei({pos:a,x1:o,y1:r,x2:e,y2:t,c:l}),[g,h,p,m]=U({sourceX:e,sourceY:t,targetX:o,targetY:r,sourceControlX:i,sourceControlY:d,targetControlX:c,targetControlY:u});return[`M${e},${t} C${i},${d} ${c},${u} ${o},${r}`,g,h,p,m]}ea.displayName="StraightEdge";let ed=(0,d.memo)(({sourceX:e,sourceY:t,targetX:n,targetY:o,sourcePosition:r=s.Bottom,targetPosition:a=s.Top,label:l,labelStyle:i,labelShowBg:c,labelBgStyle:u,labelBgPadding:g,labelBgBorderRadius:h,style:p,markerEnd:m,markerStart:f,pathOptions:y,interactionWidth:x})=>{let[S,b,E]=es({sourceX:e,sourceY:t,sourcePosition:r,targetX:n,targetY:o,targetPosition:a,curvature:y?.curvature});return d.createElement(Y,{path:S,labelX:b,labelY:E,label:l,labelStyle:i,labelShowBg:c,labelBgStyle:u,labelBgPadding:g,labelBgBorderRadius:h,style:p,markerEnd:m,markerStart:f,interactionWidth:x})});ed.displayName="BezierEdge";let ec=(0,d.createContext)(null),eu=ec.Provider;ec.Consumer;let eg=(e,t)=>{if(void 0===e)return"";if("string"==typeof e)return e;let n=t?`${t}__`:"";return`${n}${Object.keys(e).sort().map(t=>`${t}=${e[t]}`).join("&")}`},eh=({x:e,y:t},[n,o,r],a,[l,i])=>{let s={x:(e-n)/r,y:(t-o)/r};return a?{x:l*Math.round(s.x/l),y:i*Math.round(s.y/i)}:s},ep=({x:e,y:t},[n,o,r])=>({x:e*r+n,y:t*r+o}),em=(e,t=[0,0])=>{if(!e)return{x:0,y:0,positionAbsolute:{x:0,y:0}};let n=(e.width??0)*t[0],o=(e.height??0)*t[1],r={x:e.position.x-n,y:e.position.y-o};return{...r,positionAbsolute:e.positionAbsolute?{x:e.positionAbsolute.x-n,y:e.positionAbsolute.y-o}:r}},ef=(e,t=[0,0])=>0===e.length?{x:0,y:0,width:0,height:0}:B(e.reduce((e,n)=>{let{x:o,y:r}=em(n,t).positionAbsolute;return _(e,O({x:o,y:r,width:n.width||0,height:n.height||0}))},{x:1/0,y:1/0,x2:-1/0,y2:-1/0})),ey=(e,t,[n,o,r]=[0,0,1],a=!1,l=!1,i=[0,0])=>{let s={x:(t.x-n)/r,y:(t.y-o)/r,width:t.width/r,height:t.height/r},d=[];return e.forEach(e=>{let{width:t,height:n,selectable:o=!0,hidden:r=!1}=e;if(l&&!o||r)return!1;let{positionAbsolute:c}=em(e,i),u=L(s,{x:c.x,y:c.y,width:t||0,height:n||0}),g=void 0===t||void 0===n||null===t||null===n,h=(t||0)*(n||0);(g||a&&u>0||u>=h||e.dragging)&&d.push(e)}),d},ex=(e,t)=>{let n=e.map(e=>e.id);return t.filter(e=>n.includes(e.source)||n.includes(e.target))},eS=(e,t,n,o,r,a=.1)=>{let l=A(Math.min(t/(e.width*(1+a)),n/(e.height*(1+a))),o,r),i=e.x+e.width/2;return{x:t/2-i*l,y:n/2-(e.y+e.height/2)*l,zoom:l}},eb=(e,t=0)=>e.transition().duration(t);function eE(e,t,n,o){return(t[n]||[]).reduce((t,r)=>(`${e.id}-${r.id}-${n}`!==o&&t.push({id:r.id||null,type:n,nodeId:e.id,x:(e.positionAbsolute?.x??0)+r.x+r.width/2,y:(e.positionAbsolute?.y??0)+r.y+r.height/2}),t),[])}let ev={source:null,target:null,sourceHandle:null,targetHandle:null},ew=()=>({handleDomNode:null,isValid:!1,connection:ev,endHandle:null});function eM(e,t,n,r,a,l,i){let s="target"===a,d=i.querySelector(`.react-flow__handle[data-id="${e?.nodeId}-${e?.id}-${e?.type}"]`),c={...ew(),handleDomNode:d};if(d){let e=eC(void 0,d),a=d.getAttribute("data-nodeid"),i=d.getAttribute("data-handleid"),u=d.classList.contains("connectable"),g=d.classList.contains("connectableend"),h={source:s?a:n,sourceHandle:s?i:r,target:s?n:a,targetHandle:s?r:i};c.connection=h,u&&g&&(t===o.Strict?s&&"source"===e||!s&&"target"===e:a!==n||i!==r)&&(c.endHandle={nodeId:a,handleId:i,type:e},c.isValid=l(h))}return c}function eC(e,t){return e?e:t?.classList.contains("target")?"target":t?.classList.contains("source")?"source":null}function eN(e){e?.classList.remove("valid","connecting","react-flow__handle-valid","react-flow__handle-connecting")}function ek({event:e,handleId:t,nodeId:n,onConnect:o,isTarget:r,getState:a,setState:l,isValidConnection:i,edgeUpdaterType:s,onReconnectEnd:d}){let c,u,g=$(e.target),{connectionMode:h,domNode:p,autoPanOnConnect:m,connectionRadius:f,onConnectStart:y,panBy:x,getNodes:S,cancelConnection:b}=a(),E=0,{x:v,y:w}=Z(e),M=eC(s,g?.elementFromPoint(v,w)),C=p?.getBoundingClientRect();if(!C||!M)return;let N=Z(e,C),k=!1,A=null,P=!1,R=null,_=function({nodes:e,nodeId:t,handleId:n,handleType:o}){return e.reduce((e,r)=>{if(r[T]){let{handleBounds:a}=r[T],l=[],i=[];a&&(l=eE(r,a,"source",`${t}-${n}-${o}`),i=eE(r,a,"target",`${t}-${n}-${o}`)),e.push(...l,...i)}return e},[])}({nodes:S(),nodeId:n,handleId:t,handleType:M}),O=()=>{if(!m)return;let[e,t]=I(N,C);x({x:e,y:t}),E=requestAnimationFrame(O)};function B(e){var o,s;let d,{transform:p}=a();N=Z(e,C);let{handle:m,validHandleResult:y}=function(e,t,n,o,r,a){let{x:l,y:i}=Z(e),s=t.elementsFromPoint(l,i).find(e=>e.classList.contains("react-flow__handle"));if(s){let e=s.getAttribute("data-nodeid");if(e){let t=eC(void 0,s),o=s.getAttribute("data-handleid"),l=a({nodeId:e,id:o,type:t});if(l){let a=r.find(n=>n.nodeId===e&&n.type===t&&n.id===o);return{handle:{id:o,type:t,nodeId:e,x:a?.x||n.x,y:a?.y||n.y},validHandleResult:l}}}}let d=[],c=1/0;if(r.forEach(e=>{let t=Math.sqrt((e.x-n.x)**2+(e.y-n.y)**2);if(t<=o){let n=a(e);t<=c&&(t<c?d=[{handle:e,validHandleResult:n}]:t===c&&d.push({handle:e,validHandleResult:n}),c=t)}}),!d.length)return{handle:null,validHandleResult:ew()};if(1===d.length)return d[0];let u=d.some(({validHandleResult:e})=>e.isValid),g=d.some(({handle:e})=>"target"===e.type);return d.find(({handle:e,validHandleResult:t})=>g?"target"===e.type:!u||t.isValid)||d[0]}(e,g,eh(N,p,!1,[1,1]),f,_,e=>eM(e,h,n,t,r?"target":"source",i,g));if(c=m,k||(O(),k=!0),R=y.handleDomNode,A=y.connection,P=y.isValid,l({connectionPosition:c&&P?ep({x:c.x,y:c.y},p):N,connectionStatus:(o=!!c,d=null,(s=P)?d="valid":o&&!s&&(d="invalid"),d),connectionEndHandle:y.endHandle}),!c&&!P&&!R)return eN(u);A.source!==A.target&&R&&(eN(u),u=R,R.classList.add("connecting","react-flow__handle-connecting"),R.classList.toggle("valid",P),R.classList.toggle("react-flow__handle-valid",P))}function D(e){(c||R)&&A&&P&&o?.(A),a().onConnectEnd?.(e),s&&d?.(e),eN(u),b(),cancelAnimationFrame(E),k=!1,P=!1,A=null,R=null,g.removeEventListener("mousemove",B),g.removeEventListener("mouseup",D),g.removeEventListener("touchmove",B),g.removeEventListener("touchend",D)}l({connectionPosition:N,connectionStatus:null,connectionNodeId:n,connectionHandleId:t,connectionHandleType:M,connectionStartHandle:{nodeId:n,handleId:t,type:M},connectionEndHandle:null}),y?.(e,{nodeId:n,handleId:t,handleType:M}),g.addEventListener("mousemove",B),g.addEventListener("mouseup",D),g.addEventListener("touchmove",B),g.addEventListener("touchend",D)}let eA=()=>!0,eP=e=>({connectionStartHandle:e.connectionStartHandle,connectOnClick:e.connectOnClick,noPanClassName:e.noPanClassName}),eR=(0,d.forwardRef)(({type:e="source",position:t=s.Top,isValidConnection:n,isConnectable:o=!0,isConnectableStart:r=!0,isConnectableEnd:a=!0,id:l,onConnect:i,children:u,className:h,onMouseDown:p,onTouchStart:m,...f},y)=>{let x=l||null,b="target"===e,w=v(),M=(0,d.useContext)(ec),{connectOnClick:C,noPanClassName:N}=E(eP,g.x),{connecting:k,clickConnecting:A}=E(((e,t,n)=>o=>{let{connectionStartHandle:r,connectionEndHandle:a,connectionClickStartHandle:l}=o;return{connecting:r?.nodeId===e&&r?.handleId===t&&r?.type===n||a?.nodeId===e&&a?.handleId===t&&a?.type===n,clickConnecting:l?.nodeId===e&&l?.handleId===t&&l?.type===n}})(M,x,e),g.x);M||w.getState().onError?.("010",S.error010());let P=e=>{let{defaultEdgeOptions:t,onConnect:n,hasDefaultEdges:o}=w.getState(),r={...t,...e};if(o){let{edges:e,setEdges:t}=w.getState();t(((e,t)=>{let n;return e.source&&e.target?((e,t)=>t.some(t=>t.source===e.source&&t.target===e.target&&(t.sourceHandle===e.sourceHandle||!t.sourceHandle&&!e.sourceHandle)&&(t.targetHandle===e.targetHandle||!t.targetHandle&&!e.targetHandle)))(n=(e=>"id"in e&&"source"in e&&"target"in e)(e)?{...e}:{...e,id:(({source:e,sourceHandle:t,target:n,targetHandle:o})=>`reactflow__edge-${e}${t||""}-${n}${o||""}`)(e)},t)?t:t.concat(n):(V("006",S.error006()),t)})(r,e))}n?.(r),i?.(r)},R=e=>{if(!M)return;let t="clientX"in e;r&&(t&&0===e.button||!t)&&ek({event:e,handleId:x,nodeId:M,onConnect:P,isTarget:b,getState:w.getState,setState:w.setState,isValidConnection:n||w.getState().isValidConnection||eA}),t?p?.(e):m?.(e)};return d.createElement("div",{"data-handleid":x,"data-nodeid":M,"data-handlepos":t,"data-id":`${M}-${x}-${e}`,className:(0,c.A)(["react-flow__handle",`react-flow__handle-${t}`,"nodrag",N,h,{source:!b,target:b,connectable:o,connectablestart:r,connectableend:a,connecting:A,connectionindicator:o&&(r&&!k||a&&k)}]),onMouseDown:R,onTouchStart:R,onClick:C?t=>{let{onClickConnectStart:o,onClickConnectEnd:a,connectionClickStartHandle:l,connectionMode:i,isValidConnection:s}=w.getState();if(!M||!l&&!r)return;if(!l){o?.(t,{nodeId:M,handleId:x,handleType:e}),w.setState({connectionClickStartHandle:{nodeId:M,type:e,handleId:x}});return}let d=$(t.target),c=n||s||eA,{connection:u,isValid:g}=eM({nodeId:M,id:x,type:e},i,l.nodeId,l.handleId||null,l.type,c,d);g&&P(u),a?.(t),w.setState({connectionClickStartHandle:null})}:void 0,ref:y,...f},u)});eR.displayName="Handle";var eI=(0,d.memo)(eR);let e$=({data:e,isConnectable:t,targetPosition:n=s.Top,sourcePosition:o=s.Bottom})=>d.createElement(d.Fragment,null,d.createElement(eI,{type:"target",position:n,isConnectable:t}),e?.label,d.createElement(eI,{type:"source",position:o,isConnectable:t}));e$.displayName="DefaultNode";var e_=(0,d.memo)(e$);let eO=({data:e,isConnectable:t,sourcePosition:n=s.Bottom})=>d.createElement(d.Fragment,null,e?.label,d.createElement(eI,{type:"source",position:n,isConnectable:t}));eO.displayName="InputNode";var eB=(0,d.memo)(eO);let eD=({data:e,isConnectable:t,targetPosition:n=s.Top})=>d.createElement(d.Fragment,null,d.createElement(eI,{type:"target",position:n,isConnectable:t}),e?.label);eD.displayName="OutputNode";var ez=(0,d.memo)(eD);let eL=()=>null;eL.displayName="GroupNode";let eH=e=>({selectedNodes:e.getNodes().filter(e=>e.selected),selectedEdges:e.edges.filter(e=>e.selected).map(e=>({...e}))}),eT=e=>e.id;function eF(e,t){return(0,g.x)(e.selectedNodes.map(eT),t.selectedNodes.map(eT))&&(0,g.x)(e.selectedEdges.map(eT),t.selectedEdges.map(eT))}let eV=(0,d.memo)(({onSelectionChange:e})=>{let t=v(),{selectedNodes:n,selectedEdges:o}=E(eH,eF);return(0,d.useEffect)(()=>{let r={nodes:n,edges:o};e?.(r),t.getState().onSelectionChange.forEach(e=>e(r))},[n,o,e]),null});eV.displayName="SelectionListener";let eK=e=>!!e.onSelectionChange;function eZ({onSelectionChange:e}){let t=E(eK);return e||t?d.createElement(eV,{onSelectionChange:e}):null}let eX=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset});function eY(e,t){(0,d.useEffect)(()=>{void 0!==e&&t(e)},[e])}function eW(e,t,n){(0,d.useEffect)(()=>{void 0!==t&&n({[e]:t})},[t])}let ej=({nodes:e,edges:t,defaultNodes:n,defaultEdges:o,onConnect:r,onConnectStart:a,onConnectEnd:l,onClickConnectStart:i,onClickConnectEnd:s,nodesDraggable:c,nodesConnectable:u,nodesFocusable:h,edgesFocusable:p,edgesUpdatable:m,elevateNodesOnSelect:f,minZoom:y,maxZoom:x,nodeExtent:S,onNodesChange:b,onEdgesChange:w,elementsSelectable:M,connectionMode:C,snapGrid:N,snapToGrid:k,translateExtent:A,connectOnClick:P,defaultEdgeOptions:R,fitView:I,fitViewOptions:$,onNodesDelete:_,onEdgesDelete:O,onNodeDrag:B,onNodeDragStart:D,onNodeDragStop:z,onSelectionDrag:L,onSelectionDragStart:H,onSelectionDragStop:T,noPanClassName:F,nodeOrigin:V,rfId:K,autoPanOnConnect:Z,autoPanOnNodeDrag:X,onError:Y,connectionRadius:W,isValidConnection:j,nodeDragThreshold:U})=>{let{setNodes:G,setEdges:q,setDefaultNodesAndEdges:Q,setMinZoom:J,setMaxZoom:ee,setTranslateExtent:et,setNodeExtent:en,reset:eo}=E(eX,g.x),er=v();return(0,d.useEffect)(()=>(Q(n,o?.map(e=>({...e,...R}))),()=>{eo()}),[]),eW("defaultEdgeOptions",R,er.setState),eW("connectionMode",C,er.setState),eW("onConnect",r,er.setState),eW("onConnectStart",a,er.setState),eW("onConnectEnd",l,er.setState),eW("onClickConnectStart",i,er.setState),eW("onClickConnectEnd",s,er.setState),eW("nodesDraggable",c,er.setState),eW("nodesConnectable",u,er.setState),eW("nodesFocusable",h,er.setState),eW("edgesFocusable",p,er.setState),eW("edgesUpdatable",m,er.setState),eW("elementsSelectable",M,er.setState),eW("elevateNodesOnSelect",f,er.setState),eW("snapToGrid",k,er.setState),eW("snapGrid",N,er.setState),eW("onNodesChange",b,er.setState),eW("onEdgesChange",w,er.setState),eW("connectOnClick",P,er.setState),eW("fitViewOnInit",I,er.setState),eW("fitViewOnInitOptions",$,er.setState),eW("onNodesDelete",_,er.setState),eW("onEdgesDelete",O,er.setState),eW("onNodeDrag",B,er.setState),eW("onNodeDragStart",D,er.setState),eW("onNodeDragStop",z,er.setState),eW("onSelectionDrag",L,er.setState),eW("onSelectionDragStart",H,er.setState),eW("onSelectionDragStop",T,er.setState),eW("noPanClassName",F,er.setState),eW("nodeOrigin",V,er.setState),eW("rfId",K,er.setState),eW("autoPanOnConnect",Z,er.setState),eW("autoPanOnNodeDrag",X,er.setState),eW("onError",Y,er.setState),eW("connectionRadius",W,er.setState),eW("isValidConnection",j,er.setState),eW("nodeDragThreshold",U,er.setState),eY(e,G),eY(t,q),eY(y,J),eY(x,ee),eY(A,et),eY(S,en),null},eU={display:"none"},eG={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},eq="react-flow__node-desc",eQ="react-flow__edge-desc",eJ=e=>e.ariaLiveMessage;function e0({rfId:e}){let t=E(eJ);return d.createElement("div",{id:`react-flow__aria-live-${e}`,"aria-live":"assertive","aria-atomic":"true",style:eG},t)}function e1({rfId:e,disableKeyboardA11y:t}){return d.createElement(d.Fragment,null,d.createElement("div",{id:`${eq}-${e}`,style:eU},"Press enter or space to select a node.",!t&&"You can then use the arrow keys to move the node around."," Press delete to remove it and escape to cancel."," "),d.createElement("div",{id:`${eQ}-${e}`,style:eU},"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel."),!t&&d.createElement(e0,{rfId:e}))}var e2=(e=null,t={actInsideInputWithModifier:!0})=>{let[n,o]=(0,d.useState)(!1),r=(0,d.useRef)(!1),a=(0,d.useRef)(new Set([])),[l,i]=(0,d.useMemo)(()=>{if(null!==e){let t=(Array.isArray(e)?e:[e]).filter(e=>"string"==typeof e).map(e=>e.split("+")),n=t.reduce((e,t)=>e.concat(...t),[]);return[t,n]}return[[],[]]},[e]);return(0,d.useEffect)(()=>{let n=t?.target||("undefined"!=typeof document?document:null);if(null!==e){let e=e=>{if(r.current=e.ctrlKey||e.metaKey||e.shiftKey,(!r.current||r.current&&!t.actInsideInputWithModifier)&&K(e))return!1;let n=e3(e.code,i);a.current.add(e[n]),e5(l,a.current,!1)&&(e.preventDefault(),o(!0))},s=e=>{if((!r.current||r.current&&!t.actInsideInputWithModifier)&&K(e))return!1;let n=e3(e.code,i);e5(l,a.current,!0)?(o(!1),a.current.clear()):a.current.delete(e[n]),"Meta"===e.key&&a.current.clear(),r.current=!1},d=()=>{a.current.clear(),o(!1)};return n?.addEventListener("keydown",e),n?.addEventListener("keyup",s),window.addEventListener("blur",d),()=>{n?.removeEventListener("keydown",e),n?.removeEventListener("keyup",s),window.removeEventListener("blur",d)}}},[e,o]),n};function e5(e,t,n){return e.filter(e=>n||e.length===t.size).some(e=>e.every(e=>t.has(e)))}function e3(e,t){return t.includes(e)?"code":"key"}function e4(e,t,n){e.forEach(o=>{let r=o.parentNode||o.parentId;if(r&&!e.has(r))throw Error(`Parent node ${r} not found`);if(r||n?.[o.id]){let{x:r,y:a,z:l}=function e(t,n,o,r){let a=t.parentNode||t.parentId;if(!a)return o;let l=n.get(a),i=em(l,r);return e(l,n,{x:(o.x??0)+i.x,y:(o.y??0)+i.y,z:(l[T]?.z??0)>(o.z??0)?l[T]?.z??0:o.z??0},r)}(o,e,{...o.position,z:o[T]?.z??0},t);o.positionAbsolute={x:r,y:a},o[T].z=l,n?.[o.id]&&(o[T].isParent=!0)}})}function e7(e,t,n,o){let r=new Map,a={},l=1e3*!!o;return e.forEach(e=>{let n=(H(e.zIndex)?e.zIndex:0)+(e.selected?l:0),o=t.get(e.id),i={...e,positionAbsolute:{x:e.position.x,y:e.position.y}},s=e.parentNode||e.parentId;s&&(a[s]=!0),Object.defineProperty(i,T,{enumerable:!1,value:{handleBounds:o?.type&&o?.type!==e.type?void 0:o?.[T]?.handleBounds,z:n}}),r.set(e.id,i)}),e4(r,n,a),r}function e8(e,t={}){let{getNodes:n,width:o,height:r,minZoom:a,maxZoom:l,d3Zoom:i,d3Selection:s,fitViewOnInitDone:d,fitViewOnInit:c,nodeOrigin:u}=e(),g=t.initial&&!d&&c;if(i&&s&&(g||!t.initial)){let e=n().filter(e=>{let n=t.includeHiddenNodes?e.width&&e.height:!e.hidden;return t.nodes?.length?n&&t.nodes.some(t=>t.id===e.id):n}),d=e.every(e=>e.width&&e.height);if(e.length>0&&d){let{x:n,y:d,zoom:c}=eS(ef(e,u),o,r,t.minZoom??a,t.maxZoom??l,t.padding??.1),g=h.GS.translate(n,d).scale(c);return"number"==typeof t.duration&&t.duration>0?i.transform(eb(s,t.duration),g):i.transform(s,g),!0}}return!1}function e6({changedNodes:e,changedEdges:t,get:n,set:o}){let{nodeInternals:r,edges:a,onNodesChange:l,onEdgesChange:i,hasDefaultNodes:s,hasDefaultEdges:d}=n();e?.length&&(s&&o({nodeInternals:(e.forEach(e=>{let t=r.get(e.id);t&&r.set(t.id,{...t,[T]:t[T],selected:e.selected})}),new Map(r))}),l?.(e)),t?.length&&(d&&o({edges:a.map(e=>{let n=t.find(t=>t.id===e.id);return n&&(e.selected=n.selected),e})}),i?.(t))}let e9=()=>{},te={zoomIn:e9,zoomOut:e9,zoomTo:e9,getZoom:()=>1,setViewport:e9,getViewport:()=>({x:0,y:0,zoom:1}),fitView:()=>!1,setCenter:e9,fitBounds:e9,project:e=>e,screenToFlowPosition:e=>e,flowToScreenPosition:e=>e,viewportInitialized:!1},tt=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection});function tn(){let e=(()=>{let e=v(),{d3Zoom:t,d3Selection:n}=E(tt,g.x);return(0,d.useMemo)(()=>n&&t?{zoomIn:e=>t.scaleBy(eb(n,e?.duration),1.2),zoomOut:e=>t.scaleBy(eb(n,e?.duration),1/1.2),zoomTo:(e,o)=>t.scaleTo(eb(n,o?.duration),e),getZoom:()=>e.getState().transform[2],setViewport:(o,r)=>{let[a,l,i]=e.getState().transform,s=h.GS.translate(o.x??a,o.y??l).scale(o.zoom??i);t.transform(eb(n,r?.duration),s)},getViewport:()=>{let[t,n,o]=e.getState().transform;return{x:t,y:n,zoom:o}},fitView:t=>e8(e.getState,t),setCenter:(o,r,a)=>{let{width:l,height:i,maxZoom:s}=e.getState(),d=void 0!==a?.zoom?a.zoom:s,c=l/2-o*d,u=i/2-r*d,g=h.GS.translate(c,u).scale(d);t.transform(eb(n,a?.duration),g)},fitBounds:(o,r)=>{let{width:a,height:l,minZoom:i,maxZoom:s}=e.getState(),{x:d,y:c,zoom:u}=eS(o,a,l,i,s,r?.padding??.1),g=h.GS.translate(d,c).scale(u);t.transform(eb(n,r?.duration),g)},project:t=>{let{transform:n,snapToGrid:o,snapGrid:r}=e.getState();return console.warn("[DEPRECATED] `project` is deprecated. Instead use `screenToFlowPosition`. There is no need to subtract the react flow bounds anymore! https://reactflow.dev/api-reference/types/react-flow-instance#screen-to-flow-position"),eh(t,n,o,r)},screenToFlowPosition:t=>{let{transform:n,snapToGrid:o,snapGrid:r,domNode:a}=e.getState();if(!a)return t;let{x:l,y:i}=a.getBoundingClientRect();return eh({x:t.x-l,y:t.y-i},n,o,r)},flowToScreenPosition:t=>{let{transform:n,domNode:o}=e.getState();if(!o)return t;let{x:r,y:a}=o.getBoundingClientRect(),l=ep(t,n);return{x:l.x+r,y:l.y+a}},viewportInitialized:!0}:te,[t,n])})(),t=v(),n=(0,d.useCallback)(()=>t.getState().getNodes().map(e=>({...e})),[]),o=(0,d.useCallback)(e=>t.getState().nodeInternals.get(e),[]),r=(0,d.useCallback)(()=>{let{edges:e=[]}=t.getState();return e.map(e=>({...e}))},[]),a=(0,d.useCallback)(e=>{let{edges:n=[]}=t.getState();return n.find(t=>t.id===e)},[]),l=(0,d.useCallback)(e=>{let{getNodes:n,setNodes:o,hasDefaultNodes:r,onNodesChange:a}=t.getState(),l=n(),i="function"==typeof e?e(l):e;r?o(i):a&&a(0===i.length?l.map(e=>({type:"remove",id:e.id})):i.map(e=>({item:e,type:"reset"})))},[]),i=(0,d.useCallback)(e=>{let{edges:n=[],setEdges:o,hasDefaultEdges:r,onEdgesChange:a}=t.getState(),l="function"==typeof e?e(n):e;r?o(l):a&&a(0===l.length?n.map(e=>({type:"remove",id:e.id})):l.map(e=>({item:e,type:"reset"})))},[]),s=(0,d.useCallback)(e=>{let n=Array.isArray(e)?e:[e],{getNodes:o,setNodes:r,hasDefaultNodes:a,onNodesChange:l}=t.getState();a?r([...o(),...n]):l&&l(n.map(e=>({item:e,type:"add"})))},[]),c=(0,d.useCallback)(e=>{let n=Array.isArray(e)?e:[e],{edges:o=[],setEdges:r,hasDefaultEdges:a,onEdgesChange:l}=t.getState();a?r([...o,...n]):l&&l(n.map(e=>({item:e,type:"add"})))},[]),u=(0,d.useCallback)(()=>{let{getNodes:e,edges:n=[],transform:o}=t.getState(),[r,a,l]=o;return{nodes:e().map(e=>({...e})),edges:n.map(e=>({...e})),viewport:{x:r,y:a,zoom:l}}},[]),p=(0,d.useCallback)(({nodes:e,edges:n})=>{let{nodeInternals:o,getNodes:r,edges:a,hasDefaultNodes:l,hasDefaultEdges:i,onNodesDelete:s,onEdgesDelete:d,onNodesChange:c,onEdgesChange:u}=t.getState(),g=(e||[]).map(e=>e.id),h=(n||[]).map(e=>e.id),p=r().reduce((e,t)=>{let n=t.parentNode||t.parentId,o=!g.includes(t.id)&&n&&e.find(e=>e.id===n);return("boolean"!=typeof t.deletable||t.deletable)&&(g.includes(t.id)||o)&&e.push(t),e},[]),m=a.filter(e=>"boolean"!=typeof e.deletable||e.deletable),f=m.filter(e=>h.includes(e.id));if(p||f){let e=[...f,...ex(p,m)],n=e.reduce((e,t)=>(e.includes(t.id)||e.push(t.id),e),[]);(i||l)&&(i&&t.setState({edges:a.filter(e=>!n.includes(e.id))}),l&&(p.forEach(e=>{o.delete(e.id)}),t.setState({nodeInternals:new Map(o)}))),n.length>0&&(d?.(e),u&&u(n.map(e=>({id:e,type:"remove"})))),p.length>0&&(s?.(p),c&&c(p.map(e=>({id:e.id,type:"remove"}))))}},[]),m=(0,d.useCallback)(e=>{let n=H(e.width)&&H(e.height)&&H(e.x)&&H(e.y),o=n?null:t.getState().nodeInternals.get(e.id);return n||o?[n?e:D(o),o,n]:[null,null,n]},[]),f=(0,d.useCallback)((e,n=!0,o)=>{let[r,a,l]=m(e);return r?(o||t.getState().getNodes()).filter(e=>{if(!l&&(e.id===a.id||!e.positionAbsolute))return!1;let t=L(D(e),r);return n&&t>0||t>=r.width*r.height}):[]},[]),y=(0,d.useCallback)((e,t,n=!0)=>{let[o]=m(e);if(!o)return!1;let r=L(o,t);return n&&r>0||r>=o.width*o.height},[]);return(0,d.useMemo)(()=>({...e,getNodes:n,getNode:o,getEdges:r,getEdge:a,setNodes:l,setEdges:i,addNodes:s,addEdges:c,toObject:u,deleteElements:p,getIntersectingNodes:f,isNodeIntersecting:y}),[e,n,o,r,a,l,i,s,c,u,p,f,y])}let to={actInsideInputWithModifier:!1},tr={position:"absolute",width:"100%",height:"100%",top:0,left:0},ta=e=>({x:e.x,y:e.y,zoom:e.k}),tl=(e,t)=>e.target.closest(`.${t}`),ti=(e,t)=>2===t&&Array.isArray(e)&&e.includes(2),ts=e=>{let t=e.ctrlKey&&X()?10:1;return-e.deltaY*(1===e.deltaMode?.05:e.deltaMode?1:.002)*t},td=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection,d3ZoomHandler:e.d3ZoomHandler,userSelectionActive:e.userSelectionActive}),tc=({onMove:e,onMoveStart:t,onMoveEnd:n,onPaneContextMenu:o,zoomOnScroll:a=!0,zoomOnPinch:l=!0,panOnScroll:i=!1,panOnScrollSpeed:s=.5,panOnScrollMode:c=r.Free,zoomOnDoubleClick:u=!0,elementsSelectable:f,panOnDrag:y=!0,defaultViewport:x,translateExtent:b,minZoom:w,maxZoom:M,zoomActivationKeyCode:C,preventScrolling:N=!0,children:P,noWheelClassName:R,noPanClassName:I})=>{let $=(0,d.useRef)(),_=v(),O=(0,d.useRef)(!1),B=(0,d.useRef)(!1),D=(0,d.useRef)(null),z=(0,d.useRef)({x:0,y:0,zoom:0}),{d3Zoom:L,d3Selection:H,d3ZoomHandler:T,userSelectionActive:F}=E(td,g.x),V=e2(C),K=(0,d.useRef)(0),Z=(0,d.useRef)(!1),Y=(0,d.useRef)();return!function(e){let t=v();(0,d.useEffect)(()=>{let n,o=()=>{if(!e.current)return;let n=k(e.current);(0===n.height||0===n.width)&&t.getState().onError?.("004",S.error004()),t.setState({width:n.width||500,height:n.height||500})};return o(),window.addEventListener("resize",o),e.current&&(n=new ResizeObserver(()=>o())).observe(e.current),()=>{window.removeEventListener("resize",o),n&&e.current&&n.unobserve(e.current)}},[])}(D),(0,d.useEffect)(()=>{if(D.current){let e=D.current.getBoundingClientRect(),t=(0,h.s_)().scaleExtent([w,M]).translateExtent(b),n=(0,p.A)(D.current).call(t),o=h.GS.translate(x.x,x.y).scale(A(x.zoom,w,M)),r=[[0,0],[e.width,e.height]],a=t.constrain()(o,r,b);t.transform(n,a),t.wheelDelta(ts),_.setState({d3Zoom:t,d3Selection:n,d3ZoomHandler:n.on("wheel.zoom"),transform:[a.x,a.y,a.k],domNode:D.current.closest(".react-flow")})}},[]),(0,d.useEffect)(()=>{H&&L&&(!i||V||F?void 0!==T&&H.on("wheel.zoom",function(e,t){if(!N&&"wheel"===e.type&&!e.ctrlKey||tl(e,R))return null;e.preventDefault(),T.call(this,e,t)},{passive:!1}):H.on("wheel.zoom",o=>{if(tl(o,R))return!1;o.preventDefault(),o.stopImmediatePropagation();let a=H.property("__zoom").k||1;if(o.ctrlKey&&l){let e=(0,m.A)(o),t=a*Math.pow(2,ts(o));L.scaleTo(H,t,e,o);return}let i=1===o.deltaMode?20:1,d=c===r.Vertical?0:o.deltaX*i,u=c===r.Horizontal?0:o.deltaY*i;!X()&&o.shiftKey&&c!==r.Vertical&&(d=o.deltaY*i,u=0),L.translateBy(H,-(d/a)*s,-(u/a)*s,{internal:!0});let g=ta(H.property("__zoom")),{onViewportChangeStart:h,onViewportChange:p,onViewportChangeEnd:f}=_.getState();clearTimeout(Y.current),Z.current||(Z.current=!0,t?.(o,g),h?.(g)),Z.current&&(e?.(o,g),p?.(g),Y.current=setTimeout(()=>{n?.(o,g),f?.(g),Z.current=!1},150))},{passive:!1}))},[F,i,c,H,L,T,V,l,N,R,t,e,n]),(0,d.useEffect)(()=>{L&&L.on("start",e=>{if(!e.sourceEvent||e.sourceEvent.internal)return null;K.current=e.sourceEvent?.button;let{onViewportChangeStart:n}=_.getState(),o=ta(e.transform);O.current=!0,z.current=o,e.sourceEvent?.type==="mousedown"&&_.setState({paneDragging:!0}),n?.(o),t?.(e.sourceEvent,o)})},[L,t]),(0,d.useEffect)(()=>{L&&(F&&!O.current?L.on("zoom",null):F||L.on("zoom",t=>{let{onViewportChange:n}=_.getState();if(_.setState({transform:[t.transform.x,t.transform.y,t.transform.k]}),B.current=!!(o&&ti(y,K.current??0)),(e||n)&&!t.sourceEvent?.internal){let o=ta(t.transform);n?.(o),e?.(t.sourceEvent,o)}}))},[F,L,e,y,o]),(0,d.useEffect)(()=>{L&&L.on("end",e=>{if(!e.sourceEvent||e.sourceEvent.internal)return null;let{onViewportChangeEnd:t}=_.getState();if(O.current=!1,_.setState({paneDragging:!1}),o&&ti(y,K.current??0)&&!B.current&&o(e.sourceEvent),B.current=!1,(n||t)&&((e,t)=>e.x!==t.x||e.y!==t.y||e.zoom!==t.k)(z.current,e.transform)){let o=ta(e.transform);z.current=o,clearTimeout($.current),$.current=setTimeout(()=>{t?.(o),n?.(e.sourceEvent,o)},150*!!i)}})},[L,i,y,n,o]),(0,d.useEffect)(()=>{L&&L.filter(e=>{let t=V||a,n=l&&e.ctrlKey;if((!0===y||Array.isArray(y)&&y.includes(1))&&1===e.button&&"mousedown"===e.type&&(tl(e,"react-flow__node")||tl(e,"react-flow__edge")))return!0;if(!y&&!t&&!i&&!u&&!l||F||!u&&"dblclick"===e.type||tl(e,R)&&"wheel"===e.type||tl(e,I)&&("wheel"!==e.type||i&&"wheel"===e.type&&!V)||!l&&e.ctrlKey&&"wheel"===e.type||!t&&!i&&!n&&"wheel"===e.type||!y&&("mousedown"===e.type||"touchstart"===e.type)||Array.isArray(y)&&!y.includes(e.button)&&"mousedown"===e.type)return!1;let o=Array.isArray(y)&&y.includes(e.button)||!e.button||e.button<=1;return(!e.ctrlKey||"wheel"===e.type)&&o})},[F,L,a,l,i,u,y,f,V]),d.createElement("div",{className:"react-flow__renderer",ref:D,style:tr},P)},tu=e=>({userSelectionActive:e.userSelectionActive,userSelectionRect:e.userSelectionRect});function tg(){let{userSelectionActive:e,userSelectionRect:t}=E(tu,g.x);return e&&t?d.createElement("div",{className:"react-flow__selection react-flow__container",style:{width:t.width,height:t.height,transform:`translate(${t.x}px, ${t.y}px)`}}):null}function th(e,t){let n=t.parentNode||t.parentId,o=e.find(e=>e.id===n);if(o){let e=t.position.x+t.width-o.width,n=t.position.y+t.height-o.height;if(e>0||n>0||t.position.x<0||t.position.y<0){if(o.style={...o.style},o.style.width=o.style.width??o.width,o.style.height=o.style.height??o.height,e>0&&(o.style.width+=e),n>0&&(o.style.height+=n),t.position.x<0){let e=Math.abs(t.position.x);o.position.x=o.position.x-e,o.style.width+=e,t.position.x=0}if(t.position.y<0){let e=Math.abs(t.position.y);o.position.y=o.position.y-e,o.style.height+=e,t.position.y=0}o.width=o.style.width,o.height=o.style.height}}}function tp(e,t){if(e.some(e=>"reset"===e.type))return e.filter(e=>"reset"===e.type).map(e=>e.item);let n=e.filter(e=>"add"===e.type).map(e=>e.item);return t.reduce((t,n)=>{let o=e.filter(e=>e.id===n.id);if(0===o.length)return t.push(n),t;let r={...n};for(let e of o)if(e)switch(e.type){case"select":r.selected=e.selected;break;case"position":void 0!==e.position&&(r.position=e.position),void 0!==e.positionAbsolute&&(r.positionAbsolute=e.positionAbsolute),void 0!==e.dragging&&(r.dragging=e.dragging),r.expandParent&&th(t,r);break;case"dimensions":void 0!==e.dimensions&&(r.width=e.dimensions.width,r.height=e.dimensions.height),void 0!==e.updateStyle&&(r.style={...r.style||{},...e.dimensions}),"boolean"==typeof e.resizing&&(r.resizing=e.resizing),r.expandParent&&th(t,r);break;case"remove":return t}return t.push(r),t},n)}function tm(e,t){return tp(e,t)}let tf=(e,t)=>({id:e,type:"select",selected:t});function ty(e,t){return e.reduce((e,n)=>{let o=t.includes(n.id);return!n.selected&&o?(n.selected=!0,e.push(tf(n.id,!0))):n.selected&&!o&&(n.selected=!1,e.push(tf(n.id,!1))),e},[])}let tx=(e,t)=>n=>{n.target===t.current&&e?.(n)},tS=e=>({userSelectionActive:e.userSelectionActive,elementsSelectable:e.elementsSelectable,dragging:e.paneDragging}),tb=(0,d.memo)(({isSelecting:e,selectionMode:t=a.Full,panOnDrag:n,onSelectionStart:o,onSelectionEnd:r,onPaneClick:l,onPaneContextMenu:i,onPaneScroll:s,onPaneMouseEnter:u,onPaneMouseMove:h,onPaneMouseLeave:p,children:m})=>{let f=(0,d.useRef)(null),y=v(),x=(0,d.useRef)(0),S=(0,d.useRef)(0),b=(0,d.useRef)(),{userSelectionActive:w,elementsSelectable:M,dragging:C}=E(tS,g.x),N=()=>{y.setState({userSelectionActive:!1,userSelectionRect:null}),x.current=0,S.current=0},k=e=>{l?.(e),y.getState().resetSelectedElements(),y.setState({nodesSelectionActive:!1})},A=M&&(e||w);return d.createElement("div",{className:(0,c.A)(["react-flow__pane",{dragging:C,selection:e}]),onClick:A?void 0:tx(k,f),onContextMenu:tx(e=>{if(Array.isArray(n)&&n?.includes(2))return void e.preventDefault();i?.(e)},f),onWheel:tx(s?e=>s(e):void 0,f),onMouseEnter:A?void 0:u,onMouseDown:A?t=>{let{resetSelectedElements:n,domNode:r}=y.getState();if(b.current=r?.getBoundingClientRect(),!M||!e||0!==t.button||t.target!==f.current||!b.current)return;let{x:a,y:l}=Z(t,b.current);n(),y.setState({userSelectionRect:{width:0,height:0,startX:a,startY:l,x:a,y:l}}),o?.(t)}:void 0,onMouseMove:A?n=>{let{userSelectionRect:o,nodeInternals:r,edges:l,transform:i,onNodesChange:s,onEdgesChange:d,nodeOrigin:c,getNodes:u}=y.getState();if(!e||!b.current||!o)return;y.setState({userSelectionActive:!0,nodesSelectionActive:!1});let g=Z(n,b.current),h=o.startX??0,p=o.startY??0,m={...o,x:g.x<h?g.x:h,y:g.y<p?g.y:p,width:Math.abs(g.x-h),height:Math.abs(g.y-p)},f=u(),E=ey(r,m,i,t===a.Partial,!0,c),v=ex(E,l).map(e=>e.id),w=E.map(e=>e.id);if(x.current!==w.length){x.current=w.length;let e=ty(f,w);e.length&&s?.(e)}if(S.current!==v.length){S.current=v.length;let e=ty(l,v);e.length&&d?.(e)}y.setState({userSelectionRect:m})}:h,onMouseUp:A?e=>{if(0!==e.button)return;let{userSelectionRect:t}=y.getState();!w&&t&&e.target===f.current&&k?.(e),y.setState({nodesSelectionActive:x.current>0}),N(),r?.(e)}:void 0,onMouseLeave:A?e=>{w&&(y.setState({nodesSelectionActive:x.current>0}),r?.(e)),N()}:p,ref:f,style:tr},m,d.createElement(tg,null))});function tE(e,t,n){let o=e;do{if(o?.matches(t))return!0;if(o===n.current)break;o=o.parentElement}while(o);return!1}function tv(e,t,n,o,r=[0,0],a){var l;let i=(l=e.extent||o)&&"parent"!==l?[l[0],[l[1][0]-(e.width||0),l[1][1]-(e.height||0)]]:l,s=i,d=e.parentNode||e.parentId;if("parent"!==e.extent||e.expandParent){if(e.extent&&d&&"parent"!==e.extent){let{x:t,y:o}=em(n.get(d),r).positionAbsolute;s=[[e.extent[0][0]+t,e.extent[0][1]+o],[e.extent[1][0]+t,e.extent[1][1]+o]]}}else if(d&&e.width&&e.height){let t=n.get(d),{x:o,y:a}=em(t,r).positionAbsolute;s=t&&H(o)&&H(a)&&H(t.width)&&H(t.height)?[[o+e.width*r[0],a+e.height*r[1]],[o+t.width-e.width+e.width*r[0],a+t.height-e.height+e.height*r[1]]]:s}else a?.("005",S.error005()),s=i;let c={x:0,y:0};d&&(c=em(n.get(d),r).positionAbsolute);let u=s&&"parent"!==s?P(t,s):t;return{position:{x:u.x-c.x,y:u.y-c.y},positionAbsolute:u}}function tw({nodeId:e,dragItems:t,nodeInternals:n}){let o=t.map(e=>({...n.get(e.id),position:e.position,positionAbsolute:e.positionAbsolute}));return[e?o.find(t=>t.id===e):o[0],o]}tb.displayName="Pane";let tM=(e,t,n,o)=>{let r=t.querySelectorAll(e);if(!r||!r.length)return null;let a=Array.from(r),l=t.getBoundingClientRect(),i={x:l.width*o[0],y:l.height*o[1]};return a.map(e=>{let t=e.getBoundingClientRect();return{id:e.getAttribute("data-handleid"),position:e.getAttribute("data-handlepos"),x:(t.left-l.left-i.x)/n,y:(t.top-l.top-i.y)/n,...k(e)}})};function tC(e,t,n){return void 0===n?n:o=>{let r=t().nodeInternals.get(e);r&&n(o,{...r})}}function tN({id:e,store:t,unselect:n=!1,nodeRef:o}){let{addSelectedNodes:r,unselectNodesAndEdges:a,multiSelectionActive:l,nodeInternals:i,onError:s}=t.getState(),d=i.get(e);if(!d)return void s?.("012",S.error012(e));t.setState({nodesSelectionActive:!1}),d.selected?(n||d.selected&&l)&&(a({nodes:[d],edges:[]}),requestAnimationFrame(()=>o?.current?.blur())):r([e])}function tk(e){return(t,n,o)=>e?.(t,o)}function tA({nodeRef:e,disabled:t=!1,noDragClassName:n,handleSelector:o,nodeId:r,isSelectable:a,selectNodesOnDrag:l}){let i=v(),[s,c]=(0,d.useState)(!1),u=(0,d.useRef)([]),g=(0,d.useRef)({x:null,y:null}),h=(0,d.useRef)(0),m=(0,d.useRef)(null),y=(0,d.useRef)({x:0,y:0}),x=(0,d.useRef)(null),S=(0,d.useRef)(!1),b=(0,d.useRef)(!1),E=(0,d.useRef)(!1),w=function(){let e=v();return(0,d.useCallback)(({sourceEvent:t})=>{let{transform:n,snapGrid:o,snapToGrid:r}=e.getState(),a=t.touches?t.touches[0].clientX:t.clientX,l=t.touches?t.touches[0].clientY:t.clientY,i={x:(a-n[0])/n[2],y:(l-n[1])/n[2]};return{xSnapped:r?o[0]*Math.round(i.x/o[0]):i.x,ySnapped:r?o[1]*Math.round(i.y/o[1]):i.y,...i}},[])}();return(0,d.useEffect)(()=>{if(e?.current){let s=(0,p.A)(e.current),d=({x:e,y:t})=>{let{nodeInternals:n,onNodeDrag:o,onSelectionDrag:a,updateNodePositions:l,nodeExtent:s,snapGrid:d,snapToGrid:h,nodeOrigin:p,onError:m}=i.getState();g.current={x:e,y:t};let f=!1,y={x:0,y:0,x2:0,y2:0};if(u.current.length>1&&s&&(y=O(ef(u.current,p))),u.current=u.current.map(o=>{let r={x:e-o.distance.x,y:t-o.distance.y};h&&(r.x=d[0]*Math.round(r.x/d[0]),r.y=d[1]*Math.round(r.y/d[1]));let a=[[s[0][0],s[0][1]],[s[1][0],s[1][1]]];u.current.length>1&&s&&!o.extent&&(a[0][0]=o.positionAbsolute.x-y.x+s[0][0],a[1][0]=o.positionAbsolute.x+(o.width??0)-y.x2+s[1][0],a[0][1]=o.positionAbsolute.y-y.y+s[0][1],a[1][1]=o.positionAbsolute.y+(o.height??0)-y.y2+s[1][1]);let l=tv(o,r,n,a,p,m);return f=f||o.position.x!==l.position.x||o.position.y!==l.position.y,o.position=l.position,o.positionAbsolute=l.positionAbsolute,o}),!f)return;l(u.current,!0,!0),c(!0);let S=r?o:tk(a);if(S&&x.current){let[e,t]=tw({nodeId:r,dragItems:u.current,nodeInternals:n});S(x.current,e,t)}},v=()=>{if(!m.current)return;let[e,t]=I(y.current,m.current);if(0!==e||0!==t){let{transform:n,panBy:o}=i.getState();g.current.x=(g.current.x??0)-e/n[2],g.current.y=(g.current.y??0)-t/n[2],o({x:e,y:t})&&d(g.current)}h.current=requestAnimationFrame(v)},M=t=>{let{nodeInternals:n,multiSelectionActive:o,nodesDraggable:s,unselectNodesAndEdges:d,onNodeDragStart:c,onSelectionDragStart:h}=i.getState();b.current=!0;let p=r?c:tk(h);l&&a||o||!r||n.get(r)?.selected||d(),r&&a&&l&&tN({id:r,store:i,nodeRef:e});let m=w(t);if(g.current=m,u.current=Array.from(n.values()).filter(e=>(e.selected||e.id===r)&&(!e.parentNode||e.parentId||!function e(t,n){let o=t.parentNode||t.parentId;if(!o)return!1;let r=n.get(o);return!!r&&(!!r.selected||e(r,n))}(e,n))&&(e.draggable||s&&void 0===e.draggable)).map(e=>({id:e.id,position:e.position||{x:0,y:0},positionAbsolute:e.positionAbsolute||{x:0,y:0},distance:{x:m.x-(e.positionAbsolute?.x??0),y:m.y-(e.positionAbsolute?.y??0)},delta:{x:0,y:0},extent:e.extent,parentNode:e.parentNode||e.parentId,parentId:e.parentNode||e.parentId,width:e.width,height:e.height,expandParent:e.expandParent})),p&&u.current){let[e,o]=tw({nodeId:r,dragItems:u.current,nodeInternals:n});p(t.sourceEvent,e,o)}};if(t)s.on(".drag",null);else{let t=(0,f.A)().on("start",e=>{let{domNode:t,nodeDragThreshold:n}=i.getState();0===n&&M(e),E.current=!1,g.current=w(e),m.current=t?.getBoundingClientRect()||null,y.current=Z(e.sourceEvent,m.current)}).on("drag",e=>{let t=w(e),{autoPanOnNodeDrag:n,nodeDragThreshold:o}=i.getState();if("touchmove"===e.sourceEvent.type&&e.sourceEvent.touches.length>1&&(E.current=!0),!E.current){if(!S.current&&b.current&&n&&(S.current=!0,v()),!b.current){let n=t.xSnapped-(g?.current?.x??0),r=t.ySnapped-(g?.current?.y??0);Math.sqrt(n*n+r*r)>o&&M(e)}(g.current.x!==t.xSnapped||g.current.y!==t.ySnapped)&&u.current&&b.current&&(x.current=e.sourceEvent,y.current=Z(e.sourceEvent,m.current),d(t))}}).on("end",e=>{if(b.current&&!E.current&&(c(!1),S.current=!1,b.current=!1,cancelAnimationFrame(h.current),u.current)){let{updateNodePositions:t,nodeInternals:n,onNodeDragStop:o,onSelectionDragStop:a}=i.getState(),l=r?o:tk(a);if(t(u.current,!1,!1),l){let[t,o]=tw({nodeId:r,dragItems:u.current,nodeInternals:n});l(e.sourceEvent,t,o)}}}).filter(t=>{let r=t.target;return!t.button&&(!n||!tE(r,`.${n}`,e))&&(!o||tE(r,o,e))});return s.call(t),()=>{s.on(".drag",null)}}}},[e,t,n,o,a,i,r,l,w]),s}function tP(){let e=v();return(0,d.useCallback)(t=>{let{nodeInternals:n,nodeExtent:o,updateNodePositions:r,getNodes:a,snapToGrid:l,snapGrid:i,onError:s,nodesDraggable:d}=e.getState(),c=a().filter(e=>e.selected&&(e.draggable||d&&void 0===e.draggable)),u=l?i[0]:5,g=l?i[1]:5,h=t.isShiftPressed?4:1,p=t.x*u*h,m=t.y*g*h;r(c.map(e=>{if(e.positionAbsolute){let t={x:e.positionAbsolute.x+p,y:e.positionAbsolute.y+m};l&&(t.x=i[0]*Math.round(t.x/i[0]),t.y=i[1]*Math.round(t.y/i[1]));let{positionAbsolute:r,position:a}=tv(e,t,n,o,void 0,s);e.position=a,e.positionAbsolute=r}return e}),!0,!1)},[])}let tR={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var tI=e=>{let t=({id:t,type:n,data:o,xPos:r,yPos:a,xPosOrigin:l,yPosOrigin:i,selected:s,onClick:u,onMouseEnter:g,onMouseMove:h,onMouseLeave:p,onContextMenu:m,onDoubleClick:f,style:y,className:x,isDraggable:S,isSelectable:b,isConnectable:E,isFocusable:w,selectNodesOnDrag:M,sourcePosition:C,targetPosition:N,hidden:k,resizeObserver:A,dragHandle:P,zIndex:R,isParent:I,noDragClassName:$,noPanClassName:_,initialized:O,disableKeyboardA11y:B,ariaLabel:D,rfId:z,hasHandleBounds:L})=>{let H=v(),T=(0,d.useRef)(null),V=(0,d.useRef)(null),Z=(0,d.useRef)(C),X=(0,d.useRef)(N),Y=(0,d.useRef)(n),W=b||S||u||g||h||p,j=tP(),U=tC(t,H.getState,g),G=tC(t,H.getState,h),q=tC(t,H.getState,p),Q=tC(t,H.getState,m),J=tC(t,H.getState,f);(0,d.useEffect)(()=>()=>{V.current&&(A?.unobserve(V.current),V.current=null)},[]),(0,d.useEffect)(()=>{if(T.current&&!k){let e=T.current;O&&L&&V.current===e||(V.current&&A?.unobserve(V.current),A?.observe(e),V.current=e)}},[k,O,L]),(0,d.useEffect)(()=>{let e=Y.current!==n,o=Z.current!==C,r=X.current!==N;T.current&&(e||o||r)&&(e&&(Y.current=n),o&&(Z.current=C),r&&(X.current=N),H.getState().updateNodeDimensions([{id:t,nodeElement:T.current,forceUpdate:!0}]))},[t,n,C,N]);let ee=tA({nodeRef:T,disabled:k||!S,noDragClassName:$,handleSelector:P,nodeId:t,isSelectable:b,selectNodesOnDrag:M});return k?null:d.createElement("div",{className:(0,c.A)(["react-flow__node",`react-flow__node-${n}`,{[_]:S},x,{selected:s,selectable:b,parent:I,dragging:ee}]),ref:T,style:{zIndex:R,transform:`translate(${l}px,${i}px)`,pointerEvents:W?"all":"none",visibility:O?"visible":"hidden",...y},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:U,onMouseMove:G,onMouseLeave:q,onContextMenu:Q,onClick:e=>{let{nodeDragThreshold:n}=H.getState();if(b&&(!M||!S||n>0)&&tN({id:t,store:H,nodeRef:T}),u){let n=H.getState().nodeInternals.get(t);n&&u(e,{...n})}},onDoubleClick:J,onKeyDown:w?e=>{!K(e)&&!B&&(F.includes(e.key)&&b?tN({id:t,store:H,unselect:"Escape"===e.key,nodeRef:T}):S&&s&&Object.prototype.hasOwnProperty.call(tR,e.key)&&(H.setState({ariaLiveMessage:`Moved selected node ${e.key.replace("Arrow","").toLowerCase()}. New position, x: ${~~r}, y: ${~~a}`}),j({x:tR[e.key].x,y:tR[e.key].y,isShiftPressed:e.shiftKey})))}:void 0,tabIndex:w?0:void 0,role:w?"button":void 0,"aria-describedby":B?void 0:`${eq}-${z}`,"aria-label":D},d.createElement(eu,{value:t},d.createElement(e,{id:t,data:o,type:n,xPos:r,yPos:a,selected:s,isConnectable:E,sourcePosition:C,targetPosition:N,dragging:ee,dragHandle:P,zIndex:R})))};return t.displayName="NodeWrapper",(0,d.memo)(t)};let t$=e=>({...ef(e.getNodes().filter(e=>e.selected),e.nodeOrigin),transformString:`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`,userSelectionActive:e.userSelectionActive});var t_=(0,d.memo)(function({onSelectionContextMenu:e,noPanClassName:t,disableKeyboardA11y:n}){let o=v(),{width:r,height:a,x:l,y:i,transformString:s,userSelectionActive:u}=E(t$,g.x),h=tP(),p=(0,d.useRef)(null);if((0,d.useEffect)(()=>{n||p.current?.focus({preventScroll:!0})},[n]),tA({nodeRef:p}),u||!r||!a)return null;let m=e?t=>{e(t,o.getState().getNodes().filter(e=>e.selected))}:void 0;return d.createElement("div",{className:(0,c.A)(["react-flow__nodesselection","react-flow__container",t]),style:{transform:s}},d.createElement("div",{ref:p,className:"react-flow__nodesselection-rect",onContextMenu:m,tabIndex:n?void 0:-1,onKeyDown:n?void 0:e=>{Object.prototype.hasOwnProperty.call(tR,e.key)&&h({x:tR[e.key].x,y:tR[e.key].y,isShiftPressed:e.shiftKey})},style:{width:r,height:a,top:i,left:l}}))});let tO=e=>e.nodesSelectionActive,tB=({children:e,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:o,onPaneMouseLeave:r,onPaneContextMenu:a,onPaneScroll:l,deleteKeyCode:i,onMove:s,onMoveStart:c,onMoveEnd:u,selectionKeyCode:g,selectionOnDrag:h,selectionMode:p,onSelectionStart:m,onSelectionEnd:f,multiSelectionKeyCode:y,panActivationKeyCode:x,zoomActivationKeyCode:S,elementsSelectable:b,zoomOnScroll:w,zoomOnPinch:M,panOnScroll:C,panOnScrollSpeed:N,panOnScrollMode:k,zoomOnDoubleClick:A,panOnDrag:P,defaultViewport:R,translateExtent:I,minZoom:$,maxZoom:_,preventScrolling:O,onSelectionContextMenu:B,noWheelClassName:D,noPanClassName:z,disableKeyboardA11y:L})=>{let H=E(tO),T=e2(g),F=e2(x),V=F||P,K=F||C,Z=T||h&&!0!==V;return(({deleteKeyCode:e,multiSelectionKeyCode:t})=>{let n=v(),{deleteElements:o}=tn(),r=e2(e,to),a=e2(t);(0,d.useEffect)(()=>{if(r){let{edges:e,getNodes:t}=n.getState();o({nodes:t().filter(e=>e.selected),edges:e.filter(e=>e.selected)}),n.setState({nodesSelectionActive:!1})}},[r]),(0,d.useEffect)(()=>{n.setState({multiSelectionActive:a})},[a])})({deleteKeyCode:i,multiSelectionKeyCode:y}),d.createElement(tc,{onMove:s,onMoveStart:c,onMoveEnd:u,onPaneContextMenu:a,elementsSelectable:b,zoomOnScroll:w,zoomOnPinch:M,panOnScroll:K,panOnScrollSpeed:N,panOnScrollMode:k,zoomOnDoubleClick:A,panOnDrag:!T&&V,defaultViewport:R,translateExtent:I,minZoom:$,maxZoom:_,zoomActivationKeyCode:S,preventScrolling:O,noWheelClassName:D,noPanClassName:z},d.createElement(tb,{onSelectionStart:m,onSelectionEnd:f,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:o,onPaneMouseLeave:r,onPaneContextMenu:a,onPaneScroll:l,panOnDrag:V,isSelecting:!!Z,selectionMode:p},e,H&&d.createElement(t_,{onSelectionContextMenu:B,noPanClassName:z,disableKeyboardA11y:L})))};tB.displayName="FlowRenderer";var tD=(0,d.memo)(tB);function tz(e){let t={input:tI(e.input||eB),default:tI(e.default||e_),output:tI(e.output||ez),group:tI(e.group||eL)},n=Object.keys(e).filter(e=>!["input","default","output","group"].includes(e)).reduce((t,n)=>(t[n]=tI(e[n]||e_),t),{});return{...t,...n}}let tL=e=>({nodesDraggable:e.nodesDraggable,nodesConnectable:e.nodesConnectable,nodesFocusable:e.nodesFocusable,elementsSelectable:e.elementsSelectable,updateNodeDimensions:e.updateNodeDimensions,onError:e.onError}),tH=e=>{let{nodesDraggable:t,nodesConnectable:n,nodesFocusable:o,elementsSelectable:r,updateNodeDimensions:a,onError:l}=E(tL,g.x),i=function(e){return E((0,d.useCallback)(t=>e?ey(t.nodeInternals,{x:0,y:0,width:t.width,height:t.height},t.transform,!0):t.getNodes(),[e]))}(e.onlyRenderVisibleElements),c=(0,d.useRef)(),u=(0,d.useMemo)(()=>{if("undefined"==typeof ResizeObserver)return null;let e=new ResizeObserver(e=>{a(e.map(e=>({id:e.target.getAttribute("data-id"),nodeElement:e.target,forceUpdate:!0})))});return c.current=e,e},[]);return(0,d.useEffect)(()=>()=>{c?.current?.disconnect()},[]),d.createElement("div",{className:"react-flow__nodes",style:tr},i.map(a=>{let i=a.type||"default";e.nodeTypes[i]||(l?.("003",S.error003(i)),i="default");let c=e.nodeTypes[i]||e.nodeTypes.default,g=!!(a.draggable||t&&void 0===a.draggable),h=!!(a.selectable||r&&void 0===a.selectable),p=!!(a.connectable||n&&void 0===a.connectable),m=!!(a.focusable||o&&void 0===a.focusable),f=e.nodeExtent?P(a.positionAbsolute,e.nodeExtent):a.positionAbsolute,y=f?.x??0,x=f?.y??0,b=(({x:e,y:t,width:n,height:o,origin:r})=>!n||!o||r[0]<0||r[1]<0||r[0]>1||r[1]>1?{x:e,y:t}:{x:e-n*r[0],y:t-o*r[1]})({x:y,y:x,width:a.width??0,height:a.height??0,origin:e.nodeOrigin});return d.createElement(c,{key:a.id,id:a.id,className:a.className,style:a.style,type:i,data:a.data,sourcePosition:a.sourcePosition||s.Bottom,targetPosition:a.targetPosition||s.Top,hidden:a.hidden,xPos:y,yPos:x,xPosOrigin:b.x,yPosOrigin:b.y,selectNodesOnDrag:e.selectNodesOnDrag,onClick:e.onNodeClick,onMouseEnter:e.onNodeMouseEnter,onMouseMove:e.onNodeMouseMove,onMouseLeave:e.onNodeMouseLeave,onContextMenu:e.onNodeContextMenu,onDoubleClick:e.onNodeDoubleClick,selected:!!a.selected,isDraggable:g,isSelectable:h,isConnectable:p,isFocusable:m,resizeObserver:u,dragHandle:a.dragHandle,zIndex:a[T]?.z??0,isParent:!!a[T]?.isParent,noDragClassName:e.noDragClassName,noPanClassName:e.noPanClassName,initialized:!!a.width&&!!a.height,rfId:e.rfId,disableKeyboardA11y:e.disableKeyboardA11y,ariaLabel:a.ariaLabel,hasHandleBounds:!!a[T]?.handleBounds})}))};tH.displayName="NodeRenderer";var tT=(0,d.memo)(tH);let tF="react-flow__edgeupdater",tV=({position:e,centerX:t,centerY:n,radius:o=10,onMouseDown:r,onMouseEnter:a,onMouseOut:l,type:i})=>d.createElement("circle",{onMouseDown:r,onMouseEnter:a,onMouseOut:l,className:(0,c.A)([tF,`${tF}-${i}`]),cx:((e,t,n)=>n===s.Left?e-t:n===s.Right?e+t:e)(t,o,e),cy:((e,t,n)=>n===s.Top?e-t:n===s.Bottom?e+t:e)(n,o,e),r:o,stroke:"transparent",fill:"transparent"}),tK=()=>!0;var tZ=e=>{let t=({id:t,className:n,type:o,data:r,onClick:a,onEdgeDoubleClick:l,selected:i,animated:s,label:u,labelStyle:g,labelShowBg:h,labelBgStyle:p,labelBgPadding:m,labelBgBorderRadius:f,style:y,source:x,target:S,sourceX:b,sourceY:E,targetX:w,targetY:M,sourcePosition:C,targetPosition:N,elementsSelectable:k,hidden:A,sourceHandleId:P,targetHandleId:R,onContextMenu:I,onMouseEnter:$,onMouseMove:_,onMouseLeave:O,reconnectRadius:B,onReconnect:D,onReconnectStart:z,onReconnectEnd:L,markerEnd:H,markerStart:T,rfId:V,ariaLabel:K,isFocusable:Z,isReconnectable:X,pathOptions:Y,interactionWidth:j,disableKeyboardA11y:U})=>{let G=(0,d.useRef)(null),[q,Q]=(0,d.useState)(!1),[J,ee]=(0,d.useState)(!1),et=v(),en=(0,d.useMemo)(()=>`url('#${eg(T,V)}')`,[T,V]),eo=(0,d.useMemo)(()=>`url('#${eg(H,V)}')`,[H,V]);if(A)return null;let er=W(t,et.getState,l),ea=W(t,et.getState,I),el=W(t,et.getState,$),ei=W(t,et.getState,_),es=W(t,et.getState,O),ed=(e,n)=>{if(0!==e.button)return;let{edges:o,isValidConnection:r}=et.getState(),a=n?S:x,l=(n?R:P)||null,i=n?"target":"source",s=o.find(e=>e.id===t);ee(!0),z?.(e,s,i),ek({event:e,handleId:l,nodeId:a,onConnect:e=>D?.(s,e),isTarget:n,getState:et.getState,setState:et.setState,isValidConnection:r||tK,edgeUpdaterType:i,onReconnectEnd:e=>{ee(!1),L?.(e,s,i)}})},ec=()=>Q(!0),eu=()=>Q(!1);return d.createElement("g",{className:(0,c.A)(["react-flow__edge",`react-flow__edge-${o}`,n,{selected:i,animated:s,inactive:!k&&!a,updating:q}]),onClick:e=>{let{edges:n,addSelectedEdges:o,unselectNodesAndEdges:r,multiSelectionActive:l}=et.getState(),i=n.find(e=>e.id===t);i&&(k&&(et.setState({nodesSelectionActive:!1}),i.selected&&l?(r({nodes:[],edges:[i]}),G.current?.blur()):o([t])),a&&a(e,i))},onDoubleClick:er,onContextMenu:ea,onMouseEnter:el,onMouseMove:ei,onMouseLeave:es,onKeyDown:Z?e=>{if(!U&&F.includes(e.key)&&k){let{unselectNodesAndEdges:n,addSelectedEdges:o,edges:r}=et.getState();"Escape"===e.key?(G.current?.blur(),n({edges:[r.find(e=>e.id===t)]})):o([t])}}:void 0,tabIndex:Z?0:void 0,role:Z?"button":"img","data-testid":`rf__edge-${t}`,"aria-label":null===K?void 0:K||`Edge from ${x} to ${S}`,"aria-describedby":Z?`${eQ}-${V}`:void 0,ref:G},!J&&d.createElement(e,{id:t,source:x,target:S,selected:i,animated:s,label:u,labelStyle:g,labelShowBg:h,labelBgStyle:p,labelBgPadding:m,labelBgBorderRadius:f,data:r,style:y,sourceX:b,sourceY:E,targetX:w,targetY:M,sourcePosition:C,targetPosition:N,sourceHandleId:P,targetHandleId:R,markerStart:en,markerEnd:eo,pathOptions:Y,interactionWidth:j}),X&&d.createElement(d.Fragment,null,("source"===X||!0===X)&&d.createElement(tV,{position:C,centerX:b,centerY:E,radius:B,onMouseDown:e=>ed(e,!0),onMouseEnter:ec,onMouseOut:eu,type:"source"}),("target"===X||!0===X)&&d.createElement(tV,{position:N,centerX:w,centerY:M,radius:B,onMouseDown:e=>ed(e,!1),onMouseEnter:ec,onMouseOut:eu,type:"target"})))};return t.displayName="EdgeWrapper",(0,d.memo)(t)};function tX(e){let t={default:tZ(e.default||ed),straight:tZ(e.bezier||ea),step:tZ(e.step||er),smoothstep:tZ(e.step||eo),simplebezier:tZ(e.simplebezier||Q)},n=Object.keys(e).filter(e=>!["default","bezier"].includes(e)).reduce((t,n)=>(t[n]=tZ(e[n]||ed),t),{});return{...t,...n}}function tY(e,t,n=null){let o=(n?.x||0)+t.x,r=(n?.y||0)+t.y,a=n?.width||t.width,l=n?.height||t.height;switch(e){case s.Top:return{x:o+a/2,y:r};case s.Right:return{x:o+a,y:r+l/2};case s.Bottom:return{x:o+a/2,y:r+l};case s.Left:return{x:o,y:r+l/2}}}function tW(e,t){return e?1!==e.length&&t?t&&e.find(e=>e.id===t)||null:e[0]:null}function tj(e){let t=e?.[T]?.handleBounds||null,n=t&&e?.width&&e?.height&&void 0!==e?.positionAbsolute?.x&&void 0!==e?.positionAbsolute?.y;return[{x:e?.positionAbsolute?.x||0,y:e?.positionAbsolute?.y||0,width:e?.width||0,height:e?.height||0},t,!!n]}let tU=[{level:0,isMaxLevel:!0,edges:[]}],tG={[i.Arrow]:({color:e="none",strokeWidth:t=1})=>d.createElement("polyline",{style:{stroke:e,strokeWidth:t},strokeLinecap:"round",strokeLinejoin:"round",fill:"none",points:"-5,-4 0,0 -5,4"}),[i.ArrowClosed]:({color:e="none",strokeWidth:t=1})=>d.createElement("polyline",{style:{stroke:e,fill:e,strokeWidth:t},strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},tq=({id:e,type:t,color:n,width:o=12.5,height:r=12.5,markerUnits:a="strokeWidth",strokeWidth:l,orient:i="auto-start-reverse"})=>{let s=function(e){let t=v();return(0,d.useMemo)(()=>Object.prototype.hasOwnProperty.call(tG,e)?tG[e]:(t.getState().onError?.("009",S.error009(e)),null),[e])}(t);return s?d.createElement("marker",{className:"react-flow__arrowhead",id:e,markerWidth:`${o}`,markerHeight:`${r}`,viewBox:"-10 -10 20 20",markerUnits:a,orient:i,refX:"0",refY:"0"},d.createElement(s,{color:n,strokeWidth:l})):null},tQ=({defaultColor:e,rfId:t})=>{let n=E((0,d.useCallback)((({defaultColor:e,rfId:t})=>n=>{let o=[];return n.edges.reduce((n,r)=>([r.markerStart,r.markerEnd].forEach(r=>{if(r&&"object"==typeof r){let a=eg(r,t);o.includes(a)||(n.push({id:a,color:r.color||e,...r}),o.push(a))}}),n),[]).sort((e,t)=>e.id.localeCompare(t.id))})({defaultColor:e,rfId:t}),[e,t]),(e,t)=>!(e.length!==t.length||e.some((e,n)=>e.id!==t[n].id)));return d.createElement("defs",null,n.map(e=>d.createElement(tq,{id:e.id,key:e.id,type:e.type,color:e.color,width:e.width,height:e.height,markerUnits:e.markerUnits,strokeWidth:e.strokeWidth,orient:e.orient})))};tQ.displayName="MarkerDefinitions";var tJ=(0,d.memo)(tQ);let t0=e=>({nodesConnectable:e.nodesConnectable,edgesFocusable:e.edgesFocusable,edgesUpdatable:e.edgesUpdatable,elementsSelectable:e.elementsSelectable,width:e.width,height:e.height,connectionMode:e.connectionMode,nodeInternals:e.nodeInternals,onError:e.onError}),t1=({defaultMarkerColor:e,onlyRenderVisibleElements:t,elevateEdgesOnSelect:n,rfId:r,edgeTypes:a,noPanClassName:l,onEdgeContextMenu:i,onEdgeMouseEnter:u,onEdgeMouseMove:h,onEdgeMouseLeave:p,onEdgeClick:m,onEdgeDoubleClick:f,onReconnect:y,onReconnectStart:x,onReconnectEnd:b,reconnectRadius:v,children:w,disableKeyboardA11y:M})=>{let{edgesFocusable:C,edgesUpdatable:N,elementsSelectable:k,width:A,height:P,connectionMode:R,nodeInternals:I,onError:$}=E(t0,g.x),_=function(e,t,n){return function(e,t,n=!1){let o=-1,r=Object.entries(e.reduce((e,r)=>{let a=H(r.zIndex),l=a?r.zIndex:0;if(n){let e=t.get(r.target),n=t.get(r.source),o=r.selected||e?.selected||n?.selected,i=Math.max(n?.[T]?.z||0,e?.[T]?.z||0,1e3);l=(a?r.zIndex:0)+(o?i:0)}return e[l]?e[l].push(r):e[l]=[r],o=l>o?l:o,e},{})).map(([e,t])=>{let n=+e;return{edges:t,level:n,isMaxLevel:n===o}});return 0===r.length?tU:r}(E((0,d.useCallback)(n=>e?n.edges.filter(e=>{let o=t.get(e.source),r=t.get(e.target);return o?.width&&o?.height&&r?.width&&r?.height&&function({sourcePos:e,targetPos:t,sourceWidth:n,sourceHeight:o,targetWidth:r,targetHeight:a,width:l,height:i,transform:s}){let d={x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x+n,t.x+r),y2:Math.max(e.y+o,t.y+a)};d.x===d.x2&&(d.x2+=1),d.y===d.y2&&(d.y2+=1);let c=O({x:(0-s[0])/s[2],y:(0-s[1])/s[2],width:l/s[2],height:i/s[2]});return Math.ceil(Math.max(0,Math.min(c.x2,d.x2)-Math.max(c.x,d.x))*Math.max(0,Math.min(c.y2,d.y2)-Math.max(c.y,d.y)))>0}({sourcePos:o.positionAbsolute||{x:0,y:0},targetPos:r.positionAbsolute||{x:0,y:0},sourceWidth:o.width,sourceHeight:o.height,targetWidth:r.width,targetHeight:r.height,width:n.width,height:n.height,transform:n.transform})}):n.edges,[e,t])),t,n)}(t,I,n);return A?d.createElement(d.Fragment,null,_.map(({level:t,edges:n,isMaxLevel:g})=>d.createElement("svg",{key:t,style:{zIndex:t},width:A,height:P,className:"react-flow__edges react-flow__container"},g&&d.createElement(tJ,{defaultColor:e,rfId:r}),d.createElement("g",null,n.map(e=>{let[t,n,g]=tj(I.get(e.source)),[E,w,A]=tj(I.get(e.target));if(!g||!A)return null;let P=e.type||"default";a[P]||($?.("011",S.error011(P)),P="default");let _=a[P]||a.default,O=R===o.Strict?w.target:(w.target??[]).concat(w.source??[]),B=tW(n.source,e.sourceHandle),D=tW(O,e.targetHandle),z=B?.position||s.Bottom,L=D?.position||s.Top,H=!!(e.focusable||C&&void 0===e.focusable),T=e.reconnectable||e.updatable;if(!B||!D)return $?.("008",S.error008(B,e)),null;let{sourceX:F,sourceY:V,targetX:K,targetY:Z}=((e,t,n,o,r,a)=>{let l=tY(n,e,t),i=tY(a,o,r);return{sourceX:l.x,sourceY:l.y,targetX:i.x,targetY:i.y}})(t,B,z,E,D,L);return d.createElement(_,{key:e.id,id:e.id,className:(0,c.A)([e.className,l]),type:P,data:e.data,selected:!!e.selected,animated:!!e.animated,hidden:!!e.hidden,label:e.label,labelStyle:e.labelStyle,labelShowBg:e.labelShowBg,labelBgStyle:e.labelBgStyle,labelBgPadding:e.labelBgPadding,labelBgBorderRadius:e.labelBgBorderRadius,style:e.style,source:e.source,target:e.target,sourceHandleId:e.sourceHandle,targetHandleId:e.targetHandle,markerEnd:e.markerEnd,markerStart:e.markerStart,sourceX:F,sourceY:V,targetX:K,targetY:Z,sourcePosition:z,targetPosition:L,elementsSelectable:k,onContextMenu:i,onMouseEnter:u,onMouseMove:h,onMouseLeave:p,onClick:m,onEdgeDoubleClick:f,onReconnect:y,onReconnectStart:x,onReconnectEnd:b,reconnectRadius:v,rfId:r,ariaLabel:e.ariaLabel,isFocusable:H,isReconnectable:void 0!==y&&(T||N&&void 0===T),pathOptions:"pathOptions"in e?e.pathOptions:void 0,interactionWidth:e.interactionWidth,disableKeyboardA11y:M})})))),w):null};t1.displayName="EdgeRenderer";var t2=(0,d.memo)(t1);let t5=e=>`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;function t3({children:e}){let t=E(t5);return d.createElement("div",{className:"react-flow__viewport react-flow__container",style:{transform:t}},e)}let t4={[s.Left]:s.Right,[s.Right]:s.Left,[s.Top]:s.Bottom,[s.Bottom]:s.Top},t7=({nodeId:e,handleType:t,style:n,type:r=l.Bezier,CustomComponent:a,connectionStatus:i})=>{let{fromNode:s,handleId:c,toX:u,toY:h,connectionMode:p}=E((0,d.useCallback)(t=>({fromNode:t.nodeInternals.get(e),handleId:t.connectionHandleId,toX:(t.connectionPosition.x-t.transform[0])/t.transform[2],toY:(t.connectionPosition.y-t.transform[1])/t.transform[2],connectionMode:t.connectionMode}),[e]),g.x),m=s?.[T]?.handleBounds,f=m?.[t];if(p===o.Loose&&(f=f||m?.["source"===t?"target":"source"]),!s||!f)return null;let y=c?f.find(e=>e.id===c):f[0],x=y?y.x+y.width/2:(s.width??0)/2,S=y?y.y+y.height/2:s.height??0,b=(s.positionAbsolute?.x??0)+x,v=(s.positionAbsolute?.y??0)+S,w=y?.position,M=w?t4[w]:null;if(!w||!M)return null;if(a)return d.createElement(a,{connectionLineType:r,connectionLineStyle:n,fromNode:s,fromHandle:y,fromX:b,fromY:v,toX:u,toY:h,fromPosition:w,toPosition:M,connectionStatus:i});let C="",N={sourceX:b,sourceY:v,sourcePosition:w,targetX:u,targetY:h,targetPosition:M};return r===l.Bezier?[C]=es(N):r===l.Step?[C]=en({...N,borderRadius:0}):r===l.SmoothStep?[C]=en(N):r===l.SimpleBezier?[C]=q(N):C=`M${b},${v} ${u},${h}`,d.createElement("path",{d:C,fill:"none",className:"react-flow__connection-path",style:n})};t7.displayName="ConnectionLine";let t8=e=>({nodeId:e.connectionNodeId,handleType:e.connectionHandleType,nodesConnectable:e.nodesConnectable,connectionStatus:e.connectionStatus,width:e.width,height:e.height});function t6({containerStyle:e,style:t,type:n,component:o}){let{nodeId:r,handleType:a,nodesConnectable:l,width:i,height:s,connectionStatus:u}=E(t8,g.x);return r&&a&&i&&l?d.createElement("svg",{style:e,width:i,height:s,className:"react-flow__edges react-flow__connectionline react-flow__container"},d.createElement("g",{className:(0,c.A)(["react-flow__connection",u])},d.createElement(t7,{nodeId:r,handleType:a,style:t,type:n,CustomComponent:o,connectionStatus:u}))):null}function t9(e,t){return(0,d.useRef)(null),v(),(0,d.useMemo)(()=>t(e),[e])}let ne=({nodeTypes:e,edgeTypes:t,onMove:n,onMoveStart:o,onMoveEnd:r,onInit:a,onNodeClick:l,onEdgeClick:i,onNodeDoubleClick:s,onEdgeDoubleClick:c,onNodeMouseEnter:u,onNodeMouseMove:g,onNodeMouseLeave:h,onNodeContextMenu:p,onSelectionContextMenu:m,onSelectionStart:f,onSelectionEnd:y,connectionLineType:x,connectionLineStyle:S,connectionLineComponent:b,connectionLineContainerStyle:E,selectionKeyCode:v,selectionOnDrag:w,selectionMode:M,multiSelectionKeyCode:C,panActivationKeyCode:N,zoomActivationKeyCode:k,deleteKeyCode:A,onlyRenderVisibleElements:P,elementsSelectable:R,selectNodesOnDrag:I,defaultViewport:$,translateExtent:_,minZoom:O,maxZoom:B,preventScrolling:D,defaultMarkerColor:z,zoomOnScroll:L,zoomOnPinch:H,panOnScroll:T,panOnScrollSpeed:F,panOnScrollMode:V,zoomOnDoubleClick:K,panOnDrag:Z,onPaneClick:X,onPaneMouseEnter:Y,onPaneMouseMove:W,onPaneMouseLeave:j,onPaneScroll:U,onPaneContextMenu:G,onEdgeContextMenu:q,onEdgeMouseEnter:Q,onEdgeMouseMove:J,onEdgeMouseLeave:ee,onReconnect:et,onReconnectStart:en,onReconnectEnd:eo,reconnectRadius:er,noDragClassName:ea,noWheelClassName:el,noPanClassName:ei,elevateEdgesOnSelect:es,disableKeyboardA11y:ed,nodeOrigin:ec,nodeExtent:eu,rfId:eg})=>{let eh=t9(e,tz),ep=t9(t,tX);return!function(e){let t=tn(),n=(0,d.useRef)(!1);(0,d.useEffect)(()=>{!n.current&&t.viewportInitialized&&e&&(setTimeout(()=>e(t),1),n.current=!0)},[e,t.viewportInitialized])}(a),d.createElement(tD,{onPaneClick:X,onPaneMouseEnter:Y,onPaneMouseMove:W,onPaneMouseLeave:j,onPaneContextMenu:G,onPaneScroll:U,deleteKeyCode:A,selectionKeyCode:v,selectionOnDrag:w,selectionMode:M,onSelectionStart:f,onSelectionEnd:y,multiSelectionKeyCode:C,panActivationKeyCode:N,zoomActivationKeyCode:k,elementsSelectable:R,onMove:n,onMoveStart:o,onMoveEnd:r,zoomOnScroll:L,zoomOnPinch:H,zoomOnDoubleClick:K,panOnScroll:T,panOnScrollSpeed:F,panOnScrollMode:V,panOnDrag:Z,defaultViewport:$,translateExtent:_,minZoom:O,maxZoom:B,onSelectionContextMenu:m,preventScrolling:D,noDragClassName:ea,noWheelClassName:el,noPanClassName:ei,disableKeyboardA11y:ed},d.createElement(t3,null,d.createElement(t2,{edgeTypes:ep,onEdgeClick:i,onEdgeDoubleClick:c,onlyRenderVisibleElements:P,onEdgeContextMenu:q,onEdgeMouseEnter:Q,onEdgeMouseMove:J,onEdgeMouseLeave:ee,onReconnect:et,onReconnectStart:en,onReconnectEnd:eo,reconnectRadius:er,defaultMarkerColor:z,noPanClassName:ei,elevateEdgesOnSelect:!!es,disableKeyboardA11y:ed,rfId:eg},d.createElement(t6,{style:S,type:x,component:b,containerStyle:E})),d.createElement("div",{className:"react-flow__edgelabel-renderer"}),d.createElement(tT,{nodeTypes:eh,onNodeClick:l,onNodeDoubleClick:s,onNodeMouseEnter:u,onNodeMouseMove:g,onNodeMouseLeave:h,onNodeContextMenu:p,selectNodesOnDrag:I,onlyRenderVisibleElements:P,noPanClassName:ei,noDragClassName:ea,disableKeyboardA11y:ed,nodeOrigin:ec,nodeExtent:eu,rfId:eg})))};ne.displayName="GraphView";var nt=(0,d.memo)(ne);let nn=[[-1/0,-1/0],[1/0,1/0]],no={rfId:"1",width:0,height:0,transform:[0,0,1],nodeInternals:new Map,edges:[],onNodesChange:null,onEdgesChange:null,hasDefaultNodes:!1,hasDefaultEdges:!1,d3Zoom:null,d3Selection:null,d3ZoomHandler:void 0,minZoom:.5,maxZoom:2,translateExtent:nn,nodeExtent:nn,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionNodeId:null,connectionHandleId:null,connectionHandleType:"source",connectionPosition:{x:0,y:0},connectionStatus:null,connectionMode:o.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:[0,0],nodeDragThreshold:0,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesUpdatable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,fitViewOnInit:!1,fitViewOnInitDone:!1,fitViewOnInitOptions:void 0,onSelectionChange:[],multiSelectionActive:!1,connectionStartHandle:null,connectionEndHandle:null,connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,connectionRadius:20,onError:V,isValidConnection:void 0},nr=({children:e})=>{let t=(0,d.useRef)(null);return t.current||(t.current=(0,u.h)((e,t)=>({...no,setNodes:n=>{let{nodeInternals:o,nodeOrigin:r,elevateNodesOnSelect:a}=t();e({nodeInternals:e7(n,o,r,a)})},getNodes:()=>Array.from(t().nodeInternals.values()),setEdges:n=>{let{defaultEdgeOptions:o={}}=t();e({edges:n.map(e=>({...o,...e}))})},setDefaultNodesAndEdges:(n,o)=>{let r=void 0!==n,a=void 0!==o;e({nodeInternals:r?e7(n,new Map,t().nodeOrigin,t().elevateNodesOnSelect):new Map,edges:a?o:[],hasDefaultNodes:r,hasDefaultEdges:a})},updateNodeDimensions:n=>{let{onNodesChange:o,nodeInternals:r,fitViewOnInit:a,fitViewOnInitDone:l,fitViewOnInitOptions:i,domNode:s,nodeOrigin:d}=t(),c=s?.querySelector(".react-flow__viewport");if(!c)return;let u=window.getComputedStyle(c),{m22:g}=new window.DOMMatrixReadOnly(u.transform),h=n.reduce((e,t)=>{let n=r.get(t.id);if(n?.hidden)r.set(n.id,{...n,[T]:{...n[T],handleBounds:void 0}});else if(n){let o=k(t.nodeElement);o.width&&o.height&&(n.width!==o.width||n.height!==o.height||t.forceUpdate)&&(r.set(n.id,{...n,[T]:{...n[T],handleBounds:{source:tM(".source",t.nodeElement,g,d),target:tM(".target",t.nodeElement,g,d)}},...o}),e.push({id:n.id,type:"dimensions",dimensions:o}))}return e},[]);e4(r,d);let p=l||a&&!l&&e8(t,{initial:!0,...i});e({nodeInternals:new Map(r),fitViewOnInitDone:p}),h?.length>0&&o?.(h)},updateNodePositions:(e,n=!0,o=!1)=>{let{triggerNodeChanges:r}=t();r(e.map(e=>{let t={id:e.id,type:"position",dragging:o};return n&&(t.positionAbsolute=e.positionAbsolute,t.position=e.position),t}))},triggerNodeChanges:n=>{let{onNodesChange:o,nodeInternals:r,hasDefaultNodes:a,nodeOrigin:l,getNodes:i,elevateNodesOnSelect:s}=t();n?.length&&(a&&e({nodeInternals:e7(tm(n,i()),r,l,s)}),o?.(n))},addSelectedNodes:n=>{let o,{multiSelectionActive:r,edges:a,getNodes:l}=t(),i=null;r?o=n.map(e=>tf(e,!0)):(o=ty(l(),n),i=ty(a,[])),e6({changedNodes:o,changedEdges:i,get:t,set:e})},addSelectedEdges:n=>{let o,{multiSelectionActive:r,edges:a,getNodes:l}=t(),i=null;r?o=n.map(e=>tf(e,!0)):(o=ty(a,n),i=ty(l(),[])),e6({changedNodes:i,changedEdges:o,get:t,set:e})},unselectNodesAndEdges:({nodes:n,edges:o}={})=>{let{edges:r,getNodes:a}=t();e6({changedNodes:(n||a()).map(e=>(e.selected=!1,tf(e.id,!1))),changedEdges:(o||r).map(e=>tf(e.id,!1)),get:t,set:e})},setMinZoom:n=>{let{d3Zoom:o,maxZoom:r}=t();o?.scaleExtent([n,r]),e({minZoom:n})},setMaxZoom:n=>{let{d3Zoom:o,minZoom:r}=t();o?.scaleExtent([r,n]),e({maxZoom:n})},setTranslateExtent:n=>{t().d3Zoom?.translateExtent(n),e({translateExtent:n})},resetSelectedElements:()=>{let{edges:n,getNodes:o}=t();e6({changedNodes:o().filter(e=>e.selected).map(e=>tf(e.id,!1)),changedEdges:n.filter(e=>e.selected).map(e=>tf(e.id,!1)),get:t,set:e})},setNodeExtent:n=>{let{nodeInternals:o}=t();o.forEach(e=>{e.positionAbsolute=P(e.position,n)}),e({nodeExtent:n,nodeInternals:new Map(o)})},panBy:e=>{let{transform:n,width:o,height:r,d3Zoom:a,d3Selection:l,translateExtent:i}=t();if(!a||!l||!e.x&&!e.y)return!1;let s=h.GS.translate(n[0]+e.x,n[1]+e.y).scale(n[2]),d=a?.constrain()(s,[[0,0],[o,r]],i);return a.transform(l,d),n[0]!==d.x||n[1]!==d.y||n[2]!==d.k},cancelConnection:()=>e({connectionNodeId:no.connectionNodeId,connectionHandleId:no.connectionHandleId,connectionHandleType:no.connectionHandleType,connectionStatus:no.connectionStatus,connectionStartHandle:no.connectionStartHandle,connectionEndHandle:no.connectionEndHandle}),reset:()=>e({...no})}),Object.is)),d.createElement(x,{value:t.current},e)};nr.displayName="ReactFlowProvider";let na=({children:e})=>(0,d.useContext)(y)?d.createElement(d.Fragment,null,e):d.createElement(nr,null,e);na.displayName="ReactFlowWrapper";let nl={input:eB,default:e_,output:ez,group:eL},ni={default:ed,straight:ea,step:er,smoothstep:eo,simplebezier:Q},ns=[0,0],nd=[15,15],nc={x:0,y:0,zoom:1},nu={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0},ng=(0,d.forwardRef)(({nodes:e,edges:t,defaultNodes:n,defaultEdges:i,className:s,nodeTypes:u=nl,edgeTypes:g=ni,onNodeClick:h,onEdgeClick:p,onInit:m,onMove:f,onMoveStart:y,onMoveEnd:x,onConnect:S,onConnectStart:b,onConnectEnd:E,onClickConnectStart:v,onClickConnectEnd:w,onNodeMouseEnter:M,onNodeMouseMove:N,onNodeMouseLeave:k,onNodeContextMenu:A,onNodeDoubleClick:P,onNodeDragStart:R,onNodeDrag:I,onNodeDragStop:$,onNodesDelete:_,onEdgesDelete:O,onSelectionChange:B,onSelectionDragStart:D,onSelectionDrag:z,onSelectionDragStop:L,onSelectionContextMenu:H,onSelectionStart:T,onSelectionEnd:F,connectionMode:V=o.Strict,connectionLineType:K=l.Bezier,connectionLineStyle:Z,connectionLineComponent:Y,connectionLineContainerStyle:W,deleteKeyCode:j="Backspace",selectionKeyCode:U="Shift",selectionOnDrag:G=!1,selectionMode:q=a.Full,panActivationKeyCode:Q="Space",multiSelectionKeyCode:J=X()?"Meta":"Control",zoomActivationKeyCode:ee=X()?"Meta":"Control",snapToGrid:et=!1,snapGrid:en=nd,onlyRenderVisibleElements:eo=!1,selectNodesOnDrag:er=!0,nodesDraggable:ea,nodesConnectable:el,nodesFocusable:ei,nodeOrigin:es=ns,edgesFocusable:ed,edgesUpdatable:ec,elementsSelectable:eu,defaultViewport:eg=nc,minZoom:eh=.5,maxZoom:ep=2,translateExtent:em=nn,preventScrolling:ef=!0,nodeExtent:ey,defaultMarkerColor:ex="#b1b1b7",zoomOnScroll:eS=!0,zoomOnPinch:eb=!0,panOnScroll:eE=!1,panOnScrollSpeed:ev=.5,panOnScrollMode:ew=r.Free,zoomOnDoubleClick:eM=!0,panOnDrag:eC=!0,onPaneClick:eN,onPaneMouseEnter:ek,onPaneMouseMove:eA,onPaneMouseLeave:eP,onPaneScroll:eR,onPaneContextMenu:eI,children:e$,onEdgeContextMenu:e_,onEdgeDoubleClick:eO,onEdgeMouseEnter:eB,onEdgeMouseMove:eD,onEdgeMouseLeave:ez,onEdgeUpdate:eL,onEdgeUpdateStart:eH,onEdgeUpdateEnd:eT,onReconnect:eF,onReconnectStart:eV,onReconnectEnd:eK,reconnectRadius:eX=10,edgeUpdaterRadius:eY=10,onNodesChange:eW,onEdgesChange:eU,noDragClassName:eG="nodrag",noWheelClassName:eq="nowheel",noPanClassName:eQ="nopan",fitView:eJ=!1,fitViewOptions:e0,connectOnClick:e2=!0,attributionPosition:e5,proOptions:e3,defaultEdgeOptions:e4,elevateNodesOnSelect:e7=!0,elevateEdgesOnSelect:e8=!1,disableKeyboardA11y:e6=!1,autoPanOnConnect:e9=!0,autoPanOnNodeDrag:te=!0,connectionRadius:tt=20,isValidConnection:tn,onError:to,style:tr,id:ta,nodeDragThreshold:tl,...ti},ts)=>{let td=ta||"1";return d.createElement("div",{...ti,style:{...tr,...nu},ref:ts,className:(0,c.A)(["react-flow",s]),"data-testid":"rf__wrapper",id:ta},d.createElement(na,null,d.createElement(nt,{onInit:m,onMove:f,onMoveStart:y,onMoveEnd:x,onNodeClick:h,onEdgeClick:p,onNodeMouseEnter:M,onNodeMouseMove:N,onNodeMouseLeave:k,onNodeContextMenu:A,onNodeDoubleClick:P,nodeTypes:u,edgeTypes:g,connectionLineType:K,connectionLineStyle:Z,connectionLineComponent:Y,connectionLineContainerStyle:W,selectionKeyCode:U,selectionOnDrag:G,selectionMode:q,deleteKeyCode:j,multiSelectionKeyCode:J,panActivationKeyCode:Q,zoomActivationKeyCode:ee,onlyRenderVisibleElements:eo,selectNodesOnDrag:er,defaultViewport:eg,translateExtent:em,minZoom:eh,maxZoom:ep,preventScrolling:ef,zoomOnScroll:eS,zoomOnPinch:eb,zoomOnDoubleClick:eM,panOnScroll:eE,panOnScrollSpeed:ev,panOnScrollMode:ew,panOnDrag:eC,onPaneClick:eN,onPaneMouseEnter:ek,onPaneMouseMove:eA,onPaneMouseLeave:eP,onPaneScroll:eR,onPaneContextMenu:eI,onSelectionContextMenu:H,onSelectionStart:T,onSelectionEnd:F,onEdgeContextMenu:e_,onEdgeDoubleClick:eO,onEdgeMouseEnter:eB,onEdgeMouseMove:eD,onEdgeMouseLeave:ez,onReconnect:eF??eL,onReconnectStart:eV??eH,onReconnectEnd:eK??eT,reconnectRadius:eX??eY,defaultMarkerColor:ex,noDragClassName:eG,noWheelClassName:eq,noPanClassName:eQ,elevateEdgesOnSelect:e8,rfId:td,disableKeyboardA11y:e6,nodeOrigin:es,nodeExtent:ey}),d.createElement(ej,{nodes:e,edges:t,defaultNodes:n,defaultEdges:i,onConnect:S,onConnectStart:b,onConnectEnd:E,onClickConnectStart:v,onClickConnectEnd:w,nodesDraggable:ea,nodesConnectable:el,nodesFocusable:ei,edgesFocusable:ed,edgesUpdatable:ec,elementsSelectable:eu,elevateNodesOnSelect:e7,minZoom:eh,maxZoom:ep,nodeExtent:ey,onNodesChange:eW,onEdgesChange:eU,snapToGrid:et,snapGrid:en,connectionMode:V,translateExtent:em,connectOnClick:e2,defaultEdgeOptions:e4,fitView:eJ,fitViewOptions:e0,onNodesDelete:_,onEdgesDelete:O,onNodeDragStart:R,onNodeDrag:I,onNodeDragStop:$,onSelectionDrag:z,onSelectionDragStart:D,onSelectionDragStop:L,noPanClassName:eQ,nodeOrigin:es,rfId:td,autoPanOnConnect:e9,autoPanOnNodeDrag:te,onError:to,connectionRadius:tt,isValidConnection:tn,nodeDragThreshold:tl}),d.createElement(eZ,{onSelectionChange:B}),e$,d.createElement(C,{proOptions:e3,position:e5}),d.createElement(e1,{rfId:td,disableKeyboardA11y:e6})))});function nh(e){return t=>{let[n,o]=(0,d.useState)(t),r=(0,d.useCallback)(t=>o(n=>e(t,n)),[]);return[n,o,r]}}ng.displayName="ReactFlow";let np=nh(tm),nm=nh(function(e,t){return tp(e,t)})}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[197],{1223:(a,t,r)=>{r.d(t,{GLE:()=>g,H2l:()=>i,Q7K:()=>d,RQe:()=>h,Ykz:()=>o,e5t:()=>v,fZv:()=>Z,hX7:()=>u,tS8:()=>c,wiW:()=>e,xtx:()=>n,yBK:()=>f});var l=r(61895);function i(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"},child:[]}]})(a)}function c(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z"},child:[]}]})(a)}function n(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"},child:[]}]})(a)}function h(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z"},child:[]}]})(a)}function o(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"},child:[]}]})(a)}function e(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"},child:[]}]})(a)}function u(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"},child:[]}]})(a)}function d(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM128,72a12,12,0,1,0-12-12A12,12,0,0,0,128,72Zm0,112a12,12,0,1,0,12,12A12,12,0,0,0,128,184Z"},child:[]}]})(a)}function g(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"},child:[]}]})(a)}function Z(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},child:[]}]})(a)}function v(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"},child:[]}]})(a)}function f(a){return(0,l.k5)({tag:"svg",attr:{viewBox:"0 0 256 256",fill:"currentColor"},child:[{tag:"path",attr:{d:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"},child:[]}]})(a)}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[813],{29613:(h,t,v)=>{v.d(t,{Hsw:()=>l,xj_:()=>i});var a=v(61895);function i(h){return(0,a.k5)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M18 17h2v.5h-1v1h1v.5h-2v1h3v-4h-3zm1-9h1V4h-2v1h1zm-1 3h1.8L18 13.1v.9h3v-1h-1.8l1.8-2.1V10h-3zM2 5h14v2H2zm0 12h14v2H2zm0-6h14v2H2z"},child:[]}]})(h)}function l(h){return(0,a.k5)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M14 9v2h-3V9H8.5V7H11V1H4v6h2.5v2H4v6h2.5v2H4v6h7v-6H8.5v-2H11v-2h3v2h7V9h-7z"},child:[]}]})(h)}}}]);