sharp 0.33.5 → 0.35.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.
Files changed (47) hide show
  1. package/README.md +12 -18
  2. package/dist/channel.cjs +177 -0
  3. package/{lib/channel.js → dist/channel.mjs} +11 -8
  4. package/dist/colour.cjs +195 -0
  5. package/{lib/colour.js → dist/colour.mjs} +38 -23
  6. package/dist/composite.cjs +213 -0
  7. package/{lib/composite.js → dist/composite.mjs} +14 -11
  8. package/{lib/constructor.js → dist/constructor.cjs} +102 -43
  9. package/dist/constructor.mjs +511 -0
  10. package/dist/index.cjs +25 -0
  11. package/dist/index.mjs +25 -0
  12. package/dist/input.cjs +814 -0
  13. package/{lib/input.js → dist/input.mjs} +224 -68
  14. package/{lib/is.js → dist/is.cjs} +19 -45
  15. package/dist/is.mjs +143 -0
  16. package/{lib/libvips.js → dist/libvips.cjs} +52 -43
  17. package/dist/libvips.mjs +212 -0
  18. package/dist/operation.cjs +987 -0
  19. package/{lib/operation.js → dist/operation.mjs} +108 -79
  20. package/{lib/output.js → dist/output.cjs} +243 -36
  21. package/dist/output.mjs +1794 -0
  22. package/dist/resize.cjs +613 -0
  23. package/{lib/resize.js → dist/resize.mjs} +38 -12
  24. package/dist/sharp.cjs +164 -0
  25. package/dist/sharp.mjs +164 -0
  26. package/{lib/utility.js → dist/utility.cjs} +23 -24
  27. package/dist/utility.mjs +295 -0
  28. package/install/build.js +38 -0
  29. package/lib/index.d.ts +347 -125
  30. package/package.json +75 -84
  31. package/src/binding.gyp +49 -26
  32. package/src/common.cc +203 -111
  33. package/src/common.h +68 -40
  34. package/src/metadata.cc +106 -22
  35. package/src/metadata.h +15 -5
  36. package/src/operations.cc +62 -21
  37. package/src/operations.h +15 -3
  38. package/src/pipeline.cc +374 -183
  39. package/src/pipeline.h +34 -7
  40. package/src/sharp.cc +11 -8
  41. package/src/stats.cc +16 -13
  42. package/src/stats.h +6 -3
  43. package/src/utilities.cc +32 -12
  44. package/src/utilities.h +5 -2
  45. package/install/check.js +0 -41
  46. package/lib/index.js +0 -16
  47. package/lib/sharp.js +0 -114
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sharp",
3
3
  "description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, GIF, AVIF and TIFF images",
4
- "version": "0.33.5",
4
+ "version": "0.35.0",
5
5
  "author": "Lovell Fuller <npm@lovell.info>",
6
6
  "homepage": "https://sharp.pixelplumbing.com",
7
7
  "contributors": [
@@ -89,31 +89,44 @@
89
89
  "Lachlan Newman <lachnewman007@gmail.com>",
90
90
  "Dennis Beatty <dennis@dcbeatty.com>",
91
91
  "Ingvar Stepanyan <me@rreverser.com>",
92
- "Don Denton <don@happycollision.com>"
92
+ "Don Denton <don@happycollision.com>",
93
+ "Dmytro Tiapukhin <cool.gegeg@gmail.com>",
94
+ "Florian Lefebvre <contact@florian-lefebvre.dev>"
93
95
  ],
94
96
  "scripts": {
95
- "install": "node install/check",
96
- "clean": "rm -rf src/build/ .nyc_output/ coverage/ test/fixtures/output.*",
97
- "test": "npm run test-lint && npm run test-unit && npm run test-licensing && npm run test-types",
98
- "test-lint": "semistandard && cpplint",
99
- "test-unit": "nyc --reporter=lcov --reporter=text --check-coverage --branches=100 mocha",
100
- "test-licensing": "license-checker --production --summary --onlyAllow=\"Apache-2.0;BSD;ISC;LGPL-3.0-or-later;MIT\"",
97
+ "build": "node install/build.js",
98
+ "build:dist": "node scripts/build.mjs",
99
+ "clean": "rm -rf src/build/ test/fixtures/output.*",
100
+ "test": "npm run lint && npm run test-unit",
101
+ "lint": "npm run lint-cpp && npm run lint-js && npm run lint-types",
102
+ "lint-cpp": "cpplint --quiet src/*.h src/*.cc",
103
+ "lint-js": "biome lint",
104
+ "lint-types": "tsd --files ./test/types/sharp.test-d.ts",
101
105
  "test-leak": "./test/leak/leak.sh",
102
- "test-types": "tsd",
103
- "package-from-local-build": "node npm/from-local-build",
104
- "package-from-github-release": "node npm/from-github-release",
105
- "docs-build": "node docs/build && node docs/search-index/build",
106
- "docs-serve": "cd docs && npx serve",
107
- "docs-publish": "cd docs && npx firebase-tools deploy --project pixelplumbing --only hosting:pixelplumbing-sharp"
106
+ "test-unit": "node --experimental-test-coverage test/unit.mjs",
107
+ "package-from-local-build": "node npm/from-local-build.js",
108
+ "package-wasm-wrappers": "node npm/wasm-wrappers.js",
109
+ "package-release-notes": "node npm/release-notes.js",
110
+ "docs-build": "node docs/build.mjs",
111
+ "docs-serve": "cd docs && npm start",
112
+ "docs-publish": "cd docs && npm run build && npx firebase-tools deploy --project pixelplumbing --only hosting:pixelplumbing-sharp"
108
113
  },
109
114
  "type": "commonjs",
110
- "main": "lib/index.js",
111
- "types": "lib/index.d.ts",
112
115
  "files": [
116
+ "dist",
113
117
  "install",
114
- "lib",
118
+ "lib/index.d.ts",
115
119
  "src/*.{cc,h,gyp}"
116
120
  ],
121
+ "main": "./dist/index.cjs",
122
+ "module": "./dist/index.mjs",
123
+ "types": "./lib/index.d.ts",
124
+ "exports": {
125
+ ".": {
126
+ "import": "./dist/index.mjs",
127
+ "require": "./dist/index.cjs"
128
+ }
129
+ },
117
130
  "repository": {
118
131
  "type": "git",
119
132
  "url": "git://github.com/lovell/sharp.git"
@@ -137,86 +150,64 @@
137
150
  "vips"
138
151
  ],
139
152
  "dependencies": {
140
- "color": "^4.2.3",
141
- "detect-libc": "^2.0.3",
142
- "semver": "^7.6.3"
153
+ "@img/colour": "^1.1.0",
154
+ "detect-libc": "^2.1.2",
155
+ "semver": "^7.8.4"
143
156
  },
144
157
  "optionalDependencies": {
145
- "@img/sharp-darwin-arm64": "0.33.5",
146
- "@img/sharp-darwin-x64": "0.33.5",
147
- "@img/sharp-libvips-darwin-arm64": "1.0.4",
148
- "@img/sharp-libvips-darwin-x64": "1.0.4",
149
- "@img/sharp-libvips-linux-arm": "1.0.5",
150
- "@img/sharp-libvips-linux-arm64": "1.0.4",
151
- "@img/sharp-libvips-linux-s390x": "1.0.4",
152
- "@img/sharp-libvips-linux-x64": "1.0.4",
153
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
154
- "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
155
- "@img/sharp-linux-arm": "0.33.5",
156
- "@img/sharp-linux-arm64": "0.33.5",
157
- "@img/sharp-linux-s390x": "0.33.5",
158
- "@img/sharp-linux-x64": "0.33.5",
159
- "@img/sharp-linuxmusl-arm64": "0.33.5",
160
- "@img/sharp-linuxmusl-x64": "0.33.5",
161
- "@img/sharp-wasm32": "0.33.5",
162
- "@img/sharp-win32-ia32": "0.33.5",
163
- "@img/sharp-win32-x64": "0.33.5"
158
+ "@img/sharp-darwin-arm64": "0.35.0",
159
+ "@img/sharp-darwin-x64": "0.35.0",
160
+ "@img/sharp-freebsd-wasm32": "0.35.0",
161
+ "@img/sharp-libvips-darwin-arm64": "1.3.0",
162
+ "@img/sharp-libvips-darwin-x64": "1.3.0",
163
+ "@img/sharp-libvips-linux-arm": "1.3.0",
164
+ "@img/sharp-libvips-linux-arm64": "1.3.0",
165
+ "@img/sharp-libvips-linux-ppc64": "1.3.0",
166
+ "@img/sharp-libvips-linux-riscv64": "1.3.0",
167
+ "@img/sharp-libvips-linux-s390x": "1.3.0",
168
+ "@img/sharp-libvips-linux-x64": "1.3.0",
169
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.0",
170
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.0",
171
+ "@img/sharp-linux-arm": "0.35.0",
172
+ "@img/sharp-linux-arm64": "0.35.0",
173
+ "@img/sharp-linux-ppc64": "0.35.0",
174
+ "@img/sharp-linux-riscv64": "0.35.0",
175
+ "@img/sharp-linux-s390x": "0.35.0",
176
+ "@img/sharp-linux-x64": "0.35.0",
177
+ "@img/sharp-linuxmusl-arm64": "0.35.0",
178
+ "@img/sharp-linuxmusl-x64": "0.35.0",
179
+ "@img/sharp-webcontainers-wasm32": "0.35.0",
180
+ "@img/sharp-win32-arm64": "0.35.0",
181
+ "@img/sharp-win32-ia32": "0.35.0",
182
+ "@img/sharp-win32-x64": "0.35.0"
164
183
  },
165
184
  "devDependencies": {
166
- "@emnapi/runtime": "^1.2.0",
167
- "@img/sharp-libvips-dev": "1.0.4",
168
- "@img/sharp-libvips-dev-wasm32": "1.0.5",
169
- "@img/sharp-libvips-win32-ia32": "1.0.4",
170
- "@img/sharp-libvips-win32-x64": "1.0.4",
185
+ "@biomejs/biome": "^2.4.16",
186
+ "@cpplint/cli": "^0.1.0",
187
+ "@emnapi/runtime": "^1.11.0",
188
+ "@img/sharp-libvips-dev": "1.3.0",
189
+ "@img/sharp-libvips-dev-wasm32": "1.3.0",
190
+ "@img/sharp-libvips-win32-arm64": "1.3.0",
191
+ "@img/sharp-libvips-win32-ia32": "1.3.0",
192
+ "@img/sharp-libvips-win32-x64": "1.3.0",
171
193
  "@types/node": "*",
172
- "async": "^3.2.5",
173
- "cc": "^3.0.1",
174
- "emnapi": "^1.2.0",
175
- "exif-reader": "^2.0.1",
194
+ "emnapi": "^1.11.0",
195
+ "exif-reader": "^2.0.3",
176
196
  "extract-zip": "^2.0.1",
177
- "icc": "^3.0.0",
178
- "jsdoc-to-markdown": "^8.0.3",
179
- "license-checker": "^25.0.1",
180
- "mocha": "^10.7.3",
181
- "node-addon-api": "^8.1.0",
182
- "nyc": "^17.0.0",
183
- "prebuild": "^13.0.1",
184
- "semistandard": "^17.0.0",
185
- "tar-fs": "^3.0.6",
186
- "tsd": "^0.31.1"
197
+ "icc": "^4.0.0",
198
+ "node-addon-api": "^8.8.0",
199
+ "node-gyp": "^12.4.0",
200
+ "tar-fs": "^3.1.2",
201
+ "tsd": "^0.33.0"
187
202
  },
188
203
  "license": "Apache-2.0",
189
204
  "engines": {
190
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
205
+ "node": ">=20.9.0"
191
206
  },
192
207
  "config": {
193
- "libvips": ">=8.15.3"
208
+ "libvips": ">=8.18.3"
194
209
  },
195
210
  "funding": {
196
211
  "url": "https://opencollective.com/libvips"
197
- },
198
- "binary": {
199
- "napi_versions": [
200
- 9
201
- ]
202
- },
203
- "semistandard": {
204
- "env": [
205
- "mocha"
206
- ]
207
- },
208
- "cc": {
209
- "linelength": "120",
210
- "filter": [
211
- "build/include"
212
- ]
213
- },
214
- "nyc": {
215
- "include": [
216
- "lib"
217
- ]
218
- },
219
- "tsd": {
220
- "directory": "test/types/"
221
212
  }
222
213
  }
package/src/binding.gyp CHANGED
@@ -3,23 +3,28 @@
3
3
 
4
4
  {
5
5
  'variables': {
6
- 'vips_version': '<!(node -p "require(\'../lib/libvips\').minimumLibvipsVersion")',
7
- 'platform_and_arch': '<!(node -p "require(\'../lib/libvips\').buildPlatformArch()")',
6
+ 'vips_version': '<!(node -p "require(\'../dist/libvips.cjs\').minimumLibvipsVersion")',
7
+ 'platform_and_arch': '<!(node -p "require(\'../dist/libvips.cjs\').buildPlatformArch()")',
8
+ 'sharp_version': '<!(node -p "require(\'../package.json\').version")',
8
9
  'sharp_libvips_version': '<!(node -p "require(\'../package.json\').optionalDependencies[\'@img/sharp-libvips-<(platform_and_arch)\']")',
9
- 'sharp_libvips_yarn_locator': '<!(node -p "require(\'../lib/libvips\').yarnLocator()")',
10
- 'sharp_libvips_include_dir': '<!(node -p "require(\'../lib/libvips\').buildSharpLibvipsIncludeDir()")',
11
- 'sharp_libvips_cplusplus_dir': '<!(node -p "require(\'../lib/libvips\').buildSharpLibvipsCPlusPlusDir()")',
12
- 'sharp_libvips_lib_dir': '<!(node -p "require(\'../lib/libvips\').buildSharpLibvipsLibDir()")'
10
+ 'sharp_libvips_yarn_locator': '<!(node -p "require(\'../dist/libvips.cjs\').yarnLocator()")',
11
+ 'sharp_libvips_include_dir': '<!(node -p "require(\'../dist/libvips.cjs\').buildSharpLibvipsIncludeDir()")',
12
+ 'sharp_libvips_cplusplus_dir': '<!(node -p "require(\'../dist/libvips.cjs\').buildSharpLibvipsCPlusPlusDir()")',
13
+ 'sharp_libvips_lib_dir': '<!(node -p "require(\'../dist/libvips.cjs\').buildSharpLibvipsLibDir()")'
13
14
  },
14
15
  'targets': [{
15
- 'target_name': 'libvips-cpp',
16
+ 'target_name': 'libvips-cpp-<(vips_version)',
16
17
  'conditions': [
17
18
  ['OS == "win"', {
18
19
  # Build libvips C++ binding for Windows due to MSVC std library ABI changes
19
20
  'type': 'shared_library',
20
21
  'defines': [
21
- 'VIPS_CPLUSPLUS_EXPORTS',
22
- '_ALLOW_KEYWORD_MACROS'
22
+ '_VIPS_PUBLIC=__declspec(dllexport)',
23
+ '_ALLOW_KEYWORD_MACROS',
24
+ '_HAS_EXCEPTIONS=1',
25
+ 'G_DISABLE_ASSERT',
26
+ 'G_DISABLE_CAST_CHECKS',
27
+ 'G_DISABLE_CHECKS'
23
28
  ],
24
29
  'sources': [
25
30
  '<(sharp_libvips_cplusplus_dir)/VConnection.cpp',
@@ -45,6 +50,9 @@
45
50
  'Release': {
46
51
  'msvs_settings': {
47
52
  'VCCLCompilerTool': {
53
+ "AdditionalOptions": [
54
+ "/std:c++17"
55
+ ],
48
56
  'ExceptionHandling': 1,
49
57
  'Optimization': 1,
50
58
  'WholeProgramOptimization': 'true'
@@ -75,21 +83,24 @@
75
83
  }]
76
84
  ]
77
85
  }, {
78
- 'target_name': 'sharp-<(platform_and_arch)',
86
+ 'target_name': 'sharp-<(platform_and_arch)-<(sharp_version)',
79
87
  'defines': [
88
+ 'G_DISABLE_ASSERT',
89
+ 'G_DISABLE_CAST_CHECKS',
90
+ 'G_DISABLE_CHECKS',
80
91
  'NAPI_VERSION=9',
81
92
  'NODE_ADDON_API_DISABLE_DEPRECATED',
82
93
  'NODE_API_SWALLOW_UNTHROWABLE_EXCEPTIONS'
83
94
  ],
84
95
  'dependencies': [
85
96
  '<!(node -p "require(\'node-addon-api\').gyp")',
86
- 'libvips-cpp'
97
+ 'libvips-cpp-<(vips_version)'
87
98
  ],
88
99
  'variables': {
89
100
  'conditions': [
90
101
  ['OS != "win"', {
91
- 'pkg_config_path': '<!(node -p "require(\'../lib/libvips\').pkgConfigPath()")',
92
- 'use_global_libvips': '<!(node -p "Boolean(require(\'../lib/libvips\').useGlobalLibvips()).toString()")'
102
+ 'pkg_config_path': '<!(node -p "require(\'../dist/libvips.cjs\').pkgConfigPath()")',
103
+ 'use_global_libvips': '<!(node -p "Boolean(require(\'../dist/libvips.cjs\').useGlobalLibvips()).toString()")'
93
104
  }, {
94
105
  'pkg_config_path': '',
95
106
  'use_global_libvips': ''
@@ -111,7 +122,7 @@
111
122
  'conditions': [
112
123
  ['use_global_libvips == "true"', {
113
124
  # Use pkg-config for include and lib
114
- 'include_dirs': ['<!@(PKG_CONFIG_PATH="<(pkg_config_path)" pkg-config --cflags-only-I vips-cpp vips glib-2.0 | sed s\/-I//g)'],
125
+ 'include_dirs': ['<!@(PKG_CONFIG_PATH="<(pkg_config_path)" pkg-config --cflags-only-I vips-cpp vips glib-2.0 | sed s/-I//g)'],
115
126
  'libraries': ['<!@(PKG_CONFIG_PATH="<(pkg_config_path)" pkg-config --libs vips-cpp)'],
116
127
  'defines': [
117
128
  'SHARP_USE_GLOBAL_LIBVIPS'
@@ -138,7 +149,8 @@
138
149
  ['OS == "win"', {
139
150
  'defines': [
140
151
  '_ALLOW_KEYWORD_MACROS',
141
- '_FILE_OFFSET_BITS=64'
152
+ '_FILE_OFFSET_BITS=64',
153
+ '_HAS_EXCEPTIONS=1'
142
154
  ],
143
155
  'link_settings': {
144
156
  'libraries': [
@@ -149,14 +161,17 @@
149
161
  ['OS == "mac"', {
150
162
  'link_settings': {
151
163
  'libraries': [
152
- 'libvips-cpp.42.dylib'
164
+ 'libvips-cpp.<(vips_version).dylib'
153
165
  ]
154
166
  },
155
167
  'xcode_settings': {
156
168
  'OTHER_LDFLAGS': [
169
+ '-Wl,-s',
170
+ '-Wl,-dead_strip',
157
171
  # Ensure runtime linking is relative to sharp.node
158
172
  '-Wl,-rpath,\'@loader_path/../../sharp-libvips-<(platform_and_arch)/lib\'',
159
173
  '-Wl,-rpath,\'@loader_path/../../../sharp-libvips-<(platform_and_arch)/<(sharp_libvips_version)/lib\'',
174
+ '-Wl,-rpath,\'@loader_path/../node_modules/@img/sharp-libvips-<(platform_and_arch)/lib\'',
160
175
  '-Wl,-rpath,\'@loader_path/../../node_modules/@img/sharp-libvips-<(platform_and_arch)/lib\'',
161
176
  '-Wl,-rpath,\'@loader_path/../../../node_modules/@img/sharp-libvips-<(platform_and_arch)/lib\'',
162
177
  '-Wl,-rpath,\'@loader_path/../../../../../@img-sharp-libvips-<(platform_and_arch)-npm-<(sharp_libvips_version)-<(sharp_libvips_yarn_locator)/node_modules/@img/sharp-libvips-<(platform_and_arch)/lib\''
@@ -167,14 +182,19 @@
167
182
  'defines': [
168
183
  '_GLIBCXX_USE_CXX11_ABI=1'
169
184
  ],
185
+ 'cflags_cc': [
186
+ '<!(node -p "require(\'detect-libc\').isNonGlibcLinuxSync() ? \'\' : \'-flto=auto\'")'
187
+ ],
170
188
  'link_settings': {
171
189
  'libraries': [
172
- '-l:libvips-cpp.so.42'
190
+ '-l:libvips-cpp.so.<(vips_version)'
173
191
  ],
174
192
  'ldflags': [
193
+ '-lstdc++fs',
175
194
  '-Wl,-s',
176
195
  '-Wl,--disable-new-dtags',
177
196
  '-Wl,-z,nodelete',
197
+ '-Wl,-Bsymbolic-functions',
178
198
  '-Wl,-rpath=\'$$ORIGIN/../../sharp-libvips-<(platform_and_arch)/lib\'',
179
199
  '-Wl,-rpath=\'$$ORIGIN/../../../sharp-libvips-<(platform_and_arch)/<(sharp_libvips_version)/lib\'',
180
200
  '-Wl,-rpath=\'$$ORIGIN/../../node_modules/@img/sharp-libvips-<(platform_and_arch)/lib\'',
@@ -185,18 +205,18 @@
185
205
  }],
186
206
  ['OS == "emscripten"', {
187
207
  'product_extension': 'node.js',
208
+ 'cflags_cc': [
209
+ '-fwasm-exceptions'
210
+ ],
188
211
  'link_settings': {
189
212
  'ldflags': [
190
- '-fexceptions',
213
+ '-fwasm-exceptions',
191
214
  '--pre-js=<!(node -p "require.resolve(\'./emscripten/pre.js\')")',
192
215
  '-Oz',
193
216
  '-sALLOW_MEMORY_GROWTH',
194
217
  '-sENVIRONMENT=node',
195
- '-sEXPORTED_FUNCTIONS=["emnapiInit", "_vips_shutdown", "_uv_library_shutdown"]',
196
218
  '-sNODERAWFS',
197
- '-sTEXTDECODER=0',
198
- '-sWASM_ASYNC_COMPILATION=0',
199
- '-sWASM_BIGINT'
219
+ '-sWASM_ASYNC_COMPILATION=0'
200
220
  ],
201
221
  'libraries': [
202
222
  '<!@(PKG_CONFIG_PATH="<!(node -p "require(\'@img/sharp-libvips-dev-wasm32/lib\')")/pkgconfig" pkg-config --static --libs vips-cpp)'
@@ -207,14 +227,14 @@
207
227
  }]
208
228
  ],
209
229
  'cflags_cc': [
210
- '-std=c++0x',
230
+ '-std=c++17',
211
231
  '-fexceptions',
212
232
  '-Wall',
213
233
  '-Os'
214
234
  ],
215
235
  'xcode_settings': {
216
- 'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',
217
- 'MACOSX_DEPLOYMENT_TARGET': '10.13',
236
+ 'CLANG_CXX_LANGUAGE_STANDARD': 'c++17',
237
+ 'MACOSX_DEPLOYMENT_TARGET': '10.15',
218
238
  'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
219
239
  'GCC_ENABLE_CPP_RTTI': 'YES',
220
240
  'OTHER_CPLUSPLUSFLAGS': [
@@ -234,6 +254,9 @@
234
254
  ['OS == "win"', {
235
255
  'msvs_settings': {
236
256
  'VCCLCompilerTool': {
257
+ "AdditionalOptions": [
258
+ "/std:c++17"
259
+ ],
237
260
  'ExceptionHandling': 1,
238
261
  'Optimization': 1,
239
262
  'WholeProgramOptimization': 'true'
@@ -264,7 +287,7 @@
264
287
  'target_name': 'copy-dll',
265
288
  'type': 'none',
266
289
  'dependencies': [
267
- 'sharp-<(platform_and_arch)'
290
+ 'sharp-<(platform_and_arch)-<(sharp_version)'
268
291
  ],
269
292
  'conditions': [
270
293
  ['OS == "win"', {