Repository: JanDeDobbeleer/oh-my-posh
Pull request #6396 (2025-04-24 04:39:16)

next
### Prerequisites

- [x] I have read and understood the [contributing guide][CONTRIBUTING.md].
- [x] The commit message follows the [conventional commits][cc] guidelines.
- [x] Tests for the changes have been added (for bug fixes / features).
- [x] Docs have been added/updated (for bug fixes / features).

<!---

Tips:

If you're not comfortable with working with Git,
we're working a guide (https://ohmyposh.dev/docs/contributing/git) to help you out.
Oh My Posh advises GitKraken (https://www.gitkraken.com/invite/nQmDPR9D) as your preferred cross platform Git GUI power tool.

-->

[CONTRIBUTING.md]: https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/CONTRIBUTING.md
[cc]: https://www.conventionalcommits.org/en/v1.0.0/#summary



Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 4b5611ca..40451922 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -3113,6 +3113,17 @@
         "code",
         "doc"
       ]
+    },
+    {
+      "login": "mwiedemeyer",
+      "name": "Marco Wiedemeyer",
+      "avatar_url": "https://avatars.githubusercontent.com/u/4295189?v=4",
+      "profile": "https://mwiede.me/blog",
+      "contributions": [
+        "code",
+        "design",
+        "doc"
+      ]
     }
   ],
   "contributorsPerLine": 7,
diff --git a/src/config/segment_types.go b/src/config/segment_types.go
index 54f3c8bd..69c5249f 100644
--- a/src/config/segment_types.go
+++ b/src/config/segment_types.go
@@ -108,6 +108,8 @@ const (
 	IPIFY SegmentType = "ipify"
 	// JAVA writes the active java version
 	JAVA SegmentType = "java"
+	// API writes the output of a custom JSON API
+	HTTP SegmentType = "http"
 	// JULIA writes which julia version is currently active
 	JULIA SegmentType = "julia"
 	// KOTLIN writes the active kotlin version
@@ -276,6 +278,7 @@ var Segments = map[SegmentType]func() SegmentWriter{
 	HELM:            func() SegmentWriter { return &segments.Helm{} },
 	IPIFY:           func() SegmentWriter { return &segments.IPify{} },
 	JAVA:            func() SegmentWriter { return &segments.Java{} },
+	HTTP:            func() SegmentWriter { return &segments.HTTP{} },
 	JULIA:           func() SegmentWriter { return &segments.Julia{} },
 	KOTLIN:          func() SegmentWriter { return &segments.Kotlin{} },
 	KUBECTL:         func() SegmentWriter { return &segments.Kubectl{} },
diff --git a/src/segments/http.go b/src/segments/http.go
new file mode 100644
index 00000000..3d9096b5
--- /dev/null
+++ b/src/segments/http.go
@@ -0,0 +1,68 @@
+package segments
+
+import (
+	"encoding/json"
+
+	"net/http"
+
+	"github.com/jandedobbeleer/oh-my-posh/src/properties"
+	"github.com/jandedobbeleer/oh-my-posh/src/template"
+)
+
+type HTTP struct {
+	base
+
+	Body map[string]interface{}
+}
+
+const (
+	METHOD properties.Property = "method"
+)
+
+func (h *HTTP) Template() string {
+	return " {{ .Body }} "
+}
+
+func (h *HTTP) Enabled() bool {
+	url := h.props.GetString(URL, "")
+	if len(url) == 0 {
+		return false
+	}
+
+	method := h.props.GetString(METHOD, "GET")
+
+	tmpl := &template.Text{
+		Template: url,
+	}
+
+	if resolved, err := tmpl.Render(); err == nil {
+		url = resolved
+	}
+
+	result, err := h.getResult(url, method)
+	if err != nil {
+		return false
+	}
+
+	h.Body = result
+	return true
+}
+
+func (h *HTTP) getResult(url, method string) (map[string]interface{}, error) {
+	setMethod := func(request *http.Request) {
+		request.Method = method
+	}
+
+	resultBody, err := h.env.HTTPRequest(url, nil, 10000, setMethod)
+	if err != nil {
+		return nil, err
+	}
+
+	var result map[string]interface{}
+	err = json.Unmarshal(resultBody, &result)
+	if err != nil {
+		return nil, err
+	}
+
+	return result, nil
+}
diff --git a/src/segments/ipify.go b/src/segments/ipify.go
index f7cfa872..8c3a699e 100644
--- a/src/segments/ipify.go
+++ b/src/segments/ipify.go
@@ -32,8 +32,6 @@ type IPify struct {
 }
 
 const (
-	IpifyURL properties.Property = "url"
-
 	OFFLINE = "OFFLINE"
 )
 
diff --git a/src/shell/scripts/omp.nu b/src/shell/scripts/omp.nu
index 33bb8d8e..5e08b577 100644
--- a/src/shell/scripts/omp.nu
+++ b/src/shell/scripts/omp.nu
@@ -40,6 +40,7 @@ def --wrapped _omp_get_prompt [
             $"--no-status=($no_status)"
             $"--execution-time=($execution_time)"
             $"--terminal-width=((term size).columns)"
+            $"--job-count=(job list | length)"
             ...$args
     )
 }
diff --git a/themes/schema.json b/themes/schema.json
index 57da8d95..12ad328a 100644
--- a/themes/schema.json
+++ b/themes/schema.json
@@ -339,6 +339,7 @@
             "go",
             "haskell",
             "helm",
+            "http",
             "ipify",
             "java",
             "julia",
@@ -4940,8 +4941,338 @@
             }
           },
           "then": {
-            "title": "XMake Segment",
-            "description": "https://ohmyposh.dev/docs/segments/cli/xmake",
+            "title": "Plastic SCM Segment",
+            "description": "https://ohmyposh.dev/docs/segments/scm/plastic",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "fetch_status": {
+                    "type": "boolean",
+                    "title": "Display Status",
+                    "description": "Display the local changes or not",
+                    "default": false
+                  },
+                  "status_formats": {
+                    "$ref": "#/definitions/status_formats"
+                  },
+                  "branch_icon": {
+                    "type": "string",
+                    "title": "Branch Icon",
+                    "description": "The icon to use in front of the selector branch name",
+                    "default": "\uE0A0 "
+                  },
+                  "commit_icon": {
+                    "type": "string",
+                    "title": "Commit Icon",
+                    "description": "Icon/text to display before the selector changeset",
+                    "default": "\uF417"
+                  },
+                  "tag_icon": {
+                    "type": "string",
+                    "title": "Tag Icon",
+                    "description": "Icon/text to display before the seletor label",
+                    "default": "\uF412"
+                  },
+                  "truncate_symbol": {
+                    "$ref": "#/definitions/truncate_symbol"
+                  },
+                  "branch_max_length": {
+                    "$ref": "#/definitions/branch_max_length"
+                  },
+                  "full_branch_path": {
+                    "$ref": "#/definitions/full_branch_path"
+                  },
+                  "native_fallback": {
+                    "$ref": "#/definitions/native_fallback"
+                  },
+                  "mapped_branches": {
+                    "$ref": "#/definitions/mapped_branches"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "brewfather"
+              }
+            }
+          },
+          "then": {
+            "title": "Brewfather Batch Status",
+            "description": "https://ohmyposh.dev/docs/segments/web/brewfather",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "user_id": {
+                    "type": "string",
+                    "title": "Brewfather UserID (required)",
+                    "description": "Provided by Brewfather's Generate API Key settings option",
+                    "default": ""
+                  },
+                  "api_key": {
+                    "type": "string",
+                    "title": "Brewfather API Key (required)",
+                    "description": "Provided by Brewfather's Generate API Key settings option",
+                    "default": ""
+                  },
+                  "batch_id": {
+                    "type": "string",
+                    "title": "ID of the batch in Brewfather (required)",
+                    "description": "At the end of the URL when viewing the batch on the Brewfather site",
+                    "default": ""
+                  },
+                  "day_icon": {
+                    "type": "string",
+                    "title": "Icon to use to indicate days",
+                    "description": "Appended to a number to indicate days, e.g. 25d",
+                    "default": "d"
+                  },
+                  "http_timeout": {
+                    "$ref": "#/definitions/http_timeout"
+                  },
+                  "doubleup_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, very high positive change",
+                    "description": "Delta between this and prior temperature reading is very high (> 4C by default), available intemplate as .TemperatureTrend",
+                    "default": "↑↑"
+                  },
+                  "singleup_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, high positive change",
+                    "description": "Delta between this and prior temperature reading is high (2C < delta < 4C by default), available intemplate as .TemperatureTrend",
+                    "default": "↑"
+                  },
+                  "fortyfiveup_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, positive change",
+                    "description": "Delta between this and prior temperature reading is positive (0.5C < delta < 2C by default), available intemplate as .TemperatureTrend",
+                    "default": "↗"
+                  },
+                  "flat_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, flat/small change",
+                    "description": "Delta between this and prior temperature and this temperature reading (< +-0.5C change), available intemplate as .TemperatureTrend",
+                    "default": "→"
+                  },
+                  "fortyfivedown_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, v. negative change",
+                    "description": "Delta between this and prior temperature reading is negative (-0.5C > delta > -2C by default), available intemplate as .TemperatureTrend",
+                    "default": "↘"
+                  },
+                  "singledown_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, high negative change",
+                    "description": "Delta between this and prior temperature reading is large negative (-2C > delta > -4C by default), available intemplate as .TemperatureTrend",
+                    "default": "↓"
+                  },
+                  "doubledown_icon": {
+                    "type": "string",
+                    "title": "Temperature trend icon, very high negative change",
+                    "description": "Delta between this and prior temperature reading is very large negative (> -4C by default), available intemplate as .TemperatureTrend",
+                    "default": "↓↓"
+                  },
+                  "planning_status_icon": {
+                    "type": "string",
+                    "title": "Icon for batch in planning",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uF8EA"
+                  },
+                  "brewing_status_icon": {
+                    "type": "string",
+                    "title": "Icon for batch being brewed",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uF7DE"
+                  },
+                  "fermenting_status_icon": {
+                    "type": "string",
+                    "title": "Icon for batch fermenting",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uF499"
+                  },
+                  "conditioning_status_icon": {
+                    "type": "string",
+                    "title": "Icon for batch conditioning",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uE372"
+                  },
+                  "completed_status_icon": {
+                    "type": "string",
+                    "title": "Icon for completed batch",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uF7A5"
+                  },
+                  "archived_status_icon": {
+                    "type": "string",
+                    "title": "Icon for archived batch",
+                    "description": "Available in template as .StatusIcon",
+                    "default": "\uF187"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "ipify"
+              }
+            }
+          },
+          "then": {
+            "title": "Display your external IP Address",
+            "description": "https://ohmyposh.dev/docs/segments/web/ipify",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "url": {
+                    "type": "string",
+                    "title": "URL",
+                    "description": "The Ipify API URL",
+                    "default": "https://api.ipify.org"
+                  },
+                  "http_timeout": {
+                    "$ref": "#/definitions/http_timeout"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "http"
+              }
+            }
+          },
+          "then": {
+            "title": "Display your any JSON property from any API",
+            "description": "https://ohmyposh.dev/docs/segments/web/http",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "url": {
+                    "type": "string",
+                    "title": "URL",
+                    "description": "The HTTP URL",
+                    "default": ""
+                  },
+                  "method": {
+                    "type": "string",
+                    "title": "HTTP method",
+                    "description": "The HTTP method",
+                    "default": "GET"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "haskell"
+              }
+            }
+          },
+          "then": {
+            "title": "Haskell Segment",
+            "description": "https://ohmyposh.dev/docs/segments/languages/haskell",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "home_enabled": {
+                    "$ref": "#/definitions/home_enabled"
+                  },
+                  "fetch_version": {
+                    "$ref": "#/definitions/fetch_version"
+                  },
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  },
+                  "missing_command_text": {
+                    "$ref": "#/definitions/missing_command_text"
+                  },
+                  "version_url_template": {
+                    "$ref": "#/definitions/version_url_template"
+                  },
+                  "stack_ghc_mode": {
+                    "type": "string",
+                    "title": "Use Stack GHC",
+                    "description": "Get the GHC version used by Stack. Will decrease performance. Boolean indicating whether stack ghc was used available in template as .StackGhc",
+                    "enum": [
+                      "always",
+                      "package",
+                      "never"
+                    ],
+                    "default": "never"
+                  },
+                  "extensions": {
+                    "type": "array",
+                    "title": "Extensions",
+                    "description": "The extensions to look for when determining if the current directory is a Haskell project",
+                    "default": [
+                      "*.hs",
+                      "*.lhs",
+                      "stack.yaml",
+                      "package.yaml",
+                      "*.cabal",
+                      "cabal.project"
+                    ],
+                    "items": {
+                      "type": "string"
+                    }
+                  },
+                  "folders": {
+                    "$ref": "#/definitions/folders"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "helm"
+              }
+            }
+          },
+          "then": {
+            "title": "Helm segment",
+            "description": "https://ohmyposh.dev/docs/segments/cli/helm",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  }
+                }
+              }
+            }
+          }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "ui5tooling"
+              }
+            }
+          },
+          "then": {
+            "title": "UI5 tooling CLI segment",
+            "description": "https://ohmyposh.dev/docs/segments/cli/ui5tooling",
             "properties": {
               "properties": {
                 "properties": {
diff --git a/website/docs/configuration/templates.mdx b/website/docs/configuration/templates.mdx
index 54836e2d..193b1ada 100644
--- a/website/docs/configuration/templates.mdx
+++ b/website/docs/configuration/templates.mdx
@@ -18,26 +18,26 @@ These properties can be used anywhere, in any segment. If a segment contains a p
 the segment property value will be used instead. In case you want to use the global property, you can prefix
 it with `.$` to reference it directly.
 
-| Name            | Type                  | Description                                                       |
-| --------------- | --------------------- | ----------------------------------------------------------------- |
-| `.Root`         | `boolean`             | is the current user root/admin or not                             |
-| `.PWD`          | `string`              | the current working directory (`~` for `$HOME`)                   |
-| `.AbsolutePWD`  | `string`              | the current working directory (unaltered)                         |
-| `.PSWD`         | `string`              | the current non-filesystem working directory in PowerShell        |
-| `.Folder`       | `string`              | the current working folder                                        |
-| `.Shell`        | `string`              | the current shell name                                            |
-| `.ShellVersion` | `string`              | the current shell version                                         |
-| `.SHLVL`        | `int`                 | the current shell level                                           |
-| `.UserName`     | `string`              | the current user name                                             |
-| `.HostName`     | `string`              | the host name                                                     |
-| `.Code`         | `int`                 | the last exit code                                                |
-| `.Jobs`         | `int`                 | number of background jobs (only available for zsh and PowerShell) |
-| `.OS`           | `string`              | the operating system                                              |
-| `.WSL`          | `boolean`             | in WSL yes/no                                                     |
-| `.Templates`    | `string`              | the [templates][templates] result                                 |
-| `.PromptCount`  | `int`                 | the prompt counter, increments with 1 for every prompt invocation |
-| `.Version`      | `string`              | the Oh My Posh version                                            |
-| `.Segment`      | [`Segment`](#segment) | the current segment's metadata                                    |
+| Name            | Type                  | Description                                                                 |
+| --------------- | --------------------- | --------------------------------------------------------------------------- |
+| `.Root`         | `boolean`             | is the current user root/admin or not                                       |
+| `.PWD`          | `string`              | the current working directory (`~` for `$HOME`)                             |
+| `.AbsolutePWD`  | `string`              | the current working directory (unaltered)                                   |
+| `.PSWD`         | `string`              | the current non-filesystem working directory in PowerShell                  |
+| `.Folder`       | `string`              | the current working folder                                                  |
+| `.Shell`        | `string`              | the current shell name                                                      |
+| `.ShellVersion` | `string`              | the current shell version                                                   |
+| `.SHLVL`        | `int`                 | the current shell level                                                     |
+| `.UserName`     | `string`              | the current user name                                                       |
+| `.HostName`     | `string`              | the host name                                                               |
+| `.Code`         | `int`                 | the last exit code                                                          |
+| `.Jobs`         | `int`                 | number of background jobs (only available for zsh, PowerShell, and Nushell) |
+| `.OS`           | `string`              | the operating system                                                        |
+| `.WSL`          | `boolean`             | in WSL yes/no                                                               |
+| `.Templates`    | `string`              | the [templates][templates] result                                           |
+| `.PromptCount`  | `int`                 | the prompt counter, increments with 1 for every prompt invocation           |
+| `.Version`      | `string`              | the Oh My Posh version                                                      |
+| `.Segment`      | [`Segment`](#segment) | the current segment's metadata                                              |
 
 ### Segment
 
diff --git a/website/docs/contributors.md b/website/docs/contributors.md
index b8504742..82af3649 100644
--- a/website/docs/contributors.md
+++ b/website/docs/contributors.md
@@ -437,6 +437,7 @@ Thanks goes to these wonderful people ([emoji key][acek]):
     <tr>
       <td align="center" valign="top" width="14.28%"><a href="https://github.com/OwlBurst"><img src="https://avatars.githubusercontent.com/u/158167545?v=4?s=100" width="100px;" alt="Owl Burst"/><br /><sub><b>Owl Burst</b></sub></a><br /><a href="https://github.com/JanDeDobbeleer/oh-my-posh/commits?author=OwlBurst" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="14.28%"><a href="http://rubixdev.de"><img src="https://avatars.githubusercontent.com/u/35602040?v=4?s=100" width="100px;" alt="Silas Groh"/><br /><sub><b>Silas Groh</b></sub></a><br /><a href="https://github.com/JanDeDobbeleer/oh-my-posh/commits?author=RubixDev" title="Code">💻</a> <a href="https://github.com/JanDeDobbeleer/oh-my-posh/commits?author=RubixDev" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://mwiede.me/blog"><img src="https://avatars.githubusercontent.com/u/4295189?v=4?s=100" width="100px;" alt="Marco Wiedemeyer"/><br /><sub><b>Marco Wiedemeyer</b></sub></a><br /><a href="https://github.com/JanDeDobbeleer/oh-my-posh/commits?author=mwiedemeyer" title="Code">💻</a> <a href="#design-mwiedemeyer" title="Design">🎨</a> <a href="https://github.com/JanDeDobbeleer/oh-my-posh/commits?author=mwiedemeyer" title="Documentation">📖</a></td>
     </tr>
   </tbody>
 </table>
diff --git a/website/docs/segments/web/http.mdx b/website/docs/segments/web/http.mdx
new file mode 100644
index 00000000..bf4e5c15
--- /dev/null
+++ b/website/docs/segments/web/http.mdx
@@ -0,0 +1,54 @@
+---
+id: http
+title: HTTP
+sidebar_label: HTTP
+---
+
+## What
+
+HTTP Request is a simple segment to return any json data from any HTTP call.
+
+## Sample Configuration
+
+import Config from "@site/src/components/Config.js";
+
+<Config
+  data={{
+    type: "http",
+    style: "diamond",
+    foreground: "#ffffff",
+    background: "#c386f1",
+    leading_diamond: "\ue0b6",
+    trailing_diamond: "\uE0B0",
+    template: "{{ .Result }}",
+    properties: {
+      url: "https://jsonplaceholder.typicode.com/posts/1",
+      method: "GET",
+    },
+  }}
+/>
+
+## Properties
+
+| Name     |   Type   | Default | Description                                         |
+| -------- | :------: | :-----: | --------------------------------------------------- |
+| `url`    | `string` |   ``    | The HTTP URL you want to call, supports [templates] |
+| `method` | `string` |  `GET`  | The HTTP method to use                              |
+
+## Template ([info][templates])
+
+:::note default template
+
+```template
+{{ .Body }}
+```
+
+:::
+
+### Properties
+
+| Name             | Type     | Description                                               |
+| ---------------- | -------- | --------------------------------------------------------- |
+| `.Body.property` | `string` | Replace `.property` with the property you want to display |
+
+[templates]: /docs/configuration/templates
diff --git a/website/sidebars.js b/website/sidebars.js
index 05b6878a..0c470baf 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -206,6 +206,7 @@ module.exports = {
             "segments/web/brewfather",
             "segments/web/carbonintensity",
             "segments/web/ipify",
+            "segments/web/http",
             "segments/web/nba",
             "segments/web/owm",
             "segments/web/wakatime",


Test patch:
diff --git a/src/segments/http_test.go b/src/segments/http_test.go
new file mode 100644
index 00000000..5c150ac2
--- /dev/null
+++ b/src/segments/http_test.go
@@ -0,0 +1,78 @@
+package segments
+
+import (
+	"errors"
+	"testing"
+
+	"github.com/jandedobbeleer/oh-my-posh/src/properties"
+	"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestHTTPSegmentEnabled(t *testing.T) {
+	cases := []struct {
+		expected    any
+		name        string
+		url         string
+		method      string
+		response    string
+		shouldError bool
+	}{
+		{
+			name:        "Valid URL with GET response",
+			url:         "https://jsonplaceholder.typicode.com/posts/1",
+			method:      "GET",
+			response:    `{"id": "1"}`,
+			expected:    "1",
+			shouldError: false,
+		},
+		{
+			name:        "Valid URL with POST response",
+			url:         "https://jsonplaceholder.typicode.com/posts",
+			method:      "POST",
+			response:    `{"id": "101"}`,
+			expected:    "101",
+			shouldError: false,
+		},
+		{
+			name:        "Valid URL with error response",
+			url:         "https://api.example.com/data",
+			method:      "GET",
+			shouldError: true,
+		},
+		{
+			name:        "Empty URL",
+			url:         "",
+			method:      "GET",
+			shouldError: false,
+		},
+	}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			env := new(mock.Environment)
+			props := properties.Map{
+				URL:    tc.url,
+				METHOD: tc.method,
+			}
+
+			env.On("HTTPRequest", tc.url).Return([]byte(tc.response), func() error {
+				if tc.shouldError {
+					return errors.New("error")
+				}
+				return nil
+			}())
+
+			cs := &HTTP{
+				base: base{
+					env:   env,
+					props: props,
+				},
+			}
+
+			_ = cs.Enabled()
+			assert.Equal(t, tc.expected, cs.Body["id"], tc.name)
+		})
+	}
+}