@dyyz1993/agent-browser 0.9.2 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/__tests__/utils/parseCli.d.ts +1 -0
  2. package/dist/__tests__/utils/parseCli.d.ts.map +1 -1
  3. package/dist/__tests__/utils/parseCli.js +18 -10
  4. package/dist/__tests__/utils/parseCli.js.map +1 -1
  5. package/dist/actions.d.ts.map +1 -1
  6. package/dist/actions.js +63 -3
  7. package/dist/actions.js.map +1 -1
  8. package/dist/browser.d.ts +46 -2
  9. package/dist/browser.d.ts.map +1 -1
  10. package/dist/browser.js +343 -13
  11. package/dist/browser.js.map +1 -1
  12. package/dist/cli/commands.d.ts.map +1 -1
  13. package/dist/cli/commands.js +8 -3
  14. package/dist/cli/commands.js.map +1 -1
  15. package/dist/cli/connection.d.ts.map +1 -1
  16. package/dist/cli/connection.js +39 -1
  17. package/dist/cli/connection.js.map +1 -1
  18. package/dist/cli/help.d.ts.map +1 -1
  19. package/dist/cli/help.js +27 -20
  20. package/dist/cli/help.js.map +1 -1
  21. package/dist/cli/output.d.ts.map +1 -1
  22. package/dist/cli/output.js +5 -0
  23. package/dist/cli/output.js.map +1 -1
  24. package/dist/cli.js +20 -0
  25. package/dist/cli.js.map +1 -1
  26. package/dist/daemon.d.ts.map +1 -1
  27. package/dist/daemon.js +147 -1
  28. package/dist/daemon.js.map +1 -1
  29. package/dist/message-bridge.d.ts.map +1 -1
  30. package/dist/message-bridge.js +22 -4
  31. package/dist/message-bridge.js.map +1 -1
  32. package/dist/openapi.d.ts +22 -0
  33. package/dist/openapi.d.ts.map +1 -0
  34. package/dist/openapi.js +382 -0
  35. package/dist/openapi.js.map +1 -0
  36. package/dist/protocol.d.ts.map +1 -1
  37. package/dist/protocol.js +18 -0
  38. package/dist/protocol.js.map +1 -1
  39. package/dist/recorder/inject.js +61 -134
  40. package/dist/stream-server-standalone.d.ts +10 -0
  41. package/dist/stream-server-standalone.d.ts.map +1 -1
  42. package/dist/stream-server-standalone.js +594 -74
  43. package/dist/stream-server-standalone.js.map +1 -1
  44. package/dist/stream-server.d.ts +67 -2
  45. package/dist/stream-server.d.ts.map +1 -1
  46. package/dist/stream-server.js +371 -51
  47. package/dist/stream-server.js.map +1 -1
  48. package/dist/swagger-ui.d.ts +6 -0
  49. package/dist/swagger-ui.d.ts.map +1 -0
  50. package/dist/swagger-ui.js +51 -0
  51. package/dist/swagger-ui.js.map +1 -0
  52. package/dist/test-live.d.ts +2 -0
  53. package/dist/test-live.d.ts.map +1 -0
  54. package/dist/test-live.js +333 -0
  55. package/dist/test-live.js.map +1 -0
  56. package/dist/types.d.ts +7 -1
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/types.js.map +1 -1
  59. package/dist/viewer-html.d.ts.map +1 -1
  60. package/dist/viewer-html.js +270 -58
  61. package/dist/viewer-html.js.map +1 -1
  62. package/dist/viewer-script.d.ts +20 -2
  63. package/dist/viewer-script.d.ts.map +1 -1
  64. package/dist/viewer-script.js +911 -154
  65. package/dist/viewer-script.js.map +1 -1
  66. package/package.json +1 -1
  67. package/scripts/postinstall.js +6 -32
  68. package/scripts/test-cli-help.sh +51 -0
  69. package/scripts/verify-form.sh +67 -0
  70. package/scripts/verify-login.sh +65 -0
  71. package/scripts/verify-recording.sh +80 -0
  72. package/scripts/verify-upload.sh +41 -0
  73. package/skills/agent-browser/SKILL.md +297 -160
  74. package/skills/agent-browser/references/commands.md +3 -0
  75. package/skills/agent-browser/references/mobile-viewer.md +188 -0
  76. package/skills/agent-browser/references/network-monitoring.md +232 -0
  77. package/skills/agent-browser/references/recorder.md +319 -0
  78. package/skills/agent-browser/references/viewer-mode.md +148 -0
  79. package/skills/agent-browser/templates/api-interception.sh +3 -1
  80. package/skills/agent-browser/templates/data-extraction.sh +8 -4
  81. package/skills/agent-browser/templates/form-automation.sh +18 -23
  82. package/skills/agent-browser/templates/network-intercept-crawl.sh +256 -0
  83. package/skills/agent-browser/templates/recorder-workflow.sh +51 -0
  84. package/skills/agent-browser/templates/viewer-remote.sh +41 -0
  85. package/dist/__tests__/test-iframe.d.ts +0 -2
  86. package/dist/__tests__/test-iframe.d.ts.map +0 -1
  87. package/dist/__tests__/test-iframe.js +0 -52
  88. package/dist/__tests__/test-iframe.js.map +0 -1
  89. package/dist/cli-new.d.ts +0 -3
  90. package/dist/cli-new.d.ts.map +0 -1
  91. package/dist/cli-new.js +0 -308
  92. package/dist/cli-new.js.map +0 -1
  93. package/dist/cli-old.d.ts +0 -3
  94. package/dist/cli-old.d.ts.map +0 -1
  95. package/dist/cli-old.js +0 -1101
  96. package/dist/cli-old.js.map +0 -1
  97. package/dist/recorder/binding.d.ts +0 -24
  98. package/dist/recorder/binding.d.ts.map +0 -1
  99. package/dist/recorder/binding.js +0 -215
  100. package/dist/recorder/binding.js.map +0 -1
  101. package/dist/recorder/index.d.ts +0 -4
  102. package/dist/recorder/index.d.ts.map +0 -1
  103. package/dist/recorder/index.js +0 -4
  104. package/dist/recorder/index.js.map +0 -1
  105. package/dist/recorder/recorder.d.ts +0 -19
  106. package/dist/recorder/recorder.d.ts.map +0 -1
  107. package/dist/recorder/recorder.js +0 -101
  108. package/dist/recorder/recorder.js.map +0 -1
  109. package/dist/recorder/store.d.ts +0 -22
  110. package/dist/recorder/store.d.ts.map +0 -1
  111. package/dist/recorder/store.js +0 -150
  112. package/dist/recorder/store.js.map +0 -1
  113. package/dist/recorder/types.d.ts +0 -73
  114. package/dist/recorder/types.d.ts.map +0 -1
  115. package/dist/recorder/types.js +0 -5
  116. package/dist/recorder/types.js.map +0 -1
@@ -156,7 +156,7 @@
156
156
  }
157
157
 
158
158
  if (element.closest) {
159
- const recorderEl = element.closest('.xyzPnl, .xyzTb, .xyzSh, .xyzMk');
159
+ const recorderEl = element.closest('.xyzPnl, .xyzSh, .xyzMk');
160
160
  if (recorderEl) {
161
161
  highlightCache.set(element, { time: now, result: false });
162
162
  return false;
@@ -251,11 +251,6 @@
251
251
  return true;
252
252
  }
253
253
 
254
- const toolbar = document.querySelector('.xyzTb');
255
- if (toolbar && (element === toolbar || toolbar.contains(element))) {
256
- return true;
257
- }
258
-
259
254
  return false;
260
255
  }
261
256
 
@@ -1087,7 +1082,6 @@
1087
1082
  if (!isInIframe && !HIDE_UI) {
1088
1083
  let _animationFrameId = null;
1089
1084
  let _highlightRafId = null;
1090
- let _toolbarHideTimeout = null;
1091
1085
  let _pollInterval = null;
1092
1086
  let _checkPanelInterval = null;
1093
1087
 
@@ -1103,8 +1097,6 @@
1103
1097
  _highlightRafId = null;
1104
1098
  }
1105
1099
 
1106
- clearTimeout(_toolbarHideTimeout);
1107
-
1108
1100
  if (_pollInterval) {
1109
1101
  clearInterval(_pollInterval);
1110
1102
  _pollInterval = null;
@@ -1120,7 +1112,6 @@
1120
1112
  document.getElementById('xyzMk'),
1121
1113
  document.getElementById('xyzCv'),
1122
1114
  document.getElementById('xyzSh'),
1123
- document.getElementById('xyzTb'),
1124
1115
  document.getElementById('xyzSt')
1125
1116
  ];
1126
1117
 
@@ -1148,8 +1139,6 @@
1148
1139
  }
1149
1140
 
1150
1141
  let uiElements = {};
1151
- let toolbarHideTimeout = null;
1152
- let isOverToolbar = false;
1153
1142
  let currentElement = null;
1154
1143
  let mouseX = 0, mouseY = 0, currentEdge = null;
1155
1144
  const EDGE_THRESHOLD = 30;
@@ -1232,19 +1221,6 @@
1232
1221
  .xyzSh.login { border-color: #2196F3; background: rgba(33, 150, 243, 0.1); }
1233
1222
  .xyzSh.data { border-color: #FF9800; background: rgba(255, 152, 0, 0.1); }
1234
1223
  .xyzSh.pagination { border-color: #9C27B0; background: rgba(156, 39, 176, 0.1); }
1235
- .xyzTb { position: absolute; z-index: 2147483647; background: white; border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); padding: 4px; display: flex; gap: 2px; pointer-events: auto; }
1236
- .xyzTb.horizontal { flex-direction: row; }
1237
- .xyzTb.vertical { flex-direction: column; }
1238
- .xyzTb button { padding: 5px 8px; border: none; border-radius: 3px; cursor: pointer; font-size: 11px; white-space: nowrap; pointer-events: auto; }
1239
- .xyzTb button:hover { transform: scale(1.02); }
1240
- .xyzTb .btn-login { background: #E3F2FD; color: #1976D2; }
1241
- .xyzTb .btn-data { background: #FFF3E0; color: #F57C00; }
1242
- .xyzTb .btn-page { background: #F3E5F5; color: #7B1FA2; }
1243
- .xyzTb .btn-note { background: #E8F5E9; color: #388E3C; }
1244
- .xyzTb .btn-wait { background: #FFF8E1; color: #F9A825; }
1245
- .xyzTb .btn-container { background: #E0F7FA; color: #00838F; }
1246
- .xyzTb .btn-item { background: #FFF3E0; color: #F57C00; }
1247
- .xyzTb .btn-check { background: #E8F5E9; color: #2E7D32; }
1248
1224
  .xyzMk { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 2147483645; }
1249
1225
  .xyzMrk { position: absolute; pointer-events: none; border: 2px solid rgba(76, 175, 80, 0.6); border-radius: 4px; transition: all 0.2s ease-out; }
1250
1226
  .xyzMrk.login { border-color: rgba(33, 150, 243, 0.8); }
@@ -1419,23 +1395,7 @@
1419
1395
  shadowBox.setAttribute('aria-hidden', 'true');
1420
1396
  document.body.appendChild(shadowBox);
1421
1397
 
1422
- const toolbar = document.createElement('div');
1423
- toolbar.className = 'xyzTb';
1424
- toolbar.id = 'xyzTb';
1425
- toolbar.setAttribute('aria-hidden', 'true');
1426
- toolbar.innerHTML = `
1427
- <button class="btn-wait" data-type="wait_element">⏳ Wait</button>
1428
- <button class="btn-container" data-type="data_container">📦 Container</button>
1429
- <button class="btn-item" data-type="data_item">📊 Item</button>
1430
- <button class="btn-page" data-type="pagination">📄 Page</button>
1431
- <button class="btn-login" data-type="login_check">🔐 Login</button>
1432
- <button class="btn-check" data-type="checkpoint">✅ Check</button>
1433
- <button class="btn-note" data-type="custom">📝 Note</button>
1434
- `;
1435
- toolbar.style.display = 'none';
1436
- document.body.appendChild(toolbar);
1437
-
1438
- uiElements = { panel, markersContainer, canvas, shadowBox, toolbar, style };
1398
+ uiElements = { panel, markersContainer, canvas, shadowBox, style };
1439
1399
 
1440
1400
  function updateUI() {
1441
1401
  const container = document.getElementById('xyzSteps');
@@ -1646,55 +1606,6 @@
1646
1606
  shadowBox.className = 'xyzSh' + (annotation ? ' ' + annotation.type : '');
1647
1607
  }
1648
1608
 
1649
- function calculateToolbarPosition(rect) {
1650
- const GAP = 10;
1651
- const TOOLBAR_W = 280;
1652
- const TOOLBAR_H = 32;
1653
- const scrollX = window.scrollX, scrollY = window.scrollY;
1654
-
1655
- let left = mouseX + GAP;
1656
- let top = mouseY + GAP;
1657
-
1658
- if (left + TOOLBAR_W > window.innerWidth - 10) {
1659
- left = mouseX - TOOLBAR_W - GAP;
1660
- }
1661
- if (top + TOOLBAR_H > window.innerHeight - 10) {
1662
- top = mouseY - TOOLBAR_H - GAP;
1663
- }
1664
-
1665
- left = Math.max(10, Math.min(window.innerWidth - TOOLBAR_W - 10, left));
1666
- top = Math.max(10, Math.min(window.innerHeight - TOOLBAR_H - 10, top));
1667
-
1668
- return { left: left + scrollX, top: top + scrollY, orientation: 'horizontal' };
1669
- }
1670
-
1671
- function updateToolbar(element) {
1672
- if (!element) {
1673
- toolbar.style.display = 'none';
1674
- return;
1675
- }
1676
- const rect = element.getBoundingClientRect();
1677
- const pos = calculateToolbarPosition(rect);
1678
- toolbar.style.left = pos.left + 'px';
1679
- toolbar.style.top = pos.top + 'px';
1680
- toolbar.className = 'xyzTb ' + pos.orientation;
1681
- toolbar.style.display = 'flex';
1682
- }
1683
-
1684
- function showToolbar() {
1685
- clearTimeout(toolbarHideTimeout);
1686
- toolbar.style.display = 'flex';
1687
- }
1688
-
1689
- function hideToolbarDelayed() {
1690
- clearTimeout(toolbarHideTimeout);
1691
- toolbarHideTimeout = setTimeout(() => {
1692
- if (!isOverToolbar) {
1693
- toolbar.style.display = 'none';
1694
- }
1695
- }, TOOLBAR_HIDE_DELAY);
1696
- }
1697
-
1698
1609
  function annotateElement(element, type) {
1699
1610
  if (!element) return;
1700
1611
  const selector = getSelector(element);
@@ -1748,23 +1659,6 @@
1748
1659
  updateShadowBox(element);
1749
1660
  }
1750
1661
 
1751
- toolbar.addEventListener('mouseenter', () => {
1752
- isOverToolbar = true;
1753
- showToolbar();
1754
- });
1755
-
1756
- toolbar.addEventListener('mouseleave', () => {
1757
- isOverToolbar = false;
1758
- hideToolbarDelayed();
1759
- });
1760
-
1761
- toolbar.querySelectorAll('button').forEach(btn => {
1762
- btn.addEventListener('click', (e) => {
1763
- e.stopPropagation();
1764
- annotateElement(currentElement, btn.dataset.type);
1765
- });
1766
- });
1767
-
1768
1662
  let lastHighlightTime = 0;
1769
1663
 
1770
1664
  function throttledHighlight(element) {
@@ -1777,20 +1671,17 @@
1777
1671
  highlightRafId = requestAnimationFrame(() => {
1778
1672
  highlightRafId = null;
1779
1673
  updateShadowBox(pendingHighlightElement);
1780
- updateToolbar(pendingHighlightElement);
1781
1674
  });
1782
1675
  }
1783
1676
  }
1784
1677
  }
1785
1678
 
1786
1679
  document.addEventListener('mousemove', (e) => {
1787
- if (isOverToolbar) return;
1788
-
1789
1680
  const element = e.composedPath()[0] || e.target;
1790
1681
  mouseX = e.clientX;
1791
1682
  mouseY = e.clientY;
1792
1683
 
1793
- if (element === shadowBox || element === toolbar || toolbar.contains(element)) return;
1684
+ if (element === shadowBox) return;
1794
1685
  if (isInPanel(element)) {
1795
1686
  throttledHighlight(null);
1796
1687
  return;
@@ -1880,34 +1771,70 @@
1880
1771
  createRecorderOverlay();
1881
1772
  }, 0);
1882
1773
 
1883
- // 监听页面变化
1884
- let lastUrl = window.location.href;
1885
- _checkPanelInterval = setInterval(() => {
1886
- if (window.xyzStopped) {
1887
- console.log('[Panel] Session was stopped, removing panel');
1888
- if (typeof window.xyzClose === 'function') {
1889
- window.xyzClose();
1774
+ // ============ 鵘化版面板恢复机制 (使用 MutationObserver) ============
1775
+
1776
+ // 使用 MutationObserver 替代 setInterval 来实时检测面板是否消失
1777
+ // 这比轮询更高效, 可以立即恢复面板, 不占用主线程
1778
+ let panelObserver = null;
1779
+
1780
+ function startPanelObserver() {
1781
+ if (panelObserver) {
1782
+ panelObserver.disconnect();
1783
+ }
1784
+
1785
+ // 监听 document.body 的子元素变化
1786
+ panelObserver = new MutationObserver((mutations) => {
1787
+ // 检查录制会话是否已停止
1788
+ if (window.xyzStopped) {
1789
+ console.log('[Panel] Session was stopped, removing observer');
1790
+ if (typeof window.xyzClose === 'function') {
1791
+ window.xyzClose();
1792
+ }
1793
+ if (panelObserver) {
1794
+ panelObserver.disconnect();
1795
+ panelObserver = null;
1796
+ }
1797
+ return;
1890
1798
  }
1891
- clearInterval(_checkPanelInterval);
1892
- _checkPanelInterval = null;
1799
+
1800
+ // 检查录制会话是否激活
1801
+ if (!window.xyzActive) {
1802
+ console.log('[Panel] Session not active, skipping panel check');
1803
+ return;
1804
+ }
1805
+
1806
+ // 检查面板是否存在
1807
+ const panel = document.getElementById('xyzPnl');
1808
+ const style = document.getElementById('xyzSt');
1809
+ if (document.body && (!panel || !style)) {
1810
+ console.log('[Panel] Panel or style missing, recreating...');
1811
+ createRecorderOverlay();
1812
+ }
1813
+ });
1814
+
1815
+ // 启动观察器
1816
+ panelObserver.observe(document.body, {
1817
+ childList: true,
1818
+ subtree: false
1819
+ });
1820
+
1821
+ console.log('[Panel] MutationObserver started, watching for panel removal');
1822
+ }
1823
+
1824
+ // 延迟创建面板(保持与原逻辑兼容)
1825
+ setTimeout(() => {
1826
+ if (window.xyzStopped) {
1827
+ console.log('[Panel] Session was stopped during init, skipping panel creation');
1893
1828
  return;
1894
1829
  }
1895
-
1896
1830
  if (!window.xyzActive) {
1897
- clearInterval(_checkPanelInterval);
1898
- _checkPanelInterval = null;
1831
+ console.log('[Panel] Session not active during init, skipping panel creation');
1899
1832
  return;
1900
1833
  }
1834
+ createRecorderOverlay();
1835
+ }, 0);
1901
1836
 
1902
- if (window.location.href !== lastUrl) {
1903
- lastUrl = window.location.href;
1904
- }
1905
-
1906
- const panel = document.getElementById('xyzPnl');
1907
- const style = document.getElementById('xyzSt');
1908
- if (document.body && (!panel || !style)) {
1909
- createRecorderOverlay();
1910
- }
1911
- }, 1000);
1837
+ // 启动 MutationObserver
1838
+ startPanelObserver();
1912
1839
  }
1913
1840
  })();
@@ -1,3 +1,4 @@
1
+ import { BrowserManager } from './browser.js';
1
2
  export declare function getStreamPort(): number;
2
3
  declare class StreamServerStandalone {
3
4
  private wss;
@@ -7,15 +8,20 @@ declare class StreamServerStandalone {
7
8
  private sessions;
8
9
  private clients;
9
10
  private daemonSockets;
11
+ private outboundSockets;
10
12
  private frameBuffers;
11
13
  private instanceIdToSession;
12
14
  private latestFrames;
15
+ private clientStates;
16
+ browser?: BrowserManager;
13
17
  constructor(port?: number);
14
18
  private checkPortAvailable;
15
19
  start(): Promise<void>;
16
20
  private startServer;
17
21
  private handleWebSocketConnection;
18
22
  private handleClientMessage;
23
+ private requestElementBox;
24
+ private sendCroppedFrame;
19
25
  private startIpcServer;
20
26
  private handleIpcConnection;
21
27
  private handleIpcMessage;
@@ -24,6 +30,10 @@ declare class StreamServerStandalone {
24
30
  private broadcastStatus;
25
31
  private sendStatus;
26
32
  private getTotalClientCount;
33
+ /**
34
+ * Send a command to the daemon via Unix socket and return the response
35
+ */
36
+ private sendCommandToDaemon;
27
37
  private getPidFile;
28
38
  private getIpcPath;
29
39
  private writePidFile;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-server-standalone.d.ts","sourceRoot":"","sources":["../src/stream-server-standalone.ts"],"names":[],"mappings":"AAYA,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA4BD,cAAM,sBAAsB;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,YAAY,CAA4D;gBAEpE,IAAI,GAAE,MAA4B;YAIhC,kBAAkB;IA6B1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBd,WAAW;IAuEzB,OAAO,CAAC,yBAAyB;IA+EjC,OAAO,CAAC,mBAAmB;YA0Bb,cAAc;IAuB5B,OAAO,CAAC,mBAAmB;IAuC3B,OAAO,CAAC,gBAAgB;IA+CxB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,qBAAqB;IAuCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB5B;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"stream-server-standalone.d.ts","sourceRoot":"","sources":["../src/stream-server-standalone.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAM9C,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAyCD,cAAM,sBAAsB;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,YAAY,CAA4D;IAChF,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,EAAE,cAAc,CAAC;gBAEb,IAAI,GAAE,MAA4B;YAIhC,kBAAkB;IA6B1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBd,WAAW;IAwJzB,OAAO,CAAC,yBAAyB;IAkHjC,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,iBAAiB;YAkBX,gBAAgB;YA6EhB,cAAc;IAuB5B,OAAO,CAAC,mBAAmB;YAsCb,gBAAgB;IA8F9B,OAAO,CAAC,eAAe;YA4GT,cAAc;IAiI5B,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,mBAAmB;IAkEjC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,qBAAqB;IAuCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB5B;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}