@docmentis/udoc-viewer 0.5.3 → 0.5.6

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 (211) hide show
  1. package/dist/package.json +57 -0
  2. package/dist/src/UDocClient.d.ts +383 -0
  3. package/dist/src/UDocClient.d.ts.map +1 -0
  4. package/dist/src/UDocClient.js +441 -0
  5. package/dist/src/UDocClient.js.map +1 -0
  6. package/dist/src/UDocViewer.d.ts +275 -0
  7. package/dist/src/UDocViewer.d.ts.map +1 -0
  8. package/dist/src/UDocViewer.js +796 -0
  9. package/dist/src/UDocViewer.js.map +1 -0
  10. package/dist/src/fonts.d.ts +29 -0
  11. package/dist/src/fonts.d.ts.map +1 -0
  12. package/dist/src/fonts.js +30 -0
  13. package/dist/src/fonts.js.map +1 -0
  14. package/dist/src/index.d.ts +9 -0
  15. package/dist/src/index.d.ts.map +1 -0
  16. package/dist/src/index.js +8 -0
  17. package/dist/src/index.js.map +1 -0
  18. package/dist/src/performance/PerformanceCounter.d.ts +132 -0
  19. package/dist/src/performance/PerformanceCounter.d.ts.map +1 -0
  20. package/dist/src/performance/PerformanceCounter.js +129 -0
  21. package/dist/src/performance/PerformanceCounter.js.map +1 -0
  22. package/dist/src/performance/index.d.ts +2 -0
  23. package/dist/src/performance/index.d.ts.map +1 -0
  24. package/dist/src/performance/index.js +2 -0
  25. package/dist/src/performance/index.js.map +1 -0
  26. package/dist/src/ui/framework/component.d.ts +68 -0
  27. package/dist/src/ui/framework/component.d.ts.map +1 -0
  28. package/dist/src/ui/framework/component.js +97 -0
  29. package/dist/src/ui/framework/component.js.map +1 -0
  30. package/dist/src/ui/framework/dom.d.ts +19 -0
  31. package/dist/src/ui/framework/dom.d.ts.map +1 -0
  32. package/dist/src/ui/framework/dom.js +29 -0
  33. package/dist/src/ui/framework/dom.js.map +1 -0
  34. package/dist/src/ui/framework/events.d.ts +18 -0
  35. package/dist/src/ui/framework/events.d.ts.map +1 -0
  36. package/dist/src/ui/framework/events.js +23 -0
  37. package/dist/src/ui/framework/events.js.map +1 -0
  38. package/dist/src/ui/framework/index.d.ts +15 -0
  39. package/dist/src/ui/framework/index.d.ts.map +1 -0
  40. package/dist/src/ui/framework/index.js +15 -0
  41. package/dist/src/ui/framework/index.js.map +1 -0
  42. package/dist/src/ui/framework/selectors.d.ts +51 -0
  43. package/dist/src/ui/framework/selectors.d.ts.map +1 -0
  44. package/dist/src/ui/framework/selectors.js +30 -0
  45. package/dist/src/ui/framework/selectors.js.map +1 -0
  46. package/dist/src/ui/framework/store.d.ts +37 -0
  47. package/dist/src/ui/framework/store.d.ts.map +1 -0
  48. package/dist/src/ui/framework/store.js +66 -0
  49. package/dist/src/ui/framework/store.js.map +1 -0
  50. package/dist/src/ui/viewer/actions.d.ts +132 -0
  51. package/dist/src/ui/viewer/actions.d.ts.map +1 -0
  52. package/dist/src/ui/viewer/actions.js +2 -0
  53. package/dist/src/ui/viewer/actions.js.map +1 -0
  54. package/dist/src/ui/viewer/annotation/LinkRenderer.d.ts +9 -0
  55. package/dist/src/ui/viewer/annotation/LinkRenderer.d.ts.map +1 -0
  56. package/dist/src/ui/viewer/annotation/LinkRenderer.js +17 -0
  57. package/dist/src/ui/viewer/annotation/LinkRenderer.js.map +1 -0
  58. package/dist/src/ui/viewer/annotation/MarkupRenderer.d.ts +21 -0
  59. package/dist/src/ui/viewer/annotation/MarkupRenderer.d.ts.map +1 -0
  60. package/dist/src/ui/viewer/annotation/MarkupRenderer.js +138 -0
  61. package/dist/src/ui/viewer/annotation/MarkupRenderer.js.map +1 -0
  62. package/dist/src/ui/viewer/annotation/ShapeRenderer.d.ts +33 -0
  63. package/dist/src/ui/viewer/annotation/ShapeRenderer.d.ts.map +1 -0
  64. package/dist/src/ui/viewer/annotation/ShapeRenderer.js +378 -0
  65. package/dist/src/ui/viewer/annotation/ShapeRenderer.js.map +1 -0
  66. package/dist/src/ui/viewer/annotation/TextRenderer.d.ts +23 -0
  67. package/dist/src/ui/viewer/annotation/TextRenderer.d.ts.map +1 -0
  68. package/dist/src/ui/viewer/annotation/TextRenderer.js +196 -0
  69. package/dist/src/ui/viewer/annotation/TextRenderer.js.map +1 -0
  70. package/dist/src/ui/viewer/annotation/index.d.ts +8 -0
  71. package/dist/src/ui/viewer/annotation/index.d.ts.map +1 -0
  72. package/dist/src/ui/viewer/annotation/index.js +8 -0
  73. package/dist/src/ui/viewer/annotation/index.js.map +1 -0
  74. package/dist/src/ui/viewer/annotation/render.d.ts +24 -0
  75. package/dist/src/ui/viewer/annotation/render.d.ts.map +1 -0
  76. package/dist/src/ui/viewer/annotation/render.js +184 -0
  77. package/dist/src/ui/viewer/annotation/render.js.map +1 -0
  78. package/dist/src/ui/viewer/annotation/types.d.ts +239 -0
  79. package/dist/src/ui/viewer/annotation/types.d.ts.map +1 -0
  80. package/dist/src/ui/viewer/annotation/types.js +7 -0
  81. package/dist/src/ui/viewer/annotation/types.js.map +1 -0
  82. package/dist/src/ui/viewer/annotation/utils.d.ts +37 -0
  83. package/dist/src/ui/viewer/annotation/utils.d.ts.map +1 -0
  84. package/dist/src/ui/viewer/annotation/utils.js +82 -0
  85. package/dist/src/ui/viewer/annotation/utils.js.map +1 -0
  86. package/dist/src/ui/viewer/components/AnnotationPanel.d.ts +19 -0
  87. package/dist/src/ui/viewer/components/AnnotationPanel.d.ts.map +1 -0
  88. package/dist/src/ui/viewer/components/AnnotationPanel.js +284 -0
  89. package/dist/src/ui/viewer/components/AnnotationPanel.js.map +1 -0
  90. package/dist/src/ui/viewer/components/FloatingToolbar.d.ts +9 -0
  91. package/dist/src/ui/viewer/components/FloatingToolbar.d.ts.map +1 -0
  92. package/dist/src/ui/viewer/components/FloatingToolbar.js +305 -0
  93. package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -0
  94. package/dist/src/ui/viewer/components/LeftPanel.d.ts +10 -0
  95. package/dist/src/ui/viewer/components/LeftPanel.d.ts.map +1 -0
  96. package/dist/src/ui/viewer/components/LeftPanel.js +165 -0
  97. package/dist/src/ui/viewer/components/LeftPanel.js.map +1 -0
  98. package/dist/src/ui/viewer/components/LoadingOverlay.d.ts +12 -0
  99. package/dist/src/ui/viewer/components/LoadingOverlay.d.ts.map +1 -0
  100. package/dist/src/ui/viewer/components/LoadingOverlay.js +88 -0
  101. package/dist/src/ui/viewer/components/LoadingOverlay.js.map +1 -0
  102. package/dist/src/ui/viewer/components/OutlinePanel.d.ts +10 -0
  103. package/dist/src/ui/viewer/components/OutlinePanel.d.ts.map +1 -0
  104. package/dist/src/ui/viewer/components/OutlinePanel.js +169 -0
  105. package/dist/src/ui/viewer/components/OutlinePanel.js.map +1 -0
  106. package/dist/src/ui/viewer/components/PasswordDialog.d.ts +15 -0
  107. package/dist/src/ui/viewer/components/PasswordDialog.d.ts.map +1 -0
  108. package/dist/src/ui/viewer/components/PasswordDialog.js +143 -0
  109. package/dist/src/ui/viewer/components/PasswordDialog.js.map +1 -0
  110. package/dist/src/ui/viewer/components/RightPanel.d.ts +9 -0
  111. package/dist/src/ui/viewer/components/RightPanel.d.ts.map +1 -0
  112. package/dist/src/ui/viewer/components/RightPanel.js +102 -0
  113. package/dist/src/ui/viewer/components/RightPanel.js.map +1 -0
  114. package/dist/src/ui/viewer/components/Spread.d.ts +43 -0
  115. package/dist/src/ui/viewer/components/Spread.d.ts.map +1 -0
  116. package/dist/src/ui/viewer/components/Spread.js +345 -0
  117. package/dist/src/ui/viewer/components/Spread.js.map +1 -0
  118. package/dist/src/ui/viewer/components/ThumbnailPanel.d.ts +11 -0
  119. package/dist/src/ui/viewer/components/ThumbnailPanel.d.ts.map +1 -0
  120. package/dist/src/ui/viewer/components/ThumbnailPanel.js +240 -0
  121. package/dist/src/ui/viewer/components/ThumbnailPanel.js.map +1 -0
  122. package/dist/src/ui/viewer/components/Toolbar.d.ts +9 -0
  123. package/dist/src/ui/viewer/components/Toolbar.d.ts.map +1 -0
  124. package/dist/src/ui/viewer/components/Toolbar.js +93 -0
  125. package/dist/src/ui/viewer/components/Toolbar.js.map +1 -0
  126. package/dist/src/ui/viewer/components/ViewModeMenu.d.ts +9 -0
  127. package/dist/src/ui/viewer/components/ViewModeMenu.d.ts.map +1 -0
  128. package/dist/src/ui/viewer/components/ViewModeMenu.js +178 -0
  129. package/dist/src/ui/viewer/components/ViewModeMenu.js.map +1 -0
  130. package/dist/src/ui/viewer/components/Viewport.d.ts +10 -0
  131. package/dist/src/ui/viewer/components/Viewport.d.ts.map +1 -0
  132. package/dist/src/ui/viewer/components/Viewport.js +1082 -0
  133. package/dist/src/ui/viewer/components/Viewport.js.map +1 -0
  134. package/dist/src/ui/viewer/effects.d.ts +8 -0
  135. package/dist/src/ui/viewer/effects.d.ts.map +1 -0
  136. package/dist/src/ui/viewer/effects.js +240 -0
  137. package/dist/src/ui/viewer/effects.js.map +1 -0
  138. package/dist/src/ui/viewer/icons.d.ts +32 -0
  139. package/dist/src/ui/viewer/icons.d.ts.map +1 -0
  140. package/dist/src/ui/viewer/icons.js +44 -0
  141. package/dist/src/ui/viewer/icons.js.map +1 -0
  142. package/dist/src/ui/viewer/index.d.ts +6 -0
  143. package/dist/src/ui/viewer/index.d.ts.map +1 -0
  144. package/dist/src/ui/viewer/index.js +6 -0
  145. package/dist/src/ui/viewer/index.js.map +1 -0
  146. package/dist/src/ui/viewer/layout/index.d.ts +3 -0
  147. package/dist/src/ui/viewer/layout/index.d.ts.map +1 -0
  148. package/dist/src/ui/viewer/layout/index.js +3 -0
  149. package/dist/src/ui/viewer/layout/index.js.map +1 -0
  150. package/dist/src/ui/viewer/layout/pixelAlign.d.ts +7 -0
  151. package/dist/src/ui/viewer/layout/pixelAlign.d.ts.map +1 -0
  152. package/dist/src/ui/viewer/layout/pixelAlign.js +22 -0
  153. package/dist/src/ui/viewer/layout/pixelAlign.js.map +1 -0
  154. package/dist/src/ui/viewer/layout/spreadLayout.d.ts +93 -0
  155. package/dist/src/ui/viewer/layout/spreadLayout.d.ts.map +1 -0
  156. package/dist/src/ui/viewer/layout/spreadLayout.js +315 -0
  157. package/dist/src/ui/viewer/layout/spreadLayout.js.map +1 -0
  158. package/dist/src/ui/viewer/navigation.d.ts +80 -0
  159. package/dist/src/ui/viewer/navigation.d.ts.map +1 -0
  160. package/dist/src/ui/viewer/navigation.js +59 -0
  161. package/dist/src/ui/viewer/navigation.js.map +1 -0
  162. package/dist/src/ui/viewer/reducer.d.ts +4 -0
  163. package/dist/src/ui/viewer/reducer.d.ts.map +1 -0
  164. package/dist/src/ui/viewer/reducer.js +317 -0
  165. package/dist/src/ui/viewer/reducer.js.map +1 -0
  166. package/dist/src/ui/viewer/shell.d.ts +34 -0
  167. package/dist/src/ui/viewer/shell.d.ts.map +1 -0
  168. package/dist/src/ui/viewer/shell.js +101 -0
  169. package/dist/src/ui/viewer/shell.js.map +1 -0
  170. package/dist/src/ui/viewer/state.d.ts +105 -0
  171. package/dist/src/ui/viewer/state.d.ts.map +1 -0
  172. package/dist/src/ui/viewer/state.js +65 -0
  173. package/dist/src/ui/viewer/state.js.map +1 -0
  174. package/dist/src/ui/viewer/styles-inline.d.ts +2 -0
  175. package/dist/src/ui/viewer/styles-inline.d.ts.map +1 -0
  176. package/dist/src/ui/viewer/styles-inline.js +1584 -0
  177. package/dist/src/ui/viewer/styles-inline.js.map +1 -0
  178. package/dist/src/ui/viewer/text/index.d.ts +7 -0
  179. package/dist/src/ui/viewer/text/index.d.ts.map +1 -0
  180. package/dist/src/ui/viewer/text/index.js +3 -0
  181. package/dist/src/ui/viewer/text/index.js.map +1 -0
  182. package/dist/src/ui/viewer/text/render.d.ts +19 -0
  183. package/dist/src/ui/viewer/text/render.d.ts.map +1 -0
  184. package/dist/src/ui/viewer/text/render.js +228 -0
  185. package/dist/src/ui/viewer/text/render.js.map +1 -0
  186. package/dist/src/ui/viewer/text/selection.d.ts +12 -0
  187. package/dist/src/ui/viewer/text/selection.d.ts.map +1 -0
  188. package/dist/src/ui/viewer/text/selection.js +70 -0
  189. package/dist/src/ui/viewer/text/selection.js.map +1 -0
  190. package/dist/src/ui/viewer/text/types.d.ts +37 -0
  191. package/dist/src/ui/viewer/text/types.d.ts.map +1 -0
  192. package/dist/src/ui/viewer/text/types.js +7 -0
  193. package/dist/src/ui/viewer/text/types.js.map +1 -0
  194. package/dist/src/wasm/LICENSE +104 -0
  195. package/dist/src/wasm/udoc.d.ts +480 -0
  196. package/dist/src/wasm/udoc.js +1738 -0
  197. package/dist/src/wasm/udoc_bg.wasm +0 -0
  198. package/dist/src/wasm/udoc_bg.wasm.d.ts +45 -0
  199. package/dist/src/worker/WorkerClient.d.ts +335 -0
  200. package/dist/src/worker/WorkerClient.d.ts.map +1 -0
  201. package/dist/src/worker/WorkerClient.js +906 -0
  202. package/dist/src/worker/WorkerClient.js.map +1 -0
  203. package/dist/src/worker/index.d.ts +4 -0
  204. package/dist/src/worker/index.d.ts.map +1 -0
  205. package/dist/src/worker/index.js +2 -0
  206. package/dist/src/worker/index.js.map +1 -0
  207. package/dist/src/worker/worker.d.ts +437 -0
  208. package/dist/src/worker/worker.d.ts.map +1 -0
  209. package/dist/src/worker/worker.js +237 -0
  210. package/dist/src/worker/worker.js.map +1 -0
  211. package/package.json +5 -4
@@ -0,0 +1,441 @@
1
+ /**
2
+ * UDocClient - SDK entry point for document viewing.
3
+ *
4
+ * Manages the WASM engine and provides document operations.
5
+ */
6
+ import { WorkerClient } from "./worker/index.js";
7
+ import { UDocViewer } from "./UDocViewer.js";
8
+ import pkg from "../package.json" with { type: "json" };
9
+ /**
10
+ * SDK entry point for document viewing.
11
+ *
12
+ * Manages the WASM engine, creates viewers, and provides document operations.
13
+ */
14
+ export class UDocClient {
15
+ /**
16
+ * SDK version string.
17
+ */
18
+ static version = pkg.version;
19
+ workerClient;
20
+ options;
21
+ viewers = new Set();
22
+ destroyed = false;
23
+ licenseInfo = {
24
+ valid: true,
25
+ tier: "free",
26
+ features: [],
27
+ limits: {},
28
+ };
29
+ constructor(workerClient, options) {
30
+ this.workerClient = workerClient;
31
+ this.options = options;
32
+ }
33
+ /**
34
+ * Create and initialize a client instance.
35
+ * Loads the WASM engine.
36
+ */
37
+ static async create(options = {}) {
38
+ // Create worker client - use custom URL if provided, otherwise use bundled worker
39
+ const workerClient = options.baseUrl
40
+ ? WorkerClient.createWithUrl(new URL("worker.js", options.baseUrl))
41
+ : WorkerClient.create();
42
+ // Initialize WASM in the worker
43
+ const wasmUrl = options.baseUrl
44
+ ? new URL("udoc_bg.wasm", options.baseUrl).href
45
+ : undefined;
46
+ await workerClient.init(wasmUrl);
47
+ const client = new UDocClient(workerClient, options);
48
+ // Validate license if provided
49
+ if (options.license) {
50
+ const domain = typeof window !== "undefined"
51
+ ? window.location.hostname
52
+ : "localhost";
53
+ const result = await workerClient.setLicense(options.license, domain);
54
+ client.licenseInfo = licenseResultToInfo(result);
55
+ if (!result.valid) {
56
+ console.warn(`[udoc-viewer] License validation failed: ${result.error}`);
57
+ }
58
+ }
59
+ return client;
60
+ }
61
+ /**
62
+ * Get current license information.
63
+ */
64
+ get license() {
65
+ return { ...this.licenseInfo };
66
+ }
67
+ /**
68
+ * Check if a feature is available with the current license.
69
+ * @param feature - Feature name (e.g., "merge")
70
+ */
71
+ hasFeature(feature) {
72
+ return this.licenseInfo.features.includes(feature);
73
+ }
74
+ /**
75
+ * Create a viewer instance.
76
+ *
77
+ * - With container: Full UI mode
78
+ * - Without container: Headless mode (same API, no UI)
79
+ */
80
+ async createViewer(options = {}) {
81
+ this.ensureNotDestroyed();
82
+ const viewer = new UDocViewer(this.workerClient, options);
83
+ this.viewers.add(viewer);
84
+ return viewer;
85
+ }
86
+ /**
87
+ * Compose new documents by cherry-picking pages from source documents.
88
+ *
89
+ * This is a powerful method that allows creating new documents by selecting
90
+ * specific pages from multiple source documents in any order. Pages can
91
+ * optionally be rotated during composition.
92
+ *
93
+ * @param compositions - Array of compositions. Each composition creates one output document.
94
+ * Each composition is an array of picks specifying which pages from which documents.
95
+ * @returns Array of viewers containing the composed documents
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * // Create a document with pages 1-3 from viewer A and page 5 from viewer B
100
+ * const [newDoc] = await client.compose([
101
+ * [
102
+ * { doc: viewerA, pages: "1-3" },
103
+ * { doc: viewerB, pages: "5" }
104
+ * ]
105
+ * ]);
106
+ *
107
+ * // Create multiple documents at once
108
+ * const [doc1, doc2] = await client.compose([
109
+ * [{ doc: viewerA, pages: "1" }], // doc1: page 1 from A
110
+ * [{ doc: viewerA, pages: "2" }, { doc: viewerB, pages: "1" }] // doc2: page 2 from A + page 1 from B
111
+ * ]);
112
+ *
113
+ * // Rotate pages during composition
114
+ * const [rotated] = await client.compose([
115
+ * [
116
+ * { doc: viewerA, pages: "1", rotation: 90 }, // rotate page 1 by 90 degrees
117
+ * { doc: viewerA, pages: "2", rotation: 180 } // rotate page 2 by 180 degrees
118
+ * ]
119
+ * ]);
120
+ * ```
121
+ */
122
+ async compose(compositions) {
123
+ this.ensureNotDestroyed();
124
+ if (compositions.length === 0) {
125
+ throw new Error("At least one composition is required");
126
+ }
127
+ // Collect all unique document sources and load them
128
+ const sourceMap = new Map(); // source -> docId
129
+ const docIds = [];
130
+ for (const composition of compositions) {
131
+ for (const pick of composition) {
132
+ if (!sourceMap.has(pick.doc)) {
133
+ const docId = await this.loadSource(pick.doc);
134
+ sourceMap.set(pick.doc, docId);
135
+ docIds.push(docId);
136
+ }
137
+ }
138
+ }
139
+ // Build source index map (source -> index in docIds array)
140
+ const sourceIndexMap = new Map();
141
+ let index = 0;
142
+ for (const source of sourceMap.keys()) {
143
+ sourceIndexMap.set(source, index++);
144
+ }
145
+ // Convert to low-level format
146
+ const lowLevelCompositions = compositions.map(composition => composition.map(pick => ({
147
+ doc: sourceIndexMap.get(pick.doc),
148
+ pages: this.normalizePages(pick.pages),
149
+ rotation: pick.rotation,
150
+ })));
151
+ // Execute compose
152
+ const newDocIds = await this.workerClient.pdfCompose(lowLevelCompositions, docIds);
153
+ // Unload temporary sources that weren't from viewers
154
+ for (const [source, docId] of sourceMap) {
155
+ if (!(source instanceof UDocViewer)) {
156
+ await this.workerClient.unloadPdf(docId);
157
+ }
158
+ }
159
+ // Create viewers for the composed documents
160
+ const viewers = [];
161
+ for (const docId of newDocIds) {
162
+ const viewer = new UDocViewer(this.workerClient, {});
163
+ await viewer.initializeFromDocId(docId);
164
+ this.viewers.add(viewer);
165
+ viewers.push(viewer);
166
+ }
167
+ return viewers;
168
+ }
169
+ /**
170
+ * Split a document by its outline (bookmarks) structure.
171
+ *
172
+ * Creates multiple documents, one for each outline section at the specified level.
173
+ * The original document remains unchanged.
174
+ *
175
+ * @param source - Document source (viewer, URL, File, or bytes)
176
+ * @param options - Split options
177
+ * @param options.maxLevel - Maximum outline level to consider (1 = top level only, default: 1)
178
+ * @param options.splitMidPage - When true, filters page content when sections share a page (default: false)
179
+ * @returns Object with viewers array and sections metadata
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * // Split a document by top-level bookmarks
184
+ * const result = await client.splitByOutline(viewer);
185
+ * console.log(`Split into ${result.viewers.length} documents`);
186
+ * result.sections.forEach((section, i) => {
187
+ * console.log(`Document ${i}: ${section.title}`);
188
+ * });
189
+ *
190
+ * // Split with mid-page content filtering
191
+ * const result = await client.splitByOutline(viewer, { maxLevel: 2, splitMidPage: true });
192
+ * ```
193
+ */
194
+ async splitByOutline(source, options = {}) {
195
+ this.ensureNotDestroyed();
196
+ const { maxLevel = 1, splitMidPage = false } = options;
197
+ const docId = await this.loadSource(source);
198
+ const isTemporary = !(source instanceof UDocViewer);
199
+ try {
200
+ const result = await this.workerClient.pdfSplitByOutline(docId, maxLevel, splitMidPage);
201
+ // Create viewers for the split documents
202
+ const viewers = [];
203
+ for (const newDocId of result.documentIds) {
204
+ const viewer = new UDocViewer(this.workerClient, {});
205
+ await viewer.initializeFromDocId(newDocId);
206
+ this.viewers.add(viewer);
207
+ viewers.push(viewer);
208
+ }
209
+ return {
210
+ viewers,
211
+ sections: result.sections,
212
+ };
213
+ }
214
+ finally {
215
+ // Unload temporary source
216
+ if (isTemporary) {
217
+ await this.workerClient.unloadPdf(docId);
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Extract all embedded images from a document.
223
+ *
224
+ * @param source - Document source (viewer, URL, File, or bytes)
225
+ * @param options - Extract options
226
+ * @param options.convertRawToPng - When true, converts raw pixel data to PNG format (default: false)
227
+ * @returns Array of extracted images with metadata and data
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * const images = await client.extractImages(viewer);
232
+ * for (const image of images) {
233
+ * console.log(`${image.name}: ${image.format} (${image.width}x${image.height})`);
234
+ * // image.data contains the raw image bytes
235
+ * }
236
+ *
237
+ * // Convert raw images to PNG for easier viewing
238
+ * const pngImages = await client.extractImages(viewer, { convertRawToPng: true });
239
+ * ```
240
+ */
241
+ async extractImages(source, options = {}) {
242
+ this.ensureNotDestroyed();
243
+ const { convertRawToPng = false } = options;
244
+ const docId = await this.loadSource(source);
245
+ const isTemporary = !(source instanceof UDocViewer);
246
+ try {
247
+ return await this.workerClient.pdfExtractImages(docId, convertRawToPng);
248
+ }
249
+ finally {
250
+ if (isTemporary) {
251
+ await this.workerClient.unloadPdf(docId);
252
+ }
253
+ }
254
+ }
255
+ /**
256
+ * Extract all embedded fonts from a document.
257
+ *
258
+ * @param source - Document source (viewer, URL, File, or bytes)
259
+ * @returns Array of extracted fonts with metadata and data
260
+ *
261
+ * @example
262
+ * ```ts
263
+ * const fonts = await client.extractFonts(viewer);
264
+ * for (const font of fonts) {
265
+ * console.log(`${font.name}: ${font.fontType} (.${font.extension})`);
266
+ * // font.data contains the raw font bytes
267
+ * }
268
+ * ```
269
+ */
270
+ async extractFonts(source) {
271
+ this.ensureNotDestroyed();
272
+ const docId = await this.loadSource(source);
273
+ const isTemporary = !(source instanceof UDocViewer);
274
+ try {
275
+ return await this.workerClient.pdfExtractFonts(docId);
276
+ }
277
+ finally {
278
+ if (isTemporary) {
279
+ await this.workerClient.unloadPdf(docId);
280
+ }
281
+ }
282
+ }
283
+ /**
284
+ * Compress a document.
285
+ *
286
+ * Saves the document with full compression options enabled:
287
+ * - Compress stream data using FlateDecode
288
+ * - Pack objects into compressed object streams (PDF 1.5+)
289
+ * - Use compressed xref streams (PDF 1.5+)
290
+ * - Remove unreferenced objects
291
+ *
292
+ * @param source - Document source (viewer, URL, File, or bytes)
293
+ * @returns Compressed PDF data as Uint8Array
294
+ *
295
+ * @example
296
+ * ```ts
297
+ * const compressedBytes = await client.compress(viewer);
298
+ * // Save to file or download
299
+ * const blob = new Blob([compressedBytes], { type: 'application/pdf' });
300
+ * ```
301
+ */
302
+ async compress(source) {
303
+ this.ensureNotDestroyed();
304
+ const docId = await this.loadSource(source);
305
+ const isTemporary = !(source instanceof UDocViewer);
306
+ try {
307
+ return await this.workerClient.pdfCompress(docId);
308
+ }
309
+ finally {
310
+ if (isTemporary) {
311
+ await this.workerClient.unloadPdf(docId);
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Decompress a document.
317
+ *
318
+ * Removes all filter encodings from streams, resulting in raw,
319
+ * uncompressed stream data. Useful for debugging or inspection.
320
+ *
321
+ * @param source - Document source (viewer, URL, File, or bytes)
322
+ * @returns Decompressed PDF data as Uint8Array
323
+ *
324
+ * @example
325
+ * ```ts
326
+ * const decompressedBytes = await client.decompress(viewer);
327
+ * // Save to file for inspection
328
+ * const blob = new Blob([decompressedBytes], { type: 'application/pdf' });
329
+ * ```
330
+ */
331
+ async decompress(source) {
332
+ this.ensureNotDestroyed();
333
+ const docId = await this.loadSource(source);
334
+ const isTemporary = !(source instanceof UDocViewer);
335
+ try {
336
+ return await this.workerClient.pdfDecompress(docId);
337
+ }
338
+ finally {
339
+ if (isTemporary) {
340
+ await this.workerClient.unloadPdf(docId);
341
+ }
342
+ }
343
+ }
344
+ /**
345
+ * Load a document source and return its ID.
346
+ * Note: This is only used for PDF operations (compose, split, etc.)
347
+ */
348
+ async loadSource(source) {
349
+ if (source instanceof UDocViewer) {
350
+ const docId = source.documentId;
351
+ if (!docId) {
352
+ throw new Error("Viewer has no loaded document");
353
+ }
354
+ return docId;
355
+ }
356
+ let bytes;
357
+ if (typeof source === "string") {
358
+ const controller = new AbortController();
359
+ const timeoutId = setTimeout(() => controller.abort(), 60_000);
360
+ try {
361
+ const response = await fetch(source, { signal: controller.signal });
362
+ if (!response.ok) {
363
+ throw new Error(`Failed to fetch ${source}: ${response.statusText}`);
364
+ }
365
+ bytes = new Uint8Array(await response.arrayBuffer());
366
+ }
367
+ catch (error) {
368
+ if (error instanceof DOMException && error.name === "AbortError") {
369
+ throw new Error(`Fetch timed out for ${source}`);
370
+ }
371
+ throw error;
372
+ }
373
+ finally {
374
+ clearTimeout(timeoutId);
375
+ }
376
+ }
377
+ else if (source instanceof File) {
378
+ bytes = new Uint8Array(await source.arrayBuffer());
379
+ }
380
+ else {
381
+ bytes = source;
382
+ }
383
+ return this.workerClient.loadPdf(bytes);
384
+ }
385
+ /**
386
+ * Normalize page specification to a string format.
387
+ */
388
+ normalizePages(pages) {
389
+ if (typeof pages === "string") {
390
+ return pages;
391
+ }
392
+ if (typeof pages === "number") {
393
+ return String(pages);
394
+ }
395
+ return pages.join(",");
396
+ }
397
+ /**
398
+ * Destroy the client and release all resources.
399
+ * All viewers created by this client become invalid.
400
+ */
401
+ destroy() {
402
+ if (this.destroyed)
403
+ return;
404
+ this.destroyed = true;
405
+ // Destroy all viewers
406
+ for (const viewer of this.viewers) {
407
+ viewer.destroy();
408
+ }
409
+ this.viewers.clear();
410
+ // Terminate the worker (also cleans up render resources)
411
+ this.workerClient.terminate();
412
+ }
413
+ /**
414
+ * Get the underlying worker client (for internal use).
415
+ * @internal
416
+ */
417
+ getWorkerClient() {
418
+ return this.workerClient;
419
+ }
420
+ ensureNotDestroyed() {
421
+ if (this.destroyed) {
422
+ throw new Error("UDocClient has been destroyed");
423
+ }
424
+ }
425
+ }
426
+ /**
427
+ * Convert WASM license result to LicenseInfo.
428
+ */
429
+ function licenseResultToInfo(result) {
430
+ const hasLicensedFeatures = result.features.length > 0 || Object.keys(result.limits).length > 0;
431
+ return {
432
+ valid: result.valid,
433
+ tier: result.valid && hasLicensedFeatures ? "licensed" : "free",
434
+ features: result.features,
435
+ limits: result.limits,
436
+ organization: result.organization,
437
+ expiresAt: result.expiresAt ? new Date(result.expiresAt * 1000) : undefined,
438
+ error: result.error,
439
+ };
440
+ }
441
+ //# sourceMappingURL=UDocClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UDocClient.js","sourceRoot":"","sources":["../../src/UDocClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AASjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAsMxD;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACrB;;OAEG;IACH,MAAM,CAAU,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;IAEtC,YAAY,CAAe;IAC3B,OAAO,CAAgB;IACvB,OAAO,GAAoB,IAAI,GAAG,EAAE,CAAC;IACrC,SAAS,GAAG,KAAK,CAAC;IAClB,WAAW,GAAgB;QACjC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,YAAoB,YAA0B,EAAE,OAAsB;QACpE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QAC7C,kFAAkF;QAClF,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;YAClC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAE1B,gCAAgC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;YAC7B,CAAC,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAErD,+BAA+B;QAC/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,WAAW;gBAC1C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;gBAC1B,CAAC,CAAC,WAAW,CAAC;YAEhB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtE,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAEjD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,UAAyB,EAAE;QAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,KAAK,CAAC,OAAO,CAAC,YAAsB;QAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,oDAAoD;QACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC,CAAC,kBAAkB;QACvE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC9C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;QACzD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,8BAA8B;QAC9B,MAAM,oBAAoB,GAAkB,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CACzE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE;YAClC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CACJ,CAAC;QAEF,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAEnF,qDAAqD;QACrD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,cAAc,CAClB,MAAsB,EACtB,UAAyD,EAAE;QAE3D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAExF,yCAAyC;YACzC,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAED,OAAO;gBACL,OAAO;gBACP,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,0BAA0B;YAC1B,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,aAAa,CACjB,MAAsB,EACtB,UAAyC,EAAE;QAE3C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,UAAU,CAAC,MAAsB;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU,CAAC,MAAsB;QAC7C,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;YACjC,MAAM,KAAK,GAAI,MAAmD,CAAC,UAAU,CAAC;YAC9E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAiB,CAAC;QACtB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACvE,CAAC;gBACD,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACjE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,YAAY,IAAI,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAiC;QACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,yDAAyD;QACzD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,kBAAkB;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;;AAGH;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAqB;IAChD,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAChG,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;QAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}