diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e92a28f25ab..3fb008ed5c205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [1.661.0](https://github.com/windmill-labs/windmill/compare/v1.660.1...v1.661.0) (2026-03-19) + + +### Features + +* add OTel metrics support ([#8442](https://github.com/windmill-labs/windmill/issues/8442)) ([7de98c0](https://github.com/windmill-labs/windmill/commit/7de98c0df464d8a7c9cf5d04228753294183f759)) + + +### Bug Fixes + +* fix datatable setup on RDS ([#8450](https://github.com/windmill-labs/windmill/issues/8450)) ([446afb5](https://github.com/windmill-labs/windmill/commit/446afb5b36211e5cbe8a279ce68f2f790a5953b9)) +* full code apps deployable on merge UI and deploy UI ([#8451](https://github.com/windmill-labs/windmill/issues/8451)) ([0e022b1](https://github.com/windmill-labs/windmill/commit/0e022b14fd36e897106219010917bd7ceabf4078)) +* improve DND drag feedback in EditableSchemaForm ([#8449](https://github.com/windmill-labs/windmill/issues/8449)) ([fd7f0d3](https://github.com/windmill-labs/windmill/commit/fd7f0d3da9153d91c15df5847aaae51e67479cde)) +* prevent raw app iframe reload on userStore refresh ([#8455](https://github.com/windmill-labs/windmill/issues/8455)) ([4e59a1a](https://github.com/windmill-labs/windmill/commit/4e59a1a166847045897a6b576812bb53546e683b)) +* resolve blank inline script panel for components with underscores in ID ([#8457](https://github.com/windmill-labs/windmill/issues/8457)) ([b2c1e3d](https://github.com/windmill-labs/windmill/commit/b2c1e3de0a263f606127f0decedb11a2ce0b822b)) + ## [1.660.1](https://github.com/windmill-labs/windmill/compare/v1.660.0...v1.660.1) (2026-03-19) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 38e996e5f5ff9..c5ed1068b3f66 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -10642,9 +10642,9 @@ dependencies = [ [[package]] name = "quick_cache" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c901384fb8fb3d4510388129ce6e13ecd686eee610da778b6ea77219decd53" +checksum = "5a70b1b8b47e31d0498ecbc3c5470bb931399a8bfed1fd79d1717a61ce7f96e3" dependencies = [ "ahash 0.8.12", "equivalent", @@ -15742,7 +15742,7 @@ dependencies = [ [[package]] name = "windmill" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-nats", @@ -15809,7 +15809,7 @@ dependencies = [ [[package]] name = "windmill-alerting" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -15822,7 +15822,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "argon2", @@ -15963,7 +15963,7 @@ dependencies = [ [[package]] name = "windmill-api-agent-workers" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -15986,7 +15986,7 @@ dependencies = [ [[package]] name = "windmill-api-assets" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -15999,7 +15999,7 @@ dependencies = [ [[package]] name = "windmill-api-auth" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16025,7 +16025,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.660.1" +version = "1.661.0" dependencies = [ "reqwest 0.12.28", "serde", @@ -16035,7 +16035,7 @@ dependencies = [ [[package]] name = "windmill-api-configs" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16052,7 +16052,7 @@ dependencies = [ [[package]] name = "windmill-api-debug" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "base64 0.22.1", @@ -16075,7 +16075,7 @@ dependencies = [ [[package]] name = "windmill-api-embeddings" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16098,7 +16098,7 @@ dependencies = [ [[package]] name = "windmill-api-flow-conversations" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16114,7 +16114,7 @@ dependencies = [ [[package]] name = "windmill-api-flows" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16134,7 +16134,7 @@ dependencies = [ [[package]] name = "windmill-api-groups" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16154,7 +16154,7 @@ dependencies = [ [[package]] name = "windmill-api-inputs" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16168,7 +16168,7 @@ dependencies = [ [[package]] name = "windmill-api-integration-tests" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-nats", @@ -16196,7 +16196,7 @@ dependencies = [ [[package]] name = "windmill-api-jobs" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16221,7 +16221,7 @@ dependencies = [ [[package]] name = "windmill-api-npm-proxy" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "flate2", @@ -16239,7 +16239,7 @@ dependencies = [ [[package]] name = "windmill-api-openapi" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16260,7 +16260,7 @@ dependencies = [ [[package]] name = "windmill-api-schedule" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16280,7 +16280,7 @@ dependencies = [ [[package]] name = "windmill-api-scripts" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16310,7 +16310,7 @@ dependencies = [ [[package]] name = "windmill-api-settings" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16337,7 +16337,7 @@ dependencies = [ [[package]] name = "windmill-api-sse" -version = "1.660.1" +version = "1.661.0" dependencies = [ "lazy_static", "serde", @@ -16349,7 +16349,7 @@ dependencies = [ [[package]] name = "windmill-api-users" -version = "1.660.1" +version = "1.661.0" dependencies = [ "argon2", "axum 0.7.9", @@ -16372,7 +16372,7 @@ dependencies = [ [[package]] name = "windmill-api-workers" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16386,7 +16386,7 @@ dependencies = [ [[package]] name = "windmill-api-workspaces" -version = "1.660.1" +version = "1.661.0" dependencies = [ "axum 0.7.9", "chrono", @@ -16417,7 +16417,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.660.1" +version = "1.661.0" dependencies = [ "chrono", "lazy_static", @@ -16431,7 +16431,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -16450,7 +16450,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.660.1" +version = "1.661.0" dependencies = [ "aes-gcm", "anyhow", @@ -16549,7 +16549,7 @@ dependencies = [ [[package]] name = "windmill-dep-map" -version = "1.660.1" +version = "1.661.0" dependencies = [ "chrono", "itertools 0.14.0", @@ -16568,7 +16568,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.660.1" +version = "1.661.0" dependencies = [ "regex", "serde", @@ -16583,7 +16583,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "astral-tokio-tar", @@ -16607,7 +16607,7 @@ dependencies = [ [[package]] name = "windmill-jseval" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "futures", @@ -16624,7 +16624,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.660.1" +version = "1.661.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -16640,7 +16640,7 @@ dependencies = [ [[package]] name = "windmill-mcp" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -16661,7 +16661,7 @@ dependencies = [ [[package]] name = "windmill-native-triggers" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -16692,7 +16692,7 @@ dependencies = [ [[package]] name = "windmill-oauth" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-oauth2", @@ -16716,7 +16716,7 @@ dependencies = [ [[package]] name = "windmill-object-store" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-stream", @@ -16750,7 +16750,7 @@ dependencies = [ [[package]] name = "windmill-operator" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "futures", @@ -16768,7 +16768,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.660.1" +version = "1.661.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -16777,7 +16777,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "lazy_static", @@ -16789,7 +16789,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "serde_json", @@ -16801,7 +16801,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "gosyn", @@ -16813,7 +16813,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "lazy_static", @@ -16825,7 +16825,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "serde_json", @@ -16837,7 +16837,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "nu-parser", @@ -16848,7 +16848,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -16859,7 +16859,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -16871,7 +16871,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-asset" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "rustpython-ast", @@ -16882,7 +16882,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-recursion", @@ -16906,7 +16906,7 @@ dependencies = [ [[package]] name = "windmill-parser-ruby" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "lazy_static", @@ -16920,7 +16920,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -16937,7 +16937,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "lazy_static", @@ -16951,7 +16951,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql-asset" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "serde", @@ -16963,7 +16963,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "lazy_static", @@ -16981,7 +16981,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts-asset" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "serde-wasm-bindgen", @@ -16997,7 +16997,7 @@ dependencies = [ [[package]] name = "windmill-parser-wac" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "rustpython-ast", @@ -17013,7 +17013,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "serde", @@ -17024,7 +17024,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-recursion", @@ -17061,7 +17061,7 @@ dependencies = [ [[package]] name = "windmill-runtime-nativets" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "const_format", @@ -17099,7 +17099,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.660.1" +version = "1.661.0" dependencies = [ "getrandom 0.3.4", "wasm-bindgen", @@ -17110,7 +17110,7 @@ dependencies = [ [[package]] name = "windmill-store" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-recursion", @@ -17139,7 +17139,7 @@ dependencies = [ [[package]] name = "windmill-test-utils" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "axum 0.7.9", @@ -17162,7 +17162,7 @@ dependencies = [ [[package]] name = "windmill-trigger" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17195,7 +17195,7 @@ dependencies = [ [[package]] name = "windmill-trigger-email" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17215,7 +17215,7 @@ dependencies = [ [[package]] name = "windmill-trigger-gcp" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17249,7 +17249,7 @@ dependencies = [ [[package]] name = "windmill-trigger-http" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17284,7 +17284,7 @@ dependencies = [ [[package]] name = "windmill-trigger-kafka" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17307,7 +17307,7 @@ dependencies = [ [[package]] name = "windmill-trigger-mqtt" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17331,7 +17331,7 @@ dependencies = [ [[package]] name = "windmill-trigger-nats" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-nats", @@ -17355,7 +17355,7 @@ dependencies = [ [[package]] name = "windmill-trigger-postgres" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17390,7 +17390,7 @@ dependencies = [ [[package]] name = "windmill-trigger-sqs" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17418,7 +17418,7 @@ dependencies = [ [[package]] name = "windmill-trigger-websocket" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-trait", @@ -17441,7 +17441,7 @@ dependencies = [ [[package]] name = "windmill-types" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "bitflags 2.9.4", @@ -17459,7 +17459,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.660.1" +version = "1.661.0" dependencies = [ "anyhow", "async-once-cell", @@ -17566,7 +17566,7 @@ dependencies = [ [[package]] name = "windmill-worker-volumes" -version = "1.660.1" +version = "1.661.0" dependencies = [ "bytes", "futures", @@ -18455,18 +18455,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "5c5030500cb2d66bdfbb4ebc9563be6ce7005a4b5d0f26be0c523870fe372ca6" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "a5f86989a046a79640b9d8867c823349a139367bda96549794fcc3313ce91f4e" dependencies = [ "proc-macro2", "quote", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d4900da7eda6e..afc2faf1f0b22 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.660.1" +version = "1.661.0" authors.workspace = true edition.workspace = true @@ -82,7 +82,7 @@ members = [ exclude = ["./windmill-duckdb-ffi-internal"] [workspace.package] -version = "1.660.1" +version = "1.661.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 74f1bfed70f43..0a64da38278ee 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.660.1 + version: 1.661.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 22f3f8ef776ff..bf8ea7d148ccb 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.660.1"; +export const VERSION = "v1.661.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/src/main.ts b/cli/src/main.ts index cb376757cfe59..8d06ba9c0a0b9 100755 --- a/cli/src/main.ts +++ b/cli/src/main.ts @@ -68,7 +68,7 @@ export { workspaceAdd, }; -export const VERSION = "1.660.1"; +export const VERSION = "1.661.0"; // Re-exported from constants.ts to maintain backwards compatibility export { WM_FORK_PREFIX } from "./core/constants.ts"; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2a9d4f29fc1f7..b91a71eb6d7b4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.660.1", + "version": "1.661.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.660.1", + "version": "1.661.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 29e05702f8b6c..7646475cae526 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.660.1", + "version": "1.661.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 80a859dc0bd02..2d79653510f66 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.660.1" +wmill = ">=1.661.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 6da0cacf1a490..b6df342b00686 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: '3.0.3' info: - version: 1.660.1 + version: 1.661.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index beb9801195b71..c88ddb8bd78fe 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.660.1' + ModuleVersion = '1.661.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index b10b8b1eddfc4..7885a9a9cc02e 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.660.1" +version = "1.661.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 167603d65092f..307336738473c 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.660.1", + "version": "1.661.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 7d2eca3416a4c..6732ce7cfa4d2 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.660.1", + "version": "1.661.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "sideEffects": false, diff --git a/version.txt b/version.txt index 7e16a84c13826..0351aaa014a7d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.660.1 +1.661.0