@adaptive-ds/assets-optimizer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.gitattributes ADDED
@@ -0,0 +1,4 @@
1
+ # Lline Endings
2
+ text eol=lf
3
+ # Encoding Format
4
+ * text=auto encoding=UTF-8
@@ -0,0 +1,40 @@
1
+ name: Publish Package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ id-token: write # Required for OIDC
10
+ contents: read
11
+ jobs:
12
+ publish:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ # Checkout source code
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ ref: ${{ github.ref }}
19
+
20
+ # Setup Bun for installation, building, and testing
21
+ - uses: oven-sh/setup-bun@v1
22
+ with:
23
+ bun-version: latest
24
+
25
+ # Setup Node.js only for npm publishing with OIDC until Bun adds support for it - https://github.com/oven-sh/bun/issues/15601
26
+ - uses: actions/setup-node@v4
27
+ with:
28
+ node-version: "20"
29
+ registry-url: "https://registry.npmjs.org"
30
+
31
+ # Use Bun for everything except publishing
32
+ - run: bun install
33
+ - run: bun run build
34
+ # - run: bun test
35
+
36
+ # Ensure npm 11.5.1 or later is installed
37
+ - name: Update npm
38
+ run: npm install -g npm@latest
39
+ # Use npm only for publishing with OIDC support
40
+ - run: npm publish --access public --provenance
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+
2
+ MIT License
3
+
4
+ Copyright (c) 2025 David Siewert
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,325 @@
1
+ # @adaptive-ds/assets-optimizer
2
+
3
+ Process, hash, sync, and clean image assets for web projects that keep originals outside git and use R2 as the canonical store, with a separate pass for web videos.
4
+
5
+ This package is built for a workflow with two local directories:
6
+
7
+ - `images`: original source images, never modified
8
+ - `public/images`: generated optimized images, flat output only
9
+ - `videos`: original source videos, optional
10
+ - `public/videos`: processed videos, optional
11
+
12
+ It is designed for projects where:
13
+
14
+ - originals live in R2 and are synced locally
15
+ - optimized outputs should be deterministic and aggressively cacheable
16
+ - output filenames should change when either the source file or the transform changes
17
+ - old optimized files should be removed locally and remotely
18
+ - generated `imageList.ts` and `videoList.ts` should stay in sync with processed assets
19
+
20
+ ## Diagrams
21
+
22
+ ![Overview](docs/arch/overview_v1.excalidraw.svg)
23
+ ![Image process](docs/arch/process_image_v1.excalidraw.svg)
24
+ ![Video process](docs/arch/process_video_v1.excalidraw.svg)
25
+
26
+ ## What It Does
27
+
28
+ `assetsOptimize()` performs the full asset pipeline:
29
+
30
+ 1. Resolves the project name from `package.json.name`
31
+ 2. Uses that as the bucket base path on your `rclone` remote
32
+ 3. Syncs originals between R2 and `images`
33
+ 4. Scans transform folders like `1920x1080_jpg`
34
+ 5. Processes matching image source files with `sharp`
35
+ 6. Writes flat optimized images into `public/images`
36
+ 7. Names image files as `<basename>_<hash>.<ext>`
37
+ 8. Skips already-generated images
38
+ 9. Deletes stale optimized images locally
39
+ 10. Uploads missing optimized images to R2 with cache headers
40
+ 11. Deletes stale optimized images from R2
41
+ 12. Runs a separate optional video pass from `videos` to `public/videos`
42
+ 13. Generates a `.jpg` preview beside each processed video using the processed video dimensions
43
+ 14. Keeps video filenames unchanged and skips any processed video or preview that already exists
44
+ 15. Uploads missing processed videos and previews to R2 without deleting manual variants
45
+ 16. Generates `src/app/assets/imageList.ts` and `src/app/assets/videoList.ts` by default
46
+ 17. Prints a clear summary of what changed
47
+
48
+ The hash is derived from:
49
+
50
+ - source file bytes
51
+ - normalized transform spec
52
+
53
+ That means image cache keys change when the source image changes or when you change the folder rule, even if the output filename format stays short.
54
+
55
+ ## Folder Convention
56
+
57
+ Original files belong in transform folders inside `images`.
58
+
59
+ Example:
60
+
61
+ ```text
62
+ images/
63
+ 1920x1080_jpg/
64
+ kitchen.jpg
65
+ living-room.png
66
+ 1200x1200_webp/
67
+ kitchen.jpg
68
+ ```
69
+
70
+ This produces flat optimized image output like:
71
+
72
+ ```text
73
+ public/images/
74
+ kitchen_a1b2c3d4.jpg
75
+ living-room_9f8e7d6c.jpg
76
+ kitchen_7c6b5a4d.webp
77
+ ```
78
+
79
+ Root-level files directly inside `images` are intentionally skipped and warned on every run.
80
+
81
+ Videos are handled separately and do not use transform folders:
82
+
83
+ ```text
84
+ videos/
85
+ hero.mp4
86
+ intro.webm
87
+
88
+ public/videos/
89
+ hero.mp4
90
+ hero.jpg
91
+ intro.webm
92
+ intro.jpg
93
+ ```
94
+
95
+ Video behavior:
96
+
97
+ - if both local `videos` and remote `video-originals` are missing, the video pass does nothing
98
+ - source videos sync through `video-originals`
99
+ - processed videos sync through `video-processed`
100
+ - missing processed videos are created with `ffmpeg`
101
+ - missing preview images are created as `.jpg` files beside processed videos
102
+ - existing processed videos are skipped and preserved as manual transformations
103
+ - existing preview images are skipped and preserved
104
+ - video filenames and relative paths are kept as-is
105
+ - stale processed videos are not deleted
106
+
107
+ ## Transform Folder Format
108
+
109
+ Folder names must use:
110
+
111
+ ```text
112
+ <width>x<height>_<format>
113
+ ```
114
+
115
+ Supported image output formats:
116
+
117
+ - `jpg`
118
+ - `png`
119
+ - `webp`
120
+ - `avif`
121
+ Examples:
122
+
123
+ - `1920x1080_jpg`
124
+ - `1600x900_webp`
125
+ - `800x800_avif`
126
+ Image processing behavior:
127
+
128
+ - resize fit: `inside` / max-bounds scaling
129
+ - `withoutEnlargement: true`
130
+ - image auto-rotation is applied
131
+ - default quality is `80`
132
+
133
+ Supported video source extensions:
134
+
135
+ - `mp4`
136
+ - `mov`
137
+ - `m4v`
138
+ - `webm`
139
+ - `avi`
140
+ - `mkv`
141
+
142
+ ## Defaults
143
+
144
+ If you call `assetsOptimize()` with no arguments, it uses:
145
+
146
+ - `cwd`: `process.cwd()`
147
+ - `projectName`: `package.json.name`
148
+ - `processImages`: `true`
149
+ - `imageOriginalsDir`: `./images`
150
+ - `imageOptimizedDir`: `./public/images`
151
+ - `allowRootImageFiles`: `false`
152
+ - `processVideos`: `true`
153
+ - `videosDir`: `./videos`
154
+ - `processedVideosDir`: `./public/videos`
155
+ - `imageListOutputPath`: `./src/app/assets/imageList.ts`
156
+ - `videoListOutputPath`: `./src/app/assets/videoList.ts`
157
+ - `generateImageList`: `true`
158
+ - `generateVideoList`: `true`
159
+ - `videoPreviewQuality`: `80`
160
+ - `rcloneRemote`: `leo`
161
+ - `remoteImageOriginalsDir`: `image-originals`
162
+ - `remoteImageOptimizedDir`: `image-processed`
163
+ - `remoteVideoOriginalsDir`: `video-originals`
164
+ - `remoteVideoProcessedDir`: `video-processed`
165
+ - `cacheControlHeader`: `public,max-age=31536000,immutable`
166
+
167
+ So for a project named `moramontage`, the remote paths become:
168
+
169
+ - `leo:moramontage/image-originals`
170
+ - `leo:moramontage/image-processed`
171
+ - `leo:moramontage/video-originals`
172
+ - `leo:moramontage/video-processed`
173
+
174
+ ## Installation
175
+
176
+ ```bash
177
+ bun add @adaptive-ds/assets-optimizer
178
+ ```
179
+
180
+ ## Basic Usage
181
+
182
+ Example project entrypoint:
183
+
184
+ ```ts
185
+ import { assetsOptimize } from "@adaptive-ds/assets-optimizer"
186
+
187
+ await assetsOptimize()
188
+ ```
189
+
190
+ This generates optimized images, processed videos, video preview JPGs, `imageList.ts`, and `videoList.ts` in one run. Existing image alt text and existing video preview alt text are preserved when the generated files already exist.
191
+
192
+ ## API
193
+
194
+ ```ts
195
+ import { assetsOptimize } from "@adaptive-ds/assets-optimizer"
196
+
197
+ const result = await assetsOptimize(options)
198
+ ```
199
+
200
+ ### `OptimizeImagesWebOptions`
201
+
202
+ ```ts
203
+ interface OptimizeImagesWebOptions {
204
+ cwd?: string
205
+ projectName?: string
206
+ processImages?: boolean
207
+ imageOriginalsDir?: string
208
+ imageOptimizedDir?: string
209
+ allowRootImageFiles?: boolean
210
+ imageListOutputPath?: string
211
+ imageListImportPath?: string
212
+ generateImageList?: boolean
213
+ processVideos?: boolean
214
+ videosDir?: string
215
+ processedVideosDir?: string
216
+ videoListOutputPath?: string
217
+ videoListImportPath?: string
218
+ generateVideoList?: boolean
219
+ videoPreviewQuality?: number
220
+ rcloneRemote?: string
221
+ remoteImageOriginalsDir?: string
222
+ remoteImageOptimizedDir?: string
223
+ remoteVideoOriginalsDir?: string
224
+ remoteVideoProcessedDir?: string
225
+ cacheControlHeader?: string
226
+ }
227
+ ```
228
+
229
+ ### `OptimizeImagesWebResult`
230
+
231
+ ```ts
232
+ interface OptimizeImagesWebResult {
233
+ processed: string[]
234
+ skippedExisting: string[]
235
+ skippedRootFiles: string[]
236
+ warnings: string[]
237
+ deletedLocal: string[]
238
+ uploadedRemote: string[]
239
+ deletedRemote: string[]
240
+ processedVideos: string[]
241
+ skippedExistingVideos: string[]
242
+ uploadedRemoteVideos: string[]
243
+ processedVideoPreviews: string[]
244
+ skippedExistingVideoPreviews: string[]
245
+ uploadedRemoteVideoPreviews: string[]
246
+ }
247
+ ```
248
+
249
+ ## Example With Custom Paths
250
+
251
+ ```ts
252
+ import { assetsOptimize } from "@adaptive-ds/assets-optimizer"
253
+
254
+ await assetsOptimize({
255
+ processImages: true,
256
+ imageOriginalsDir: "./assets/originals",
257
+ imageOptimizedDir: "./assets/optimized",
258
+ allowRootImageFiles: false,
259
+ imageListOutputPath: "./src/app/assets/imageList.ts",
260
+ processVideos: true,
261
+ videoListOutputPath: "./src/app/assets/videoList.ts",
262
+ videoPreviewQuality: 80,
263
+ rcloneRemote: "leo",
264
+ remoteImageOriginalsDir: "image-originals",
265
+ remoteImageOptimizedDir: "image-processed",
266
+ cacheControlHeader: "public,max-age=31536000,immutable",
267
+ })
268
+ ```
269
+
270
+ ## Requirements
271
+
272
+ - `bun`
273
+ - `rclone`
274
+ - `ffmpeg`
275
+ - an existing `rclone` remote, defaulting to `leo`
276
+ - write access to the target bucket/path
277
+ - Node/Bun environment capable of running `sharp`
278
+
279
+ This package assumes the remote bucket/path already exists or can be created by `rclone mkdir`.
280
+
281
+ ## Cleanup Behavior
282
+
283
+ The package does not use a manifest.
284
+
285
+ Instead it derives the expected output set from the current originals and current transform folders, then reconciles that against:
286
+
287
+ - local `public/images`
288
+ - remote `image-processed` objects
289
+
290
+ That means:
291
+
292
+ - files no longer produced by the current source set are deleted
293
+ - renaming or removing a source file cleans up stale optimized files
294
+ - changing a transform folder causes a different hash and a different output filename
295
+
296
+ ## Recommended Workflow
297
+
298
+ 1. Add or sync originals into `images/<transform-folder>/`
299
+ 2. Run your local image pipeline entrypoint
300
+ 3. Regenerate your typed image list
301
+ 4. Reference the generated hashed filenames from app code or derived metadata
302
+
303
+ ## Important Caveat
304
+
305
+ If your project currently stores source images directly at the root of `images`, this package will skip them by design.
306
+
307
+ Before adopting it fully, move originals into explicit transform folders such as:
308
+
309
+ ```text
310
+ images/1920x1080_jpg/
311
+ ```
312
+
313
+ That contract is what makes the output deterministic and safe to clean automatically.
314
+
315
+ ## Publishing
316
+
317
+ This package is intended to be published from:
318
+
319
+ - npm package: `@adaptive-ds/assets-optimizer`
320
+ - homepage: `https://github.com/david1gp/assets-optimizer`
321
+ - generated asset lists import types from this package name by default unless you override `imageListImportPath` or `videoListImportPath`
322
+
323
+ ## License
324
+
325
+ MIT
@@ -0,0 +1,8 @@
1
+ {
2
+ "folders": [
3
+ {
4
+ "path": "."
5
+ }
6
+ ],
7
+ "settings": {}
8
+ }
package/biome.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
3
+ "assist": {
4
+ "actions": {
5
+ "source": {
6
+ "organizeImports": "on"
7
+ }
8
+ }
9
+ },
10
+ "formatter": {
11
+ "enabled": true,
12
+ "indentStyle": "space",
13
+ "lineWidth": 120
14
+ },
15
+ "javascript": {
16
+ "formatter": {
17
+ "semicolons": "asNeeded"
18
+ }
19
+ },
20
+ "linter": {
21
+ "enabled": true,
22
+ "rules": {
23
+ "recommended": true,
24
+ "suspicious": {
25
+ "noExplicitAny": "off",
26
+ "noTsIgnore": "off"
27
+ },
28
+ "correctness": {
29
+ "useExhaustiveDependencies": "info"
30
+ },
31
+ "style": {
32
+ "noNonNullAssertion": "off",
33
+ "noInferrableTypes": "off",
34
+ "useImportType": "off",
35
+ "noParameterAssign": "error",
36
+ "useAsConstAssertion": "error",
37
+ "useDefaultParameterLast": "error",
38
+ "useEnumInitializers": "error",
39
+ "useSelfClosingElements": "error",
40
+ "useSingleVarDeclarator": "error",
41
+ "noUnusedTemplateLiteral": "error",
42
+ "useNumberNamespace": "error",
43
+ "noUselessElse": "error"
44
+ }
45
+ }
46
+ },
47
+ "vcs": {
48
+ "enabled": true,
49
+ "clientKind": "git",
50
+ "useIgnoreFile": true
51
+ }
52
+ }
package/bun.lock ADDED
@@ -0,0 +1,110 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "configVersion": 1,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "@adaptive-ds/optimize-images-web",
7
+ "dependencies": {
8
+ "image-size": "^2.0.2",
9
+ "sharp": "^0.34.5",
10
+ },
11
+ "devDependencies": {
12
+ "@biomejs/biome": "^2.4.11",
13
+ "@types/bun": "latest",
14
+ "@types/node": "^25.6.0",
15
+ "typescript": "^6.0.2",
16
+ },
17
+ },
18
+ },
19
+ "packages": {
20
+ "@biomejs/biome": ["@biomejs/biome@2.4.11", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.11", "@biomejs/cli-darwin-x64": "2.4.11", "@biomejs/cli-linux-arm64": "2.4.11", "@biomejs/cli-linux-arm64-musl": "2.4.11", "@biomejs/cli-linux-x64": "2.4.11", "@biomejs/cli-linux-x64-musl": "2.4.11", "@biomejs/cli-win32-arm64": "2.4.11", "@biomejs/cli-win32-x64": "2.4.11" }, "bin": { "biome": "bin/biome" } }, "sha512-nWxHX8tf3Opb/qRgZpBbsTOqOodkbrkJ7S+JxJAruxOReaDPPmPuLBAGQ8vigyUgo0QBB+oQltNEAvalLcjggA=="],
21
+
22
+ "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wOt+ed+L2dgZanWyL6i29qlXMc088N11optzpo10peayObBaAshbTcxKUchzEMp9QSY8rh5h6VfAFE3WTS1rqg=="],
23
+
24
+ "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-gZ6zR8XmZlExfi/Pz/PffmdpWOQ8Qhy7oBztgkR8/ylSRyLwfRPSadmiVCV8WQ8PoJ2MWUy2fgID9zmtgUUJmw=="],
25
+
26
+ "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-avdJaEElXrKceK0va9FkJ4P5ci3N01TGkc6ni3P8l3BElqbOz42Wg2IyX3gbh0ZLEd4HVKEIrmuVu/AMuSeFFA=="],
27
+
28
+ "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-+Sbo1OAmlegtdwqFE8iOxFIWLh1B3OEgsuZfBpyyN/kWuqZ8dx9ZEes6zVnDMo+zRHF2wLynRVhoQmV7ohxl2Q=="],
29
+
30
+ "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.11", "", { "os": "linux", "cpu": "x64" }, "sha512-TagWV0iomp5LnEnxWFg4nQO+e52Fow349vaX0Q/PIcX6Zhk4GGBgp3qqZ8PVkpC+cuehRctMf3+6+FgQ8jCEFQ=="],
31
+
32
+ "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.11", "", { "os": "linux", "cpu": "x64" }, "sha512-bexd2IklK7ZgPhrz6jXzpIL6dEAH9MlJU1xGTrypx+FICxrXUp4CqtwfiuoDKse+UlgAlWtzML3jrMqeEAHEhA=="],
33
+
34
+ "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-RJhaTnY8byzxDt4bDVb7AFPHkPcjOPK3xBip4ZRTrN3TEfyhjLRm3r3mqknqydgVTB74XG8l4jMLwEACEeihVg=="],
35
+
36
+ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.11", "", { "os": "win32", "cpu": "x64" }, "sha512-A8D3JM/00C2KQgUV3oj8Ba15EHEYwebAGCy5Sf9GAjr5Y3+kJIYOiESoqRDeuRZueuMdCsbLZIUqmPhpYXJE9A=="],
37
+
38
+ "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
39
+
40
+ "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
41
+
42
+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
43
+
44
+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
45
+
46
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
47
+
48
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
49
+
50
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
51
+
52
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
53
+
54
+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
55
+
56
+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
57
+
58
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
59
+
60
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
61
+
62
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
63
+
64
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
65
+
66
+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
67
+
68
+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
69
+
70
+ "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
71
+
72
+ "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
73
+
74
+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
75
+
76
+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
77
+
78
+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
79
+
80
+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
81
+
82
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
83
+
84
+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
85
+
86
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
87
+
88
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
89
+
90
+ "@types/bun": ["@types/bun@1.3.12", "", { "dependencies": { "bun-types": "1.3.12" } }, "sha512-DBv81elK+/VSwXHDlnH3Qduw+KxkTIWi7TXkAeh24zpi5l0B2kUg9Ga3tb4nJaPcOFswflgi/yAvMVBPrxMB+A=="],
91
+
92
+ "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
93
+
94
+ "bun-types": ["bun-types@1.3.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-HqOLj5PoFajAQciOMRiIZGNoKxDJSr6qigAttOX40vJuSp6DN/CxWp9s3C1Xwm4oH7ybueITwiaOcWXoYVoRkA=="],
95
+
96
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
97
+
98
+ "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="],
99
+
100
+ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
101
+
102
+ "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
103
+
104
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
105
+
106
+ "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="],
107
+
108
+ "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
109
+ }
110
+ }
package/bunfig.toml ADDED
@@ -0,0 +1,2 @@
1
+ [console]
2
+ depth = 5
package/cliff.toml ADDED
@@ -0,0 +1,90 @@
1
+ # git-cliff ~ configuration file
2
+ # https://git-cliff.org/docs/configuration
3
+
4
+ [git]
5
+ conventional_commits = true
6
+ require_conventional = false
7
+ filter_unconventional = false
8
+ tag_pattern = "v[0-9].*"
9
+ # Split commits on newlines, treating each line as an individual commit.
10
+ split_commits = false
11
+ # An array of regex based parsers to modify commit messages prior to further processing.
12
+ commit_preprocessors = [
13
+ # Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
14
+ #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
15
+ # Check spelling of the commit message using https://github.com/crate-ci/typos.
16
+ # If the spelling is incorrect, it will be fixed automatically.
17
+ #{ pattern = '.*', replace_command = 'typos --write-changes -' },
18
+ ]
19
+ # Prevent commits that are breaking from being excluded by commit parsers.
20
+ protect_breaking_commits = false
21
+ # An array of regex based parsers for extracting data from the commit message.
22
+ # Assigns commits to groups.
23
+ # Optionally sets the commit's scope and can decide to exclude commits from further processing.
24
+ commit_parsers = [
25
+ { message = "^feat", group = "<!-- 0 -->🚀 Features" },
26
+ { message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
27
+ { message = "^doc", group = "<!-- 3 -->📚 Documentation" },
28
+ { message = "^perf", group = "<!-- 4 -->⚡ Performance" },
29
+ { message = "^refactor", group = "<!-- 2 -->🚜 Refactor" },
30
+ { message = "^style", group = "<!-- 5 -->🎨 Styling" },
31
+ { message = "^test", group = "<!-- 6 -->🧪 Testing" },
32
+ { message = "^ci", group = "<!-- 12 -->🤖 CI" },
33
+ { message = "^ops", group = "<!-- 11 -->🏭 Operations" },
34
+ { message = "^chore\\(release\\): prepare for", skip = true },
35
+ { message = "^chore\\(deps.*\\)", skip = true },
36
+ { message = "^chore\\(pr\\)", skip = true },
37
+ { message = "^chore\\(pull\\)", skip = true },
38
+ { message = "^chore", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
39
+ { body = ".*security", group = "<!-- 8 -->🛡️ Security" },
40
+ { message = "^revert", group = "<!-- 9 -->◀️ Revert" },
41
+ { message = ".*", group = "<!-- 10 -->💼 Other" },
42
+ ]
43
+ # Exclude commits that are not matched by any commit parser.
44
+ filter_commits = false
45
+ # An array of link parsers for extracting external references, and turning them into URLs, using regex.
46
+ link_parsers = []
47
+ # Include only the tags that belong to the current branch.
48
+ use_branch_tags = false
49
+ # Order releases topologically instead of chronologically.
50
+ topo_order = false
51
+ # Order releases topologically instead of chronologically.
52
+ topo_order_commits = true
53
+ # Order of commits in each group/release within the changelog.
54
+ # Allowed values: newest, oldest
55
+ sort_commits = "oldest"
56
+ # Process submodules commits
57
+ recurse_submodules = false
58
+
59
+
60
+ [changelog]
61
+ # A Tera template to be rendered for each release in the changelog.
62
+ # See https://keats.github.io/tera/docs/#introduction
63
+ body = """
64
+ {% if version %}\
65
+ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
66
+ {% else %}\
67
+ ## [unreleased]
68
+ {% endif %}\
69
+ {% for group, commits in commits | group_by(attribute="group") %}
70
+ ### {{ group | striptags | trim | upper_first }}
71
+ {% for commit in commits %}
72
+ - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
73
+ {% if commit.breaking %}[**breaking**] {% endif %}\
74
+ {{ commit.message | upper_first }}\
75
+ {% endfor %}
76
+ {% endfor %}
77
+ """
78
+ # Remove leading and trailing whitespaces from the changelog's body.
79
+ trim = true
80
+ # Render body even when there are no releases to process.
81
+ render_always = true
82
+ # An array of regex based postprocessors to modify the changelog.
83
+ postprocessors = [
84
+ # Replace the placeholder <REPO> with a URL.
85
+ #{ pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" },
86
+ ]
87
+ # render body even when there are no releases to process
88
+ # render_always = true
89
+ # output file path
90
+ # output = "test.md"
@@ -0,0 +1,2 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1029.714111328125 744.0092926025391" width="1029.714111328125" height="744.0092926025391"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1daXPiSFx1MDAxMv0+v8Lh/TrUVNZdXHUwMDEzsbHh225cdTAwMWJf4KsnJlx1MDAxY1x1MDAxOGSs5lx1MDAxMFx1MDAwNuFrY/77ZmFcdTAwMWJcdTAwMDGSQGBwuzdwx3i6hYA68uV7mZVV+u9vKyur4XPLW/1zZdV7KpfqfqVdelxc/d1df/DaXHUwMDFkP2jiS6z3707QbZd7d96FYavz51x1MDAxZn80Su2aXHUwMDE3tuqlskdcdTAwMWX8TrdU74Tdilx1MDAxZpBy0PjDXHUwMDBmvUbnP+73Yanh/btcdTAwMTU0KmGbRF+S8yp+XHUwMDE4tF+/y6t7XHKvXHUwMDE5dvDT/8J/r6z8t/dcdTAwMWJf8SvuXHUwMDFiv2/ozfv8j/bl7s2tKe35V9Xtb53eW3s3vXeh7ZXDUrNa96KXnvA6Z4JQbUBQJo02lqr+y8/4co5xTbSSjEltqLHK9F9+9CvhnftcdTAwMDRcdTAwMGVcdTAwMDQkXHUwMDE1XGZAuLv6N9x5fvUuxDtcdTAwMTRcdTAwMDVcIrVS+OGaXHUwMDFipm3/ltdcdTAwMDb9uUL7VzphO6h5XHUwMDFiQVx1MDAxZLuPrf5cdTAwMTd47k/U5ptSuVZtXHUwMDA33Walf0/YLjU7rVJcdTAwMWJcdTAwMDcpuu/Wr9dcdTAwMGLhc+/TcXpwXFxXR77j4q39MHI97V34pdW7ptfpXGa9J2iVyn7ohlxuaNRcdTAwMGLXwtZepTdnf0dtauNs77lJa3br9f5lv1nx3FSslvJD39asvH3b+4RHs8nfrvxcdTAwMTO13fPcXHUwMDA3XHUwMDBiLjTTXHUwMDEwTUJkqVx1MDAwMKBHL1x1MDAxZlx1MDAwNs2e2TJKtbVW8OiNfmdcdTAwMTMtL+x96i1ar1x1MDAxN02Ba9rWgFVGPey2KqXXt4DWinElKJWa9V+v+83aaPfrQblcdTAwMTZ9y29cdTAwMDPdXHUwMDFhMfQj7/txLVfbuz+zXHKjNtdcdTAwMGXyu7vZXHI95yydKc6pVNgsxeSwoXOwRFx1MDAxYokmzikwZSWPWbpQilx1MDAxOKlcdTAwMDGHXHUwMDE4lFx1MDAxZcRC39S1g1x1MDAxM7XMMoWA4lx1MDAxNpamnmzqh1x1MDAxZjZ1XHUwMDEwYFx1MDAwNPqcXHUwMDAxj1x1MDAxNVx1MDAxObtiLM3WXHUwMDAxp1GAZfCVbf3bMzsvyoeLl5eL79VCsVJaV3Qnu62DpUSgR1ZcdTAwMTaMXHUwMDE1klx1MDAwM1x1MDAxYjZ2kIZcdTAwMTilqJRGWjo4XHUwMDE077bONCWIXHUwMDE0g/6fU6GMTrB1IDjMRnHt0Fx1MDAwMkwsbT3Z1o8+bOtcbriSYJPcuuWxq31Lx1x1MDAxOVZKUzaLofdcdTAwMWJcdTAwMTc1c8DwQu8pmpVcdTAwMDG7rT029yvVYv6OXHUwMDA3jedu82nft/Wr1f59//ye/LGvby5cdTAwMWaJ64fb01x1MDAwM77xWFx1MDAwZlx1MDAxZTb904vOzvXwt7x/f6ndXHUwMDBlXHUwMDFls35ut3rWeG5dnctDtu+Hldv87tqBzPa5b3/7JNQnj15cZvVDg/9cbnijiLTcUT+AXHUwMDAxJfhcYt65JFJcbmyv1SjS1IBcdTAwMTJ4XHUwMDA3vGKES2u5lVx1MDAxYS1ccvFcdTAwMWNcdTAwMDf8XHUwMDAwZS5cdTAwMTE+hPDjZIRcdTAwMGbd/U5bXHUwMDE0UDygyEjAslx1MDAxNqlYlkJasOjTXHUwMDE3QFp2XHUwMDFh842s0Vkhdt5vlKregFx1MDAwZbtccpphwX95lZVDV7dLXHK/7kZcXFx1MDAwZX3IWt2vNnv4x/Z67dXBIVxifYyJ+jc0/EplkOvK+KElv+m197KQZtD2q36zVC+mNLzUXHKDU6/z2vSw3fVcdTAwMDZHxdt9R1x1MDAwMVx1MDAxMCbHYDhcXGf1gO9Xg+PAY8WdnUbxx4WegrlccuJQMCrQTuSoSFx1MDAwNUFcXFx1MDAwMGW4XHUwMDE2XHUwMDE0ozWMqeK8LTQyOzI6Q5CD0Vwigbhcclx1MDAxMINcIlxiXGbGdVxccL2EdVxurE8+TtxcdTAwMDK9sZY0pkZ7XHLUqVx1MDAwMZnCKVx1MDAxNFx1MDAxMj6TurdrL0/li/x1bqNcXKjpR2/7vFLf/7+j2OReZqJYi1x1MDAxNEudXHUwMDEztkikxlx1MDAwZUtqwVx0KEBcdTAwMGV2ikui5l5cdTAwMTLsPJF4Olx1MDAwNcG6TFx1MDAxM1qOXHUwMDE2XHSYXHUwMDFinLZRtWyllehbXHUwMDE3klx1MDAwM7F8XG7z/cJcdTAwMTQ7gd0+h2KfTmpcdTAwMWSdzyvz/Th//SCKJ2x/aytcdTAwMTOGmURcdTAwMDZcdTAwMTVcdTAwMDY5XHUwMDE0Q1tE48BcXL9mO61cItaARVrUXHUwMDE41lx1MDAwZWQq+9lOZohmwFx1MDAwMe9QQ1x1MDAwNN1HMV+iOFx1MDAwNcWFKVDsUnHMXHUwMDFhnaSTQfHRq+8oNtRyJmBcdTAwMDD8Pym5XHUwMDEzXHUwMDAz8UGAOFu5XHLqXHUwMDE1r73iN1eCltcsXHUwMDA3XHUwMDE1L1x1MDAxOdZm6OokWNe923BcZqjDoJWG6KFcdTAwMWWMwndyk+dcdTAwMDPo/eZ93lx1MDAxZa2t313kitJvXFytXHUwMDFm73e+ZdbMzFx1MDAxOFx1MDAwMlx1MDAxY6nZXHUwMDAyXHUwMDAznH5cdTAwMWTL7Fx1MDAxYUJcdTAwMTnTXGJ+lMwssu0+pq0mXHUwMDFjQFMlXHUwMDA1elx1MDAwMJOU13XZYSmMNVRcdTAwMDOSf2R/S4hcdTAwMGZBvDiHvK7RbiWKJeV1tY2xerSGgdOPUDXR+75eXndn73Dn26E4p61bflI5uV6v7vjrWahcdTAwMGJlXHRiiGp0blx1MDAxONyNmjiz3EV9rvNcdTAwMWFAmXhcXMhcdTAwMTkym9RcdTAwMWO741x1MDAxNulgSVxc01j1WXbiciYjkYWS1CdcdTAwMWaT35FcdTAwMTiwW1xm+n628cZ469RrXHUwMDA0obdSXGKDNoq5lfUu3lx1MDAxZH5h0prQ3vkwVjFYL3XpXHUwMDE1XHUwMDE1nJ2H1r8zN1pcdTAwMDaZcCxcdTAwMTRhWqF+RFx1MDAxMGpuRlx1MDAxMrVcZiShXHUwMDFjvZxCPjJAXHUwMDEzkMyMXCJUa3STQ6mbJYonovh8qiwtV5SCSErc8Hg6p1x1MDAxZkRKo5XR8PNJKIbjR++m44dertVcdTAwMGV+oJDKNXG0vjCMxzd3PijOnVxc7V5cdTAwMWWZJ3NvuSi8bPwo3duD7KUzmqGuVFSh8ujlWkdIXHUwMDE5JFIuRpMuzkS4JpTOYKBCrKZcdTAwMDapu7fIqlwi71x1MDAxZlx1MDAxNc9Igs5cdTAwMDApmyvrXHUwMDE2uyNcdTAwMWJYontcYt1cdTAwMTdcdTAwMWZWnpxqYVx1MDAwMJJcIk6bztxgrWXUsoFcdTAwMTWdhedqb3ZNO3+7/nifb1x1MDAxNbv3dLvlybL/XHTLrG9/+ySxnNzLXGYkK1x1MDAxOCeaoi/mb8iKLYcqopVGLtZcdTAwMTLVsIona1x1MDAwMeU26jGDYpnZlJhwma1Ng+LlNHlcdTAwMWWgTFx1MDAxYpkkl5mRqaBzgVx1MDAxZeWLKeKxclxu+43xbC/nmXunsy+RtZ3Ac4lZ26RcdTAwMWXMh3W/35U21588b3s9/LH90Lk+5XtXPPtcbinikVApMJKVXHUwMDAyXHJcdTAwMDdZdkRCc0tcZkPkolx1MDAxMJNguYrXOriEj8RcdTAwMTeRml2RXHUwMDFleqxcdTAwMDTeXHUwMDA1SoBcdTAwMDOqbdXLKi2LVlPAfvVh3lx1MDAwNWG15JImOlx1MDAwMeTjVOrFQFtcdTAwMGLKZ1sl/ayanuC6ZP21l7MweCpcdTAwMWWdXWzkWa2ShcTQkFx1MDAwNWFGW4MsJVFBwoidgyZcbs1cdTAwMWY0XHUwMDFhO/pCXHUwMDFhZ7FlqDirUX+fgsFQ/Fx0zUEl5SuZSV3iXHUwMDA3aZlAU/v5dajLUHEyad1cdTAwMWRcdTAwMTXZ/qVcdTAwMDc7z+H+9l1BdVT3x172UFFcdFwiOUcsM7cyzUXk6dxwMaVcYkexqTFY1FJRXHUwMDE2rz1fhopzRHfp45Tl5oFJm1xieqA6VbgqyVx1MDAwNVx1MDAxZtqhsfBg8aW7q3KPXHUwMDA3h0Vdbpbl/dXxzk2nkDVY3GhcdTAwMWVvnsN57fHksdC9v71t313Uq18xWEzuZZZgXHUwMDExXHUwMDE0McLipFCnJthwrOgoVLntXHUwMDFjmjNcdTAwMDZ8UKNEsaImXHUwMDFj4Ys0/LpcdTAwMDKZXHUwMDAwzWWsmIbFmymYXHUwMDE2qNKaqaScrFx1MDAxOLPhQ2ohjDFyplx1MDAwNM2kWFFPYb4xon3wK17wtWLFXHREN8q9qT2YXHUwMDBm7bKCf9s4y/ntk/xhWZSO1moln02RoaVcYm2qXGazxiF0hHbRnlxiRpGupo9q/C2WXHUwMDE52oVCvfxx2mWGXHUwMDFhJFCTXFxPq9LraXHu3daHz2NdY4vX8rTq14thRVx1MDAxNNpcdTAwMDH98czDrKxbXHUwMDBiT89vlb5qhe3D+6NcdTAwMGKwXHUwMDFie+H6V2Td5F5mYl1BXHUwMDA0unJQwCR65+FqWiRaXCKtNFx1MDAwNtlcdTAwMTRcXKV6nHRdJZ9bXbGv1bhcdTAwMDO7XHUwMDAwl6Q7XHUwMDExiZUpSFczXHUwMDAwq2ziSqiAVNaVWlx1MDAxYk0pX0RBw8BGuJlJXHUwMDE3g8Uy9tqrfFx1MDAwNdKdQHPJpJvQg/mQ7rN/9VL02OZx80Hahnmq0kOTUKSUvvlUXHUwMDExV1x1MDAxOFx1MDAwMT1YjmxhYVx1MDAxYV/E+Fei4FZGm4RId7nzdG449+bAuKA5hrkmKdA1OrVcdTAwMGWXK025XHUwMDE2cib4z8a4bON74eZi+7pQOTw+qGhcdTAwMWRcbutDVsbNe+WNwkn4XHUwMDEy7rWP91x1MDAwMt64uVxmXHUwMDFiKlx1MDAxYuOO/dxfJn5OXHUwMDFlvVxmTJ6z4PaWakSj5W6z+Uhuy1rChTQuNHZcdTAwMWJT4yX1XG6IO32C9ZLcw/W7SyqfXGLx2+xUjiNLJWibVOCgbCqU3bxh1C1cdTAwMTaRqFZcdTAwMDNcdTAwMDMwK5V/ibB5XHUwMDAyZyYy+Nyj5cuTnbtvt/XnVq1xdXhcdTAwMWFuXHUwMDE2y42D8lx1MDAxNMStXHJRWuhod8uwKFx1MDAwN0aki5dx3jDgZVx0ZVx1MDAxM8vdp3NEdvXj5C0pTpWB5HXVuKJ/R7xFXVx1MDAwNqDlJyapi7d+9/Jsb+N0PX9y1eQv7Y2j0+Bnk/cvXHUwMDEzhiePXlx1MDAxNvI2kjDDpUFBLtDJy+FccnEgKLHS1TByTjXeXHUwMDE0l+tL9u5dnVx1MDAxMeN3U1x1MDAwNOJcXFx1MDAxYqncXHUwMDFlpVx1MDAwNDRblbovxlJcdTAwMTDSZc1cdTAwMTbB3jCF/X5h9p5AnJ/D3uO92IinXHUwMDE5RrE0xHJcdTAwMTCWMvyfpHyYuF1ELcfG3EjJxq08S4lcdTAwMTF1cshNXbFcdOdKKevOzor8xFx1MDAxMtFDiPanQDTTUief6iRV+lxuslx1MDAxNtZlPj8xl10sbT/lrzZcdTAwMTlcdTAwMWNcdTAwMWWtXHUwMDE1nq+3qtxsbS6W7PqXW4E/2va/XHUwMDA2WkhcdTAwMDebS/t///v3xLvT7Nz95GImXHUwMDFlfVqsg52w1Fx1MDAwZddx1v1mdViTvVx1MDAxZNeZJSrAu1x1MDAxYm437Z/Ow9z4g0OPtv/kVY5d34e6jn0kKOrg96FO0eFcdTAwMWaWNFxm6EfLXTeO74NcdTAwMTSpRa9ZmdyV8S5yTl1JnMAxLe9Nw5pziHdeKVx1MDAwNkrs1+Bro57Tq99cdTAwMDSPXHRcdTAwMTbXXGJcdTAwMWW8vP/a4s6FXHUwMDFm3r1cdTAwMDEodmO91Fx0N4JGw1x1MDAwZsOog65cdTAwMDXjlFpcIpSyKDVcdTAwMDDkXHUwMDBmZqVUKNQ4XHUwMDFkWHju+XjGiCtg6G2DtqB5Qp1cdTAwMDJVRGhrjLGgeqdcdTAwMGItlVp2v/5jXG6/3ltwNslx15jj+pCfXHUwMDA1Y3y2nOkkpfahXHUwMDAzSFx1MDAxOFlcdFqh33BcbudcdTAwMGLItVx0SmlUriW2fj6abXx6d5xm40pcdTAwMTKOUTZcIlx1MDAxOVxyZTCyclx1MDAwM8cpJ4Irt1x1MDAxMVx1MDAxZdy5y1x1MDAxMVSj2l5JXGbG6Fxm5f0rnONodlvGNUeeXHUwMDEzgjOml6mWNHDXplx1MDAwMLelOFx1MDAxZiBcdTAwMTJcdTAwMGYmXHUwMDE5PNt6XHUwMDE03dxcdTAwMWHZS5t9om5cdTAwMGIr+fVvQX1rf+vb/Vx1MDAxZb0vfNed419Rt+XSrd39xOz848ptfFx1MDAxOdSA3PGbXHUwMDFkf+BElPF6h2JoZiU6ekfTXHUwMDE03X1E0683oDQ17qxcdTAwMTKquMvW60UouVx1MDAwNYjSuFx1MDAwNFx1MDAxZOlcdTAwMTbqvP9/aZeItlxm0s6d1sxccnNYXHUwMDFiOXn8dVx1MDAwMU1cdTAwMTKX9dFcZu9jksZPXHUwMDA0UKKXglx1MDAxM/hLmqEqt6Wum+j669ldv8JcdTAwMTlQisUrTXviLdXxU1x1MDAwNuBOXllA+ami0VxczyDrgKx0npvlryDpJlxiqVFJXHUwMDE3a/l85Nz4rdHj5ZxcInLcYVx1MDAwMO7pXHUwMDAzXFxbVHSKuUrR+K5EZoD0XHUwMDBltNcoLjTlPCGTXHUwMDBlxFx1MDAxZFx1MDAxZWwlXHUwMDEznErJXHUwMDA2XHUwMDBmOVxc4npcYteNaUrctERxkbyDi7OY0IskXHUwMDFkTpSb0U/c+V/3L8Pntcdv9U16eUXlfrHW5bVfVNKlmbv7iVx1MDAxYvrHNd34bdAzXHSf4T7PonMySbbxJ1svJdvKjJItXHUwMDE5TZkkXHUwMDFiJ9pQ3juqToA2I5vQ3Vx0XHUwMDEzIFx1MDAwNWCAL1xciJ+QjluqtpXZvXszu3dnXHUwMDE0h1ejXHUwMDA0S1x1MDAwZdjTnLtcdTAwMGLV3VraXHUwMDAyXHUwMDBlclL0Q1x1MDAwN0x8IdU2QS99kmpcdTAwMWJfpjFOtWlBXFzWQFlh3LmKali0geSEaUupoIxyiEOYWbdkxFx1MDAxOXD0llYnPVx1MDAxMMpcdTAwMTKLWtA99MxcYlR/NLK3JaKHXHUwMDEwXHUwMDFkTKHXmHu2XHUwMDE2T9l8q9PLmnBcdTAwMDasXHUwMDE0nynX7vKP3U4tbJQ3q/fVm4NdXHUwMDAwj2//inIt1dTdTy5m5Vx1MDAxZlx1MDAxN2tcdTAwMGJYb1xcgOTJpN7G7+74Sbrz11x1MDAxM2vJWMpcIta0XCLMPStcdTAwMGUoY1ZcZjyU73WvmXRcdTAwMGb+Y+B2o2EwXHUwMDAy8bJWo4lwj26gXHUwMDAyRopfllJtomNvTeHYJUVcdTAwMWE2XHTna7pcdTAwMTGG0Yvvfl1zyzlO7EKk2of2d3Oy0m3Vg9KX2GQ2QSaNirWEts9HrsmHbdZ5Wt/NXHUwMDE1fNg629+h14enU1Sp9/aHuUORjDTGKGVHQi+pXHRcdTAwMDKdakZccnXHSrE4nvFcIqHCUlx1MDAwMJa2xYy5XHUwMDEzWzQ3r1x1MDAwN4SpJbzT4H3/4Sp1SzW4qUqKz3h6gMbcVns1uN3+61x1MDAxZP7Vejm73FxytjxRaLb5eVtcXF9eXSY82CDlSSXISO4occ5cdTAwMThTsVPuLGHKur1cdTAwMTZgXHK4h83GrFx1MDAxY0BcdTAwMTONisyCVSOHXHUwMDBlLWlrol23p6At4O7Ad56cYZDpXHUwMDA3k7hHYmu6kI1VXHUwMDFmPFx1MDAwMazVvan75bdHf8yDvFx1MDAxNnT0V0o750NU41x1MDAxZmo2viBbXHUwMDEy97xWw9FLgbR6eE9kzlx1MDAwMNGCg0WOQj1KZcJOKsJRiUpAeuP4Z1DcRLlcdTAwMDVFNJf4XCJcdTAwMDcwWqnlWlBcbpY72bGMjpJyKVx1MDAxM4uyXHUwMDEx52lQllJcdTAwMDBcIn02MupT5VSphULr25l3dVx1MDAxZfCd2uWPx7Z/cGNK9ldMLeTSbd39xKw8+rxYXHUwMDE3M+ZcdTAwMTZcdTAwMTawnPKzyrLHP5BtZcY6JYzDXHUwMDE4aOq2/kvOo6dcdL++SinHSJq6zdxoSFRoUFN27ddLPiSjLYuSXHUwMDAzaol7LCS6XHUwMDE1obiwI1QgJDFaSop8gH6HJVx1MDAxY/24rNvuXZ3R94dT6DjGLf7HXHUwMDEzj7qB9INcXDFcZmGGsdm2y07IP8CHloq+WN32XHUwMDA0QbWYuu3f3pzSaqnVKoQ4wn1viiblV0ZG4vVa6LWiUehdyqNcdTAwMWLdapZu6qOjvfrge4/rcVx1MDAwNP3rtvfjXGK551FcdTAwMWN6vF5k/M9v//xcdTAwMGYpSLXLIn0=<!-- payload-end --></metadata><defs><style class="style-fonts">
2
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><rect x="0" y="0" width="1029.714111328125" height="744.0092926025391" fill="#ffffff"></rect><g stroke-linecap="round" transform="translate(658.3414459228516 92.02067052037273) rotate(0 165.575210571289 300.78834533691395)"><path d="M32 0 C93.4 -2.37, 156.34 -3.39, 299.15 0 M32 0 C101.82 -0.78, 171.75 -1.06, 299.15 0 M299.15 0 C320.27 -0.58, 330.1 10.55, 331.15 32 M299.15 0 C321.12 -2.23, 329.56 8.75, 331.15 32 M331.15 32 C332.1 153.7, 332.59 275.12, 331.15 569.58 M331.15 32 C332.44 145.3, 332.79 258.17, 331.15 569.58 M331.15 569.58 C331.41 589.61, 320.04 599.86, 299.15 601.58 M331.15 569.58 C332.52 591.56, 319.1 599.3, 299.15 601.58 M299.15 601.58 C206.57 598.75, 110.9 600.01, 32 601.58 M299.15 601.58 C201.41 603.6, 103.9 603.82, 32 601.58 M32 601.58 C10.62 601.27, 0.2 591.03, 0 569.58 M32 601.58 C8.42 600.94, -1.58 591.26, 0 569.58 M0 569.58 C-2.55 362.05, -2.18 153.7, 0 32 M0 569.58 C-1.69 421.89, -2.2 273.24, 0 32 M0 32 C0.97 9.88, 11.94 -1.87, 32 0 M0 32 C0.5 9.15, 9.49 -0.2, 32 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g stroke-linecap="round" transform="translate(10 10) rotate(0 233.4285736083984 362.00464630126953)"><path d="M32 0 C188.97 -0.41, 347.52 0.55, 434.86 0 M32 0 C179.32 -1.44, 325.67 -1.82, 434.86 0 M434.86 0 C455.14 -0.11, 467.41 8.72, 466.86 32 M434.86 0 C454.6 -1.91, 465.17 11.57, 466.86 32 M466.86 32 C467.78 229.21, 466.47 427.71, 466.86 692.01 M466.86 32 C467.29 242.79, 466.98 453.2, 466.86 692.01 M466.86 692.01 C466.42 711.62, 457.38 724.58, 434.86 724.01 M466.86 692.01 C465.47 711.07, 457.37 725.31, 434.86 724.01 M434.86 724.01 C344.56 722.31, 255.94 722.73, 32 724.01 M434.86 724.01 C277.01 724.51, 119.2 724.19, 32 724.01 M32 724.01 C10.87 724.13, -1.95 712.79, 0 692.01 M32 724.01 C9.09 724.36, 2 715.34, 0 692.01 M0 692.01 C1.93 470.12, 2.03 248.43, 0 32 M0 692.01 C-1.59 525.77, -1.07 359.91, 0 32 M0 32 C1.28 8.79, 11.1 -1.32, 32 0 M0 32 C-1.18 10.46, 10.34 -0.85, 32 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g stroke-linecap="round" transform="translate(143.82113647460938 170.91984044224773) rotate(0 135.02841186523435 35.81143188476562)"><path d="M17.91 0 C81.09 1.71, 146.7 2.37, 252.15 0 M17.91 0 C105.22 -1.01, 192.27 -0.81, 252.15 0 M252.15 0 C264.64 -1.94, 268.67 4.31, 270.06 17.91 M252.15 0 C262.4 0.91, 270.04 6.26, 270.06 17.91 M270.06 17.91 C268.53 29.55, 270.71 38.88, 270.06 53.72 M270.06 17.91 C270.51 30.16, 270.16 42.85, 270.06 53.72 M270.06 53.72 C271.25 66.22, 262.88 69.65, 252.15 71.62 M270.06 53.72 C271.23 66.96, 262.32 73.39, 252.15 71.62 M252.15 71.62 C200.93 72.38, 149.06 71.43, 17.91 71.62 M252.15 71.62 C179.05 72.28, 106.07 72.46, 17.91 71.62 M17.91 71.62 C4.02 71.07, -1.37 65.96, 0 53.72 M17.91 71.62 C7.97 73.62, 0.84 63.71, 0 53.72 M0 53.72 C-0.36 42.31, -0.83 28.36, 0 17.91 M0 53.72 C0.77 39.5, 0.93 25.12, 0 17.91 M0 17.91 C0.44 4.65, 4.95 -0.18, 17.91 0 M0 17.91 C-0.33 5.11, 4.39 0.7, 17.91 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(247.66957855224607 194.23127232701336) rotate(0 31.179969787597656 12.5)"><text x="31.179969787597656" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">images</text></g><g stroke-linecap="round" transform="translate(151.9212646484375 344.5241800418571) rotate(0 123.93109130859374 40.923309326171875)"><path d="M20.46 0 C82.5 0.84, 142.63 -0.79, 227.4 0 M20.46 0 C76.79 -0.76, 132.01 -0.64, 227.4 0 M227.4 0 C239.57 0.79, 247.85 7.07, 247.86 20.46 M227.4 0 C240.86 1.69, 246.68 4.76, 247.86 20.46 M247.86 20.46 C249.15 36.98, 248.21 50.13, 247.86 61.38 M247.86 20.46 C248.37 30.36, 247.17 38.7, 247.86 61.38 M247.86 61.38 C248.88 76.16, 239.5 83.39, 227.4 81.85 M247.86 61.38 C246.1 74.06, 241.12 83.35, 227.4 81.85 M227.4 81.85 C157.06 81.49, 87.01 81.51, 20.46 81.85 M227.4 81.85 C167.66 81.71, 109.05 82.09, 20.46 81.85 M20.46 81.85 C8.56 83.59, 0.73 73.34, 0 61.38 M20.46 81.85 C8.37 80.96, 0.71 74.46, 0 61.38 M0 61.38 C1.92 43.92, -1.13 30.64, 0 20.46 M0 61.38 C-0.04 50.05, -0.77 39.95, 0 20.46 M0 20.46 C-0.28 6.08, 5.45 0.6, 20.46 0 M0 20.46 C-0.32 7.41, 9.03 -0.27, 20.46 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(244.6723861694336 372.947489368029) rotate(0 31.179969787597656 12.5)"><text x="31.179969787597656" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">images</text></g><g transform="translate(79.51492309570312 32.80397282750164) rotate(0 164.36065673828125 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Local folder in opencode</text></g><g stroke-linecap="round" transform="translate(622.4024047851562 11.763170825548514) rotate(0 198.65585327148438 359.87744903564464)"><path d="M32 0 C128.4 1.57, 223.64 0.25, 365.31 0 M32 0 C104.28 -0.81, 176.51 -0.39, 365.31 0 M365.31 0 C385.62 -1.79, 398.5 11.05, 397.31 32 M365.31 0 C386.71 1.39, 399.4 10.97, 397.31 32 M397.31 32 C394.92 237.7, 395.83 441.97, 397.31 687.75 M397.31 32 C398.34 164.24, 398.35 295.69, 397.31 687.75 M397.31 687.75 C397.38 710.4, 387.46 721.59, 365.31 719.75 M397.31 687.75 C396.95 709.36, 386.56 720.67, 365.31 719.75 M365.31 719.75 C266.25 718.66, 166.65 719.05, 32 719.75 M365.31 719.75 C260.43 721.15, 155.51 721.46, 32 719.75 M32 719.75 C11.29 719.26, 1.75 708.12, 0 687.75 M32 719.75 C11.77 721.74, -1.85 707.56, 0 687.75 M0 687.75 C0.28 459.52, 0.5 230.53, 0 32 M0 687.75 C0.1 496.98, 0.32 306.06, 0 32 M0 32 C1.92 10.43, 12.59 -1.55, 32 0 M0 32 C1.28 9.55, 11.09 1.75, 32 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(672.5140380859375 35.923657630100934) rotate(0 163.47866821289062 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Remote Storage Bucket</text></g><g transform="translate(680.5396194458008 114.74795018345867) rotate(0 143.03857421875 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">website-project-name</text></g><g stroke-linecap="round" transform="translate(706.2893676757812 172.78776036412273) rotate(0 120.98544311523432 32.73078918457031)"><path d="M16.37 0 C65.36 1.35, 113.18 1.22, 225.61 0 M16.37 0 C95.03 1.83, 172.67 2.19, 225.61 0 M225.61 0 C238.33 0.27, 242.23 4.15, 241.97 16.37 M225.61 0 C236.01 -1.98, 243.34 6.11, 241.97 16.37 M241.97 16.37 C242.78 22.67, 243.19 30.52, 241.97 49.1 M241.97 16.37 C242.39 25.73, 241.83 33.37, 241.97 49.1 M241.97 49.1 C241.9 60.8, 236.46 65.15, 225.61 65.46 M241.97 49.1 C242.2 60.14, 234.27 64.83, 225.61 65.46 M225.61 65.46 C178.75 67.72, 127.32 68.26, 16.37 65.46 M225.61 65.46 C171.63 64.58, 116.53 65.77, 16.37 65.46 M16.37 65.46 C3.84 64.13, 0.97 59.22, 0 49.1 M16.37 65.46 C6.92 63.31, 0.5 58.49, 0 49.1 M0 49.1 C-0.71 39.58, 0.63 32.53, 0 16.37 M0 49.1 C0.65 37.67, 0.24 27.31, 0 16.37 M0 16.37 C0.37 6.98, 4.47 -1.43, 16.37 0 M0 16.37 C1.9 3.86, 6.63 1.13, 16.37 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(757.9648895263672 193.01854954869304) rotate(0 69.30992126464847 12.5)"><text x="69.30992126464844" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">image-originals</text></g><g stroke-linecap="round" transform="translate(42.20896911621094 89.95746861607586) rotate(0 198.79255676269528 305.06564331054693)"><path d="M32 0 C132.88 -0.52, 230.55 0.98, 365.59 0 M32 0 C139.13 -1.27, 245.11 -1.8, 365.59 0 M365.59 0 C386.48 -1.72, 398.78 11.23, 397.59 32 M365.59 0 C385.53 -2.27, 398.76 11.97, 397.59 32 M397.59 32 C398.93 153.8, 399.79 275.87, 397.59 578.13 M397.59 32 C397.23 246.11, 397.23 459.84, 397.59 578.13 M397.59 578.13 C397.79 599.58, 384.97 609.58, 365.59 610.13 M397.59 578.13 C396 599.82, 388.92 612.13, 365.59 610.13 M365.59 610.13 C252.79 612.07, 140.7 612.84, 32 610.13 M365.59 610.13 C281.15 611.63, 198.14 611.81, 32 610.13 M32 610.13 C11.94 608.26, 0.44 598.15, 0 578.13 M32 610.13 C9.49 609.93, -0.33 598.61, 0 578.13 M0 578.13 C-0.46 452.54, -0.75 326.19, 0 32 M0 578.13 C-1.14 456.97, -1.41 334.91, 0 32 M0 32 C1.65 9.28, 11.69 0.98, 32 0 M0 32 C1.07 9.56, 9.6 -0.8, 32 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(99.9753189086914 112.13437901646648) rotate(0 143.03857421875 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">website-project-name</text></g><g stroke-linecap="round" transform="translate(698.7971038818359 596.1843744388298) rotate(0 120.98544311523432 32.73078918457031)"><path d="M16.37 0 C68.76 -1.05, 121.54 0.51, 225.61 0 M16.37 0 C81.74 0.44, 148.04 1.46, 225.61 0 M225.61 0 C235.31 -1.98, 242.99 6.59, 241.97 16.37 M225.61 0 C234.74 1.77, 240.21 4.49, 241.97 16.37 M241.97 16.37 C244.02 25.98, 242.42 36.15, 241.97 49.1 M241.97 16.37 C242.06 27.55, 240.99 38.34, 241.97 49.1 M241.97 49.1 C240.6 60.31, 238.26 67.2, 225.61 65.46 M241.97 49.1 C242.81 58.06, 238.06 64.58, 225.61 65.46 M225.61 65.46 C155.48 67.93, 88.59 65.65, 16.37 65.46 M225.61 65.46 C177.33 63.91, 128.12 64.15, 16.37 65.46 M16.37 65.46 C4.43 65.28, -0.28 59.26, 0 49.1 M16.37 65.46 C3.88 66.16, -0.32 60.59, 0 49.1 M0 49.1 C-1.51 37.25, -0.93 23.55, 0 16.37 M0 49.1 C0.99 36.09, 0.67 24.97, 0 16.37 M0 16.37 C0.93 4.49, 4.53 -0.7, 16.37 0 M0 16.37 C2.23 6.1, 5.09 1.17, 16.37 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(751.1126327514648 616.4151636234001) rotate(0 68.6699142456055 12.5)"><text x="68.66991424560547" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">video-originals</text></g><g stroke-linecap="round" transform="translate(705.1039886474609 440.150988208361) rotate(0 120.98544311523432 32.73078918457031)"><path d="M16.37 0 C79.93 -1.45, 141.87 -2.07, 225.61 0 M16.37 0 C60.6 -1.4, 106.36 -0.02, 225.61 0 M225.61 0 C234.98 1.54, 240.44 4.61, 241.97 16.37 M225.61 0 C236.59 1.5, 242.91 7.57, 241.97 16.37 M241.97 16.37 C242.81 25.62, 241.7 35.18, 241.97 49.1 M241.97 16.37 C240.96 26.53, 242.52 37.27, 241.97 49.1 M241.97 49.1 C242.7 58.32, 237.86 64.69, 225.61 65.46 M241.97 49.1 C242.68 59.44, 238.53 64.35, 225.61 65.46 M225.61 65.46 C151.64 64.82, 79.34 65.1, 16.37 65.46 M225.61 65.46 C181.97 64.16, 139.12 63.91, 16.37 65.46 M16.37 65.46 C4.08 66.07, -0.28 60.52, 0 49.1 M16.37 65.46 C7.66 65.19, 2.21 58.22, 0 49.1 M0 49.1 C1.68 36.48, -1.27 27.48, 0 16.37 M0 49.1 C0.3 41.07, -0.63 33.66, 0 16.37 M0 16.37 C1.94 6.02, 5.13 1.02, 16.37 0 M0 16.37 C1.11 7.05, 5.34 0.04, 16.37 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(748.6895217895508 460.3817773929313) rotate(0 77.39990997314456 12.5)"><text x="77.39990997314453" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">video-processed</text></g><g stroke-linecap="round" transform="translate(138.2200927734375 605.8203556281478) rotate(0 135.02841186523435 35.811431884765625)"><path d="M17.91 0 C89.76 1.44, 165 -0.58, 252.15 0 M17.91 0 C64.38 -0.47, 111.51 -1.47, 252.15 0 M252.15 0 C264.16 1.31, 270.88 7.8, 270.06 17.91 M252.15 0 C263.73 0.28, 269.97 6.89, 270.06 17.91 M270.06 17.91 C270.12 26.61, 269.45 37.84, 270.06 53.72 M270.06 17.91 C270.73 28.36, 271.04 40.11, 270.06 53.72 M270.06 53.72 C270.68 65.16, 265.84 70.65, 252.15 71.62 M270.06 53.72 C271.16 67.64, 262.24 70.09, 252.15 71.62 M252.15 71.62 C168.98 73.25, 87.86 72.02, 17.91 71.62 M252.15 71.62 C183.38 71.14, 115.65 71.1, 17.91 71.62 M17.91 71.62 C7.89 71.39, 1.93 64.1, 0 53.72 M17.91 71.62 C7.24 70.51, 0.42 67.4, 0 53.72 M0 53.72 C-1.13 45.76, 1.24 36.68, 0 17.91 M0 53.72 C1.14 44.98, 0 36.18, 0 17.91 M0 17.91 C0.97 7.35, 5.87 0.04, 17.91 0 M0 17.91 C-1.31 6.12, 5.25 0.82, 17.91 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(242.70854187011716 629.1317875129134) rotate(0 30.539962768554688 12.5)"><text x="30.539962768554688" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">videos</text></g><g stroke-linecap="round" transform="translate(155.58859252929688 442.3224003058822) rotate(0 123.93109130859374 40.923309326171875)"><path d="M20.46 0 C93.15 2.02, 170.35 -0.26, 227.4 0 M20.46 0 C98.51 1.35, 176.87 1.59, 227.4 0 M227.4 0 C240.73 0.24, 247.79 7.62, 247.86 20.46 M227.4 0 C240.98 -0.36, 248.1 6.96, 247.86 20.46 M247.86 20.46 C248.06 30.48, 249.49 37.76, 247.86 61.38 M247.86 20.46 C248.45 29.03, 249.01 37.61, 247.86 61.38 M247.86 61.38 C248.82 76.75, 239.43 80.51, 227.4 81.85 M247.86 61.38 C248.97 74.13, 242.51 79.69, 227.4 81.85 M227.4 81.85 C160.65 80.65, 93.56 79.69, 20.46 81.85 M227.4 81.85 C159.91 82.21, 91.57 81.63, 20.46 81.85 M20.46 81.85 C7.93 80.88, 0.37 76.55, 0 61.38 M20.46 81.85 C5.69 80.2, 1.9 73.43, 0 61.38 M0 61.38 C-1.16 46.09, -0.9 34.58, 0 20.46 M0 61.38 C0.55 48.65, 0.02 34.54, 0 20.46 M0 20.46 C-1.14 6.95, 6.2 0.71, 20.46 0 M0 20.46 C1.18 6.68, 7.16 2.12, 20.46 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(248.97972106933594 470.74570963205406) rotate(0 30.539962768554688 12.5)"><text x="30.539962768554688" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">videos</text></g><g mask="url(#mask-MecCSQtztIrPIo3mbXtm6)" stroke-linecap="round"><g transform="translate(275.3318153709122 600.3203556281478) rotate(0 0.941878278848435 -35.32566833496094)"><path d="M0 0 C1.8 -26.32, 0.08 -49.53, 1.88 -70.65 M0 0 C0.24 -25.71, 1.05 -51.25, 1.88 -70.65" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(275.3318153709122 600.3203556281478) rotate(0 0.941878278848435 -35.32566833496094)"><path d="M9.53 -46.85 C8.25 -56.8, 3.18 -63.55, 1.88 -70.65 M9.53 -46.85 C6.48 -55.36, 3.81 -63.77, 1.88 -70.65" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(275.3318153709122 600.3203556281478) rotate(0 0.941878278848435 -35.32566833496094)"><path d="M-7.56 -47.5 C-2.84 -57.09, -1.9 -63.62, 1.88 -70.65 M-7.56 -47.5 C-4.36 -55.93, -0.79 -64.11, 1.88 -70.65" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-MecCSQtztIrPIo3mbXtm6"><rect x="0" y="0" fill="#fff" width="377.21557192860905" height="770.9716922980697"></rect><rect x="223.0337491917528" y="552.4946872931869" fill="#000" width="106.47988891601562" height="25" opacity="1"></rect></mask><g transform="translate(223.0337491917528 552.4946872931869) rotate(0 53.23994445800781 12.5)"><text x="53.23994445800781" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">2. optimize</text></g><g mask="url(#mask-CnPDV1VkwQwSuqffrhWlg)" stroke-linecap="round"><g transform="translate(699.5944366455078 633.2226841193587) rotate(0 -142.90876007080078 4.128684372161388)"><path d="M0 0 C-62.88 2.54, -126.32 3.53, -285.82 8.26 M0 0 C-89.2 3.32, -178.27 6.06, -285.82 8.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(699.5944366455078 633.2226841193587) rotate(0 -142.90876007080078 4.128684372161388)"><path d="M-262.53 -0.83 C-266.46 2.03, -271.14 2.92, -285.82 8.26 M-262.53 -0.83 C-269.82 1.94, -276.96 4.99, -285.82 8.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(699.5944366455078 633.2226841193587) rotate(0 -142.90876007080078 4.128684372161388)"><path d="M-262.13 16.27 C-266.08 15.3, -270.85 12.38, -285.82 8.26 M-262.13 16.27 C-269.55 13.71, -276.81 11.42, -285.82 8.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-CnPDV1VkwQwSuqffrhWlg"><rect x="0" y="0" fill="#fff" width="1085.4119567871094" height="741.4800528636815"></rect><rect x="524.6457061767578" y="624.8513684915201" fill="#000" width="64.07994079589844" height="25" opacity="1"></rect></mask><g transform="translate(524.6457061767578 624.8513684915201) rotate(0 32.03997039794922 12.5)"><text x="32.03997039794922" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">1. sync</text></g><g mask="url(#mask-cO4_vfRL3CwlovDiRWsG_)" stroke-linecap="round"><g transform="translate(700.7893676757812 205.54791753843256) rotate(0 -140.70570373535168 0.5838476215276387)"><path d="M0 0 C-95.75 0, -191.26 0.42, -281.41 1.17 M0 0 C-80.8 0.25, -160.64 0.91, -281.41 1.17" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(700.7893676757812 205.54791753843256) rotate(0 -140.70570373535168 0.5838476215276387)"><path d="M-257.95 -7.46 C-265.63 -4.63, -273.07 -1.66, -281.41 1.17 M-257.95 -7.46 C-265.59 -5.27, -271.98 -2.38, -281.41 1.17" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(700.7893676757812 205.54791753843256) rotate(0 -140.70570373535168 0.5838476215276387)"><path d="M-257.89 9.64 C-265.75 6.64, -273.21 3.78, -281.41 1.17 M-257.89 9.64 C-265.57 6.97, -271.97 4.99, -281.41 1.17" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-cO4_vfRL3CwlovDiRWsG_"><rect x="0" y="0" fill="#fff" width="1082.2007751464846" height="306.71561278148783"></rect><rect x="528.0436935424804" y="193.6317651599602" fill="#000" width="64.07994079589844" height="25" opacity="1"></rect></mask><g transform="translate(528.0436935424804 193.6317651599602) rotate(0 32.03997039794922 12.5)"><text x="32.03997039794922" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">1. sync</text></g><g mask="url(#mask-ktRVf67YptrNqOW19CItB)" stroke-linecap="round"><g transform="translate(408.95077514648415 483.06490032158354) rotate(0 145.3266067504884 -4.9937913992398535)"><path d="M0 0 C85.86 -2.75, 172.3 -7.32, 290.65 -9.99 M0 0 C79.87 -2.4, 158.65 -6.41, 290.65 -9.99" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(408.95077514648415 483.06490032158354) rotate(0 145.3266067504884 -4.9937913992398535)"><path d="M267.44 -0.71 C273.97 -3.25, 281.28 -8.16, 290.65 -9.99 M267.44 -0.71 C274.69 -2.41, 280.51 -6.65, 290.65 -9.99" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(408.95077514648415 483.06490032158354) rotate(0 145.3266067504884 -4.9937913992398535)"><path d="M266.91 -17.81 C273.66 -15.28, 281.13 -15.12, 290.65 -9.99 M266.91 -17.81 C274.19 -14.84, 280.15 -14.43, 290.65 -9.99" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-ktRVf67YptrNqOW19CItB"><rect x="0" y="0" fill="#fff" width="799.6039886474609" height="593.0524831200632"></rect><rect x="510.5474166870116" y="465.5711089223437" fill="#000" width="87.45993041992188" height="25" opacity="1"></rect></mask><g transform="translate(510.5474166870116 465.5711089223437) rotate(0 43.72996520996094 12.5)"><text x="43.72996520996094" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">3. upload</text></g><g stroke-linecap="round" transform="translate(64.16462707519554 272.675824220516) rotate(0 176.02450561523435 132.28692626953125)"><path d="M32 0 C120.93 1.08, 210.92 3.43, 320.05 0 M32 0 C143.98 1.55, 255.19 1.65, 320.05 0 M320.05 0 C343.13 -0.97, 353.01 12.39, 352.05 32 M320.05 0 C339.53 -1.53, 353.16 9.77, 352.05 32 M352.05 32 C349.18 104.04, 350.2 177.67, 352.05 232.57 M352.05 32 C350.69 84.95, 351.67 137.34, 352.05 232.57 M352.05 232.57 C353.98 252.36, 342.49 263.61, 320.05 264.57 M352.05 232.57 C352.47 255.66, 340.25 262.93, 320.05 264.57 M320.05 264.57 C210.61 266.39, 98.97 264.99, 32 264.57 M320.05 264.57 C243.56 265.57, 167.67 265.71, 32 264.57 M32 264.57 C10.57 264.61, -1.14 254.04, 0 232.57 M32 264.57 C9.95 265.4, 1.18 253.76, 0 232.57 M0 232.57 C-1.55 168.89, -1.08 105.05, 0 32 M0 232.57 C-0.16 163.32, -0.01 95.7, 0 32 M0 32 C0.45 12.25, 10.69 -0.06, 32 0 M0 32 C1.03 10.32, 9.26 -1.75, 32 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(80.13694763183594 300.5160341814535) rotate(0 58.88994598388672 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">public folder</text></g><g mask="url(#mask-ugUmypYV5N2KitdfMHAL5)" stroke-linecap="round"><g transform="translate(278.74342242390276 248.04270421177898) rotate(0 -1.1707758481818473 48.36768465593832)"><path d="M0 0 C1.35 23.13, -2.62 46.11, -2.34 96.74 M0 0 C0.56 24.82, -0.45 51.48, -2.34 96.74" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(278.74342242390276 248.04270421177898) rotate(0 -1.1707758481818473 48.36768465593832)"><path d="M-9.95 72.92 C-6.41 79.09, -8.08 85.22, -2.34 96.74 M-9.95 72.92 C-7.01 78.68, -5.41 86.26, -2.34 96.74" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(278.74342242390276 248.04270421177898) rotate(0 -1.1707758481818473 48.36768465593832)"><path d="M7.14 73.6 C6.72 79.77, 1.1 85.73, -2.34 96.74 M7.14 73.6 C5.61 79.15, 2.73 86.55, -2.34 96.74" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-ugUmypYV5N2KitdfMHAL5"><rect x="0" y="0" fill="#fff" width="381.08497412026645" height="444.7780735236556"></rect><rect x="224.3327021177131" y="283.9103888677173" fill="#000" width="106.47988891601562" height="25" opacity="1"></rect></mask><g transform="translate(224.3327021177131 283.9103888677173) rotate(0 53.37261078818949 12.5)"><text x="53.23994445800781" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">2. optimize</text></g></svg>
@@ -0,0 +1,2 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 791.6916503906249 494.36415364919594" width="791.6916503906249" height="494.36415364919594"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1ba1PbSFx1MDAxNv2eX0ExXHUwMDFmN1a6b7+namtcdTAwMGJcYlx1MDAxMJLAsoFcdMlsTVGyJYyCLDmSzGsq/31vXHUwMDBisCxLsmUweWxZVFHQLbX6ce8959xu/f1ibW09u1x1MDAxOfrrv6+t+9c9N1xmvMS9Wn9pyy/9JFxy4lxiqyD/P41HSS+/8zzLhunvr15cctzkws+GodvzncsgXHUwMDFkuWGajbwgdnrx4FWQ+YP0X/b3gTvw/zmMXHUwMDA3XpY4xUs6vlx1MDAxN2RxcvcuP/RcdTAwMDd+lKXY+n/x/7W1v/PfWFx1MDAxM3j2jZu7TN6qvb2tP3XsfaD8jVx1MDAxOZI/80fzm1x1MDAxZYaQ+ddZUXqNRVJcdTAwMTNHaS2ENsJcdTAwMThJx5U3WKmYw5VcdTAwMTKcXG7BiFZcdTAwMTTGtVeBl53jXHUwMDFk1HBHXG6ppFZGa9BcdTAwMTO3nPtB/zzDe5hcdTAwMTiXuVE/tFx1MDAxZCHjkjRL4lx1MDAwYn8rXHUwMDBlcaTYwd+ob3+KPnbd3kU/iUeRN74nS9woXHUwMDFkulx0zkdx31lcdTAwMTCGR9lN3jquXHUwMDA0TuH61DtOXHUwMDFlujxV3vRcdTAwMTS+tH9cdTAwMWX5aVp6Jlx1MDAxZbq9ILOTQ0kxXG7bw+Gely/PX0WfXHUwMDEyXFzYPbs+0ShcZsfFQeT5durXXVp6W+Tdv610d+r7tlx1MDAwNUmFXHUwMDAxSUGNK1xu82OSTZdcdTAwMWXEUW6KXHUwMDFjjOGGXHUwMDEyU7w9fY3GlOWNnqFB+sVU2y5sT1x1MDAxOFoxktHQc+9cdTAwMWWhSklgkjBcXO1iXcMgupjueFx1MDAxOPcuat6SmyBcdTAwMGV+b+D2/bVhXHUwMDEy9+ygizmLo+wouLV9XHUwMDA3XSrdcVx1MDAwN0FoJ16U2tpcYoO+nYT10D+bsFx1MDAwN5yHLEBXXHUwMDFhV2fxsKjtYXtuXHUwMDEw+Ul1deIk6Fx1MDAwN5FcdTAwMWJcdTAwMWXP7qc7yuJcdTAwMGZ+etfTLFx1MDAxOfmTc+G/ebB96oDIK769rHPb5JjdvFx1MDAxYuzsvr1cdTAwMWGKjcFccvU/XHUwMDFjXHUwMDFkxlW3Tfxeduc6Jd9Fd82dXHUwMDBmXHUwMDE4XHUwMDAx4JJcdTAwMTTzZaeJUepwbrhmgGtcdTAwMDVEyKr3cnBcdTAwMTh6rWKCXHQqJNR4r8RcdTAwMThgOEiQRjCKr+Erb673Zqj35oclL9aT3Zd8m3ZyKlx1MDAxOSE42VDxZ1tJWaObU0lcZv5wXoSHXHUwMDA1/HzcwaKrTZgxYbuf1N4g8n35xXN7e5tsJ4tHbzfXx/d9e1nf7N3D/Ouh7p59XHUwMDBlR597XXpLLuWt6Xwsv+Xh/W6SxFdt2yWyv9ntvf5887WbnPT3Lnb6wf5uu3bv/2pcbnpUIUgqwvWko89cdHozPL9+9lpcdTAwMDA2JUBcdTAwMWPJKVx1MDAwNS04IcyUnZ5hpZGScsmERliu+Dxwh1NO5ET0XHUwMDFl+zqskLrBt9lcdTAwMDJIXHJaUoPRssaHXHUwMDExi1x1MDAxYl2YUE1cdONsqVB9b7WaLmC1XHUwMDE1qE6TXj1Ak1LpPIDuYWf9ZFx1MDAwNkRcdTAwMGZcdTAwMDLPm8S4MkrPXHUwMDAzy2ngLvV6OXB9XHUwMDA122+32KXUXHUwMDA3n69O986YXHUwMDFlRIO91nCN/NpcdTAwMDGM8Fx1MDAxY7FcdTAwMTRhVFx1MDAxN9HcTlx1MDAxYeK3gyxcdTAwMWN5tlFoXHS8qH3wXFxGjGMs9cqhWlx1MDAxMFJcdTAwMDD62IO1ckAzppGj4Xu0Wjl0g0Pzp4O1MYyg19ZScoqu3Fxm1oZcdTAwMTngoIqhPTtYb31ccrbkbu8w3PD/+HR+SFx1MDAwZXbebVx1MDAxY/xosP6D7vf3vTfQOz05Pn5PyO3b6OT4Z1x1MDAwNOv62WtcdTAwMDHWklx1MDAxOUdcdTAwMTKgQqF6U4pNubyhjlwieFx1MDAwMYpr7KyquDxcdTAwMDCGXGahUFav0HpcdTAwMDHnXHUwMDE27dFcdTAwMWHNhGtcdTAwMWIua9FaN/mwRu9FzTRcdTAwMTHDl1xi1rCA1VbA2lx1MDAwYtJs7dXaeTZcYtf+sdZLU/xcdTAwMWRYXHLbILK/L4bPQdBpXGZvM5jlQPvsXHUwMDE4N1x1MDAxNYdKPm5cdTAwMTDWXHUwMDExuDlcdTAwMTdcdTAwMDI00YU8zvm4JijCmeLCaFx1MDAxNNmM1Ihwylx1MDAxY0q5MVxuhVx1MDAxZnL2wqTGnq64g4xcdTAwMWVB/y7HVsSJld+X/F62XHUwMDA1dWhcdTAwMDR1QaRS1OjaeEArUD/GdFxcOkMphvlnXGJcYlx1MDAwYsHYuHhcdTAwMThcdTAwMDfTlKH4a60wmfyf8d9/vay9u9Nopfaats+itVxuTqeZm2SbuGRB1C8vzX2Ku1xy18e7XHUwMDA3sZdcdTAwMWJZnHSDScaDhnvte4d27KWh41x1MDAxOFE1cyYptatcdTAwMGJcYrqlXHRwXHUwMDA0KOCEMimRf1x1MDAwM6V1M4IhsjeyU0oq9uNH3vxRzY5+j1x1MDAxY1x1MDAxNZfIXHUwMDBmcO65soK/SJraizqE3iXvNWFcdTAwMTJ1XHUwMDA1W3BY+XJt2KB37rtcdTAwMTXPw0FP1k1HRz/sxlc1ljmIL/394G446UmQnd/7QuXG0E2zrXgwXGKyrFx1MDAxOL3twYxAvusnyXX2Jbr5cLIpXmt6SqPtqLVGY1x1MDAxMlx1MDAxY6FAoLxcdTAwMDLOKS+gOFx1MDAwZlFcXFlcdTAwMDXGXHUwMDA1gFx1MDAwNjSl6n5cYsZcdTAwMGVHXHUwMDFhKlx1MDAwNWGmPsdcIrmjtTGoz1xmujabaGNcdTAwMTXMS8FcXD1ZoVx0LqxHm6KDXHUwMDEzXHUwMDAyjWgyXTxcdTAwMGXmhlNcdTAwMDaIXHUwMDAzj1xu5uP+LSTQTi6j/iVcXFx1MDAxY3S+qvDg3fnRXHUwMDFiPdzfbSuk2H78XHUwMDFlds8uT+KL4LqXXHUwMDFkXHUwMDFlXHUwMDFivX20XHUwMDE0IZVv9UjCXHUwMDE3oaQznLN+lC2EXHUwMDE0p8ZhXFxjqFx1MDAxM1x1MDAxYem6Klx1MDAwYikqXHUwMDE1Olx1MDAxNcVV01xm1Vx1MDAxNkykPVx1MDAxZVx1MDAxY1Ncbu2gKTCOXHUwMDBiSzFcdTAwMTDqqmeu9FSTK+r2eopKbqHG8FpcdTAwMDI1sXk07XOMgyGCT2xcdTAwMTYva6dyQfOtKKrEXHUwMDFmxJmPMuTK76ZB5neGSfxcdTAwMDXho1x1MDAxM+G0YXEuSDpcdTAwMGbSJcVcdTAwMTJqgFxc21xic4qPTGw7/jjdNVx1MDAwN1x1MDAxNad11/KGvFx1MDAxY3U2O8DNUmdcdTAwMTK5qWFAhSZKXHUwMDEwNeHjdrZcdTAwMDFZreTYa9DIaymvbpdQ0Fx1MDAwZVZJg3FFalRcdTAwMDbVuGGkQ4BpgVx1MDAwNswoUqxcdTAwMTWiN4RcdTAwMTGzXHUwMDA0eVx1MDAwNkxcdCFZPaTLxnyNwXVBXHL+PVx1MDAxMf3qw9mx+/H29JTvXHUwMDFlyZNURbdp2nle5H0u7dfkXHUwMDAz9qpYf9FcXGWELcXf7GA1qVdcdTAwMWNU67mqUyBcdTAwMDV2rnBva6Xu0DJyxyh5t1+Sp1p1xbZaSbfu0c6tvP7a+XRL9lx1MDAwN5dvPu9+2X/r1fWpg52yXHUwMDAyUnCF8yWAKG4qnaKVTvx6QqvevttwOSZcdTAwMWOkYVx1MDAwNjVcdTAwMTRKbm3Kx1bQwbFWXHUwMDEwQZAtMFFlclRcdTAwMTJcdTAwMDeshmdMcTQ9XnCKXHUwMDE1lZtcdTAwMWKDN9pTOdSo2nBTu79VLSwyYUpIatRy97GBXHSD0VtcdTAwMTVr/VxiXCJcdTAwMTdcdTAwMGazYIBMJP2JXHUwMDEy4nOYzTQxa1x1MDAxZcJyiNbsMDc/e8IsUCCXolxcINsqjCTPhdv9a8IooVgnuajZ7kIwodiIXHUwMDAwcZc+qdnhVjhcdTAwMDKCrSiWXHUwMDFmN1x1MDAxNavjaFxynr7Zlm3N2uHGXHRGZK07ykJJ9YTLOFx1MDAwNqCaI5JS8ajtscfRrWPv+OT66+DK69+ciP3Td65cdTAwMTl2u99hJ3pmu09IzMxs95c55la/Km1IXHUwMDAy55ZHKVx1MDAwM1x1MDAxMllcdTAwMTRcdTAwMDJRWbgh+DtcdTAwMThcdTAwMDVsJVx1MDAwN1wiXHUwMDEwb6o8wdJcZlx1MDAxY01+WGZFXHUwMDEx2lx1MDAwN46t9lx1MDAxNFx1MDAwMThcdTAwMTFKqfpkXHUwMDBmbUywXG6a77HBc+yemydcdTAwMWR1XHUwMDFijrph0HvIcPxcdTAwMTRcZmFcdTAwMGUkTzOExlx1MDAxMSyHIMyOlLMyMYJKRyCnJ8JcYuBMT5FcdTAwMDMtXHUwMDFkXHUwMDE0vJxqw1Cp65pPTSg4ymiKRFx1MDAxMFUm3lV3WF07XFygpMDQoJmYXHUwMDA0rpWPl3z89dNTMUjJKUC9PFCyeXNFolxuXHUwMDE3XHUwMDE411x1MDAxZnX6bVx1MDAxZWyZSaP+IdmSZjO1V8VAi+YqwNwyWzI3M/GYTWXGMaxcdTAwMGJcZtJcblU64aVcdTAwMTlwpFx1MDAwMEDY1Vx1MDAwNOxJVVwi6qbkp9wql4xryjm1+1x1MDAxMyDo5Kiog3yWXHUwMDFizlxyXHUwMDEzRFx1MDAwYi3+/3fKNy7fg1x1MDAwYlx1MDAwNztcdTAwMWb9hHbizrvDq/DdaVx1MDAxYm6mqP2GXHUwMDAw7Vx1MDAwM1x1MDAwM4D9KqhcdTAwMTTIcXZcdTAwMWRcdTAwMGXIz4zmTFx0wqtcdTAwMTlcdTAwMWPOXHUwMDFj1HdGgpLotVxc1uTUV+ysKXJvL7BcdTAwMTenwSCFhurngbaSN8o3oFxc4sI98oDys4ToXHUwMDA3ftZcdTAwMWRcdTAwMDWht1xmVvZMX1x1MDAwYk71bzmca7bam7n7JYXDXHUwMDEwa0FKzXHyy8dZkGc5XFxcIkpJjcGPTGzOXHUwMDE2XHRcdTAwMTniWH5vJGNcblGrJlx1MDAxZlx1MDAwM1x1MDAwZaC3XHUwMDEzXHUwMDAzmlx1MDAxMYWIRlae2+C5O+09l5P8rIOu/bTANHIroFRKKlx1MDAxNfuOn1x1MDAwMV5s71x1MDAxY/7n4HhcdTAwMTBcdTAwMWbuZW9BXHUwMDFjvtlcZuDfi+dcdTAwMWJ+PHFrtHV7dapm/lMyt1x1MDAxMqchjiDkWVx1MDAwZTI+x/HMJ/f812Ng9b7ThoGBxMhNUSlcdTAwMDPYXGbXdHKMOlpIqVx1MDAwMGOBsVx1MDAxY6sqplGI4POw+rJksVx1MDAxOL67XHUwMDAw+1L22ElD9lx1MDAxY1x1MDAxYclcdTAwMTdcdTAwMTJiIVFcdTAwMWY+KoTPy409afus7yNcdTAwMDXCRu8yS2thkGbLYGJPzY/NYUfTXGZt5ihcdTAwMTbmay/ug9O6O1x1MDAxY1x1MDAxZWXY7DhoooVcdTAwMDXe1IzclWX+sJiNvGhcdTAwMWaj5XbkdsPp2V+/XGb8q82qQ/12ll9cdTAwMTZm88hincnPXHUwMDEzON9efPtcdTAwMWb/y21tIn0=<!-- payload-end --></metadata><defs><style class="style-fonts">
2
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,d09GMgABAAAAABTsAA4AAAAAJGgAABSXAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbhxgcgUYGYACBFBEICrV0p2YLSgABNgIkA4EQBCAFgxgHIBsdHDMDwcYBCSB8Otl/dZCNYWijf3aMNqKiySGEfI0aSen6O50sv+DdZs/a7st2ru2fXBkhyezwdOq/u0tycQM1blQoLBiwdeq1Q0EMRGf+7wHsYPHP+4M776J0SUomFJuomAlsNiUItfH7HyBcJURzcylZDNUQwte7Ovcwo4KhWJpgGhvSaSW1mpYMgQVT8Ck5ILTjg+q4aL+UW7kdEBgCAlOcBRkWgEeaB6vmfB1wKTHbvb2pUKZGVgX+//1c/W9o3VlI4JlDSD/R8JAo5W9+/5vZw/x9TOvEQkUsJA6JOEgmzaWNtIVESDTRWIiRSEkJ3YYxSQES7D7iRD9dtBhuG1Yddj2xDu0PIACQAeCKiAB9KqSgx1dDpGaEOZ4S0gH/1t5QBfiPhuJKwH/lN9UAPgwAQO7hfN4bFOOlACAKtxpuIbyAB8+bD+eHLzGQsaDA7xd+VCIjf4u4+kTSVRff8fyRcb1w16n4HjEbi79HVr+IAwbxzr2GwOO9QzzAEFhkFB5omFjYeDzxiUlAYBIUFAyoCXAOsJ0gMA+hggbgsTIWDoEHMiIaEjrdSExSeNBdgQIDGTCGJgOgVYIHKgiIcbMCNu0AYUoB6GFWTPQrr8KHP80VhwYQRAfBgBgECyAYgFYEZHYOwZLVNlGwCjyIKuOY+jmFCXE2BDtREJnXi9e2FZYmS6uVIKoV/P4UCc/KMy2AOpABQ7auKCHTjIDMF2T9Ci8yrRVkPDsCvBMiBKCGjkGOgzHvETsPk3ddWARAcl8IjhjEKKb0mYbc+CaUDYD4uUBXWt8gL2RJ69mRBPYCqY5Nyx/Y1mda9sDSt/BXjkGaA1EEACzC0ECM0dcmRIPkbwfyF0grnMtQxSrUadamY/0GvJAEC8uZr1SVBljrs+SUVOKpa0aGBvp6ImGTImThIWdxCuRk9EPwT2EaGfFA/aGc6+BQUuziYEVfbboM1IxHeHQYxUoZNzg7lCtWswo1OpaKa4ii+rIyLXwhR6lMsHiK/TwMxtz45Nx4rYTIkbBlRGahbWmVVjnWGwdL3MDilEJjsNQQ0YxMopebSl8JaPa1qumg4FYzYIhZK7QNbstJbrVq5rwelwbE+1wAP2R3EJsEqJ+xX6HhFBs0jmt0leeP/v9+yVYXnkfyYYflaMORkI9kRdoOYZ8aFX6Jd/j4DMb7Sx2lMkqF/BsHiwk+22+fBZA+H0R6Nn1rfN9gi/6d8pxEkjr97BcLW1zveiw3/r+s+/Ju1b+cPyJClYU3pIhmYJE5mlatZqpOxa/50wEZqI+bF1BdXBmeXT64/prlx34vY0NKKbUopxz653Pjt688+PyO7Qpjfeewvbdgn3raq4wkTGKTpBjcy7CKFRuEU5yGKFz8xSrdDitdRfhlnNI9KKuPmFUm2nMzQM1LGU2Q4PQCGxUkIFu5Fxh71KtIJgeBbpi7fIBl9yGED8Xu/2QyhoIEgXo+IW6eYis0mjFBfYSnv/jn8x2Vqz9d0nnR+NgVvv3vD9TrNyKdJSsrzGlpZlYzba0lF2h5kD8JRbyut8zDMDYGKLzaSiTePFmPiKfyqswNYqMa4HCJXylHRRARMSQRAiISgiEQHGao71NqWQYFCxaoAZVbu2tnzUhQs2bAYkStDf3qH7N1km/FKPk3a9ZAD/I2IM0iAEF0pzxT9eaMAIZeZUij6yODy4Yz/hJUxrJg+TU/XeXc5d03SFddeV2QK8AaCxhEAWI1lqBDhCiF/ks8cUIYuzvSZ7P84HCj0OhiXxb8h6P13kb/l5tMmRbqnjopbGdEABdbMiNl+PId208nyYJzyte5YAXveik0+IJSRJnJ2J8E3XKJrSlOz+N698bbV9R2dK6/4jgZG1o+xx3MpzB+um62HOR8GiTlOutr5itxzVrl2E3zuopkkmTJcn1ZHHhd4in9LLNzyDleNau2zGhZjXOYIAdSg9LlnatV+bzJ1iUgUUpDY16l7qv3lZII3QpKe/ID3+Czkq3tJR9PPi9HH0dZ7eJWQc4lUw3AwYJmEzxX8t5nJWveq2T+uM8wHOQ65SEQsWv9YpNEZ1X4HvCmxUfn06UD9foF4LsmNA0w/yicjyoUUursCAiA6klGLUCwgXBbZiRap9ZHBfqLVRqnubTuP+xJOHqFGmxyPdyGIF21n+YO0pMnuRCCMSBhGwnM5JjSCLhyKTmeZE1Ka/xMw/s47OS9C0UmmLFPxN5kLfiDvzrAPE3jbt7bZlmz7ewhs2VrhF5his+fPHKHs8+cGzkLmb1/W59Nd8Jx3mu/CWKHKLHNH6TYTdM0H6Jzi8l3b31eszAfd9x9/VLL++qEB1wxGaoxbVdK4yTtdpZBWotz3NWLB+yjrH38RmGYu1AMNrShyh+VJyuna3a7jZwM9XGY426H7+vdqL1eD8I3IO1R6IeY68XgUIL+omwRnJZ5B/OBwXXEyYxdekv3FGnkuB5D1Mw6mtnSxNEREcMhGb4sgkOWTUzNbGsOpH7t9u/8eKnOG+RC/QIweTcZStDYv11vKlXgbuYQU6kF9CHtwXmG2m2NHaLgR0o55zhlI22orsofvPg8AhYTeYaW/ChO3zJMqUlxMr2fm39THNz+YF51Xj23Hfx89vUrH99Z9TUT9gxCbMSVygjSEdzNMofaNILWXs7tdPrl5r2yCBBjmlmrC4/c2rHJJLgDLAsPhylOyQcu7rz+tdJm0AzZs2tXrJs09n1IbXQuWUmMWb0Zrqe/TFf5mU4+rXhLLvahFeNkvGfeJa/PPib6cLufZQkqRnei7e3JQg/6sYTWFkxrQ8wNFpQFgOR34BUFy2Z34aj38BMa/2KFYRYqCyTjwNrRgF/G7r6r9NQLPymGREyAQ1eCI213gwUMuKZ0uZs3GEHu+0f9BRO2zGSxXaE1y7c4HvzT3d/P5RquHi5viNBaqo80zVlkIIdHhHhnr9qPm8yhe0eHWZYtD2+ojPiXeFuIgPQXJCTo3PgphZbGeV28Lj4XKs/dAb6e1sWaADKGVliywkBR5RyKyLTltNFNMx0Ke9QLFNVYMWft7UCzwP3Qs/fMLePuXYT0KfRrod6ERy6otbWh3qr0ZozPL5d5O2FgnynVCBaRve4/lR6dz1N5b+DsQVndiucTYRUqoUGNzYJGldj6K3RzdA7vWjzXY20YlaMZ6Hxkj8O3aOyHnAjyNkfleDVb1WxDu1ct8kcGbNZ7djpScvtmryNN9I6XX8w9eFl7OWv4GdLETaRj0bMXszelszZe/FbImniFPzyyCyfTAXs2xruKNLuK8PgrWQcyL6az953L9LyS9XfWAk5t4b8n8KPQEpnOhyrLQMZQiCxjf/1y9z0R+QYSsn173wQcLk+uzAyHyQhcgkyi33lDX37xo/K0Y6jyt0hVhKM6yhgt+D9A+UX6gvUirvM9l/V5K3pv2LLlBQdy7pb0zeAM85521AoCV+/4jzd441jM0iHTYb4VTPovR2SgOxvezdxMSv1yebwyyy+i2T6han/YoLNqLR7ghJ8SXTflFYOjxpGI3NyA1s7QeWYS3diUboOUeKxbmfLbfvyKV6r/yC2LdAU70wdL4s+Ctb79fFlw8NE5O2b1hU1Ah6Dp178fADw68zlkhfaK4UxvEs6/dLI1yH9kI7552Z6vw2MC0ranFX4rmoklGtQz0JtoKiaZhBxytWPAZPycV1nsTSH23fCsaSvGgVkTf5gmP3oj6F+9+NiMPDnEgZSQTuo2GfV/K4PzGyLPZ0rD7+x6euhTcU53ftRffq8H3pjCWmuw0+fkipmPPLQ10zAzsbTDU2bYWYWUBLghFVh5Iqs5NJ0NW5qTM+4AOzMub+XE3BpHkTRyOHHblbcrmHX9wsdCpGmlcjM25oYqJ1hthiNWsE0ZWu6NYyNMiuRhLvQMo81mZ0Fo/3q1zP04t2/vZDhB2zphJmbJa2ZQbvBTtC6viH/pIH3GcugGXEIpQeN9vCpnCeb9C34zh3VCHaI7BMhcqQd/rioyfOvfujNP4EFsJJ6eMCiOllFG/Es2KQ7F485MhKsgHOcThh5nL7zcsjvP+M+77yKovEwK0Ak+2iRIEe3DzAI5nqFd00s90wPX0v+0edQ7H1LxVmITlb4zUY/X++f3JrABLbNu25KA/nTN2Wl3eK5b7kulyu1vcEyEr0VoFhoCWaER0ud1eCMOAx9NqaLQoRn7DetRnwn5Aw0srBpRY9kFkjnADwRWktvp3JM6SI1VkbzunHtvPD+c6sRi44vFK+BQWgQ5OY7mS8rARsEfYdfZctz7RMpRrArsx9038VSTK64mZ7D9ID/bnwFFsulOj2SUXr4g7GRe7hRuEleWy5tMTcZ8B1j/grX2Awr9Oo7J21Kfbh5MvwJ1FTuRNlQfh9HNzN5RhynnAyKpyOEbF0TIg9K6cekC9isKu+IGfS5R+AbrMVboMQlJ6VM8ETsXSIJSZGF14+cm6DU5mbQjHUePpNMdH54tCVAkE/6338o4QR8E8ih7+anvCmnXv+HsNVNHcIZ6PzEe8So5F6s8shc5/zH8/Oyn09/66P+GzZEr32u/J0LbK7ENepTXNhisZmiODWz+ikuNRgnJIzuSyHfjfGIQFGlHcWpOURKDNgSO+uONWzBXD1KU5EqFJFFhzA/OEgqMceLnBpRV/cqzpsbD4TpwRL+ybpcX93NWQPRsdj/sIKQX64B35kFFSUVMagLvXeHe+tRYFSY1B+GwdVW3jlHXFCSMZA4/ct3SoJSx7o1J4aQmY8y+VvmgZ63Yxo8moghOe6CbUs9mndCW9gNWC9MeOqh6odEzKZ/L+Ns647MMAQMjCIlDGJhUeEqIJnJshJNoyC77nBTqAFiSmoRt3W1L+fmu0i6zRka61pf8Rb+ukJpZQyX4lsXImjEKIAhblCwpp7ZKixbeCHgC3iK86qJ/A9fD8uRv30q9q4xCvkzijpMBBEMJ1qnheAaSC3OoP3yZ2DDz9GFbIfD7NJbfi3kfi+bbB9W5dRyOl5MlyV4qzPaDQhm2ejB1372vIilx9Yh8Jj3FPds4Ttshb4fC6Vn0sbyTKwFFJEBT0GyUL3qqOnSGXV17IRAvC4bgYN8KsHmJye6vGTonhSPRpZvW7+UpjlQ38WgjIAvT92BikjYnyZn6J4c6OpsCWUO0kl0TvT9RdZQ8qnMj9cudBbrgyzxO8vNBYDiTe+QW1M2joETSUT5MOh3QzhFK4F4s4iBSAil/orNdEGKTbllB6TgCOsDKYYol8PsIDnl67lDDou/3s33/+MgKbWRGp929umVW3F58DpT1v2ihity6P/13zWhCYBdcSNCkWdvoi5MX6xJezoRvxGaRGmENCEnQDZ0IdsBET0ZJKcOUp9rs5MpweC9TqMHNDEqq77f+I3GRZouwiQiBZnkjPVDhTw2FLNsvyTNr5QNGrxUV0yq3ix0ZjFRkH8R/Ji0DNzB+5f+5vmPKK/zKN5t85sXGjYs9orNviq3uFn4srlNL430yOa4wO8m0rBSSpQcFSA79RU+fbsV7+5MgYvWb7ZVgUUNd3UDmv3RvB3ENHpTwIXcewdr75hjTRkFnNovVzp/knlc1MbIBt34xhgCP8UIrIopmzA+Z81+UgO1y2tM3Kz+R4j2WdlM7wFT5TKqVhd0mI3N1Mgq0Yhl31aTcEUNZWAJ/spNFXuvoHk9kKieABg5lUnjkqrvnoqmIC+HAVmCyMS8pw7TPRSu3GUnC4zMNLYFLEs0ZfJPBXnBegKt+nKdIw8JeyFvNDmuLk+0ejU19s7P5+5WLoz+/3pHxNjvUPOQeSq/36ukBrLBzucrzu5WkThXLmWnZf5Ug2lZw/Y4lnJlN3htW+kcZZ2WQN1JXotQMbDOdW7UBDM//bKdt4w62e4QRk7fwfxXr1e9TdphG2VrLuxyYZtbmveduphqHdYYmptRLe8AAGYdGmMY/6S3mueGYznaJdOX2MQbd2uk8yEbKoOCCPjFlmuEORBoEK5QRwe4zBT4HCKJ/4kqEcT5hpzahCGbYCqpXsL8qDBNNcbz7wcgBh6mIlHTBfLds7uhaXSS0CMapKHR/GT2rD22hpw8Wdduxs/0sWfGmhpJ7KsRl8YrH+TNEh4KKF2nStoc/gJZmvM03TtvsqNfHycwx9tN32a0Cd0QZcEb3Jy+oxJTHj0guMYfNynlbnHlnZiCnNROPqZ9JG7chKi3fiCxrcpvDLbPndLMv0ehuqY0RAiGwn3VVSW600cbmOMPo7dKCi7pvAfyve1NHzJqaY35GI8KcQxMsGbzrwcDE/aAjRGwLrR0z7nvZauL8EuHw0xlv0vMdJ83T9iHT1g+ltJA+PJoJRX0KHGEzvZg3WPDL5kIg7veVzAbxG5oqhxcx5JKdcBCRwhcQKfIgBv+eASy73F+Ujfr6C2zlGF9Zq2XhCK+bghGwZuL/NKbBmF1Av01AN1BqmpaHH8giIYWUFuJrImfSwIo604zYaY/P974TEAsXYGYKsnEFk+jg9s6dheEIKSt+NHrGgzGKPkYB6uivhTlsX4dpar+Qp1/mG2lw/FjvgLgAvJ1NTPFgs129G6+HkGZUs65Pn9fka5xPhHPOzJieFkZ+0PKQlhMWr+qeXly3qN9frgm+Ou/A7L6wCQBafXWFdyrypgz1iPqIJ52FPAEAuNu+IwAA3Fv+vNOofyfm2TYcAHgwQfFP07hjBMm/H+7/J+5WsSlgm2kAfCCehZhpYJonajbg9I/HShdJzYLzIm4JYkaq/BnmC2mD+eZJkD//Qhl8QBvnWu0u0DdXVFQQXjZ1nkJnEU0SPvmCUtC0S2DJPIriNasJDZlOue3SFK4AHMDA0K3dCOuhBkFAWwIAoMr5UwaE5b8MGNXWDISfMRkYCgUZWDEUgOPdAmDTplC+KuVK1KrRJJBbsVLNB5qvQeZGGjSGsn5fKY0gak4iOWLark4ZuCPSgXaCjyDt6KF8pbNIXaV1t0rjkATPJNe+55dgmaROewDlKVymCXwS4DuJltpBr1AQhkqpUJSm+VoFcYpJlSo13aLxAoonKoYWhqKUBYGyfv+CBQ==); }</style></defs><rect x="0" y="0" width="791.6916503906249" height="494.36415364919594" fill="#ffffff"></rect><g transform="translate(328.2160339355469 10) rotate(0 97.32838439941406 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Image process</text></g><g stroke-linecap="round" transform="translate(609.0841979980466 247.97194173513344) rotate(0 71.19143676757807 31.74713134765622)"><path d="M15.87 0 C43.11 1.96, 65.96 -0.28, 126.51 0 M15.87 0 C53.52 1.08, 91.12 0.96, 126.51 0 M126.51 0 C138.62 -0.28, 141.39 7, 142.38 15.87 M126.51 0 C135.94 -1.78, 143.26 5.64, 142.38 15.87 M142.38 15.87 C141.36 22.69, 143.83 27.62, 142.38 47.62 M142.38 15.87 C141.71 27.05, 143.49 37.22, 142.38 47.62 M142.38 47.62 C144.25 58.93, 135.28 64.61, 126.51 63.49 M142.38 47.62 C142.51 57.53, 138.22 65.79, 126.51 63.49 M126.51 63.49 C82.47 66, 38.18 65.37, 15.87 63.49 M126.51 63.49 C91.75 63.17, 56.91 63.21, 15.87 63.49 M15.87 63.49 C5.56 63.91, 0.57 57.14, 0 47.62 M15.87 63.49 C3.78 62.86, -1.78 56.93, 0 47.62 M0 47.62 C-0.69 38.75, 2.08 33.62, 0 15.87 M0 47.62 C-1 39.38, 0.13 29.07, 0 15.87 M0 15.87 C-1.4 6.55, 3.61 -1.3, 15.87 0 M0 15.87 C-0.04 6.81, 5.69 1.38, 15.87 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(668.0686035156248 267.2190730827897) rotate(0 12.207031250000057 12.5)"><text x="12.20703125" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">src</text></g><g stroke-linecap="round" transform="translate(246.69052124023415 397.0807674187272) rotate(0 154.96801757812506 43.641693115234375)"><path d="M21.82 0 C115.88 0.1, 207.88 1.28, 288.12 0 M21.82 0 C116.55 -0.99, 209.69 -0.21, 288.12 0 M288.12 0 C301.66 -1.55, 310.7 7.57, 309.94 21.82 M288.12 0 C300.43 1.62, 308.87 5.84, 309.94 21.82 M309.94 21.82 C310.88 37.41, 311.2 47.78, 309.94 65.46 M309.94 21.82 C311.24 37.8, 309.4 53.61, 309.94 65.46 M309.94 65.46 C310.05 79.43, 303.64 89.28, 288.12 87.28 M309.94 65.46 C312.17 78.52, 304.85 87.16, 288.12 87.28 M288.12 87.28 C189.04 87.98, 89.85 87.86, 21.82 87.28 M288.12 87.28 C222.12 86.43, 156.14 85.85, 21.82 87.28 M21.82 87.28 C5.96 86.73, -1.54 78.91, 0 65.46 M21.82 87.28 C5.98 86.57, 2.29 79.1, 0 65.46 M0 65.46 C-0.8 55.55, 1.08 42.46, 0 21.82 M0 65.46 C-0.81 49.9, -0.95 32.44, 0 21.82 M0 21.82 C-0.04 8.59, 7.62 1.2, 21.82 0 M0 21.82 C0.85 6.42, 8.15 -1.94, 21.82 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(287.02963256835915 428.22246053396157) rotate(0 114.62890625 12.5)"><text x="114.62890625" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">dist / html + css + images</text></g><g stroke-linecap="round"><g transform="translate(646.9859205036698 316.96620443044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M-0.01 0.64 C-18.72 13.26, -94.49 62.82, -113.19 75.12 M-1.47 -0.07 C-20.27 12.24, -95.67 60.64, -114.18 73.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(646.9859205036698 316.96620443044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M-99.27 53.19 C-101.65 57.58, -105.23 63.74, -114.18 73.26 M-99.27 53.19 C-104.13 58.28, -107.51 64.95, -114.18 73.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(646.9859205036698 316.96620443044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M-89.86 67.47 C-94.28 68.65, -99.98 71.6, -114.18 73.26 M-89.86 67.47 C-97.34 68.56, -103.42 71.14, -114.18 73.26" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(10 84.45891072927407) rotate(0 385.84582519531244 32.44496154785156)"><path d="M16.22 0 C237.97 0.79, 458.94 -0.21, 755.47 0 M16.22 0 C301.32 2.35, 585.72 2.58, 755.47 0 M755.47 0 C765.35 -1.25, 772.07 6.63, 771.69 16.22 M755.47 0 C764.98 0.78, 773.62 6.55, 771.69 16.22 M771.69 16.22 C772.16 24.78, 772.61 27.8, 771.69 48.67 M771.69 16.22 C772.2 28.77, 772.68 38.66, 771.69 48.67 M771.69 48.67 C773.59 59.38, 767.74 64.43, 755.47 64.89 M771.69 48.67 C772.64 59.77, 766.04 65.3, 755.47 64.89 M755.47 64.89 C546.89 63.65, 339.24 63.78, 16.22 64.89 M755.47 64.89 C572.65 63.86, 390.22 63.95, 16.22 64.89 M16.22 64.89 C7.4 64.1, -1.14 61.46, 0 48.67 M16.22 64.89 C7.11 64.47, 0.81 61.22, 0 48.67 M0 48.67 C-1.54 40.4, 1.02 33.26, 0 16.22 M0 48.67 C0.18 41.64, 0.38 33.05, 0 16.22 M0 16.22 C0.77 3.72, 3.78 -1.83, 16.22 0 M0 16.22 C-0.26 6.15, 4.65 0.74, 16.22 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(66.77615356445312 104.40387227712563) rotate(0 329.0696716308593 12.5)"><text x="329.0696716308594" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">remote / website-project-name / image-originals / 1920x1080_webp</text></g><g mask="url(#mask-3MoL2GfvWokixctPT98ES)" stroke-linecap="round"><g transform="translate(322.3596330506583 150.1632613211277) rotate(0 -64.37134510843595 48.01192714655916)"><path d="M-0.6 1.03 C-22.31 16.9, -108.06 79.23, -129.34 95.09 M1.29 0.52 C-20.1 16.53, -105.26 79.96, -126.95 96.14" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(322.3596330506583 150.1632613211277) rotate(0 -64.37134510843595 48.01192714655916)"><path d="M-113.22 75.24 C-116.71 82.04, -125.13 91.67, -126.95 96.14 M-113.22 75.24 C-118.21 81.3, -121.88 89.12, -126.95 96.14" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(322.3596330506583 150.1632613211277) rotate(0 -64.37134510843595 48.01192714655916)"><path d="M-103 88.96 C-110.31 90.54, -122.59 95.01, -126.95 96.14 M-103 88.96 C-111.08 90.76, -117.97 94.26, -126.95 96.14" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-3MoL2GfvWokixctPT98ES"><rect x="0" y="0" fill="#fff" width="551.1023232675302" height="346.187115614246"></rect><rect x="177.8783712552107" y="185.6751884676868" fill="#000" width="160.21983337402344" height="25" opacity="1"></rect></mask><g transform="translate(177.8783712552107 185.67518846768684) rotate(0 80.45443541456007 12.817787592560052)"><text x="80.10991668701172" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">optimizes images</text></g><g stroke-linecap="round" transform="translate(11.170349121093523 246.4255599975586) rotate(0 148.0681762695313 35.60015869140628)"><path d="M17.8 0 C83.16 -2.35, 149.17 -1.54, 278.34 0 M17.8 0 C79.28 -1.01, 142.33 -0.88, 278.34 0 M278.34 0 C288.33 1.16, 297.82 6.22, 296.14 17.8 M278.34 0 C292.35 0.84, 294.05 7.22, 296.14 17.8 M296.14 17.8 C298.03 30.62, 294.73 41.46, 296.14 53.4 M296.14 17.8 C296.81 28.42, 296.29 38.97, 296.14 53.4 M296.14 53.4 C295.77 64.23, 289.3 70.23, 278.34 71.2 M296.14 53.4 C296.44 65.75, 290.86 69.98, 278.34 71.2 M278.34 71.2 C216.44 68.69, 155.82 71.19, 17.8 71.2 M278.34 71.2 C211.09 73.12, 142.94 73.87, 17.8 71.2 M17.8 71.2 C4.16 72.62, 0.48 63.96, 0 53.4 M17.8 71.2 C4.32 72.64, -1.94 63.77, 0 53.4 M0 53.4 C0.96 43.53, -0.98 32.94, 0 17.8 M0 53.4 C0.18 46.04, -0.04 38.36, 0 17.8 M0 17.8 C1.61 5.18, 7.09 -1.28, 17.8 0 M0 17.8 C0.64 5.53, 4.03 -0.09, 17.8 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(91.49926757812477 269.52571868896484) rotate(0 67.7392578125 12.5)"><text x="67.7392578125" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">public / images</text></g><g stroke-linecap="round"><g transform="translate(164.02388092802448 323.1258773803711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M-0.56 -0.75 C18.47 10.64, 94.25 57.59, 113.02 69.19 M1.35 1.47 C20.35 12.45, 93.92 56.58, 112.2 67.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(164.02388092802448 323.1258773803711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M87.64 62.75 C91.41 64.19, 98.86 63.64, 112.2 67.45 M87.64 62.75 C94.95 64.77, 104.93 65.91, 112.2 67.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(164.02388092802448 323.1258773803711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M96.41 48.07 C98.51 52.45, 104.18 54.87, 112.2 67.45 M96.41 48.07 C100.91 55.04, 107.96 61.08, 112.2 67.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask></mask><g transform="translate(361.84523010253884 349.94579829066333) rotate(0 21.769981384277344 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">build</text></g><g mask="url(#mask-06gBbcDYyqbrWgIkFgiMG)" stroke-linecap="round"><g transform="translate(312.806701660156 281.99078525641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M0 0 C93.22 1.78, 186.19 -1.58, 290.78 -2.22 M0 0 C104.71 -0.83, 207.36 -1.48, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(312.806701660156 281.99078525641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M267.36 6.52 C275.45 5.54, 283.24 -0.8, 290.78 -2.22 M267.36 6.52 C276.59 3.72, 283.13 0.79, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(312.806701660156 281.99078525641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M267.22 -10.58 C275.46 -6.11, 283.29 -6.99, 290.78 -2.22 M267.22 -10.58 C276.65 -7.26, 283.24 -4.08, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-06gBbcDYyqbrWgIkFgiMG"><rect x="0" y="0" fill="#fff" width="703.5841979980466" height="384.2140945394949"></rect><rect x="373.8888092041012" y="268.37913061488143" fill="#000" width="168.61328125" height="25" opacity="1"></rect></mask><g transform="translate(373.8888092041012 268.37913061488143) rotate(0 84.306640625 12.75657094838769)"><text x="84.306640625" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">generate image list</text></g></svg>
@@ -0,0 +1,2 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 868.292816162109 516.9149348991959" width="868.292816162109" height="516.9149348991959"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1baW/bSFx1MDAxMv2eXyF4Pk7E9H1cZrBY2I7PxF5v7ImT2Vx1MDAxZFx1MDAxOJTYllx1MDAxOVMkQ1K+XHUwMDA2+e9bTdukxEOXlZnMQjJg2GSr2Ue9V6+qmn+86nQ2svvYbPzS2TB3fTfwvcS93Xhtr9+YJPWjXHUwMDEwbpH8/zRcdTAwMWEl/bzlVZbF6S9v3lxm3eTaZHHg9o1z46cjN0izkedHTj9cdTAwMWG+8TMzTP9pf1x1MDAxZrtD8484XHUwMDFhelnilFx1MDAwZulcdTAwMWHPz6Lk8VkmMENcdTAwMTNmKfT+XHUwMDFm+L/T+SP/XHJ3fM8+cWuPilx1MDAwN3lwsP2birxcdTAwMGaY7etcdTAwMTj9ln81b/Q8hczcZeXVO7gkJHa0QIxSzbVcdTAwMTa4uHlcdTAwMGY3OXI0XHUwMDExUiBcbj9KYlLcvfW97FxuWmAlXHUwMDFjionEVFx1MDAxMIqYUKpocmX8wVVcdTAwMDZtKC+uueEgsFx1MDAwM0HFlTRLomuzXHUwMDFkXHUwMDA1MFNcdTAwMTjgT9jYn3KMPbd/PUiiUehcdTAwMTVtssRcctPYTWA9ynaXflx1MDAxMJxm93nvsFx1MDAxM7CEXHUwMDFilWecP1x1MDAwZrlyve1b8NDBVWjSdOI7Uez2/cwuXHUwMDBlRuUs7Fxi41x1MDAwMy/fnt/LMSWwsVx1MDAwN3Z/wlFcdTAwMTBcdTAwMTSX/dAzduk3XFw88bTQe3raROvUXHUwMDE424PAXHUwMDFjtlx1MDAwMla6uFGaXHUwMDFmXHUwMDE1vHr1OFxuc1PESGlJXHUwMDE1XHUwMDEy5db56Vuwpizv9Vx1MDAxMizSlGttx7AzZmnlVEax5z5+XHUwMDA1S1x0W821XHUwMDEwlJebXHUwMDFk+OF1deRB1L9ueEpugzD7j75nok6cRH0763LRojA79Vx1MDAxZuzgiZq4uutcdTAwMGX9IDfLib42XHUwMDAzf2BXYSMwl2NcdTAwMDZcdTAwMDFcdTAwMGKR+YCl4nZcdTAwMTbF5d0+9Of6oUnq21x1MDAxMyX+wFx1MDAwZt3gbPo43VFcdTAwMTZ9MOnjSLNkZMbXwuw/XHUwMDFiP3ZcYs9vfHvdhNvkjN6/XHUwMDFi7u5cdTAwMWTexnxzeI/Nh9OTqI7bxPSzR+xMgFx1MDAxN/DqXGIuJECPXHUwMDEwJlC5XnaZKMZcdTAwMGVjmilKlFwiXHUwMDA0cVGDL1x1MDAwMYRTqTR0oTjmXHUwMDAylWZSwFdQXHUwMDA3OiGCXGLNXHUwMDAx6kywNZyb4Uya4fy85eV+0qcr36oox4JcIlx1MDAwNItNaFx1MDAwM8wx5qR6ucC5pJQjjXVpXHUwMDAyXHUwMDBi4LxcdTAwMThgOdQ2pzFmu5/kwTA0Rnzx3P7BXHUwMDE23c2i0eHWRtHu2+vmblx1MDAxZr/Mvp6o3uXnYPS538NcdTAwMGboRjzo7sfJpzw/302S6HbefpFcdTAwMThs9fpvP99/7SXng4Pr3YF/tDdfv09/tZNcdTAwMWWjREtJx4E+g/SmIL959ebw2FpLXHUwMDA3PDXRXHUwMDA0Y0a4XHUwMDE0k6CnyFx1MDAxMUDOmFl+lkLVMFx1MDAwZnOBXHUwMDE2Wlx1MDAxMY1cdTAwMTFAnvA65MnaY7dAnC7gsYlcdTAwMTJYXHUwMDAzaTZAWSvRhmRJMKOcIbFcZpBXabs1h50m/c6bjlx1MDAxYsfw+8Y6xVx1MDAxNq+NJq7O8tp9XHUwMDE4u0mm+O2h73njjm/Sdc/yoFVvPm1cdTAwMTKrcem3ZOdwm95cYnX8+fbi4JKqYTg8mNulg1xid4iwUppcYnC1qtwxu4bg41x1MDAxZM5cdTAwMTW1qlx1MDAwZSswlFx1MDAxYbop0o6moNh5jm00ZkdcdTAwMDW8lXSIolQ9SXa5RntcdTAwMGLa2ctcdTAwMWS61lx1MDAxNFx1MDAwMc826naMUc3PXHUwMDE3XHUwMDBlXWiqXHSDyOrPc+jbX/1tsdc/XHQ2za+frk7Q8e67zeO/2qH/io9cdTAwMDZH3j7pX5yfnb1H6OEwPD9biUPHUnEuXHUwMDExWySKmYL75tWbw6FcdTAwMGKqXHUwMDFkUN6YS1xi8YCjK5DX2JFcYj5cdTAwMDRcInBcdTAwMTisrEGeXHUwMDEwoFxmLlx1MDAxNV678kXAzed35WAmTFm6bHLlY/ZTwbBcdTAwMDL0clBhdFx1MDAxOVxiz7BaRVx1MDAxNrDamiv3/DRcdTAwMDNcdTAwMDd4lVxyg87PnX6awm9/6Fx1MDAwZcxcdTAwMGbh0md40KpLn2cyq3Ht0zmuwkNcdTAwMTXRrq3jZoxzopAqQ+hcXLMrXHUwMDA0gTqVjGtFOSj4eqCOMXVA7oP2h+BcdTAwMTB0fWlSXHUwMDA10iVzQPWD09dcdTAwMTDtK1xc8sRcdTAwMWH3XHUwMDEzuFx1MDAxN/PjXHUwMDFlcySkhKC6XHUwMDEx+LTm00tccs9cdTAwMTlnkpbbvKKkXHUwMDFi03Ism7pcdTAwMDDw48ivSoPyr05pXHUwMDFh+T/F37+/bmzdbbVG+6naYdlbzVx1MDAxZqeZm2RbsDV+OJjUVU/57nkkPrRcdTAwMWVGXm5MUdLzx5Vcclx1MDAxOOid8U7s3CemXHUwMDBlc3RcdTAwMDQgTmBsN5egMu/1eJNcdTAwMTNJXHUwMDE4wlRcYtDZXHUwMDEwZzetXGJQYX+UjuPK2qRcdTAwMWI/7UhNXHUwMDExmtCbPdXp1LfkVJlcdTAwMDBxXHUwMDAwXHUwMDFiwqTNXGKUWVX7wVx1MDAwZcKYc4goXHUwMDE0olx1MDAwMoJcbjp9rnWha/dw0zLelXFrsINJj9+rUqNcdHrRbYO5XHUwMDBlo1x1MDAxYnPkP04nPfezqyeA1Fx1MDAxYVx1MDAwNm6abUfDoZ9l5eyL5W9m8T2TJHfZl/D+w/lcdTAwMTZ/q/BcdTAwMDVcdTAwMGV3wrlcdTAwMDM0JpGjpZKSI8JcdTAwMThmpVx1MDAxZs75idi7WCDFKbH2pWtUzlx1MDAwNVx1MDAwMEQghlx1MDAxMNVcYjalbFGmXFyZo5TWXHUwMDEwnmlw9XSs7rLm8lx0LpcvXHUwMDBl0CxRXHUwMDAz0HU5wIn4rFXbYWBjrFx1MDAxMV6usFKMb6H47PwmXHUwMDFj3JDr4+5XXHUwMDE5XHUwMDFjv7s63Vfx0d68cVx1MDAxND2K3pO9y5vz6Nq/62cnZ1rtnK4oMcq1XHUwMDA0S11RXHUwMDFj1TzLOeIoTojDbFqUMUDn+Jbm1sZcdTAwMDCZWFx1MDAwMJ6QgmCLjGU9npHJXHUwMDA0hFpcXHPoQYFcdTAwMWNbR1NcdTAwMGIgUS2gqlx1MDAwNLO+RrPGXCJcdTAwMDdCrFx1MDAxZHOSIVx0XHUwMDFhXHUwMDFhLYO5VZpvLaBKzDDKXGZEIbeml/qZ6cZJ9Fx1MDAwNVx1MDAxY0g3hHV7TjV2nyOXXHUwMDFmXCLKmuFcdTAwMDarUdbSM1xcTeg1nb6mhV5cdTAwMTC6O0JcdTAwMTGGldQg5tVkvcRcdTAwMWVg4Fx1MDAxODGI1W1sXHK6r0ZcdTAwMGLgolx1MDAxZEVcdTAwMDTmhIL5UapcdTAwMWLOOGBcdTAwMDKKmDMsXHUwMDE58Fx1MDAwZbbp1zVRNFx1MDAxM4VeJPxcIsDCXFzQXHUwMDE259xKXHUwMDE0XHUwMDA0UVx1MDAwNtqJLsVcdTAwMTPL+ebbXHUwMDBml2fux4eLXHUwMDBitncqzlNcdTAwMTk+pGl3cVx1MDAxZqrHwfHXXHUwMDA0d+3mbj91Qy87rM1xzvhuOlx1MDAxM41FXHUwMDFmXeRgqUGvKVx0XHUwMDExJsVcXI41elxmvTjEM/k5hedxLVx1MDAxOID1TndcdTAwMWbE3dfup1x1MDAwN3Q0vNn/vPfl6NBrXHUwMDE5XHUwMDBi6HeCiLalXHUwMDE2an9qg8G1Mfz9oqVmw55DjjGwXHUwMDE0SmxcdTAwMWRLYKQ1xZPES4hcdTAwMDRa5ogjLVx1MDAxOOV1NWbr1Fx1MDAxYaxcdTAwMGZcIiWgbVBkJdxcdTAwMGLaXHUwMDFkU1x1MDAwMmuanaDZzflpXHUwMDE24kylmW4sUdUzX89cdTAwMWNLNSNcdTAwMWMzvHItXHUwMDA2hkKWynE9a7EozvwhyI30qcDb+fm/4cCA7oFcdTAwMDd14sTc+Ob2R1x1MDAxMGAzJE1VgNWn1Wmf1WpE13QynJUpoYI6klx1MDAxMSVcdTAwMTmQNVx1MDAwN1x1MDAxME/gPy9UI2rPoHAkXHUwMDE4b6hraeFg6IRcdTAwMTOeZ0p4QylbwlxmXHUwMDEw9Fwiqc01XHUwMDEyvj6b1sJcdTAwMDdbzXywWClcdTAwMWJcdTAwMTaYXGLedKBcdTAwMDVcdTAwMTi+/VxmKlx1MDAwNiEhMOZL1cGWk2Nn3tn53dfhrTe4P+dHXHUwMDE371xcXHUwMDFk93p/Qsl5ar8vSMFM7ff7nXlbcYm8eVfm0Vx1MDAxMlxmOyDqMFxie1x1MDAwNIqLqOqhN+pcdTAwMDBcdTAwMGJcdTAwMTCBXGIjiGNdJ1x1MDAxM5v+4VxcK2hCrLNrOOi6Tu60kcf2/GKCMMSllI25XHUwMDFkjVsrZlx1MDAxOFGI0TmiS51fnXbsXHLbXHUwMDAw8iVyXCJcdTAwMWX1XHUwMDAyv/9DnXmb4ZeryqF1XHUwMDA2q1FcdNPpclpqhmPhcJD/yCZdXHUwMDE5VVx1MDAxNYWghFx1MDAwM1x1MDAwMSbDSlPKuGp4+1x1MDAwNFx1MDAxM0dqhbm2VTxo1XR8XTmMM6WBXHUwMDFmXHUwMDE05ePea1xy8lx0kL9dIDFcdTAwMDM6XHUwMDFkXHUwMDAzjzaGXGZS1NI1XHUwMDA1yrmC4F2yXHUwMDE1n23lmokl87crTZ20m6P91Fxmseyu5oXnTJzMTFYsUy2mXGb4m0twokSRMsf2eFNwQsDHKkTs+VPEm5ZkSrH4r6uBXHUwMDBiylx1MDAxNFx1MDAwNlx1MDAxOWHrXHUwMDBlXHUwMDEwt47PXG47IF6ZZkxTjlx1MDAxNFf8/79cdTAwMDS+efOeuOR496NJcDfqvju5XHLeXcwjxCRmXHUwMDBlXHUwMDAz1HHAv31cdTAwMWZogrBhdVx1MDAxZEaoTVx1MDAxOdryXHUwMDE5YlxyJTZcbjrOvr0gXHUwMDA1KEuA7VqGzc/QO1x1MDAwYjC0XCJaYklEY42NtcZqXHUwMDA0M1x1MDAwMVx1MDAxYrfkseNZYcRS2e1nXHUwMDFk1lx1MDAxYvmBt1xu9fWd3lx1MDAxM6yMbzXaanpoN01bXHTBXHUwMDFkKiHQXHUwMDExQjFY/MlzKqCnXHUwMDFjJsBLXHRcdTAwMDXkh8be6SuzL8ixQl5cdTAwMGJq31x1MDAxMGx6j4A4XHUwMDA00I4gXHUwMDFjo0iCR0Nr5LYgd3d+5DKItoVUqklakbFsa63khVx1MDAxMIdcdTAwMTBZLKWtXG4vt1CS5Xpn9+Tfx2fD6OQgOyT8ZH/LJ//6vi/UfVx1MDAxZuHWauv2062b+Vx1MDAwZqncJjRccnI4QjOOLS6nzr7HYcxFRz52bcqBy7+fLGtcdTAwMDbUPLKMIFx1MDAwN0mFJMRcdTAwMWWgwFSF7Cl2XHUwMDE0XHUwMDE3Qlx1MDAxMiyktsKrxvYg5q23UEhwbIVZyT5rXTaT3fdcdTAwMTbQZZJcdTAwMTLclkSvn3Mo3iSB6Fx1MDAwNTZu1YEzo6BcdTAwMTPZi7JjRVx0Ks8tdVx1MDAwMj/NVqHRXpohm6Gbqtpt6ixcdTAwMTZWcq+eaGvDjePTXGa6LehcdTAwMTQszPcqK/J4LTNxuVx1MDAxYfmlI+DRndDtXHUwMDA11dXfsKW+rTqgfrrMP9ZcdTAwMDHn9GLBZPJcIs+3V9/+XHUwMDA3mZd91iJ9<!-- payload-end --></metadata><defs><style class="style-fonts">
2
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><rect x="0" y="0" width="868.292816162109" height="516.9149348991959" fill="#ffffff"></rect><g transform="translate(318.21755981445335 10) rotate(0 93.15635681152344 17.5)"><text x="0" y="24.668" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Video process</text></g><g stroke-linecap="round" transform="translate(607.9138488769531 270.52272298513344) rotate(0 125.18948364257795 31.74713134765622)"><path d="M15.87 0 C67.8 2.5, 115.93 0.56, 234.51 0 M15.87 0 C90.28 1.4, 164.63 1.3, 234.51 0 M234.51 0 C246.61 -0.28, 249.38 7, 250.38 15.87 M234.51 0 C243.94 -1.78, 251.26 5.64, 250.38 15.87 M250.38 15.87 C249.36 22.69, 251.83 27.62, 250.38 47.62 M250.38 15.87 C249.71 27.05, 251.49 37.22, 250.38 47.62 M250.38 47.62 C252.24 58.93, 243.27 64.61, 234.51 63.49 M250.38 47.62 C250.51 57.53, 246.22 65.79, 234.51 63.49 M234.51 63.49 C147.59 66.57, 60.46 66.02, 15.87 63.49 M234.51 63.49 C166.03 63.38, 97.48 63.41, 15.87 63.49 M15.87 63.49 C5.56 63.91, 0.57 57.14, 0 47.62 M15.87 63.49 C3.78 62.86, -1.78 56.93, 0 47.62 M0 47.62 C-0.69 38.75, 2.08 33.62, 0 15.87 M0 47.62 C-1 39.38, 0.13 29.07, 0 15.87 M0 15.87 C-1.4 6.55, 3.61 -1.3, 15.87 0 M0 15.87 C-0.04 6.81, 5.69 1.38, 15.87 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(644.2534179687499 289.7698543327897) rotate(0 88.84991455078125 12.5)"><text x="88.84991455078125" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">src / app / videos</text></g><g stroke-linecap="round" transform="translate(245.52017211914062 419.6315486687272) rotate(0 154.96801757812506 43.641693115234375)"><path d="M21.82 0 C115.88 0.1, 207.88 1.28, 288.12 0 M21.82 0 C116.55 -0.99, 209.69 -0.21, 288.12 0 M288.12 0 C301.66 -1.55, 310.7 7.57, 309.94 21.82 M288.12 0 C300.43 1.62, 308.87 5.84, 309.94 21.82 M309.94 21.82 C310.88 37.41, 311.2 47.78, 309.94 65.46 M309.94 21.82 C311.24 37.8, 309.4 53.61, 309.94 65.46 M309.94 65.46 C310.05 79.43, 303.64 89.28, 288.12 87.28 M309.94 65.46 C312.17 78.52, 304.85 87.16, 288.12 87.28 M288.12 87.28 C189.04 87.98, 89.85 87.86, 21.82 87.28 M288.12 87.28 C222.12 86.43, 156.14 85.85, 21.82 87.28 M21.82 87.28 C5.96 86.73, -1.54 78.91, 0 65.46 M21.82 87.28 C5.98 86.57, 2.29 79.1, 0 65.46 M0 65.46 C-0.8 55.55, 1.08 42.46, 0 21.82 M0 65.46 C-0.81 49.9, -0.95 32.44, 0 21.82 M0 21.82 C-0.04 8.59, 7.62 1.2, 21.82 0 M0 21.82 C0.85 6.42, 8.15 -1.94, 21.82 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(285.8592834472656 450.77324178396157) rotate(0 114.62890625 12.5)"><text x="114.62890625" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">dist / html + css + images</text></g><g stroke-linecap="round"><g transform="translate(645.8155713825763 339.51698568044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M0 0 C-24.73 16.65, -50.39 35.07, -113.11 74.61 M0 0 C-33.23 21.53, -64.7 43.8, -113.11 74.61" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(645.8155713825763 339.51698568044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M-98.06 54.65 C-100.48 59.02, -104.09 65.16, -113.11 74.61 M-98.06 54.65 C-102.97 59.72, -106.39 66.35, -113.11 74.61" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(645.8155713825763 339.51698568044594) rotate(0 -56.55749871129365 37.30728149414085)"><path d="M-88.75 69 C-93.19 70.14, -98.9 73.05, -113.11 74.61 M-88.75 69 C-96.25 70.04, -102.34 72.57, -113.11 74.61" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(117.23590087890648 80.04484822927407) rotate(0 282.33020019531244 32.44496154785156)"><path d="M16.22 0 C175.96 0.74, 334.92 -0.27, 548.44 0 M16.22 0 C221.52 1.71, 426.12 1.93, 548.44 0 M548.44 0 C558.32 -1.25, 565.04 6.63, 564.66 16.22 M548.44 0 C557.95 0.78, 566.59 6.55, 564.66 16.22 M564.66 16.22 C565.13 24.78, 565.58 27.8, 564.66 48.67 M564.66 16.22 C565.17 28.77, 565.65 38.66, 564.66 48.67 M564.66 48.67 C566.56 59.38, 560.71 64.43, 548.44 64.89 M564.66 48.67 C565.6 59.77, 559.01 65.3, 548.44 64.89 M548.44 64.89 C398.16 64.03, 248.83 64.15, 16.22 64.89 M548.44 64.89 C416.73 64.08, 285.42 64.18, 16.22 64.89 M16.22 64.89 C7.4 64.1, -1.14 61.46, 0 48.67 M16.22 64.89 C7.11 64.47, 0.81 61.22, 0 48.67 M0 48.67 C-1.54 40.4, 1.02 33.26, 0 16.22 M0 48.67 C0.18 41.64, 0.38 33.05, 0 16.22 M0 16.22 C0.77 3.72, 3.78 -1.83, 16.22 0 M0 16.22 C-0.26 6.15, 4.65 0.74, 16.22 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(168.68634033203136 99.98980977712563) rotate(0 230.8797607421875 12.5)"><text x="230.8797607421875" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">remote / website-project-name / video-originals</text></g><g mask="url(#mask-3MoL2GfvWokixctPT98ES)" stroke-linecap="round"><g transform="translate(394.9395446522109 145.5837224730856) rotate(0 -124.91307617036699 61.57708719558018)"><path d="M0 0 C-92.83 44.62, -189.35 92.32, -249.83 123.15 M0 0 C-79.98 39.67, -158.18 79.42, -249.83 123.15" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(394.9395446522109 145.5837224730856) rotate(0 -124.91307617036699 61.57708719558018)"><path d="M-232.41 105.22 C-237.28 110.88, -247.09 119.39, -249.83 123.15 M-232.41 105.22 C-238.54 110.37, -243.37 117.25, -249.83 123.15" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(394.9395446522109 145.5837224730856) rotate(0 -124.91307617036699 61.57708719558018)"><path d="M-224.96 120.61 C-232.61 120.44, -245.23 123.17, -249.83 123.15 M-224.96 120.61 C-233.28 120.96, -240.46 123, -249.83 123.15" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-3MoL2GfvWokixctPT98ES"><rect x="0" y="0" fill="#fff" width="744.7656969929449" height="368.73789686424595"></rect><rect x="181.05656644326962" y="182.1608096686658" fill="#000" width="177.93980407714844" height="50" opacity="1"></rect></mask><g transform="translate(181.05656644326962 182.16080966866576) rotate(0 88.96990203857428 25.000000000000014)"><text x="88.96990203857422" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">optimizes videos +</text><text x="88.96990203857422" y="42.62" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">generate preview</text></g><g stroke-linecap="round" transform="translate(10 268.9763412475586) rotate(0 148.0681762695313 35.60015869140628)"><path d="M17.8 0 C83.16 -2.35, 149.17 -1.54, 278.34 0 M17.8 0 C79.28 -1.01, 142.33 -0.88, 278.34 0 M278.34 0 C288.33 1.16, 297.82 6.22, 296.14 17.8 M278.34 0 C292.35 0.84, 294.05 7.22, 296.14 17.8 M296.14 17.8 C298.03 30.62, 294.73 41.46, 296.14 53.4 M296.14 17.8 C296.81 28.42, 296.29 38.97, 296.14 53.4 M296.14 53.4 C295.77 64.23, 289.3 70.23, 278.34 71.2 M296.14 53.4 C296.44 65.75, 290.86 69.98, 278.34 71.2 M278.34 71.2 C216.44 68.69, 155.82 71.19, 17.8 71.2 M278.34 71.2 C211.09 73.12, 142.94 73.87, 17.8 71.2 M17.8 71.2 C4.16 72.62, 0.48 63.96, 0 53.4 M17.8 71.2 C4.32 72.64, -1.94 63.77, 0 53.4 M0 53.4 C0.96 43.53, -0.98 32.94, 0 17.8 M0 53.4 C0.18 46.04, -0.04 38.36, 0 17.8 M0 17.8 C1.61 5.18, 7.09 -1.28, 17.8 0 M0 17.8 C0.64 5.53, 4.03 -0.09, 17.8 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(87.78824615478516 292.07649993896484) rotate(0 70.2799301147461 12.5)"><text x="70.2799301147461" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">public / videos</text></g><g stroke-linecap="round"><g transform="translate(162.85353180693096 345.6766586303711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M0 0 C22.11 14.79, 47.46 27.16, 112.8 68.45 M0 0 C37.31 22.88, 76.76 45.3, 112.8 68.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(162.85353180693096 345.6766586303711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M88.34 63.3 C92.09 64.84, 99.52 64.37, 112.8 68.45 M88.34 63.3 C95.61 65.48, 105.56 66.76, 112.8 68.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(162.85353180693096 345.6766586303711) rotate(0 56.39907999164666 34.227445019178276)"><path d="M97.37 48.78 C99.39 53.22, 105 55.7, 112.8 68.45 M97.37 48.78 C101.75 55.85, 108.68 61.99, 112.8 68.45" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask></mask><g transform="translate(360.6748809814453 372.49657954066333) rotate(0 21.769981384277344 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">build</text></g><g mask="url(#mask-06gBbcDYyqbrWgIkFgiMG)" stroke-linecap="round"><g transform="translate(311.6363525390625 304.54156650641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M0 0 C93.22 1.78, 186.19 -1.58, 290.78 -2.22 M0 0 C104.71 -0.83, 207.36 -1.48, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(311.6363525390625 304.54156650641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M267.36 6.52 C275.45 5.54, 283.24 -0.8, 290.78 -2.22 M267.36 6.52 C276.59 3.72, 283.13 0.79, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(311.6363525390625 304.54156650641926) rotate(0 145.3887481689453 -1.1116546415378252)"><path d="M267.22 -10.58 C275.46 -6.11, 283.29 -6.99, 290.78 -2.22 M267.22 -10.58 C276.65 -7.26, 283.24 -4.08, 290.78 -2.22" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g></g><mask id="mask-06gBbcDYyqbrWgIkFgiMG"><rect x="0" y="0" fill="#fff" width="702.4138488769531" height="406.7648757894949"></rect><rect x="366.3351974487306" y="290.92991186488143" fill="#000" width="181.3798065185547" height="25" opacity="1"></rect></mask><g transform="translate(366.3351974487306 290.92991186488143) rotate(0 90.68990325927734 12.75657094838769)"><text x="90.68990325927734" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">generate video list</text></g></svg>
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@adaptive-ds/assets-optimizer",
3
+ "version": "0.1.0",
4
+ "main": "./dist/index.js",
5
+ "dependencies": {
6
+ "image-size": "^2.0.2",
7
+ "sharp": "^0.34.5"
8
+ },
9
+ "devDependencies": {
10
+ "@biomejs/biome": "^2.4.11",
11
+ "@types/bun": "latest",
12
+ "@types/node": "^25.6.0",
13
+ "typescript": "^6.0.2"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "import": "./dist/index.js",
18
+ "types": "./dist/index.d.ts"
19
+ },
20
+ "./*.js": {
21
+ "types": "./dist/*.d.ts",
22
+ "import": "./dist/*.js"
23
+ }
24
+ },
25
+ "description": "Process and sync web project images and videos between local folders and R2",
26
+ "homepage": "https://github.com/david1gp/assets-optimizer",
27
+ "keywords": [
28
+ "images",
29
+ "image-optimization",
30
+ "video",
31
+ "video-optimization",
32
+ "sharp",
33
+ "ffmpeg",
34
+ "r2",
35
+ "rclone",
36
+ "web-assets"
37
+ ],
38
+ "license": "MIT",
39
+ "prettier": {
40
+ "semi": false,
41
+ "printWidth": 120,
42
+ "trailingComma": "all"
43
+ },
44
+ "private": false,
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/david1gp/assets-optimizer.git"
48
+ },
49
+ "scripts": {
50
+ "build": "rm -rf ./dist && bun tsc -p ./tsconfig.lib.json",
51
+ "format": "bunx biome check --write src",
52
+ "release": "bash ops/release.sh"
53
+ },
54
+ "type": "module",
55
+ "types": "./dist/index.d.ts"
56
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "esnext",
4
+ "module": "nodenext",
5
+ "moduleResolution": "nodenext",
6
+ "allowImportingTsExtensions": false,
7
+ "resolveJsonModule": true,
8
+ "noEmit": true,
9
+ //
10
+ // dom
11
+ //
12
+ "lib": [
13
+ "esnext"
14
+ ],
15
+ "types": ["bun"],
16
+ //
17
+ // performance
18
+ //
19
+ "isolatedModules": true,
20
+ "skipLibCheck": true,
21
+ "incremental": true,
22
+ "tsBuildInfoFile": "./build/tsconfig.tsbuildinfo",
23
+ //
24
+ // my configs
25
+ //
26
+ "allowJs": true,
27
+ "esModuleInterop": true,
28
+ "allowSyntheticDefaultImports": true,
29
+ "useDefineForClassFields": true,
30
+ "noUncheckedSideEffectImports": true,
31
+ //
32
+ // type imports - https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax
33
+ //
34
+ "verbatimModuleSyntax": true,
35
+ //
36
+ // https://devblogs.microsoft.com/typescript/announcing-typescript-5-8/#the---erasablesyntaxonly-option
37
+ //
38
+ "erasableSyntaxOnly": true,
39
+ //
40
+ // code quality settings
41
+ //
42
+ "strict": true,
43
+ "noUncheckedIndexedAccess": true,
44
+ "noUnusedLocals": false,
45
+ "noUnusedParameters": false,
46
+ "noImplicitAny": true,
47
+ "noImplicitReturns": true,
48
+ "noFallthroughCasesInSwitch": true,
49
+ "forceConsistentCasingInFileNames": true
50
+ },
51
+ "include": [
52
+ "client",
53
+ "src",
54
+ "test"
55
+ ],
56
+ "exclude": [
57
+ ".github",
58
+ ".roo",
59
+ ".idea",
60
+ ".vscode",
61
+ ".wrangler",
62
+ "changelogs",
63
+ "build",
64
+ "dist",
65
+ "out",
66
+ "data",
67
+ "docs",
68
+ "node_modules",
69
+ "ops",
70
+ "public",
71
+ "images",
72
+ "public/images",
73
+ "videos",
74
+ "public/videos"
75
+ ],
76
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./dist",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "noEmit": false,
9
+ "incremental": false,
10
+ },
11
+ "include": [
12
+ "./src/**/*"
13
+ ],
14
+ "exclude": [
15
+ "node_modules",
16
+ "dist",
17
+ "test"
18
+ ],
19
+ }