@midscene/visualizer 0.0.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 (92) hide show
  1. package/.eslintrc.js +9 -0
  2. package/README.md +24 -0
  3. package/dist/es/assets/logo-plain.16842bbc.svg +70 -0
  4. package/dist/es/assets/logo-plain2.16842bbc.svg +70 -0
  5. package/dist/es/component/blackboard.css +25 -0
  6. package/dist/es/component/blackboard.js +256 -0
  7. package/dist/es/component/color.js +34 -0
  8. package/dist/es/component/common.css +0 -0
  9. package/dist/es/component/detail-panel.css +34 -0
  10. package/dist/es/component/detail-panel.js +106 -0
  11. package/dist/es/component/detail-side.css +99 -0
  12. package/dist/es/component/detail-side.js +285 -0
  13. package/dist/es/component/global-hover-preview.css +19 -0
  14. package/dist/es/component/global-hover-preview.js +44 -0
  15. package/dist/es/component/misc.js +24 -0
  16. package/dist/es/component/panel-title.css +8 -0
  17. package/dist/es/component/panel-title.js +9 -0
  18. package/dist/es/component/side-item.js +0 -0
  19. package/dist/es/component/sidebar.css +87 -0
  20. package/dist/es/component/sidebar.js +175 -0
  21. package/dist/es/component/store.js +128 -0
  22. package/dist/es/component/timeline.css +18 -0
  23. package/dist/es/component/timeline.js +438 -0
  24. package/dist/es/index.css +89 -0
  25. package/dist/es/index.js +174 -0
  26. package/dist/es/utils.js +76 -0
  27. package/dist/lib/assets/logo-plain.16842bbc.svg +70 -0
  28. package/dist/lib/assets/logo-plain2.16842bbc.svg +70 -0
  29. package/dist/lib/component/blackboard.css +25 -0
  30. package/dist/lib/component/blackboard.js +286 -0
  31. package/dist/lib/component/color.js +59 -0
  32. package/dist/lib/component/common.css +0 -0
  33. package/dist/lib/component/detail-panel.css +34 -0
  34. package/dist/lib/component/detail-panel.js +136 -0
  35. package/dist/lib/component/detail-side.css +99 -0
  36. package/dist/lib/component/detail-side.js +313 -0
  37. package/dist/lib/component/global-hover-preview.css +19 -0
  38. package/dist/lib/component/global-hover-preview.js +64 -0
  39. package/dist/lib/component/misc.js +48 -0
  40. package/dist/lib/component/panel-title.css +8 -0
  41. package/dist/lib/component/panel-title.js +29 -0
  42. package/dist/lib/component/side-item.js +1 -0
  43. package/dist/lib/component/sidebar.css +87 -0
  44. package/dist/lib/component/sidebar.js +198 -0
  45. package/dist/lib/component/store.js +153 -0
  46. package/dist/lib/component/timeline.css +18 -0
  47. package/dist/lib/component/timeline.js +466 -0
  48. package/dist/lib/index.css +89 -0
  49. package/dist/lib/index.js +202 -0
  50. package/dist/lib/utils.js +111 -0
  51. package/dist/types/component/blackboard.d.ts +4 -0
  52. package/dist/types/component/color.d.ts +2 -0
  53. package/dist/types/component/detail-panel.d.ts +4 -0
  54. package/dist/types/component/detail-side.d.ts +4 -0
  55. package/dist/types/component/global-hover-preview.d.ts +4 -0
  56. package/dist/types/component/misc.d.ts +2 -0
  57. package/dist/types/component/panel-title.d.ts +6 -0
  58. package/dist/types/component/side-item.d.ts +0 -0
  59. package/dist/types/component/sidebar.d.ts +4 -0
  60. package/dist/types/component/store.d.ts +35 -0
  61. package/dist/types/component/timeline.d.ts +4 -0
  62. package/dist/types/index.d.ts +4 -0
  63. package/dist/types/utils.d.ts +5 -0
  64. package/docs/index.tsx +6 -0
  65. package/modern.config.ts +15 -0
  66. package/package.json +46 -0
  67. package/src/component/assets/logo-plain.svg +70 -0
  68. package/src/component/assets/logo-plain2.svg +70 -0
  69. package/src/component/blackboard.less +37 -0
  70. package/src/component/blackboard.tsx +293 -0
  71. package/src/component/color.tsx +34 -0
  72. package/src/component/common.less +21 -0
  73. package/src/component/detail-panel.less +47 -0
  74. package/src/component/detail-panel.tsx +124 -0
  75. package/src/component/detail-side.less +131 -0
  76. package/src/component/detail-side.tsx +361 -0
  77. package/src/component/global-hover-preview.less +23 -0
  78. package/src/component/global-hover-preview.tsx +50 -0
  79. package/src/component/misc.tsx +20 -0
  80. package/src/component/panel-title.less +11 -0
  81. package/src/component/panel-title.tsx +11 -0
  82. package/src/component/side-item.tsx +0 -0
  83. package/src/component/sidebar.less +122 -0
  84. package/src/component/sidebar.tsx +205 -0
  85. package/src/component/store.tsx +151 -0
  86. package/src/component/timeline.less +25 -0
  87. package/src/component/timeline.tsx +486 -0
  88. package/src/global.d.ts +11 -0
  89. package/src/index.less +113 -0
  90. package/src/index.tsx +210 -0
  91. package/src/utils.ts +58 -0
  92. package/tsconfig.json +24 -0
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var src_exports = {};
47
+ __export(src_exports, {
48
+ default: () => src_default
49
+ });
50
+ module.exports = __toCommonJS(src_exports);
51
+ var import_jsx_runtime = require("react/jsx-runtime");
52
+ var import_index = require("./index.css");
53
+ var import_antd = require("antd");
54
+ var import_react = require("react");
55
+ var import_head = require("@modern-js/runtime/head");
56
+ var import_react_resizable_panels = require("react-resizable-panels");
57
+ var import_timeline = __toESM(require("./component/timeline"));
58
+ var import_detail_panel = __toESM(require("./component/detail-panel"));
59
+ var import_logo_plain_16842bbc = __toESM(require("./assets/logo-plain.16842bbc.svg"));
60
+ var import_global_hover_preview = __toESM(require("./component/global-hover-preview"));
61
+ var import_store = require("./component/store");
62
+ var import_detail_side = __toESM(require("./component/detail-side"));
63
+ var import_sidebar = __toESM(require("./component/sidebar"));
64
+ const { Dragger } = import_antd.Upload;
65
+ const Index = () => {
66
+ const executionDump = (0, import_store.useExecutionDump)((store) => store.dump);
67
+ const setGroupedDump = (0, import_store.useExecutionDump)((store) => store.setGroupedDump);
68
+ const reset = (0, import_store.useExecutionDump)((store) => store.reset);
69
+ const [mainLayoutChangeFlag, setMainLayoutChangeFlag] = (0, import_react.useState)(0);
70
+ const mainLayoutChangedRef = (0, import_react.useRef)(false);
71
+ (0, import_react.useEffect)(() => {
72
+ return () => {
73
+ reset();
74
+ };
75
+ }, []);
76
+ (0, import_react.useEffect)(() => {
77
+ const onResize = () => {
78
+ setMainLayoutChangeFlag((prev) => prev + 1);
79
+ };
80
+ window.addEventListener("resize", onResize);
81
+ return () => {
82
+ window.removeEventListener("resize", onResize);
83
+ };
84
+ }, []);
85
+ const uploadProps = {
86
+ name: "file",
87
+ multiple: false,
88
+ capture: false,
89
+ customRequest: () => {
90
+ },
91
+ beforeUpload(file) {
92
+ const ifValidFile = file.name.endsWith("web-dump.json");
93
+ if (!ifValidFile) {
94
+ import_antd.message.error("invalid file extension");
95
+ return false;
96
+ }
97
+ const reader = new FileReader();
98
+ reader.readAsText(file);
99
+ reader.onload = (e) => {
100
+ var _a;
101
+ const result = (_a = e.target) == null ? void 0 : _a.result;
102
+ if (typeof result === "string") {
103
+ try {
104
+ const data = JSON.parse(result);
105
+ setGroupedDump(data);
106
+ } catch (e2) {
107
+ console.error(e2);
108
+ import_antd.message.error("failed to parse dump data", e2.message);
109
+ }
110
+ } else {
111
+ import_antd.message.error("Invalid dump file");
112
+ }
113
+ };
114
+ return false;
115
+ }
116
+ };
117
+ const loadTasksDemo = () => {
118
+ };
119
+ const loadInsightDemo = () => {
120
+ };
121
+ let mainContent;
122
+ if (!executionDump) {
123
+ mainContent = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "main-right uploader-wrapper", children: [
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Dragger, __spreadProps(__spreadValues({ className: "uploader" }, uploadProps), { children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "ant-upload-drag-icon", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: import_logo_plain_16842bbc.default, alt: "Logo", style: { width: 100, height: 100, margin: "auto" } }) }),
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "ant-upload-text", children: [
127
+ "Click or drag the",
128
+ " ",
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", { children: ".web-dump.json" }) }),
130
+ " ",
131
+ "file into this area."
132
+ ] }),
133
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "ant-upload-text", children: [
134
+ "The latest dump file is usually placed in",
135
+ " ",
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", { children: "./midscene_run/" }) })
137
+ ] }),
138
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "ant-upload-text", children: "All data will be processed locally by the browser. No data will be sent to the server." })
139
+ ] })),
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "demo-loader", children: [
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "link", onClick: loadTasksDemo, children: "Load Tasks Demo" }),
142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Button, { type: "link", onClick: loadInsightDemo, children: "Load Insight Demo" })
143
+ ] })
144
+ ] });
145
+ } else {
146
+ mainContent = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
147
+ import_react_resizable_panels.PanelGroup,
148
+ {
149
+ autoSaveId: "main-page-layout",
150
+ direction: "horizontal",
151
+ onLayout: () => {
152
+ if (!mainLayoutChangedRef.current) {
153
+ setMainLayoutChangeFlag((prev) => prev + 1);
154
+ }
155
+ },
156
+ children: [
157
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_resizable_panels.Panel, { maxSize: 95, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sidebar.default, {}) }),
158
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
159
+ import_react_resizable_panels.PanelResizeHandle,
160
+ {
161
+ onDragging: (isChanging) => {
162
+ if (mainLayoutChangedRef.current && !isChanging) {
163
+ setMainLayoutChangeFlag((prev) => prev + 1);
164
+ }
165
+ mainLayoutChangedRef.current = isChanging;
166
+ }
167
+ }
168
+ ),
169
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_resizable_panels.Panel, { defaultSize: 80, maxSize: 95, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "main-right", children: [
170
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_timeline.default, {}, mainLayoutChangeFlag),
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "main-content", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react_resizable_panels.PanelGroup, { autoSaveId: "page-detail-layout", direction: "horizontal", children: [
172
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_resizable_panels.Panel, { maxSize: 95, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "main-side", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_detail_side.default, {}) }) }),
173
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_resizable_panels.PanelResizeHandle, {}),
174
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_resizable_panels.Panel, { defaultSize: 75, maxSize: 95, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "main-canvas-container", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_detail_panel.default, {}) }) })
175
+ ] }) })
176
+ ] }) })
177
+ ]
178
+ }
179
+ );
180
+ }
181
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
182
+ import_antd.ConfigProvider,
183
+ {
184
+ theme: {
185
+ components: {
186
+ Layout: {
187
+ headerHeight: 60,
188
+ headerPadding: "0 30px",
189
+ headerBg: "#FFF",
190
+ bodyBg: "#FFF"
191
+ }
192
+ }
193
+ },
194
+ children: [
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_head.Helmet, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("title", { children: "MidScene.js - Visualization Tool" }) }),
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "page-container", children: mainContent }),
197
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_global_hover_preview.default, {})
198
+ ]
199
+ }
200
+ );
201
+ };
202
+ var src_default = Index;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var utils_exports = {};
47
+ __export(utils_exports, {
48
+ filterBase64Value: () => filterBase64Value,
49
+ insightDumpToExecutionDump: () => insightDumpToExecutionDump,
50
+ timeStr: () => timeStr,
51
+ typeStr: () => typeStr
52
+ });
53
+ module.exports = __toCommonJS(utils_exports);
54
+ var import_dayjs = __toESM(require("dayjs"));
55
+ function insightDumpToExecutionDump(insightDump) {
56
+ const insightToTask = (insightDump2) => {
57
+ var _a, _b;
58
+ const task = {
59
+ type: "Insight",
60
+ subType: insightDump2.type === "locate" ? "Locate" : "Query",
61
+ status: insightDump2.error ? "fail" : "success",
62
+ param: __spreadProps(__spreadValues(__spreadValues({}, insightDump2.userQuery.element ? { query: insightDump2.userQuery } : {}), insightDump2.userQuery.dataDemand ? { dataDemand: insightDump2.userQuery.dataDemand } : {}), {
63
+ insight: {}
64
+ }),
65
+ log: {
66
+ dump: insightDump2
67
+ },
68
+ timing: {
69
+ end: insightDump2.logTime,
70
+ cost: (_a = insightDump2.taskInfo) == null ? void 0 : _a.durationMs,
71
+ start: insightDump2.logTime - ((_b = insightDump2.taskInfo) == null ? void 0 : _b.durationMs)
72
+ },
73
+ executor: () => {
74
+ }
75
+ };
76
+ return task;
77
+ };
78
+ if (!Array.isArray(insightDump)) {
79
+ const result = {
80
+ sdkVersion: insightDump.sdkVersion,
81
+ logTime: insightDump.logTime,
82
+ name: "Insight",
83
+ tasks: [insightToTask(insightDump)]
84
+ };
85
+ return result;
86
+ } else {
87
+ const result = {
88
+ sdkVersion: insightDump[0].sdkVersion,
89
+ logTime: insightDump[0].logTime,
90
+ name: "Insight",
91
+ tasks: insightDump.map(insightToTask)
92
+ };
93
+ return result;
94
+ }
95
+ }
96
+ function timeStr(timestamp) {
97
+ return timestamp ? (0, import_dayjs.default)(timestamp).format("YYYY-MM-DD HH:mm:ss") : "-";
98
+ }
99
+ function typeStr(task) {
100
+ return task.subType ? `${task.type} / ${task.subType || ""}` : task.type;
101
+ }
102
+ function filterBase64Value(input) {
103
+ return input.replace(/data:image\/[^"]+"/g, 'data:image..."');
104
+ }
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ filterBase64Value,
108
+ insightDumpToExecutionDump,
109
+ timeStr,
110
+ typeStr
111
+ });
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './blackboard.less';
3
+ declare const BlackBoard: () => JSX.Element;
4
+ export default BlackBoard;
@@ -0,0 +1,2 @@
1
+ export declare function colorForName(type: 'section' | 'element', name: string): string;
2
+ export declare function highlightColorForType(type: 'section' | 'element'): string;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './detail-panel.less';
3
+ declare const DetailPanel: () => JSX.Element;
4
+ export default DetailPanel;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './detail-side.less';
3
+ declare const DetailSide: () => JSX.Element;
4
+ export default DetailSide;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './global-hover-preview.less';
3
+ declare const GlobalHoverPreview: () => import("react").JSX.Element | null;
4
+ export default GlobalHoverPreview;
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare function timeCostStrElement(timeCost?: number): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import './panel-title.less';
3
+ declare const PanelTitle: (props: {
4
+ title: string;
5
+ }) => JSX.Element;
6
+ export default PanelTitle;
File without changes
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './sidebar.less';
3
+ declare const Sidebar: () => JSX.Element;
4
+ export default Sidebar;
@@ -0,0 +1,35 @@
1
+ import { InsightDump, BaseElement, ExecutionTask, GroupedActionDump } from '../../../midscene/dist/types';
2
+ export declare const useBlackboardPreference: import("zustand").UseBoundStore<import("zustand").StoreApi<{
3
+ bgVisible: boolean;
4
+ textsVisible: boolean;
5
+ setBgVisible: (visible: boolean) => void;
6
+ setTextsVisible: (visible: boolean) => void;
7
+ }>>;
8
+ export declare const useExecutionDump: import("zustand").UseBoundStore<import("zustand").StoreApi<{
9
+ dump: GroupedActionDump[] | null;
10
+ setGroupedDump: (dump: GroupedActionDump[]) => void;
11
+ activeTask: ExecutionTask | null;
12
+ setActiveTask: (task: ExecutionTask) => void;
13
+ hoverTask: ExecutionTask | null;
14
+ setHoverTask: (task: ExecutionTask | null) => void;
15
+ hoverPreviewConfig: {
16
+ x: number;
17
+ y: number;
18
+ } | null;
19
+ setHoverPreviewConfig: (config: {
20
+ x: number;
21
+ y: number;
22
+ } | null) => void;
23
+ reset: () => void;
24
+ }>>;
25
+ export declare const useAllCurrentTasks: () => ExecutionTask[];
26
+ export declare const useInsightDump: import("zustand").UseBoundStore<import("zustand").StoreApi<{
27
+ _loadId: number;
28
+ data: InsightDump | null;
29
+ highlightSectionNames: string[];
30
+ setHighlightSectionNames: (sections: string[]) => void;
31
+ highlightElements: BaseElement[];
32
+ setHighlightElements: (elements: BaseElement[]) => void;
33
+ loadData: (data: InsightDump) => void;
34
+ reset: () => void;
35
+ }>>;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './timeline.less';
3
+ declare const Timeline: () => import("react").JSX.Element;
4
+ export default Timeline;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import './index.less';
3
+ declare const Index: () => JSX.Element;
4
+ export default Index;
@@ -0,0 +1,5 @@
1
+ import type { ExecutionDump, InsightDump, ExecutionTask } from '@midscene/core';
2
+ export declare function insightDumpToExecutionDump(insightDump: InsightDump | InsightDump[]): ExecutionDump;
3
+ export declare function timeStr(timestamp?: number): string;
4
+ export declare function typeStr(task: ExecutionTask): any;
5
+ export declare function filterBase64Value(input: string): string;
package/docs/index.tsx ADDED
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import Tool from '@/index';
3
+
4
+ export default () => {
5
+ return <Tool />;
6
+ };
@@ -0,0 +1,15 @@
1
+ import { moduleTools, defineConfig } from '@modern-js/module-tools';
2
+ import { modulePluginDoc } from '@modern-js/plugin-module-doc';
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ moduleTools(),
7
+ modulePluginDoc({
8
+ doc: {
9
+ sidebar: false,
10
+ hideNavbar: true,
11
+ },
12
+ }),
13
+ ],
14
+ buildPreset: 'npm-component',
15
+ });
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@midscene/visualizer",
3
+ "version": "0.0.1",
4
+ "types": "./dist/types/index.d.ts",
5
+ "jsnext:source": "./src/index.ts",
6
+ "main": "./dist/lib/index.js",
7
+ "module": "./dist/es/index.js",
8
+ "dependencies": {
9
+ "@ant-design/icons": "5.3.7",
10
+ "@modern-js/runtime": "^2.54.2",
11
+ "antd": "5.17.3",
12
+ "dayjs": "1.11.11",
13
+ "pixi.js": "8.1.1",
14
+ "react": "~18.2.0",
15
+ "react-dom": "~18.2.0",
16
+ "react-resizable-panels": "2.0.22",
17
+ "zustand": "4.5.2",
18
+ "@midscene/core": "0.0.1"
19
+ },
20
+ "devDependencies": {
21
+ "@modern-js/module-tools": "^2.54.2",
22
+ "@modern-js/plugin-module-doc": "^2.33.1",
23
+ "@types/react": "~18.2.22",
24
+ "@types/react-dom": "~18.2.7",
25
+ "react": "~18.2.0",
26
+ "react-dom": "~18.2.0",
27
+ "rimraf": "~3.0.2",
28
+ "typescript": "~5.0.4"
29
+ },
30
+ "sideEffects": [
31
+ "**/*.css",
32
+ "**/*.less",
33
+ "**/*.sass",
34
+ "**/*.scss"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "scripts": {
40
+ "dev": "modern dev",
41
+ "build": "modern build",
42
+ "build:watch": "modern build -w",
43
+ "new": "modern new",
44
+ "upgrade": "modern upgrade"
45
+ }
46
+ }
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <!-- Creator: CorelDRAW 2019 (64-Bit) -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="141.563mm" height="53.8692mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
5
+ viewBox="0 0 16897.65 6430.11"
6
+ xmlns:xlink="http://www.w3.org/1999/xlink"
7
+ xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
8
+ <defs>
9
+ <style type="text/css">
10
+ <![CDATA[
11
+ .str0 {stroke:#E62129;stroke-width:23.87;stroke-miterlimit:22.9256}
12
+ .str1 {stroke:#06B1AB;stroke-width:9.1;stroke-miterlimit:22.9256}
13
+ .fil0 {fill:none}
14
+ .fil8 {fill:#FEFEFE}
15
+ .fil1 {fill:#332C2B}
16
+ .fil12 {fill:#F7B873}
17
+ .fil5 {fill:#F3A04E}
18
+ .fil9 {fill:#52C2F1}
19
+ .fil13 {fill:#06B1AB}
20
+ .fil2 {fill:#F63D55}
21
+ .fil11 {fill:#F9483E}
22
+ .fil6 {fill:url(#id0)}
23
+ .fil4 {fill:url(#id1)}
24
+ .fil10 {fill:url(#id2)}
25
+ .fil3 {fill:url(#id3)}
26
+ .fil7 {fill:url(#id4)}
27
+ ]]>
28
+ </style>
29
+ <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="11103.21" y1="5027.34" x2="10930.41" y2="1211.98">
30
+ <stop offset="0" style="stop-opacity:1; stop-color:#0A77D4"/>
31
+ <stop offset="1" style="stop-opacity:1; stop-color:#00B1E0"/>
32
+ </linearGradient>
33
+ <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" x1="11407.32" y1="5023.83" x2="11286.4" y2="1215.5">
34
+ </linearGradient>
35
+ <linearGradient id="id2" gradientUnits="userSpaceOnUse" x1="6311.87" y1="4699.25" x2="3547.5" y2="1677.39">
36
+ <stop offset="0" style="stop-opacity:1; stop-color:#F65926"/>
37
+ <stop offset="1" style="stop-opacity:1; stop-color:#F0AB1F"/>
38
+ </linearGradient>
39
+ <linearGradient id="id3" gradientUnits="userSpaceOnUse" x1="3105.35" y1="5075.61" x2="2612.67" y2="1311.04">
40
+ <stop offset="0" style="stop-opacity:1; stop-color:#E52652"/>
41
+ <stop offset="1" style="stop-opacity:1; stop-color:#FF4956"/>
42
+ </linearGradient>
43
+ <linearGradient id="id4" gradientUnits="userSpaceOnUse" x1="14599.77" y1="4808.34" x2="12000" y2="1573.25">
44
+ <stop offset="0" style="stop-opacity:1; stop-color:#02C0A7"/>
45
+ <stop offset="1" style="stop-opacity:1; stop-color:#02E097"/>
46
+ </linearGradient>
47
+ </defs>
48
+ <g id="图层_x0020_1">
49
+ <metadata id="CorelCorpID_0Corel-Layer"/>
50
+ <g id="_1978240863120">
51
+ <path class="fil0 str0" d="M2921.92 814.37l2943.46 0c660.05,0 1200.11,540.04 1200.11,1200.11l0 669.56c-180.23,1562.84 -842.69,2686.31 -2539.2,2867.65l-656.9 0c-1403.42,-112.59 -2125.37,-923.3 -2147.58,-2450.77l0 -1086.44c0,-660.07 540.04,-1200.11 1200.11,-1200.11z"/>
52
+ <path class="fil1" d="M908.05 649.1c172.38,0 312.1,139.73 312.1,312.1 0,172.38 -139.73,312.1 -312.1,312.1 -172.38,0 -312.1,-139.73 -312.1,-312.1 0,-172.38 139.73,-312.1 312.1,-312.1zm15081.56 0c-172.38,0 -312.1,139.73 -312.1,312.1 0,172.38 139.73,312.1 312.1,312.1 172.38,0 312.1,-139.73 312.1,-312.1 0,-172.38 -139.73,-312.1 -312.1,-312.1zm315.15 -649.07l-4739.56 0c-332.34,-0.73 -635.61,30.83 -892.17,114.33 -1164.61,314.95 -1684.86,539.69 -2204.5,542.55 -529.24,2.92 -1057.71,-221.77 -2243.89,-542.55 -256.56,-83.5 -559.83,-115.06 -892.17,-114.33l-4739.56 0c-326.11,0 -592.9,266.79 -592.9,592.9l0 727.65c0,326.11 262.25,574.15 588.16,562.9 244.44,-8.44 379.43,161.6 368.56,407.41l0 1401.3c844.04,3884.05 6459.63,3705.54 6872.25,-983.68 37.55,-479.97 225.37,-745.7 619.85,-795.03 394.48,49.33 582.3,315.06 619.85,795.03 221.1,2512.67 1570.99,3564.6 3624.76,3705.62 1575.25,-121.99 2822.57,-766.6 3247.49,-2721.94l0 -1401.3c-10.86,-245.81 124.13,-415.84 368.56,-407.41 325.91,11.24 588.16,-236.8 588.16,-562.9l0 -727.65c0,-326.11 -266.79,-592.9 -592.9,-592.9z"/>
53
+ <path class="fil2" d="M4404.53 5551.69l138.96 0c1696.5,-181.34 2358.97,-1304.82 2539.2,-2867.65l0 -669.56c0,-660.07 -540.06,-1200.11 -1200.11,-1200.11l-2261.28 0 -682.18 0c-660.07,0 -1200.11,540.04 -1200.11,1200.11l0 1086.44c22.21,1527.47 744.16,2338.19 2147.58,2450.77l517.94 0z"/>
54
+ <path class="fil3" d="M2884.03 3833.6c-562.03,-552.91 337.59,-1229.84 756.52,-784.77l-668.1 -718.53c-248.45,-631.92 -96.85,-1153.5 631.64,-1515.94l-682.18 0c-660.07,0 -1200.11,540.04 -1200.11,1200.11l0 1086.44c22.21,1527.47 744.16,2338.19 2147.58,2450.77l517.94 0c447.09,-261.52 828.85,-610.16 1124.32,-1073.8 -192.91,108.48 -371.35,123.1 -530.58,12.63 -269.77,225.61 -533.22,868.1 -809.3,676.82l-1287.75 -1333.74z"/>
55
+ <path class="fil4" d="M12967.79 5585.01c1654.02,-184.97 2231.4,-1330.91 2306.7,-2925.01l-43.57 -682.94c-42.95,-673.27 -608.37,-1224.11 -1256.49,-1224.11l-2220.38 0 -669.84 0c-648.13,0 -1143.27,550.85 -1100.32,1224.11l70.69 1108.16c121.19,1558.01 882.83,2384.94 2268.19,2499.78l645.03 0z"/>
56
+ <circle class="fil5" cx="3266.42" cy="4767.17" r="119.53"/>
57
+ <path class="fil6 str1" d="M11243.45 3832.57c-587.85,-563.96 251.45,-1254.43 691.78,-800.45l-702.77 -732.9c-285.07,-644.56 -170.14,-1176.57 521.59,-1546.26l-669.84 0c-648.13,0 -1143.27,550.85 -1100.32,1224.11l70.69 1108.16c121.19,1558.01 882.83,2384.94 2268.19,2499.78l508.57 0c422,-266.75 774.17,-622.36 1034.13,-1095.27 -182.37,110.65 -356.62,125.56 -520.16,12.88 -250.21,230.12 -467.1,885.46 -750.63,690.36l-1351.23 -1360.42z"/>
58
+ <path class="fil7" d="M11754.05 752.96c-691.73,369.69 -806.66,901.7 -521.59,1546.26l702.77 732.9c-440.33,-453.98 -1279.63,236.49 -691.78,800.45 1571.66,1582.35 780.78,887.85 1587.88,1752.45l136.46 0c1654.02,-184.97 2231.4,-1330.91 2306.7,-2925.01l-43.57 -682.94c-42.95,-673.27 -608.37,-1224.11 -1256.49,-1224.11l-2220.38 0z"/>
59
+ <circle class="fil8" cx="13725.89" cy="2247.09" r="867.65"/>
60
+ <circle class="fil9" cx="11745.99" cy="4944.33" r="119.53"/>
61
+ <path class="fil10" d="M3604.1 814.37c-728.5,362.44 -880.09,884.02 -631.64,1515.94l668.1 718.53c-418.94,-445.08 -1318.56,231.85 -756.52,784.77l1503.3 1718.08 138.96 0c1696.5,-181.34 2358.97,-1304.82 2539.2,-2867.65l0 -669.56c0,-660.07 -540.06,-1200.11 -1200.11,-1200.11l-2261.28 0z"/>
62
+ <path class="fil11" d="M3602.42 3012.57l-2.01 -1.79 -1.22 -1c-433.3,-363.07 -1259.33,288.49 -715.16,823.82l1503.3 1718.08 138.96 0c366.16,-39.14 684.05,-122.25 959.42,-244.11l-1883.3 -2295z"/>
63
+ <circle class="fil8" cx="5652.09" cy="2247.09" r="867.65"/>
64
+ <circle class="fil12" cx="5669.32" cy="4261.82" r="86.65"/>
65
+ <circle class="fil8" cx="3775.08" cy="4120.55" r="174.77"/>
66
+ <path class="fil13" d="M11770.33 2919.17l123.64 74.69c7.2,5.99 14.32,12.27 21.35,18.8l1988.29 2318.88c-264.55,126.79 -574.49,213.07 -935.82,253.47l-136.46 0c-807.1,-864.6 -16.22,-170.1 -1587.88,-1752.45 -520.29,-499.15 77.34,-1097.23 526.88,-913.39z"/>
67
+ <circle class="fil8" cx="12254.65" cy="4297.71" r="174.77"/>
68
+ </g>
69
+ </g>
70
+ </svg>
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <!-- Creator: CorelDRAW 2019 (64-Bit) -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="141.563mm" height="53.8692mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
5
+ viewBox="0 0 16897.65 6430.11"
6
+ xmlns:xlink="http://www.w3.org/1999/xlink"
7
+ xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
8
+ <defs>
9
+ <style type="text/css">
10
+ <![CDATA[
11
+ .str0 {stroke:#E62129;stroke-width:23.87;stroke-miterlimit:22.9256}
12
+ .str1 {stroke:#06B1AB;stroke-width:9.1;stroke-miterlimit:22.9256}
13
+ .fil0 {fill:none}
14
+ .fil8 {fill:#FEFEFE}
15
+ .fil1 {fill:#332C2B}
16
+ .fil12 {fill:#F7B873}
17
+ .fil5 {fill:#F3A04E}
18
+ .fil9 {fill:#52C2F1}
19
+ .fil13 {fill:#06B1AB}
20
+ .fil2 {fill:#F63D55}
21
+ .fil11 {fill:#F9483E}
22
+ .fil6 {fill:url(#id0)}
23
+ .fil4 {fill:url(#id1)}
24
+ .fil10 {fill:url(#id2)}
25
+ .fil3 {fill:url(#id3)}
26
+ .fil7 {fill:url(#id4)}
27
+ ]]>
28
+ </style>
29
+ <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="11103.21" y1="5027.34" x2="10930.41" y2="1211.98">
30
+ <stop offset="0" style="stop-opacity:1; stop-color:#0A77D4"/>
31
+ <stop offset="1" style="stop-opacity:1; stop-color:#00B1E0"/>
32
+ </linearGradient>
33
+ <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" x1="11407.32" y1="5023.83" x2="11286.4" y2="1215.5">
34
+ </linearGradient>
35
+ <linearGradient id="id2" gradientUnits="userSpaceOnUse" x1="6311.87" y1="4699.25" x2="3547.5" y2="1677.39">
36
+ <stop offset="0" style="stop-opacity:1; stop-color:#F65926"/>
37
+ <stop offset="1" style="stop-opacity:1; stop-color:#F0AB1F"/>
38
+ </linearGradient>
39
+ <linearGradient id="id3" gradientUnits="userSpaceOnUse" x1="3105.35" y1="5075.61" x2="2612.67" y2="1311.04">
40
+ <stop offset="0" style="stop-opacity:1; stop-color:#E52652"/>
41
+ <stop offset="1" style="stop-opacity:1; stop-color:#FF4956"/>
42
+ </linearGradient>
43
+ <linearGradient id="id4" gradientUnits="userSpaceOnUse" x1="14599.77" y1="4808.34" x2="12000" y2="1573.25">
44
+ <stop offset="0" style="stop-opacity:1; stop-color:#02C0A7"/>
45
+ <stop offset="1" style="stop-opacity:1; stop-color:#02E097"/>
46
+ </linearGradient>
47
+ </defs>
48
+ <g id="图层_x0020_1">
49
+ <metadata id="CorelCorpID_0Corel-Layer"/>
50
+ <g id="_1978240863120">
51
+ <path class="fil0 str0" d="M2921.92 814.37l2943.46 0c660.05,0 1200.11,540.04 1200.11,1200.11l0 669.56c-180.23,1562.84 -842.69,2686.31 -2539.2,2867.65l-656.9 0c-1403.42,-112.59 -2125.37,-923.3 -2147.58,-2450.77l0 -1086.44c0,-660.07 540.04,-1200.11 1200.11,-1200.11z"/>
52
+ <path class="fil1" d="M908.05 649.1c172.38,0 312.1,139.73 312.1,312.1 0,172.38 -139.73,312.1 -312.1,312.1 -172.38,0 -312.1,-139.73 -312.1,-312.1 0,-172.38 139.73,-312.1 312.1,-312.1zm15081.56 0c-172.38,0 -312.1,139.73 -312.1,312.1 0,172.38 139.73,312.1 312.1,312.1 172.38,0 312.1,-139.73 312.1,-312.1 0,-172.38 -139.73,-312.1 -312.1,-312.1zm315.15 -649.07l-4739.56 0c-332.34,-0.73 -635.61,30.83 -892.17,114.33 -1164.61,314.95 -1684.86,539.69 -2204.5,542.55 -529.24,2.92 -1057.71,-221.77 -2243.89,-542.55 -256.56,-83.5 -559.83,-115.06 -892.17,-114.33l-4739.56 0c-326.11,0 -592.9,266.79 -592.9,592.9l0 727.65c0,326.11 262.25,574.15 588.16,562.9 244.44,-8.44 379.43,161.6 368.56,407.41l0 1401.3c844.04,3884.05 6459.63,3705.54 6872.25,-983.68 37.55,-479.97 225.37,-745.7 619.85,-795.03 394.48,49.33 582.3,315.06 619.85,795.03 221.1,2512.67 1570.99,3564.6 3624.76,3705.62 1575.25,-121.99 2822.57,-766.6 3247.49,-2721.94l0 -1401.3c-10.86,-245.81 124.13,-415.84 368.56,-407.41 325.91,11.24 588.16,-236.8 588.16,-562.9l0 -727.65c0,-326.11 -266.79,-592.9 -592.9,-592.9z"/>
53
+ <path class="fil2" d="M4404.53 5551.69l138.96 0c1696.5,-181.34 2358.97,-1304.82 2539.2,-2867.65l0 -669.56c0,-660.07 -540.06,-1200.11 -1200.11,-1200.11l-2261.28 0 -682.18 0c-660.07,0 -1200.11,540.04 -1200.11,1200.11l0 1086.44c22.21,1527.47 744.16,2338.19 2147.58,2450.77l517.94 0z"/>
54
+ <path class="fil3" d="M2884.03 3833.6c-562.03,-552.91 337.59,-1229.84 756.52,-784.77l-668.1 -718.53c-248.45,-631.92 -96.85,-1153.5 631.64,-1515.94l-682.18 0c-660.07,0 -1200.11,540.04 -1200.11,1200.11l0 1086.44c22.21,1527.47 744.16,2338.19 2147.58,2450.77l517.94 0c447.09,-261.52 828.85,-610.16 1124.32,-1073.8 -192.91,108.48 -371.35,123.1 -530.58,12.63 -269.77,225.61 -533.22,868.1 -809.3,676.82l-1287.75 -1333.74z"/>
55
+ <path class="fil4" d="M12967.79 5585.01c1654.02,-184.97 2231.4,-1330.91 2306.7,-2925.01l-43.57 -682.94c-42.95,-673.27 -608.37,-1224.11 -1256.49,-1224.11l-2220.38 0 -669.84 0c-648.13,0 -1143.27,550.85 -1100.32,1224.11l70.69 1108.16c121.19,1558.01 882.83,2384.94 2268.19,2499.78l645.03 0z"/>
56
+ <circle class="fil5" cx="3266.42" cy="4767.17" r="119.53"/>
57
+ <path class="fil6 str1" d="M11243.45 3832.57c-587.85,-563.96 251.45,-1254.43 691.78,-800.45l-702.77 -732.9c-285.07,-644.56 -170.14,-1176.57 521.59,-1546.26l-669.84 0c-648.13,0 -1143.27,550.85 -1100.32,1224.11l70.69 1108.16c121.19,1558.01 882.83,2384.94 2268.19,2499.78l508.57 0c422,-266.75 774.17,-622.36 1034.13,-1095.27 -182.37,110.65 -356.62,125.56 -520.16,12.88 -250.21,230.12 -467.1,885.46 -750.63,690.36l-1351.23 -1360.42z"/>
58
+ <path class="fil7" d="M11754.05 752.96c-691.73,369.69 -806.66,901.7 -521.59,1546.26l702.77 732.9c-440.33,-453.98 -1279.63,236.49 -691.78,800.45 1571.66,1582.35 780.78,887.85 1587.88,1752.45l136.46 0c1654.02,-184.97 2231.4,-1330.91 2306.7,-2925.01l-43.57 -682.94c-42.95,-673.27 -608.37,-1224.11 -1256.49,-1224.11l-2220.38 0z"/>
59
+ <circle class="fil8" cx="13725.89" cy="2247.09" r="867.65"/>
60
+ <circle class="fil9" cx="11745.99" cy="4944.33" r="119.53"/>
61
+ <path class="fil10" d="M3604.1 814.37c-728.5,362.44 -880.09,884.02 -631.64,1515.94l668.1 718.53c-418.94,-445.08 -1318.56,231.85 -756.52,784.77l1503.3 1718.08 138.96 0c1696.5,-181.34 2358.97,-1304.82 2539.2,-2867.65l0 -669.56c0,-660.07 -540.06,-1200.11 -1200.11,-1200.11l-2261.28 0z"/>
62
+ <path class="fil11" d="M3602.42 3012.57l-2.01 -1.79 -1.22 -1c-433.3,-363.07 -1259.33,288.49 -715.16,823.82l1503.3 1718.08 138.96 0c366.16,-39.14 684.05,-122.25 959.42,-244.11l-1883.3 -2295z"/>
63
+ <circle class="fil8" cx="5652.09" cy="2247.09" r="867.65"/>
64
+ <circle class="fil12" cx="5669.32" cy="4261.82" r="86.65"/>
65
+ <circle class="fil8" cx="3775.08" cy="4120.55" r="174.77"/>
66
+ <path class="fil13" d="M11770.33 2919.17l123.64 74.69c7.2,5.99 14.32,12.27 21.35,18.8l1988.29 2318.88c-264.55,126.79 -574.49,213.07 -935.82,253.47l-136.46 0c-807.1,-864.6 -16.22,-170.1 -1587.88,-1752.45 -520.29,-499.15 77.34,-1097.23 526.88,-913.39z"/>
67
+ <circle class="fil8" cx="12254.65" cy="4297.71" r="174.77"/>
68
+ </g>
69
+ </g>
70
+ </svg>