@zzalai/leafer-multi-roi 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/README_EN.md +293 -0
- package/docs/assets/index-B2aZIWia.css +1 -0
- package/docs/assets/index-BrSsc-mD.js +1 -0
- package/docs/assets/vite-CMPW0ETM.svg +130 -0
- package/docs/index.html +14 -0
- package/index.html +13 -0
- package/package.json +61 -0
- package/project-docs/ARCHITECTURE.md +129 -0
- package/project-docs/REQUIREMENTS.md +113 -0
- package/src/App.vue +284 -0
- package/src/components/RoiEditor.vue +1544 -0
- package/src/index.ts +10 -0
- package/src/main.ts +4 -0
- package/src/types/index.ts +49 -0
- package/src/utils/coordinates.ts +46 -0
- package/src/utils/icons.ts +41 -0
- package/src/utils/uuid.ts +4 -0
- package/src/vite-env.d.ts +7 -0
- package/tsconfig.json +25 -0
- package/tsconfig.node.json +11 -0
- package/vite.config.ts +39 -0
- package/vite.docs.config.ts +29 -0
- package/vite.svg +130 -0
package/src/index.ts
ADDED
package/src/main.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// ROI 类型定义
|
|
2
|
+
export interface ROI {
|
|
3
|
+
id: string
|
|
4
|
+
x: number
|
|
5
|
+
y: number
|
|
6
|
+
width: number
|
|
7
|
+
height: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// 坐标点类型
|
|
11
|
+
export interface Point {
|
|
12
|
+
x: number
|
|
13
|
+
y: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 区域坐标类型(4个点,顺时针顺序)
|
|
17
|
+
export type RegionCoordinates = [Point, Point, Point, Point]
|
|
18
|
+
|
|
19
|
+
// 归一化坐标类型
|
|
20
|
+
export type NormalizedPoint = [number, number]
|
|
21
|
+
export type NormalizedRegion = [NormalizedPoint, NormalizedPoint, NormalizedPoint, NormalizedPoint]
|
|
22
|
+
|
|
23
|
+
// ROI 注释类型(包含原始坐标和归一化坐标)
|
|
24
|
+
export interface ROIAnnotation {
|
|
25
|
+
id: string
|
|
26
|
+
coordinates: RegionCoordinates
|
|
27
|
+
normalizedCoordinates: NormalizedRegion
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 工具配置选项类型
|
|
31
|
+
export interface RoiEditorOptions {
|
|
32
|
+
// 区域样式
|
|
33
|
+
regionStyle?: {
|
|
34
|
+
fillColor?: string
|
|
35
|
+
strokeColor?: string
|
|
36
|
+
strokeWidth?: number
|
|
37
|
+
}
|
|
38
|
+
// 选中区域样式
|
|
39
|
+
selectedRegionStyle?: {
|
|
40
|
+
fillColor?: string
|
|
41
|
+
strokeColor?: string
|
|
42
|
+
strokeWidth?: number
|
|
43
|
+
}
|
|
44
|
+
// 其他配置
|
|
45
|
+
[key: string]: any
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 图片加载状态
|
|
49
|
+
export type ImageLoadStatus = 'idle' | 'loading' | 'success' | 'error'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Point, NormalizedPoint, RegionCoordinates, NormalizedRegion } from '../types'
|
|
2
|
+
|
|
3
|
+
// 将原始图片坐标转换为归一化坐标
|
|
4
|
+
export function getNormalizedCoordinates(
|
|
5
|
+
point: Point,
|
|
6
|
+
imageWidth: number,
|
|
7
|
+
imageHeight: number
|
|
8
|
+
): NormalizedPoint {
|
|
9
|
+
return [point.x / imageWidth, point.y / imageHeight]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// 将区域坐标转换为归一化区域坐标
|
|
13
|
+
export function getNormalizedRegionCoordinates(
|
|
14
|
+
region: RegionCoordinates,
|
|
15
|
+
imageWidth: number,
|
|
16
|
+
imageHeight: number
|
|
17
|
+
): NormalizedRegion {
|
|
18
|
+
return region.map(point => getNormalizedCoordinates(point, imageWidth, imageHeight)) as NormalizedRegion
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 将归一化坐标转换为原始图片坐标
|
|
22
|
+
export function getOriginalCoordinates(
|
|
23
|
+
normalizedPoint: NormalizedPoint,
|
|
24
|
+
imageWidth: number,
|
|
25
|
+
imageHeight: number
|
|
26
|
+
): Point {
|
|
27
|
+
return {
|
|
28
|
+
x: normalizedPoint[0] * imageWidth,
|
|
29
|
+
y: normalizedPoint[1] * imageHeight
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 将矩形转换为区域坐标(4个点,顺时针顺序)
|
|
34
|
+
export function rectToRegionCoordinates(
|
|
35
|
+
x: number,
|
|
36
|
+
y: number,
|
|
37
|
+
width: number,
|
|
38
|
+
height: number
|
|
39
|
+
): RegionCoordinates {
|
|
40
|
+
return [
|
|
41
|
+
{ x, y },
|
|
42
|
+
{ x: x + width, y },
|
|
43
|
+
{ x: x + width, y: y + height },
|
|
44
|
+
{ x, y: y + height }
|
|
45
|
+
]
|
|
46
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// 图标管理工具
|
|
2
|
+
|
|
3
|
+
// 图标映射
|
|
4
|
+
const icons: Record<string, string> = {
|
|
5
|
+
// 选择工具图标
|
|
6
|
+
select: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mouse-pointer"><!-- Lucide: mouse-pointer -->
|
|
7
|
+
<path d="M15 12a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z"></path>
|
|
8
|
+
<path d="m19 18-2-2"></path>
|
|
9
|
+
<path d="m13 11-2-2"></path>
|
|
10
|
+
<path d="M13 11a2 2 0 1 0 4 0"></path>
|
|
11
|
+
</svg>`,
|
|
12
|
+
|
|
13
|
+
// 绘制工具图标
|
|
14
|
+
draw: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square"><!-- Lucide: square -->
|
|
15
|
+
<rect width="18" height="18" x="3" y="3" rx="2" ry="2"></rect>
|
|
16
|
+
</svg>`,
|
|
17
|
+
|
|
18
|
+
// 删除图标
|
|
19
|
+
trash: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trash"><!-- Lucide: trash -->
|
|
20
|
+
<path d="M3 6h18"></path>
|
|
21
|
+
<path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"></path>
|
|
22
|
+
<path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"></path>
|
|
23
|
+
</svg>`,
|
|
24
|
+
|
|
25
|
+
// 撤销图标
|
|
26
|
+
undo: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-undo"><!-- Lucide: undo -->
|
|
27
|
+
<path d="M9 14 4 9l5-5"></path>
|
|
28
|
+
<path d="M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11"></path>
|
|
29
|
+
</svg>`,
|
|
30
|
+
|
|
31
|
+
// 重做图标
|
|
32
|
+
redo: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-redo"><!-- Lucide: redo -->
|
|
33
|
+
<path d="M15 14l5-5-5-5"></path>
|
|
34
|
+
<path d="M20 9H9.5a5.5 5.5 0 0 0-5.5 5.5a5.5 5.5 0 0 0 5.5 5.5H13"></path>
|
|
35
|
+
</svg>`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 根据图标名称获取SVG代码
|
|
39
|
+
export function getSvgIcon(iconName: string): string {
|
|
40
|
+
return icons[iconName] || ''
|
|
41
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
|
|
9
|
+
/* Bundler mode */
|
|
10
|
+
"moduleResolution": "bundler",
|
|
11
|
+
"allowImportingTsExtensions": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
"jsx": "preserve",
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"noFallthroughCasesInSwitch": true
|
|
22
|
+
},
|
|
23
|
+
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
|
|
24
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
25
|
+
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defineConfig } from 'vite'
|
|
2
|
+
import vue from '@vitejs/plugin-vue'
|
|
3
|
+
import dts from 'vite-plugin-dts'
|
|
4
|
+
|
|
5
|
+
// https://vite.dev/config/
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [
|
|
8
|
+
vue(),
|
|
9
|
+
// 只在生产构建时生成类型声明
|
|
10
|
+
process.env.NODE_ENV === 'production' ? dts() : null
|
|
11
|
+
].filter(Boolean),
|
|
12
|
+
build: {
|
|
13
|
+
lib: {
|
|
14
|
+
entry: './src/index.ts',
|
|
15
|
+
name: 'LeaferMultiRoi',
|
|
16
|
+
formats: ['es', 'umd'],
|
|
17
|
+
fileName: (format) => `leafer-multi-roi.${format}.js`
|
|
18
|
+
},
|
|
19
|
+
rollupOptions: {
|
|
20
|
+
external: ['vue'],
|
|
21
|
+
output: {
|
|
22
|
+
globals: {
|
|
23
|
+
vue: 'Vue'
|
|
24
|
+
},
|
|
25
|
+
exports: "named"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
// 构建选项
|
|
29
|
+
minify: 'terser',
|
|
30
|
+
terserOptions: {
|
|
31
|
+
compress: {
|
|
32
|
+
drop_console: true, // 去掉 console
|
|
33
|
+
drop_debugger: true, // 去掉 debugger
|
|
34
|
+
pure_funcs: ['console.log'], // 移除 console.log 函数调用
|
|
35
|
+
passes: 1 // 降低压缩级别以提高速度
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineConfig } from 'vite'
|
|
2
|
+
import vue from '@vitejs/plugin-vue'
|
|
3
|
+
import { resolve } from 'path'
|
|
4
|
+
|
|
5
|
+
// https://vitejs.dev/config/
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [vue()],
|
|
8
|
+
base: './', // 确保构建后的文件使用相对路径,适合GitHub Pages
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
'@': resolve(__dirname, './src')
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
build: {
|
|
15
|
+
outDir: 'docs',
|
|
16
|
+
assetsDir: 'assets',
|
|
17
|
+
minify: 'terser',
|
|
18
|
+
terserOptions: {
|
|
19
|
+
compress: {
|
|
20
|
+
drop_console: true,
|
|
21
|
+
drop_debugger: true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
server: {
|
|
26
|
+
port: 3000,
|
|
27
|
+
open: true
|
|
28
|
+
}
|
|
29
|
+
})
|
package/vite.svg
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<svg width="48" height="46" viewBox="0 0 48 46" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M25.9456 44.9383C25.2821 45.7827 23.925 45.3131 23.925 44.2403V33.9369C23.925 32.6875 22.9126 31.6751 21.6631 31.6751H10.287C9.36714 31.6751 8.83075 30.6346 9.36713 29.8871L16.8464 19.4157C17.917 17.9185 16.8464 15.8376 15.0046 15.8376H1.23731C0.317479 15.8376 -0.218913 14.7972 0.317475 14.0497L10.0134 0.4741C10.2266 0.176825 10.5692 0.000183105 10.9332 0.000183105H39.8271C40.7469 0.000183105 41.2833 1.04065 40.7469 1.78814L33.2676 12.2595C32.197 13.7567 33.2676 15.8376 35.1094 15.8376H46.4856C47.4291 15.8376 47.959 16.9255 47.3753 17.6687L25.9478 44.9404L25.9456 44.9383Z" fill="#863BFF" style="fill:#863BFF;fill:color(display-p3 0.5252 0.2300 1.0000);fill-opacity:1;"/>
|
|
3
|
+
<mask id="mask0_2002_17158" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="48" height="46">
|
|
4
|
+
<path d="M25.8416 44.9381C25.1781 45.7825 23.821 45.3129 23.821 44.2401V33.9368C23.821 32.6873 22.8085 31.6749 21.5591 31.6749H10.183C9.26313 31.6749 8.72674 30.6344 9.26313 29.8869L16.7424 19.4155C17.813 17.9184 16.7424 15.8374 14.9006 15.8374H1.1333C0.213475 15.8374 -0.322917 14.797 0.213471 14.0495L9.90938 0.473917C10.1226 0.176641 10.4652 0 10.8292 0H39.7231C40.6429 0 41.1793 1.04046 40.6429 1.78796L33.1636 12.2594C32.093 13.7565 33.1636 15.8374 35.0054 15.8374H46.3816C47.3251 15.8374 47.855 16.9253 47.2713 17.6685L25.8438 44.9402L25.8416 44.9381Z" fill="black" style="fill:black;fill-opacity:1;"/>
|
|
5
|
+
</mask>
|
|
6
|
+
<g mask="url(#mask0_2002_17158)">
|
|
7
|
+
<g filter="url(#filter0_f_2002_17158)">
|
|
8
|
+
<ellipse cx="5.50802" cy="14.7043" rx="5.50802" ry="14.7043" transform="matrix(0.00324134 0.999995 0.999995 -0.00324134 -4.46924 31.5157)" fill="#EDE6FF" style="fill:#EDE6FF;fill:color(display-p3 0.9275 0.9033 1.0000);fill-opacity:1;"/>
|
|
9
|
+
</g>
|
|
10
|
+
<g filter="url(#filter1_f_2002_17158)">
|
|
11
|
+
<ellipse cx="10.3995" cy="29.8514" rx="10.3995" ry="29.8514" transform="matrix(0.00324134 0.999995 0.999995 -0.00324134 -39.3281 7.88272)" fill="#EDE6FF" style="fill:#EDE6FF;fill:color(display-p3 0.9275 0.9033 1.0000);fill-opacity:1;"/>
|
|
12
|
+
</g>
|
|
13
|
+
<g filter="url(#filter2_f_2002_17158)">
|
|
14
|
+
<ellipse cx="5.50802" cy="30.4868" rx="5.50802" ry="30.4868" transform="matrix(0.00324134 0.999995 0.999995 -0.00324134 -40.4673 11.3212)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
15
|
+
</g>
|
|
16
|
+
<g filter="url(#filter3_f_2002_17158)">
|
|
17
|
+
<ellipse cx="5.50802" cy="30.5986" rx="5.50802" ry="30.5986" transform="matrix(0.00324134 0.999995 0.999995 -0.00324134 -35.8721 29.3204)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
18
|
+
</g>
|
|
19
|
+
<g filter="url(#filter4_f_2002_17158)">
|
|
20
|
+
<ellipse cx="5.50802" cy="30.5986" rx="5.50802" ry="30.5986" transform="matrix(0.00324134 0.999995 0.999995 -0.00324134 -34.3398 30.4693)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
21
|
+
</g>
|
|
22
|
+
<g filter="url(#filter5_f_2002_17158)">
|
|
23
|
+
<ellipse cx="14.0715" cy="22.0783" rx="14.0715" ry="22.0783" transform="matrix(0.0584509 -0.99829 -0.99829 -0.0584509 74.3486 26.8633)" fill="#EDE6FF" style="fill:#EDE6FF;fill:color(display-p3 0.9275 0.9033 1.0000);fill-opacity:1;"/>
|
|
24
|
+
</g>
|
|
25
|
+
<g filter="url(#filter6_f_2002_17158)">
|
|
26
|
+
<ellipse cx="3.47034" cy="21.5008" rx="3.47034" ry="21.5008" transform="matrix(-0.0172986 -0.99985 -0.99985 0.0172986 75.7944 18.0627)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
27
|
+
</g>
|
|
28
|
+
<g filter="url(#filter7_f_2002_17158)">
|
|
29
|
+
<ellipse cx="3.47034" cy="21.5008" rx="3.47034" ry="21.5008" transform="matrix(-0.0172986 -0.99985 -0.99985 0.0172986 75.7944 18.0627)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
30
|
+
</g>
|
|
31
|
+
<g filter="url(#filter8_f_2002_17158)">
|
|
32
|
+
<ellipse cx="0.386861" cy="8.97156" rx="4.40666" ry="29.1076" transform="rotate(39.5103 0.386861 8.97156)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
33
|
+
</g>
|
|
34
|
+
<g filter="url(#filter9_f_2002_17158)">
|
|
35
|
+
<ellipse cx="47.5226" cy="-6.09166" rx="4.40666" ry="29.1076" transform="rotate(37.8923 47.5226 -6.09166)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
36
|
+
</g>
|
|
37
|
+
<g filter="url(#filter10_f_2002_17158)">
|
|
38
|
+
<ellipse cx="41.4121" cy="6.3335" rx="5.9715" ry="9.66515" transform="rotate(37.8923 41.4121 6.3335)" fill="#47BFFF" style="fill:#47BFFF;fill:color(display-p3 0.2799 0.7480 1.0000);fill-opacity:1;"/>
|
|
39
|
+
</g>
|
|
40
|
+
<g filter="url(#filter11_f_2002_17158)">
|
|
41
|
+
<ellipse cx="-1.87921" cy="38.3321" rx="4.40666" ry="29.1076" transform="rotate(37.8923 -1.87921 38.3321)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
42
|
+
</g>
|
|
43
|
+
<g filter="url(#filter12_f_2002_17158)">
|
|
44
|
+
<ellipse cx="-1.87921" cy="38.3321" rx="4.40666" ry="29.1076" transform="rotate(37.8923 -1.87921 38.3321)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
45
|
+
</g>
|
|
46
|
+
<g filter="url(#filter13_f_2002_17158)">
|
|
47
|
+
<ellipse cx="35.6511" cy="29.9069" rx="4.40666" ry="29.1076" transform="rotate(37.8923 35.6511 29.9069)" fill="#7E14FF" style="fill:#7E14FF;fill:color(display-p3 0.4922 0.0767 1.0000);fill-opacity:1;"/>
|
|
48
|
+
</g>
|
|
49
|
+
<g filter="url(#filter14_f_2002_17158)">
|
|
50
|
+
<ellipse cx="38.4178" cy="32.4" rx="5.9715" ry="15.2974" transform="rotate(37.8923 38.4178 32.4)" fill="#47BFFF" style="fill:#47BFFF;fill:color(display-p3 0.2799 0.7480 1.0000);fill-opacity:1;"/>
|
|
51
|
+
</g>
|
|
52
|
+
</g>
|
|
53
|
+
<defs>
|
|
54
|
+
<filter id="filter0_f_2002_17158" x="-19.7697" y="16.1493" width="60.0452" height="41.6535" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
55
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
56
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
57
|
+
<feGaussianBlur stdDeviation="7.65926" result="effect1_foregroundBlur_2002_17158"/>
|
|
58
|
+
</filter>
|
|
59
|
+
<filter id="filter1_f_2002_17158" x="-54.613" y="-7.53303" width="90.3397" height="51.4368" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
60
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
61
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
62
|
+
<feGaussianBlur stdDeviation="7.65926" result="effect1_foregroundBlur_2002_17158"/>
|
|
63
|
+
</filter>
|
|
64
|
+
<filter id="filter2_f_2002_17158" x="-49.6403" y="2.03032" width="79.3554" height="29.4" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
65
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
66
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
67
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
68
|
+
</filter>
|
|
69
|
+
<filter id="filter3_f_2002_17158" x="-45.0451" y="20.0292" width="79.579" height="29.4" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
70
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
71
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
72
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
73
|
+
</filter>
|
|
74
|
+
<filter id="filter4_f_2002_17158" x="-43.5129" y="21.1781" width="79.579" height="29.4" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
75
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
76
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
77
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
78
|
+
</filter>
|
|
79
|
+
<filter id="filter5_f_2002_17158" x="15.7557" y="-17.9006" width="74.7493" height="58.852" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
80
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
81
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
82
|
+
<feGaussianBlur stdDeviation="7.65926" result="effect1_foregroundBlur_2002_17158"/>
|
|
83
|
+
</filter>
|
|
84
|
+
<filter id="filter6_f_2002_17158" x="23.5481" y="2.28368" width="61.3773" height="25.3622" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
85
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
86
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
87
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
88
|
+
</filter>
|
|
89
|
+
<filter id="filter7_f_2002_17158" x="23.5481" y="2.28368" width="61.3773" height="25.3622" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
90
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
91
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
92
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
93
|
+
</filter>
|
|
94
|
+
<filter id="filter8_f_2002_17158" x="-27.6359" y="-22.8531" width="56.0453" height="63.6493" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
95
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
96
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
97
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
98
|
+
</filter>
|
|
99
|
+
<filter id="filter9_f_2002_17158" x="20.1155" y="-38.4147" width="54.8139" height="64.646" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
100
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
101
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
102
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
103
|
+
</filter>
|
|
104
|
+
<filter id="filter10_f_2002_17158" x="24.6414" y="-11.3229" width="33.5414" height="35.3129" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
105
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
106
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
107
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
108
|
+
</filter>
|
|
109
|
+
<filter id="filter11_f_2002_17158" x="-29.2863" y="6.00905" width="54.8139" height="64.646" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
110
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
111
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
112
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
113
|
+
</filter>
|
|
114
|
+
<filter id="filter12_f_2002_17158" x="-29.2863" y="6.00905" width="54.8139" height="64.646" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
115
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
116
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
117
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
118
|
+
</filter>
|
|
119
|
+
<filter id="filter13_f_2002_17158" x="8.24395" y="-2.41615" width="54.8139" height="64.646" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
120
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
121
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
122
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
123
|
+
</filter>
|
|
124
|
+
<filter id="filter14_f_2002_17158" x="18.7132" y="10.5885" width="39.4091" height="43.6229" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
125
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
126
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
127
|
+
<feGaussianBlur stdDeviation="4.59556" result="effect1_foregroundBlur_2002_17158"/>
|
|
128
|
+
</filter>
|
|
129
|
+
</defs>
|
|
130
|
+
</svg>
|