4
0
Эх сурвалжийг харах

Refactor HTTP Client and LocalizedError packages

Frédéric Guillot 2 жил өмнө
parent
commit
14e25ab9fe
100 өөрчлөгдсөн 1229 нэмэгдсэн , 10265 устгасан
  1. 0 2
      .github/codeql/config.yml
  2. 0 3
      .github/workflows/codeql-analysis.yml
  3. 0 1
      go.mod
  4. 0 2
      go.sum
  5. 6 6
      internal/api/feed.go
  6. 5 4
      internal/api/subscription.go
  7. 0 31
      internal/errors/errors.go
  8. 5 5
      internal/googlereader/handler.go
  9. 0 322
      internal/http/client/client.go
  10. 0 70
      internal/http/client/client_test.go
  11. 0 119
      internal/http/client/response.go
  12. 0 148
      internal/http/client/response_test.go
  13. 0 48
      internal/http/client/testdata/HTTP-charset.html
  14. 0 48
      internal/http/client/testdata/HTTP-vs-UTF-8-BOM.html
  15. 0 49
      internal/http/client/testdata/HTTP-vs-meta-charset.html
  16. 0 49
      internal/http/client/testdata/HTTP-vs-meta-content.html
  17. 0 47
      internal/http/client/testdata/No-encoding-declaration.html
  18. 0 9
      internal/http/client/testdata/README
  19. BIN
      internal/http/client/testdata/UTF-16BE-BOM.html
  20. BIN
      internal/http/client/testdata/UTF-16LE-BOM.html
  21. 0 49
      internal/http/client/testdata/UTF-8-BOM-vs-meta-charset.html
  22. 0 48
      internal/http/client/testdata/UTF-8-BOM-vs-meta-content.html
  23. 0 422
      internal/http/client/testdata/charset-content-type-xml-iso88591.xml
  24. 0 79
      internal/http/client/testdata/content-type-only-win-8859-1.xml
  25. 0 520
      internal/http/client/testdata/gb2312.html
  26. 0 48
      internal/http/client/testdata/meta-charset-attribute.html
  27. 0 48
      internal/http/client/testdata/meta-content-attribute.html
  28. 0 374
      internal/http/client/testdata/rdf_utf8.xml
  29. 0 6217
      internal/http/client/testdata/single_quote_xml_encoding.xml
  30. 0 1
      internal/http/client/testdata/smallfile.xml
  31. 0 226
      internal/http/client/testdata/urdu.xml
  32. 0 242
      internal/http/client/testdata/windows_1251.html
  33. 0 359
      internal/http/client/testdata/windows_1251.xml
  34. 5 2
      internal/integration/rssbridge/rssbridge.go
  35. 52 0
      internal/locale/error.go
  36. 24 20
      internal/locale/translations/de_DE.json
  37. 24 1
      internal/locale/translations/el_EL.json
  38. 24 1
      internal/locale/translations/en_US.json
  39. 24 1
      internal/locale/translations/es_ES.json
  40. 24 1
      internal/locale/translations/fi_FI.json
  41. 24 20
      internal/locale/translations/fr_FR.json
  42. 24 1
      internal/locale/translations/hi_IN.json
  43. 24 20
      internal/locale/translations/id_ID.json
  44. 24 1
      internal/locale/translations/it_IT.json
  45. 24 1
      internal/locale/translations/ja_JP.json
  46. 24 18
      internal/locale/translations/nl_NL.json
  47. 24 18
      internal/locale/translations/pl_PL.json
  48. 24 1
      internal/locale/translations/pt_BR.json
  49. 24 1
      internal/locale/translations/ru_RU.json
  50. 24 1
      internal/locale/translations/tr_TR.json
  51. 24 1
      internal/locale/translations/uk_UA.json
  52. 24 19
      internal/locale/translations/zh_CN.json
  53. 24 19
      internal/locale/translations/zh_TW.json
  54. 2 10
      internal/model/feed.go
  55. 1 21
      internal/model/feed_test.go
  56. 4 6
      internal/reader/atom/parser.go
  57. 0 54
      internal/reader/browser/browser.go
  58. 168 0
      internal/reader/fetcher/request_builder.go
  59. 147 0
      internal/reader/fetcher/response_handler.go
  60. 88 72
      internal/reader/handler/handler.go
  61. 26 62
      internal/reader/icon/finder.go
  62. 4 5
      internal/reader/json/parser.go
  63. 3 3
      internal/reader/opml/parser.go
  64. 5 3
      internal/reader/parser/parser.go
  65. 0 51
      internal/reader/parser/parser_test.go
  66. 56 34
      internal/reader/processor/processor.go
  67. 4 6
      internal/reader/rdf/parser.go
  68. 4 7
      internal/reader/rss/parser.go
  69. 16 29
      internal/reader/scraper/scraper.go
  70. 1 1
      internal/reader/scraper/scraper_test.go
  71. 93 66
      internal/reader/subscription/finder.go
  72. 0 5
      internal/template/engine.go
  73. 1 1
      internal/template/templates/views/add_subscription.html
  74. 1 1
      internal/template/templates/views/create_api_key.html
  75. 1 1
      internal/template/templates/views/create_category.html
  76. 1 1
      internal/template/templates/views/create_user.html
  77. 1 1
      internal/template/templates/views/edit_category.html
  78. 1 1
      internal/template/templates/views/edit_feed.html
  79. 1 1
      internal/template/templates/views/edit_user.html
  80. 1 1
      internal/template/templates/views/import.html
  81. 1 1
      internal/template/templates/views/integrations.html
  82. 1 1
      internal/template/templates/views/login.html
  83. 1 1
      internal/template/templates/views/settings.html
  84. 4 3
      internal/ui/api_key_save.go
  85. 1 1
      internal/ui/category_save.go
  86. 1 1
      internal/ui/category_update.go
  87. 1 1
      internal/ui/feed_update.go
  88. 3 3
      internal/ui/form/api_key.go
  89. 3 3
      internal/ui/form/auth.go
  90. 5 5
      internal/ui/form/settings.go
  91. 8 8
      internal/ui/form/subscription.go
  92. 8 8
      internal/ui/form/user.go
  93. 5 3
      internal/ui/login_check.go
  94. 18 10
      internal/ui/opml_upload.go
  95. 3 3
      internal/ui/settings_update.go
  96. 5 5
      internal/ui/subscription_choose.go
  97. 10 9
      internal/ui/subscription_submit.go
  98. 5 4
      internal/ui/user_save.go
  99. 4 3
      internal/ui/user_update.go
  100. 7 6
      internal/validator/category.go

+ 0 - 2
.github/codeql/config.yml

@@ -1,2 +0,0 @@
-paths-ignore:
-- ./http/client/testdata

+ 0 - 3
.github/workflows/codeql-analysis.yml

@@ -31,9 +31,6 @@ jobs:
 
     - name: Initialize CodeQL
       uses: github/codeql-action/init@v2
-      with:
-        languages: ${{ matrix.language }}
-        config-file: ./.github/codeql/config.yml
 
     - name: Autobuild
       uses: github/codeql-action/autobuild@v2

+ 0 - 1
go.mod

@@ -8,7 +8,6 @@ require (
 	github.com/coreos/go-oidc/v3 v3.7.0
 	github.com/gorilla/mux v1.8.0
 	github.com/lib/pq v1.10.9
-	github.com/mccutchen/go-httpbin/v2 v2.11.1
 	github.com/prometheus/client_golang v1.17.0
 	github.com/tdewolff/minify/v2 v2.19.10
 	github.com/yuin/goldmark v1.5.6

+ 0 - 2
go.sum

@@ -30,8 +30,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
-github.com/mccutchen/go-httpbin/v2 v2.11.1 h1:itBs6fEQvMKcGKIbMI9xzoGPZV56o2EMHA2rkCIdmLw=
-github.com/mccutchen/go-httpbin/v2 v2.11.1/go.mod h1:f4DUXYlU6yH0V81O4lJIwqpmYdTXXmYwzxMnYEimFPk=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=

+ 6 - 6
internal/api/feed.go

@@ -41,9 +41,9 @@ func (h *handler) createFeed(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	feed, err := feedHandler.CreateFeed(h.store, userID, &feedCreationRequest)
-	if err != nil {
-		json.ServerError(w, r, err)
+	feed, localizedError := feedHandler.CreateFeed(h.store, userID, &feedCreationRequest)
+	if localizedError != nil {
+		json.ServerError(w, r, localizedError.Error())
 		return
 	}
 
@@ -59,9 +59,9 @@ func (h *handler) refreshFeed(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	err := feedHandler.RefreshFeed(h.store, userID, feedID, false)
-	if err != nil {
-		json.ServerError(w, r, err)
+	localizedError := feedHandler.RefreshFeed(h.store, userID, feedID, false)
+	if localizedError != nil {
+		json.ServerError(w, r, localizedError.Error())
 		return
 	}
 

+ 5 - 4
internal/api/subscription.go

@@ -32,7 +32,7 @@ func (h *handler) discoverSubscriptions(w http.ResponseWriter, r *http.Request)
 		rssbridgeURL = intg.RSSBridgeURL
 	}
 
-	subscriptions, finderErr := subscription.FindSubscriptions(
+	subscriptions, localizedError := subscription.FindSubscriptions(
 		subscriptionDiscoveryRequest.URL,
 		subscriptionDiscoveryRequest.UserAgent,
 		subscriptionDiscoveryRequest.Cookie,
@@ -42,12 +42,13 @@ func (h *handler) discoverSubscriptions(w http.ResponseWriter, r *http.Request)
 		subscriptionDiscoveryRequest.AllowSelfSignedCertificates,
 		rssbridgeURL,
 	)
-	if finderErr != nil {
-		json.ServerError(w, r, finderErr)
+
+	if localizedError != nil {
+		json.ServerError(w, r, localizedError.Error())
 		return
 	}
 
-	if subscriptions == nil {
+	if len(subscriptions) == 0 {
 		json.NotFound(w, r)
 		return
 	}

+ 0 - 31
internal/errors/errors.go

@@ -1,31 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package errors // import "miniflux.app/v2/internal/errors"
-
-import (
-	"fmt"
-
-	"miniflux.app/v2/internal/locale"
-)
-
-// LocalizedError represents an error than could be translated to another language.
-type LocalizedError struct {
-	message string
-	args    []interface{}
-}
-
-// Error returns untranslated error message.
-func (l LocalizedError) Error() string {
-	return fmt.Sprintf(l.message, l.args...)
-}
-
-// Localize returns the translated error message.
-func (l LocalizedError) Localize(printer *locale.Printer) string {
-	return printer.Printf(l.message, l.args...)
-}
-
-// NewLocalizedError returns a new LocalizedError.
-func NewLocalizedError(message string, args ...interface{}) *LocalizedError {
-	return &LocalizedError{message: message, args: args}
-}

+ 5 - 5
internal/googlereader/handler.go

@@ -673,9 +673,9 @@ func (h *handler) quickAddHandler(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	subscriptions, s_err := mfs.FindSubscriptions(url, "", "", "", "", false, false, "")
-	if s_err != nil {
-		json.ServerError(w, r, s_err)
+	subscriptions, localizedError := mfs.FindSubscriptions(url, "", "", "", "", false, false, "")
+	if localizedError != nil {
+		json.ServerError(w, r, localizedError.Error())
 		return
 	}
 
@@ -746,9 +746,9 @@ func subscribe(newFeed Stream, category Stream, title string, store *storage.Sto
 		return nil, verr.Error()
 	}
 
-	created, err := mff.CreateFeed(store, userID, &feedRequest)
+	created, localizedError := mff.CreateFeed(store, userID, &feedRequest)
 	if err != nil {
-		return nil, err
+		return nil, localizedError.Error()
 	}
 
 	if title != "" {

+ 0 - 322
internal/http/client/client.go

@@ -1,322 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package client // import "miniflux.app/v2/internal/http/client"
-
-import (
-	"bytes"
-	"crypto/tls"
-	"crypto/x509"
-	"fmt"
-	"io"
-	"log/slog"
-	"net"
-	"net/http"
-	"net/url"
-	"time"
-
-	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/errors"
-)
-
-const (
-	defaultHTTPClientTimeout     = 20
-	defaultHTTPClientMaxBodySize = 15 * 1024 * 1024
-)
-
-var (
-	errInvalidCertificate = "Invalid SSL certificate (original error: %q)"
-	errNetworkOperation   = "This website is unreachable (original error: %q)"
-	errRequestTimeout     = "Website unreachable, the request timed out after %d seconds"
-)
-
-// Client builds and executes HTTP requests.
-type Client struct {
-	inputURL string
-
-	requestEtagHeader          string
-	requestLastModifiedHeader  string
-	requestAuthorizationHeader string
-	requestUsername            string
-	requestPassword            string
-	requestUserAgent           string
-	requestCookie              string
-	customHeaders              map[string]string
-	useProxy                   bool
-	doNotFollowRedirects       bool
-
-	ClientTimeout               int
-	ClientMaxBodySize           int64
-	ClientProxyURL              string
-	AllowSelfSignedCertificates bool
-}
-
-// New initializes a new HTTP client.
-func New(url string) *Client {
-	return &Client{
-		inputURL:          url,
-		ClientTimeout:     defaultHTTPClientTimeout,
-		ClientMaxBodySize: defaultHTTPClientMaxBodySize,
-	}
-}
-
-// NewClientWithConfig initializes a new HTTP client with application config options.
-func NewClientWithConfig(url string, opts *config.Options) *Client {
-	return &Client{
-		inputURL:          url,
-		requestUserAgent:  opts.HTTPClientUserAgent(),
-		ClientTimeout:     opts.HTTPClientTimeout(),
-		ClientMaxBodySize: opts.HTTPClientMaxBodySize(),
-		ClientProxyURL:    opts.HTTPClientProxy(),
-	}
-}
-
-// WithCredentials defines the username/password for HTTP Basic authentication.
-func (c *Client) WithCredentials(username, password string) *Client {
-	if username != "" && password != "" {
-		c.requestUsername = username
-		c.requestPassword = password
-	}
-	return c
-}
-
-// WithCustomHeaders defines custom HTTP headers.
-func (c *Client) WithCustomHeaders(customHeaders map[string]string) *Client {
-	c.customHeaders = customHeaders
-	return c
-}
-
-// WithCacheHeaders defines caching headers.
-func (c *Client) WithCacheHeaders(etagHeader, lastModifiedHeader string) *Client {
-	c.requestEtagHeader = etagHeader
-	c.requestLastModifiedHeader = lastModifiedHeader
-	return c
-}
-
-// WithProxy enables proxy for the current HTTP request.
-func (c *Client) WithProxy() *Client {
-	c.useProxy = true
-	return c
-}
-
-// WithoutRedirects disables HTTP redirects.
-func (c *Client) WithoutRedirects() *Client {
-	c.doNotFollowRedirects = true
-	return c
-}
-
-// WithUserAgent defines the User-Agent header to use for HTTP requests.
-func (c *Client) WithUserAgent(userAgent string) *Client {
-	if userAgent != "" {
-		c.requestUserAgent = userAgent
-	}
-	return c
-}
-
-// WithCookie defines the Cookies to use for HTTP requests.
-func (c *Client) WithCookie(cookie string) *Client {
-	if cookie != "" {
-		c.requestCookie = cookie
-	}
-	return c
-}
-
-// Get performs a GET HTTP request.
-func (c *Client) Get() (*Response, error) {
-	request, err := c.buildRequest(http.MethodGet, nil)
-	if err != nil {
-		return nil, err
-	}
-
-	return c.executeRequest(request)
-}
-
-func (c *Client) executeRequest(request *http.Request) (*Response, error) {
-	startTime := time.Now()
-
-	slog.Debug("Executing outgoing HTTP request",
-		slog.Group("request",
-			slog.String("method", request.Method),
-			slog.String("url", request.URL.String()),
-			slog.String("user_agent", request.UserAgent()),
-			slog.Bool("is_authenticated", c.requestAuthorizationHeader != "" || (c.requestUsername != "" && c.requestPassword != "")),
-			slog.Bool("has_cookie", c.requestCookie != ""),
-			slog.Bool("with_redirects", !c.doNotFollowRedirects),
-			slog.Bool("with_proxy", c.useProxy),
-			slog.String("proxy_url", c.ClientProxyURL),
-			slog.Bool("with_caching_headers", c.requestEtagHeader != "" || c.requestLastModifiedHeader != ""),
-		),
-	)
-
-	client := c.buildClient()
-	resp, err := client.Do(request)
-	if resp != nil {
-		defer resp.Body.Close()
-	}
-
-	if err != nil {
-		if uerr, ok := err.(*url.Error); ok {
-			switch uerr.Err.(type) {
-			case x509.CertificateInvalidError, x509.HostnameError:
-				err = errors.NewLocalizedError(errInvalidCertificate, uerr.Err)
-			case *net.OpError:
-				err = errors.NewLocalizedError(errNetworkOperation, uerr.Err)
-			case net.Error:
-				nerr := uerr.Err.(net.Error)
-				if nerr.Timeout() {
-					err = errors.NewLocalizedError(errRequestTimeout, c.ClientTimeout)
-				}
-			}
-		}
-
-		return nil, err
-	}
-
-	if resp.ContentLength > c.ClientMaxBodySize {
-		return nil, fmt.Errorf("client: response too large (%d bytes)", resp.ContentLength)
-	}
-
-	buf, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, fmt.Errorf("client: error while reading body %v", err)
-	}
-
-	response := &Response{
-		Body:          bytes.NewReader(buf),
-		StatusCode:    resp.StatusCode,
-		EffectiveURL:  resp.Request.URL.String(),
-		LastModified:  resp.Header.Get("Last-Modified"),
-		ETag:          resp.Header.Get("ETag"),
-		Expires:       resp.Header.Get("Expires"),
-		ContentType:   resp.Header.Get("Content-Type"),
-		ContentLength: resp.ContentLength,
-	}
-
-	slog.Debug("Completed outgoing HTTP request",
-		slog.Duration("duration", time.Since(startTime)),
-		slog.Group("request",
-			slog.String("method", request.Method),
-			slog.String("url", request.URL.String()),
-			slog.String("user_agent", request.UserAgent()),
-			slog.Bool("is_authenticated", c.requestAuthorizationHeader != "" || (c.requestUsername != "" && c.requestPassword != "")),
-			slog.Bool("has_cookie", c.requestCookie != ""),
-			slog.Bool("with_redirects", !c.doNotFollowRedirects),
-			slog.Bool("with_proxy", c.useProxy),
-			slog.String("proxy_url", c.ClientProxyURL),
-			slog.Bool("with_caching_headers", c.requestEtagHeader != "" || c.requestLastModifiedHeader != ""),
-		),
-		slog.Group("response",
-			slog.Int("status_code", response.StatusCode),
-			slog.String("effective_url", response.EffectiveURL),
-			slog.String("content_type", response.ContentType),
-			slog.Int64("content_length", response.ContentLength),
-			slog.String("last_modified", response.LastModified),
-			slog.String("etag", response.ETag),
-			slog.String("expires", response.Expires),
-		),
-	)
-
-	// Ignore caching headers for feeds that do not want any cache.
-	if resp.Header.Get("Expires") == "0" {
-		response.ETag = ""
-		response.LastModified = ""
-	}
-
-	return response, err
-}
-
-func (c *Client) buildRequest(method string, body io.Reader) (*http.Request, error) {
-	request, err := http.NewRequest(method, c.inputURL, body)
-	if err != nil {
-		return nil, err
-	}
-
-	request.Header = c.buildHeaders()
-
-	if c.requestUsername != "" && c.requestPassword != "" {
-		request.SetBasicAuth(c.requestUsername, c.requestPassword)
-	}
-
-	return request, nil
-}
-
-func (c *Client) buildClient() http.Client {
-	client := http.Client{
-		Timeout: time.Duration(c.ClientTimeout) * time.Second,
-	}
-
-	transport := &http.Transport{
-		Proxy: http.ProxyFromEnvironment,
-		DialContext: (&net.Dialer{
-			// Default is 30s.
-			Timeout: 10 * time.Second,
-
-			// Default is 30s.
-			KeepAlive: 15 * time.Second,
-		}).DialContext,
-
-		// Default is 100.
-		MaxIdleConns: 50,
-
-		// Default is 90s.
-		IdleConnTimeout: 10 * time.Second,
-	}
-
-	if c.AllowSelfSignedCertificates {
-		transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
-	}
-
-	if c.doNotFollowRedirects {
-		client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
-			return http.ErrUseLastResponse
-		}
-	}
-
-	if c.useProxy && c.ClientProxyURL != "" {
-		proxyURL, err := url.Parse(c.ClientProxyURL)
-		if err != nil {
-			slog.Error("Unable to parse proxy URL",
-				slog.String("proxy_url", c.ClientProxyURL),
-				slog.Any("error", err),
-			)
-		} else {
-			transport.Proxy = http.ProxyURL(proxyURL)
-		}
-	}
-
-	client.Transport = transport
-
-	return client
-}
-
-func (c *Client) buildHeaders() http.Header {
-	headers := make(http.Header)
-	headers.Add("Accept", "*/*")
-
-	if c.requestUserAgent != "" {
-		headers.Add("User-Agent", c.requestUserAgent)
-	}
-
-	if c.requestEtagHeader != "" {
-		headers.Add("If-None-Match", c.requestEtagHeader)
-	}
-
-	if c.requestLastModifiedHeader != "" {
-		headers.Add("If-Modified-Since", c.requestLastModifiedHeader)
-	}
-
-	if c.requestAuthorizationHeader != "" {
-		headers.Add("Authorization", c.requestAuthorizationHeader)
-	}
-
-	if c.requestCookie != "" {
-		headers.Add("Cookie", c.requestCookie)
-	}
-
-	for key, value := range c.customHeaders {
-		headers.Add(key, value)
-	}
-
-	headers.Add("Connection", "close")
-	return headers
-}

+ 0 - 70
internal/http/client/client_test.go

@@ -1,70 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package client // import "miniflux.app/v2/internal/http/client"
-
-import (
-	"fmt"
-	"net/http/httptest"
-	"os"
-	"testing"
-
-	"github.com/mccutchen/go-httpbin/v2/httpbin"
-)
-
-var srv *httptest.Server
-
-func TestMain(m *testing.M) {
-	srv = httptest.NewServer(httpbin.New())
-	exitCode := m.Run()
-	srv.Close()
-	os.Exit(exitCode)
-}
-
-func MakeClient(path string) *Client {
-	return New(fmt.Sprintf("%s%s", srv.URL, path))
-}
-
-func TestClientWithDelay(t *testing.T) {
-	clt := MakeClient("/delay/5")
-	clt.ClientTimeout = 1
-	_, err := clt.Get()
-	if err == nil {
-		t.Fatal(`The client should stops after 1 second`)
-	}
-}
-
-func TestClientWithError(t *testing.T) {
-	clt := MakeClient("/status/502")
-	clt.ClientTimeout = 5
-	response, err := clt.Get()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if response.StatusCode != 502 {
-		t.Fatalf(`Unexpected response status code: %d`, response.StatusCode)
-	}
-
-	if !response.HasServerFailure() {
-		t.Fatal(`A 502 error is considered as server failure`)
-	}
-}
-
-func TestClientWithResponseTooLarge(t *testing.T) {
-	clt := MakeClient("/bytes/100")
-	clt.ClientMaxBodySize = 10
-	_, err := clt.Get()
-	if err == nil {
-		t.Fatal(`The client should fails when reading a response too large`)
-	}
-}
-
-func TestClientWithBasicAuth(t *testing.T) {
-	clt := MakeClient("/basic-auth/testuser/testpassword")
-	clt.WithCredentials("testuser", "testpassword")
-	_, err := clt.Get()
-	if err != nil {
-		t.Fatalf(`The client should be authenticated successfully: %v`, err)
-	}
-}

+ 0 - 119
internal/http/client/response.go

@@ -1,119 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package client // import "miniflux.app/v2/internal/http/client"
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"regexp"
-	"strings"
-	"unicode/utf8"
-
-	"golang.org/x/net/html/charset"
-)
-
-var xmlEncodingRegex = regexp.MustCompile(`<\?xml(.*)encoding=["'](.+)["'](.*)\?>`)
-
-// Response wraps a server response.
-type Response struct {
-	Body          io.Reader
-	StatusCode    int
-	EffectiveURL  string
-	LastModified  string
-	ETag          string
-	Expires       string
-	ContentType   string
-	ContentLength int64
-}
-
-func (r *Response) String() string {
-	return fmt.Sprintf(
-		`StatusCode=%d EffectiveURL=%q LastModified=%q ETag=%s Expires=%s ContentType=%q ContentLength=%d`,
-		r.StatusCode,
-		r.EffectiveURL,
-		r.LastModified,
-		r.ETag,
-		r.Expires,
-		r.ContentType,
-		r.ContentLength,
-	)
-}
-
-// IsNotFound returns true if the resource doesn't exist anymore.
-func (r *Response) IsNotFound() bool {
-	return r.StatusCode == 404 || r.StatusCode == 410
-}
-
-// IsNotAuthorized returns true if the resource require authentication.
-func (r *Response) IsNotAuthorized() bool {
-	return r.StatusCode == 401
-}
-
-// HasServerFailure returns true if the status code represents a failure.
-func (r *Response) HasServerFailure() bool {
-	return r.StatusCode >= 400
-}
-
-// IsModified returns true if the resource has been modified.
-func (r *Response) IsModified(etag, lastModified string) bool {
-	if r.StatusCode == 304 {
-		return false
-	}
-
-	if r.ETag != "" && r.ETag == etag {
-		return false
-	}
-
-	if r.LastModified != "" && r.LastModified == lastModified {
-		return false
-	}
-
-	return true
-}
-
-// EnsureUnicodeBody makes sure the body is encoded in UTF-8.
-//
-// If a charset other than UTF-8 is detected, we convert the document to UTF-8.
-// This is used by the scraper and feed readers.
-//
-// Do not forget edge cases:
-//
-// - Feeds with encoding specified only in Content-Type header and not in XML document
-// - Feeds with encoding specified in both places
-// - Feeds with encoding specified only in XML document and not in HTTP header
-// - Feeds with wrong encoding defined and already in UTF-8
-func (r *Response) EnsureUnicodeBody() (err error) {
-	buffer, err := io.ReadAll(r.Body)
-	if err != nil {
-		return err
-	}
-
-	r.Body = bytes.NewReader(buffer)
-	if utf8.Valid(buffer) {
-		return nil
-	}
-
-	if strings.Contains(r.ContentType, "xml") {
-		// We ignore documents with encoding specified in XML prolog.
-		// This is going to be handled by the XML parser.
-		length := 1024
-		if len(buffer) < 1024 {
-			length = len(buffer)
-		}
-
-		if xmlEncodingRegex.Match(buffer[0:length]) {
-			return nil
-		}
-	}
-
-	r.Body, err = charset.NewReader(r.Body, r.ContentType)
-	return err
-}
-
-// BodyAsString returns the response body as string.
-func (r *Response) BodyAsString() string {
-	bytes, _ := io.ReadAll(r.Body)
-	return string(bytes)
-}

+ 0 - 148
internal/http/client/response_test.go

@@ -1,148 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package client // import "miniflux.app/v2/internal/http/client"
-
-import (
-	"bytes"
-	"os"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-func TestIsNotFound(t *testing.T) {
-	scenarios := map[int]bool{
-		200: false,
-		404: true,
-		410: true,
-	}
-
-	for input, expected := range scenarios {
-		r := &Response{StatusCode: input}
-		actual := r.IsNotFound()
-
-		if actual != expected {
-			t.Errorf(`Unexpected result, got %v instead of %v for status code %d`, actual, expected, input)
-		}
-	}
-}
-
-func TestIsNotAuthorized(t *testing.T) {
-	scenarios := map[int]bool{
-		200: false,
-		401: true,
-		403: false,
-	}
-
-	for input, expected := range scenarios {
-		r := &Response{StatusCode: input}
-		actual := r.IsNotAuthorized()
-
-		if actual != expected {
-			t.Errorf(`Unexpected result, got %v instead of %v for status code %d`, actual, expected, input)
-		}
-	}
-}
-
-func TestHasServerFailure(t *testing.T) {
-	scenarios := map[int]bool{
-		200: false,
-		404: true,
-		500: true,
-	}
-
-	for input, expected := range scenarios {
-		r := &Response{StatusCode: input}
-		actual := r.HasServerFailure()
-
-		if actual != expected {
-			t.Errorf(`Unexpected result, got %v instead of %v for status code %d`, actual, expected, input)
-		}
-	}
-}
-
-func TestIsModifiedWith304Status(t *testing.T) {
-	r := &Response{StatusCode: 304}
-	if r.IsModified("etag", "lastModified") {
-		t.Error("The resource should not be considered modified")
-	}
-}
-
-func TestIsModifiedWithIdenticalEtag(t *testing.T) {
-	r := &Response{StatusCode: 200, ETag: "etag"}
-	if r.IsModified("etag", "lastModified") {
-		t.Error("The resource should not be considered modified")
-	}
-}
-
-func TestIsModifiedWithIdenticalLastModified(t *testing.T) {
-	r := &Response{StatusCode: 200, LastModified: "lastModified"}
-	if r.IsModified("etag", "lastModified") {
-		t.Error("The resource should not be considered modified")
-	}
-}
-
-func TestIsModifiedWithDifferentHeaders(t *testing.T) {
-	r := &Response{StatusCode: 200, ETag: "some etag", LastModified: "some date"}
-	if !r.IsModified("etag", "lastModified") {
-		t.Error("The resource should be considered modified")
-	}
-}
-
-func TestToString(t *testing.T) {
-	input := `test`
-	r := &Response{Body: strings.NewReader(input)}
-
-	if r.BodyAsString() != input {
-		t.Error(`Unexpected output`)
-	}
-}
-
-func TestEnsureUnicodeWithHTMLDocuments(t *testing.T) {
-	var unicodeTestCases = []struct {
-		filename, contentType string
-		convertedToUnicode    bool
-	}{
-		{"HTTP-charset.html", "text/html; charset=iso-8859-15", true},
-		{"UTF-16LE-BOM.html", "", true},
-		{"UTF-16BE-BOM.html", "", true},
-		{"meta-content-attribute.html", "text/html", true},
-		{"meta-charset-attribute.html", "text/html", true},
-		{"No-encoding-declaration.html", "text/html", true},
-		{"HTTP-vs-UTF-8-BOM.html", "text/html; charset=iso-8859-15", true},
-		{"HTTP-vs-meta-content.html", "text/html; charset=iso-8859-15", true},
-		{"HTTP-vs-meta-charset.html", "text/html; charset=iso-8859-15", true},
-		{"UTF-8-BOM-vs-meta-content.html", "text/html", true},
-		{"UTF-8-BOM-vs-meta-charset.html", "text/html", true},
-		{"windows_1251.html", "text/html; charset=windows-1251", true},
-		{"gb2312.html", "text/html", true},
-		{"urdu.xml", "text/xml; charset=utf-8", true},
-		{"content-type-only-win-8859-1.xml", "application/xml; charset=ISO-8859-1", true},
-		{"rdf_utf8.xml", "application/rss+xml; charset=utf-8", true},
-		{"rdf_utf8.xml", "application/rss+xml; charset: utf-8", true}, // Invalid Content-Type
-		{"charset-content-type-xml-iso88591.xml", "application/rss+xml; charset=ISO-8859-1", false},
-		{"windows_1251.xml", "text/xml", false},
-		{"smallfile.xml", "text/xml; charset=utf-8", true},
-		{"single_quote_xml_encoding.xml", "text/xml; charset=utf-8", true},
-	}
-
-	for _, tc := range unicodeTestCases {
-		content, err := os.ReadFile("testdata/" + tc.filename)
-		if err != nil {
-			t.Fatalf(`Unable to read file %q: %v`, tc.filename, err)
-		}
-
-		r := &Response{Body: bytes.NewReader(content), ContentType: tc.contentType}
-		parseErr := r.EnsureUnicodeBody()
-		if parseErr != nil {
-			t.Fatalf(`Unicode conversion error for %q - %q: %v`, tc.filename, tc.contentType, parseErr)
-		}
-
-		isUnicode := utf8.ValidString(r.BodyAsString())
-		if isUnicode != tc.convertedToUnicode {
-			t.Errorf(`Unicode conversion %q - %q, got: %v, expected: %v`,
-				tc.filename, tc.contentType, isUnicode, tc.convertedToUnicode)
-		}
-	}
-}

+ 0 - 48
internal/http/client/testdata/HTTP-charset.html

@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
-  <title>HTTP charset</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="The character encoding of a page can be set using the HTTP header charset declaration.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css">
-</head>
-<body>
-<p class='title'>HTTP charset</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">The character encoding of a page can be set using the HTTP header charset declaration.</p>
-<div class="notes"><p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00C3;&#x0153;&#x00C3;&#x20AC;&#x00C3;&#x0161;</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p><p>The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-003">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-001<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-001" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 48
internal/http/client/testdata/HTTP-vs-UTF-8-BOM.html

@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
-  <title>HTTP vs UTF-8 BOM</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-utf8.css">
-</head>
-<body>
-<p class='title'>HTTP vs UTF-8 BOM</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.</p>
-<div class="notes"><p><p>The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00FD;&#x00E4;&#x00E8;</code>. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.</p><p>If the test is unsuccessful, the characters &#x00EF;&#x00BB;&#x00BF; should appear at the top of the page.  These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-022">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-034<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-034" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 49
internal/http/client/testdata/HTTP-vs-meta-charset.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta charset="iso-8859-1" > <title>HTTP vs meta charset</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.">
-<style type='text/css'>
-.test div { width: 50px; }.test div { width: 90px; }
-</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css">
-</head>
-<body>
-<p class='title'>HTTP vs meta charset</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.</p>
-<div class="notes"><p><p>The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00C3;&#x0153;&#x00C3;&#x20AC;&#x00C3;&#x0161;</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-037">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-018<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-018" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 49
internal/http/client/testdata/HTTP-vs-meta-content.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" > <title>HTTP vs meta content</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.">
-<style type='text/css'>
-.test div { width: 50px; }.test div { width: 90px; }
-</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css">
-</head>
-<body>
-<p class='title'>HTTP vs meta content</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.</p>
-<div class="notes"><p><p>The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00C3;&#x0153;&#x00C3;&#x20AC;&#x00C3;&#x0161;</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-018">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-016<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-016" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 47
internal/http/client/testdata/No-encoding-declaration.html

@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
-  <title>No encoding declaration</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-utf8.css">
-</head>
-<body>
-<p class='title'>No encoding declaration</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.</p>
-<div class="notes"><p><p>The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00FD;&#x00E4;&#x00E8;</code>. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-034">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-015<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-015" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 9
internal/http/client/testdata/README

@@ -1,9 +0,0 @@
-These test cases come from
-http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics
-
-Distributed under both the W3C Test Suite License
-(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license)
-and the W3C 3-clause BSD License
-(http://www.w3.org/Consortium/Legal/2008/03-bsd-license).
-To contribute to a W3C Test Suite, see the policies and contribution
-forms (http://www.w3.org/2004/10/27-testcases).

BIN
internal/http/client/testdata/UTF-16BE-BOM.html


BIN
internal/http/client/testdata/UTF-16LE-BOM.html


+ 0 - 49
internal/http/client/testdata/UTF-8-BOM-vs-meta-charset.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta charset="iso-8859-15"> <title>UTF-8 BOM vs meta charset</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.">
-<style type='text/css'>
-.test div { width: 50px; }.test div { width: 90px; }
-</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-utf8.css">
-</head>
-<body>
-<p class='title'>UTF-8 BOM vs meta charset</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.</p>
-<div class="notes"><p><p>The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00FD;&#x00E4;&#x00E8;</code>. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-024">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-038<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-038" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 48
internal/http/client/testdata/UTF-8-BOM-vs-meta-content.html

@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta http-equiv="content-type" content="text/html; charset=iso-8859-15"> <title>UTF-8 BOM vs meta content</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-utf8.css">
-</head>
-<body>
-<p class='title'>UTF-8 BOM vs meta content</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.</p>
-<div class="notes"><p><p>The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00FD;&#x00E4;&#x00E8;</code>. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-038">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-037<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-037" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 422
internal/http/client/testdata/charset-content-type-xml-iso88591.xml

@@ -1,422 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- generator="FeedCreator 1.6" -->
-<rss xmlns:content="http://purl.org/rss/1.0/modules/content/"
-    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
-    xmlns:atom="http://www.w3.org/2005/Atom"
-    version="2.0">
-    <channel>
-        <title>Golem.de</title>
-        <description>IT-News fuer Profis</description>
-        <link>https://www.golem.de/</link>
-        <atom:link rel="self" href="https://rss.golem.de/rss.php?feed=RSS2.0" />
-        <lastBuildDate>Sun, 28 Oct 2018 13:49:01 +0100</lastBuildDate>
-        <generator>FeedCreator 1.6</generator>
-        <image>
-            <url>https://www.golem.de/staticrl/images/golem-rss.png</url>
-            <title>Golem.de</title>
-            <link>https://www.golem.de/</link>
-            <description>Golem.de News Feed</description>
-        </image>
-        <language>de</language>
-        <atom:link rel="hub" href="http://golem.superfeedr.com/" />
-        <item>
-            <title>Red Dead Redemption 2: Hinweise auf PC-Umsetzung in App von Rockstar Games</title>
-            <link>https://www.golem.de/news/red-dead-redemption-2-hinweise-auf-pc-umsetzung-in-app-von-rockstar-games-1810-137358-rss.html</link>
-            <description>Viele Spieler wünschen sich eine PC-Version von Red Dead Redemption 2, aber Entwickler Rockstar Games schweigt zu dem Thema. Anders die offizielle Companion App: In einigen ihrer Daten gibt es Hinweise auf die Umsetzung. (&lt;a href=&quot;https://www.golem.de/specials/red-dead-redemption-2/&quot;&gt;Red Dead Redemption 2&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/red-dead-redemption/&quot;&gt;Red Dead Redemption&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137358&amp;amp;page=1&amp;amp;ts=1540730880&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <pubDate>Sun, 28 Oct 2018 13:48:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137358-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137358-177541-177538_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Viele Spieler wünschen sich eine PC-Version von Red Dead Redemption 2, aber Entwickler Rockstar Games schweigt zu dem Thema. Anders die offizielle Companion App: In einigen ihrer Daten gibt es Hinweise auf die Umsetzung. (<a href="https://www.golem.de/specials/red-dead-redemption-2/">Red Dead Redemption 2</a>, <a href="https://www.golem.de/specials/red-dead-redemption/">Red Dead Redemption</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137358&amp;page=1&amp;ts=1540730880" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments />
-        </item>
-        <item>
-            <title>Let's Play: Twitch will Streamer zusammen spielen und singen lassen</title>
-            <link>https://www.golem.de/news/let-s-play-twitch-will-streamer-zusammen-spielen-und-singen-lassen-1810-137357-rss.html</link>
-            <description>Der Streamingdienst Twitch hat auf seiner Hausmesse neue Funktionen für Kanalbetreiber und Zuschauer vorgestellt. Unter anderem soll es künftig Übertragungen mit bis zu vier Spielern geben - und Singwettbewerbe. (&lt;a href=&quot;https://www.golem.de/specials/twitch/&quot;&gt;Twitch&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/amazon/&quot;&gt;Amazon&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137357&amp;amp;page=1&amp;amp;ts=1540728000&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/games/let-s-play-twitch-will-streamer-zusammen-spielen-und-singen-lassen/121579,list.html</comments>
-            <pubDate>Sun, 28 Oct 2018 13:00:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137357-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137357-177536-177533_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Der Streamingdienst Twitch hat auf seiner Hausmesse neue Funktionen für Kanalbetreiber und Zuschauer vorgestellt. Unter anderem soll es künftig Übertragungen mit bis zu vier Spielern geben - und Singwettbewerbe. (<a href="https://www.golem.de/specials/twitch/">Twitch</a>, <a href="https://www.golem.de/specials/amazon/">Amazon</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137357&amp;page=1&amp;ts=1540728000" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments />
-        </item>
-        <item>
-            <title>Zhuque-1: Erste private chinesische Satellitenmission fehlgeschlagen</title>
-            <link>https://www.golem.de/news/zhuque-1-erste-private-chinesische-satellitenmission-fehlgeschlagen-1810-137356-rss.html</link>
-            <description>Die Zhuque-1 hat es nicht in den Orbit geschafft: Beim Zünden der dritten Raketenstufe kam es zu Problemen. Bei einem Erfolg wäre der Hersteller Landspace das erste von rund 60 kommerziellen chinesischen Unternehmen gewesen, das einen Satelliten ins All gebracht hätte. (&lt;a href=&quot;https://www.golem.de/specials/raumfahrt/&quot;&gt;Raumfahrt&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/internet/&quot;&gt;Internet&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137356&amp;amp;page=1&amp;amp;ts=1540722420&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/internet/zhuque-1-erste-private-chinesische-satellitenmission-fehlgeschlagen/121578,list.html</comments>
-            <pubDate>Sun, 28 Oct 2018 11:27:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137356-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137356-177532-177529_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die Zhuque-1 hat es nicht in den Orbit geschafft: Beim Zünden der dritten Raketenstufe kam es zu Problemen. Bei einem Erfolg wäre der Hersteller Landspace das erste von rund 60 kommerziellen chinesischen Unternehmen gewesen, das einen Satelliten ins All gebracht hätte. (<a href="https://www.golem.de/specials/raumfahrt/">Raumfahrt</a>, <a href="https://www.golem.de/specials/internet/">Internet</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137356&amp;page=1&amp;ts=1540722420" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>1</slash:comments>
-        </item>
-        <item>
-            <title>City Transformer: Startup entwickelt faltbares Elektroauto gegen Parkplatznot</title>
-            <link>https://www.golem.de/news/city-transformer-startup-entwickelt-faltbares-elektroauto-gegen-parkplatznot-1810-137355-rss.html</link>
-            <description>Es passt fast in jede Parklücke: Ein Faltauto des Startups City Transformer soll Städtern künftig das Leben erleichtern. Das innovative Fahrzeug wird zusammen mit Yamaha entwickelt. Vorbestellungen sollen voraussichtlich ab 2020 möglich sein, mehrere Versionen sind geplant. (&lt;a href=&quot;https://www.golem.de/specials/elektromobilitaet/&quot;&gt;Elektromobilität&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/elektroauto/&quot;&gt;Elektroauto&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137355&amp;amp;page=1&amp;amp;ts=1540721400&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/automobil/city-transformer-startup-entwickelt-faltbares-elektroauto-gegen-parkplatznot/121577,list.html</comments>
-            <pubDate>Sun, 28 Oct 2018 11:10:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137355-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137355-177527-177524_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Es passt fast in jede Parklücke: Ein Faltauto des Startups City Transformer soll Städtern künftig das Leben erleichtern. Das innovative Fahrzeug wird zusammen mit Yamaha entwickelt. Vorbestellungen sollen voraussichtlich ab 2020 möglich sein, mehrere Versionen sind geplant. (<a href="https://www.golem.de/specials/elektromobilitaet/">Elektromobilität</a>, <a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137355&amp;page=1&amp;ts=1540721400" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>37</slash:comments>
-        </item>
-        <item>
-            <title>Machine Learning: Von KI erstelltes Porträt für 432.500 US.Dollar versteigert</title>
-            <link>https://www.golem.de/news/machine-learning-von-ki-erstelltes-portraet-fuer-432-500-us-dollar-versteigert-1810-137353-rss.html</link>
-            <description>Kann Software Kunst erstellen? Eine erfolgreiche Auktion beweist, dass es zumindest Abnehmer dafür gibt. Allerdings hat sich das Entwicklerteam Obvious wohl stark bei anderen KI-Systemen bedient. (&lt;a href=&quot;https://www.golem.de/specials/neuronalesnetzwerk/&quot;&gt;Neuronales Netzwerk&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/ki/&quot;&gt;KI&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137353&amp;amp;page=1&amp;amp;ts=1540643580&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/applikationen/machine-learning-von-ki-erstelltes-portraet-fuer-432.500-us.dollar-versteigert/121575,list.html</comments>
-            <pubDate>Sat, 27 Oct 2018 13:33:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137353-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137353-177523-177520_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Kann Software Kunst erstellen? Eine erfolgreiche Auktion beweist, dass es zumindest Abnehmer dafür gibt. Allerdings hat sich das Entwicklerteam Obvious wohl stark bei anderen KI-Systemen bedient. (<a href="https://www.golem.de/specials/neuronalesnetzwerk/">Neuronales Netzwerk</a>, <a href="https://www.golem.de/specials/ki/">KI</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137353&amp;page=1&amp;ts=1540643580" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>31</slash:comments>
-        </item>
-        <item>
-            <title>Projekt Jedi: Microsoft will weiter mit US-Militär zusammenarbeiten</title>
-            <link>https://www.golem.de/news/project-jedi-microsoft-will-weiter-mit-us-militaer-zusammenarbeiten-1810-137352-rss.html</link>
-            <description>In einem Blogbeitrag hat sich Microsoft-Präsident Brad Smith zur Zusammenarbeit mit dem US-Verteidigungsministerium bekannt. Mitarbeiter, die nicht an derartigen Projekten arbeiten wollen, sollen in andere Bereiche des Unternehmens wechseln können. (&lt;a href=&quot;https://www.golem.de/specials/microsoft/&quot;&gt;Microsoft&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/google/&quot;&gt;Google&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137352&amp;amp;page=1&amp;amp;ts=1540641780&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/internet/projekt-jedi-microsoft-will-weiter-mit-us-militaer-zusammenarbeiten/121574,list.html</comments>
-            <pubDate>Sat, 27 Oct 2018 13:03:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137352-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137055-176130-176127_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">In einem Blogbeitrag hat sich Microsoft-Präsident Brad Smith zur Zusammenarbeit mit dem US-Verteidigungsministerium bekannt. Mitarbeiter, die nicht an derartigen Projekten arbeiten wollen, sollen in andere Bereiche des Unternehmens wechseln können. (<a href="https://www.golem.de/specials/microsoft/">Microsoft</a>, <a href="https://www.golem.de/specials/google/">Google</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137352&amp;page=1&amp;ts=1540641780" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>21</slash:comments>
-        </item>
-        <item>
-            <title>Star Wars: Boba-Fett-Film ist &quot;zu 100 Prozent tot&quot;</title>
-            <link>https://www.golem.de/news/star-wars-boba-fett-film-ist-zu-100-prozent-tot-1810-137351-rss.html</link>
-            <description>Es wird wohl doch keinen dritten Star-Wars-Ableger geben, der sich um den kultigen Kopfgeldjäger Boba Fett dreht. Das wird laut einem Medienbericht teils auf den geringen Erfolg des Han-Solo-Films zurückgeführt. Stattdessen soll ein bisher unbekannter Charakter in einer Serie die mandalorianische Rüstung anziehen. (&lt;a href=&quot;https://www.golem.de/specials/star-wars/&quot;&gt;Star Wars&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/film/&quot;&gt;Film&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137351&amp;amp;page=1&amp;amp;ts=1540639620&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/audio-video/star-wars-boba-fett-film-ist-zu-100-prozent-tot/121573,list.html</comments>
-            <pubDate>Sat, 27 Oct 2018 12:27:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137351-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137351-177519-177514_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Es wird wohl doch keinen dritten Star-Wars-Ableger geben, der sich um den kultigen Kopfgeldjäger Boba Fett dreht. Das wird laut einem Medienbericht teils auf den geringen Erfolg des Han-Solo-Films zurückgeführt. Stattdessen soll ein bisher unbekannter Charakter in einer Serie die mandalorianische Rüstung anziehen. (<a href="https://www.golem.de/specials/star-wars/">Star Wars</a>, <a href="https://www.golem.de/specials/film/">Film</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137351&amp;page=1&amp;ts=1540639620" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>148</slash:comments>
-        </item>
-        <item>
-            <title>Lenovo: Fehlerhafte Bios-Einstellung macht Thinkpads unbrauchbar</title>
-            <link>https://www.golem.de/news/lenovo-fehlerhafte-bios-einstellung-macht-thinkpads-unbrauchbar-1810-137350-rss.html</link>
-            <description>Die Bios-Unterstützung für Thunderbolt bei Thinkpads zu aktivieren, ist derzeit keine gute Idee: Mehrere Nutzer berichten von nicht mehr startenden Notebooks, nachdem sie diese Funktion aktiviert haben. Das konnte auf diversen Linux-Distributionen, aber auch mit Windows 10 repliziert werden. (&lt;a href=&quot;https://www.golem.de/specials/lenovo/&quot;&gt;Lenovo&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/business-notebooks/&quot;&gt;Business-Notebooks&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137350&amp;amp;page=1&amp;amp;ts=1540633200&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/applikationen/lenovo-fehlerhafte-bios-einstellung-macht-thinkpads-unbrauchbar/121572,list.html</comments>
-            <pubDate>Sat, 27 Oct 2018 10:40:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137350-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137350-177513-177510_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die Bios-Unterstützung für Thunderbolt bei Thinkpads zu aktivieren, ist derzeit keine gute Idee: Mehrere Nutzer berichten von nicht mehr startenden Notebooks, nachdem sie diese Funktion aktiviert haben. Das konnte auf diversen Linux-Distributionen, aber auch mit Windows 10 repliziert werden. (<a href="https://www.golem.de/specials/lenovo/">Lenovo</a>, <a href="https://www.golem.de/specials/business-notebooks/">Business-Notebooks</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137350&amp;page=1&amp;ts=1540633200" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>16</slash:comments>
-        </item>
-        <item>
-            <title>Wochenrückblick: Wilder Westen, buntes Handy, nutzloses Siegel</title>
-            <link>https://www.golem.de/news/wochenrueckblick-wilder-westen-buntes-handy-nutzloses-siegel-1810-137318-rss.html</link>
-            <description> Wir testen das iPhone Xr, sind ein Revolverheld und entdecken wieder Sicherheitslücken. Sieben Tage und viele Meldungen im Überblick. (&lt;a href=&quot;https://www.golem.de/specials/golemwochenrueckblick/&quot;&gt;Golem-Wochenrückblick&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/business-notebooks/&quot;&gt;Business-Notebooks&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137318&amp;amp;page=1&amp;amp;ts=1540623720&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/politik-recht/wochenrueckblick-wilder-westen-buntes-handy-nutzloses-siegel/121571,list.html</comments>
-            <pubDate>Sat, 27 Oct 2018 08:02:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137318-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137318-177504-177501_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left"> Wir testen das iPhone Xr, sind ein Revolverheld und entdecken wieder Sicherheitslücken. Sieben Tage und viele Meldungen im Überblick. (<a href="https://www.golem.de/specials/golemwochenrueckblick/">Golem-Wochenrückblick</a>, <a href="https://www.golem.de/specials/business-notebooks/">Business-Notebooks</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137318&amp;page=1&amp;ts=1540623720" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments />
-        </item>
-        <item>
-            <title>Fernsehen: 5G-Netz wird so wichtig wie Strom und Wasser</title>
-            <link>https://www.golem.de/news/fernsehen-5g-netz-wird-so-wichtig-wie-strom-und-wasser-1810-137349-rss.html</link>
-            <description>Ein 5G-FeMBMS-Sendernetz für die Fernsehverbreitung sorgt für Aufsehen, noch bevor man weiß, ob es funktioniert. Wie Rundfunkübertragung und Mobilfunk zusammenkommen können, wurde auf den Medientagen München besprochen. (&lt;a href=&quot;https://www.golem.de/specials/fernsehen/&quot;&gt;Fernsehen&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/technologie/&quot;&gt;Technologie&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137349&amp;amp;page=1&amp;amp;ts=1540572960&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/handy/fernsehen-5g-netz-wird-so-wichtig-wie-strom-und-wasser/121570,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 17:56:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137349-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137349-177509-177506_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Ein 5G-FeMBMS-Sendernetz für die Fernsehverbreitung sorgt für Aufsehen, noch bevor man weiß, ob es funktioniert. Wie Rundfunkübertragung und Mobilfunk zusammenkommen können, wurde auf den Medientagen München besprochen. (<a href="https://www.golem.de/specials/fernsehen/">Fernsehen</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137349&amp;page=1&amp;ts=1540572960" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>25</slash:comments>
-        </item>
-        <item>
-            <title>Linux und BSD: Sicherheitslücke in X.org ermöglicht Root-Rechte</title>
-            <link>https://www.golem.de/news/linux-und-bsd-sicherheitsluecke-in-x-org-ermoeglicht-root-rechte-1810-137347-rss.html</link>
-            <description>Eine Sicherheitslücke im Displayserver X.org erlaubt unter bestimmten Umständen das Überschreiben von Dateien und das Ausweiten der Benutzerrechte. Der passende Exploit passt in einen Tweet. (&lt;a href=&quot;https://www.golem.de/specials/sicherheitsluecke/&quot;&gt;Sicherheitslücke&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/openbsd/&quot;&gt;OpenBSD&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137347&amp;amp;page=1&amp;amp;ts=1540564620&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/linux-und-bsd-sicherheitsluecke-in-x.org-ermoeglicht-root-rechte/121569,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 15:37:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137347-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137347-177500-177497_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Eine Sicherheitslücke im Displayserver X.org erlaubt unter bestimmten Umständen das Überschreiben von Dateien und das Ausweiten der Benutzerrechte. Der passende Exploit passt in einen Tweet. (<a href="https://www.golem.de/specials/sicherheitsluecke/">Sicherheitslücke</a>, <a href="https://www.golem.de/specials/openbsd/">OpenBSD</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137347&amp;page=1&amp;ts=1540564620" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>47</slash:comments>
-        </item>
-        <item>
-            <title>Augsburg: Fujitsu Deutschland macht alles dicht</title>
-            <link>https://www.golem.de/news/augsburg-fujitsu-deutschland-macht-alles-dicht-1810-137348-rss.html</link>
-            <description>Fujitsu will seine gesamte Fertigung außerhalb Japans schließen. In Deutschland ist der Standort in Augsburg komplett betroffen. (&lt;a href=&quot;https://www.golem.de/specials/fujitsu/&quot;&gt;Fujitsu&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/sap/&quot;&gt;SAP&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137348&amp;amp;page=1&amp;amp;ts=1540562340&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/augsburg-fujitsu-deutschland-macht-alles-dicht/121568,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 14:59:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137348-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137348-177485-177484_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Fujitsu will seine gesamte Fertigung außerhalb Japans schließen. In Deutschland ist der Standort in Augsburg komplett betroffen. (<a href="https://www.golem.de/specials/fujitsu/">Fujitsu</a>, <a href="https://www.golem.de/specials/sap/">SAP</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137348&amp;page=1&amp;ts=1540562340" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>56</slash:comments>
-        </item>
-        <item>
-            <title>Bundesnetzagentur: Seehofer fordert Verschiebung von 5G-Auktion</title>
-            <link>https://www.golem.de/news/bundesnetzagentur-seehofer-fordert-verschiebung-von-5g-auktion-1810-137346-rss.html</link>
-            <description>Bundesinnenminister Horst Seehofer will die 5G-Auktion verschieben, bis die ländlichen Regionen besser berücksichtigt werden. Er wird von einer Gruppe um den CDU-Abgeordneten Stefan Rouenhoff unterstützt. (&lt;a href=&quot;https://www.golem.de/specials/5g/&quot;&gt;5G&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/bundesnetzagentur/&quot;&gt;Bundesnetzagentur&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137346&amp;amp;page=1&amp;amp;ts=1540557900&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/handy/bundesnetzagentur-seehofer-fordert-verschiebung-von-5g-auktion/121567,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 13:45:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137346-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137346-177483-177480_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Bundesinnenminister Horst Seehofer will die 5G-Auktion verschieben, bis die ländlichen Regionen besser berücksichtigt werden. Er wird von einer Gruppe um den CDU-Abgeordneten Stefan Rouenhoff unterstützt. (<a href="https://www.golem.de/specials/5g/">5G</a>, <a href="https://www.golem.de/specials/bundesnetzagentur/">Bundesnetzagentur</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137346&amp;page=1&amp;ts=1540557900" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>14</slash:comments>
-        </item>
-        <item>
-            <title>Linux und Patente: Open Source bei Microsoft ist &quot;Kultur statt Strategie&quot;</title>
-            <link>https://www.golem.de/news/linux-und-patente-open-source-bei-microsoft-ist-kultur-statt-strategie-1810-137345-rss.html</link>
-            <description>Der Microsoft-Angestellte Stephen Walli beschreibt den Wandel bei Microsoft hin zu Open Source Software und Linux als kulturell getrieben. Mit Blick auf den Beitritt zu dem Patentpool des Open Invention Network zeigt sich jedoch auch, dass das Unternehmen noch sehr viel Arbeit vor sich hat. Ein Bericht von Sebastian Grüner (&lt;a href=&quot;https://www.golem.de/specials/microsoft/&quot;&gt;Microsoft&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/softwarepatente/&quot;&gt;Softwarepatent&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137345&amp;amp;page=1&amp;amp;ts=1540556820&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/politik-recht/linux-und-patente-open-source-bei-microsoft-ist-kultur-statt-strategie/121566,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 13:27:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137345-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137345-177479-177475_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Der Microsoft-Angestellte Stephen Walli beschreibt den Wandel bei Microsoft hin zu Open Source Software und Linux als kulturell getrieben. Mit Blick auf den Beitritt zu dem Patentpool des Open Invention Network zeigt sich jedoch auch, dass das Unternehmen noch sehr viel Arbeit vor sich hat. Ein Bericht von Sebastian Grüner (<a href="https://www.golem.de/specials/microsoft/">Microsoft</a>, <a href="https://www.golem.de/specials/softwarepatente/">Softwarepatent</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137345&amp;page=1&amp;ts=1540556820" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>20</slash:comments>
-        </item>
-        <item>
-            <title>Sicherheitslücke: Daten von 185.000 weiteren British-Airways-Kunden betroffen</title>
-            <link>https://www.golem.de/news/sicherheitsluecke-daten-von-185-000-weiteren-british-airways-kunden-betroffen-1810-137344-rss.html</link>
-            <description>Von dem Datenleck im Buchungssystem von British Airways waren deutlich mehr Kunden betroffen als bisher bekannt. Die Fluggesellschaft rät betroffenen Kunden, ihre Bank zu kontaktieren. Kreditkarten werden in diesem Fall häufig komplett ausgetauscht. (&lt;a href=&quot;https://www.golem.de/specials/sicherheitsluecke/&quot;&gt;Sicherheitslücke&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/datenschutz/&quot;&gt;Datenschutz&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137344&amp;amp;page=1&amp;amp;ts=1540553820&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/sicherheitsluecke-daten-von-185.000-weiteren-british-airways-kunden-betroffen/121565,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 12:37:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137344-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137344-177474-177471_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Von dem Datenleck im Buchungssystem von British Airways waren deutlich mehr Kunden betroffen als bisher bekannt. Die Fluggesellschaft rät betroffenen Kunden, ihre Bank zu kontaktieren. Kreditkarten werden in diesem Fall häufig komplett ausgetauscht. (<a href="https://www.golem.de/specials/sicherheitsluecke/">Sicherheitslücke</a>, <a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137344&amp;page=1&amp;ts=1540553820" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments />
-        </item>
-        <item>
-            <title>iPhone Xr im Test: Apples günstigeres iPhone ist nicht günstig</title>
-            <link>https://www.golem.de/news/iphone-xr-im-test-apples-guenstiges-iphone-ist-nicht-guenstig-1810-137327-rss.html</link>
-            <description>Apple versucht es 2018 wieder einmal mit einem relativ preisgünstigen iPhone - weniger teuer als die Xs-Modelle, aber mit 850 Euro auch nicht gerade preiswert. Käufer bekommen dafür allerdings auch ein Smartphone mit sehr guter Ausstattung, in einigen Punkten wurde jedoch auf Hardware der teuren Modelle verzichtet. Ein Test von Tobias Költzsch (&lt;a href=&quot;https://www.golem.de/specials/iphone/&quot;&gt;iPhone&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/smartphone/&quot;&gt;Smartphone&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137327&amp;amp;page=1&amp;amp;ts=1540548180&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/handy/iphone-xr-im-test-apples-guenstigeres-iphone-ist-nicht-guenstig/121563,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 11:03:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137327-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137327-177418-177414_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Apple versucht es 2018 wieder einmal mit einem relativ preisgünstigen iPhone - weniger teuer als die Xs-Modelle, aber mit 850 Euro auch nicht gerade preiswert. Käufer bekommen dafür allerdings auch ein Smartphone mit sehr guter Ausstattung, in einigen Punkten wurde jedoch auf Hardware der teuren Modelle verzichtet. Ein Test von Tobias Költzsch (<a href="https://www.golem.de/specials/iphone/">iPhone</a>, <a href="https://www.golem.de/specials/smartphone/">Smartphone</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137327&amp;page=1&amp;ts=1540548180" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>169</slash:comments>
-        </item>
-        <item>
-            <title>Microsoft: PC-Spieleangebot des Xbox Game Pass wird erweitert</title>
-            <link>https://www.golem.de/news/microsoft-pc-spieleangebot-des-xbox-game-pass-wird-erweitert-1810-137343-rss.html</link>
-            <description>Der Xbox Game Pass soll künftig um mehr Angebote für Windows-PC erweitert werden, sagt Microsoft-Chef Satya Nadella. Derzeit gibt es für 10 Euro nur wenige plattformübergreifend verfügbare Spiele. (&lt;a href=&quot;https://www.golem.de/specials/xbox-one/&quot;&gt;Xbox One&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/microsoft/&quot;&gt;Microsoft&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137343&amp;amp;page=1&amp;amp;ts=1540546800&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/microsoft-pc-spieleangebot-des-xbox-game-pass-wird-erweitert/121562,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 10:40:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137343-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137343-177453-177450_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Der Xbox Game Pass soll künftig um mehr Angebote für Windows-PC erweitert werden, sagt Microsoft-Chef Satya Nadella. Derzeit gibt es für 10 Euro nur wenige plattformübergreifend verfügbare Spiele. (<a href="https://www.golem.de/specials/xbox-one/">Xbox One</a>, <a href="https://www.golem.de/specials/microsoft/">Microsoft</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137343&amp;page=1&amp;ts=1540546800" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>19</slash:comments>
-        </item>
-        <item>
-            <title>Breitbandgesellschaft: Grüne wollen Netzbetreiber zum Ausbau zwingen</title>
-            <link>https://www.golem.de/news/breitbandgesellschaft-gruene-wollen-netzbetreiber-zum-ausbau-zwingen-1810-137342-rss.html</link>
-            <description>Die Grünen haben die Netzversorgung in Deutschland analysiert. Die Partei, die zurzeit in Wählerumfragen stark zugewinnt, fordert den Breitbandausbau auf Kosten der Konzerne und will Glasfaser staatlich durchsetzen. (&lt;a href=&quot;https://www.golem.de/specials/breitband/&quot;&gt;Breitband&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/handy/&quot;&gt;Handy&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137342&amp;amp;page=1&amp;amp;ts=1540545840&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/politik-recht/breitbandgesellschaft-gruene-wollen-netzbetreiber-zum-ausbau-zwingen/121561,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 10:24:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137342-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1807/135605-169300-169297_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die Grünen haben die Netzversorgung in Deutschland analysiert. Die Partei, die zurzeit in Wählerumfragen stark zugewinnt, fordert den Breitbandausbau auf Kosten der Konzerne und will Glasfaser staatlich durchsetzen. (<a href="https://www.golem.de/specials/breitband/">Breitband</a>, <a href="https://www.golem.de/specials/handy/">Handy</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137342&amp;page=1&amp;ts=1540545840" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>22</slash:comments>
-        </item>
-        <item>
-            <title>Studie: Silicon Valley dient als rechte Hand des großen Bruders</title>
-            <link>https://www.golem.de/news/studie-silicon-valley-dient-als-rechte-hand-des-grossen-bruders-1810-137316-rss.html</link>
-            <description>Die US-Hightech-Branche verdingt sich zunehmend als technischer Dienstleister für staatliche Big-Brother-Projekte wie die Überwachung und Abschiebung von Immigranten, heißt es in einem Bericht von Bürgerrechtlern. Amazon und Palantir verdienten damit am meisten. Von Stefan Krempl (&lt;a href=&quot;https://www.golem.de/specials/datenschutz/&quot;&gt;Datenschutz&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/ibm/&quot;&gt;IBM&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137316&amp;amp;page=1&amp;amp;ts=1540543080&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/studie-silicon-valley-dient-als-rechte-hand-des-grossen-bruders/121560,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 09:38:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137316-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137316-177360-177357_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die US-Hightech-Branche verdingt sich zunehmend als technischer Dienstleister für staatliche Big-Brother-Projekte wie die Überwachung und Abschiebung von Immigranten, heißt es in einem Bericht von Bürgerrechtlern. Amazon und Palantir verdienten damit am meisten. Von Stefan Krempl (<a href="https://www.golem.de/specials/datenschutz/">Datenschutz</a>, <a href="https://www.golem.de/specials/ibm/">IBM</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137316&amp;page=1&amp;ts=1540543080" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>20</slash:comments>
-        </item>
-        <item>
-            <title>Bethesda: Postnukleare PC-Systemanforderungen für Fallout 76</title>
-            <link>https://www.golem.de/news/bethesda-postnukleare-pc-systemanforderungen-fuer-fallout-76-1810-137340-rss.html</link>
-            <description>Kurz vor dem Start der Betaversion für PC-Spieler hat Bethesda die Systemanforderung von Fallout 76 veröffentlicht. Hoffnungen auf lange Abenteuer in der Vorabversion gibt es aber zumindest nach den Erfahrungen des Xbox-Zugangs eher nicht. (&lt;a href=&quot;https://www.golem.de/specials/fallout-76/&quot;&gt;Fallout 76&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/rollenspiel/&quot;&gt;Rollenspiel&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137340&amp;amp;page=1&amp;amp;ts=1540542180&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/games/bethesda-postnukleare-pc-systemanforderungen-fuer-fallout-76/121559,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 09:23:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137340-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137340-177448-177445_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Kurz vor dem Start der Betaversion für PC-Spieler hat Bethesda die Systemanforderung von Fallout 76 veröffentlicht. Hoffnungen auf lange Abenteuer in der Vorabversion gibt es aber zumindest nach den Erfahrungen des Xbox-Zugangs eher nicht. (<a href="https://www.golem.de/specials/fallout-76/">Fallout 76</a>, <a href="https://www.golem.de/specials/rollenspiel/">Rollenspiel</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137340&amp;page=1&amp;ts=1540542180" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>101</slash:comments>
-        </item>
-        <item>
-            <title>Quartalszahlen: Intel legt 19-Milliarden-USD-Rekord vor</title>
-            <link>https://www.golem.de/news/quartalszahlen-intel-legt-19-milliarden-usd-rekord-vor-1810-137339-rss.html</link>
-            <description>Ungeachtet der 14-nm-Knappheit und diverser Sicherheitslücken konnte Intel im dritten Quartal 2018 mehr Umsatz erwirtschaften und mehr Gewinn erzielen als jemals zuvor. Vor allem das florierende Server-Geschäft wird bei Intel immer wichtiger. (&lt;a href=&quot;https://www.golem.de/specials/intel/&quot;&gt;Intel&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/cpu/&quot;&gt;Prozessor&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137339&amp;amp;page=1&amp;amp;ts=1540540260&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/quartalszahlen-intel-legt-19-milliarden-usd-rekord-vor/121558,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 08:51:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137339-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137339-177444-177441_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Ungeachtet der 14-nm-Knappheit und diverser Sicherheitslücken konnte Intel im dritten Quartal 2018 mehr Umsatz erwirtschaften und mehr Gewinn erzielen als jemals zuvor. Vor allem das florierende Server-Geschäft wird bei Intel immer wichtiger. (<a href="https://www.golem.de/specials/intel/">Intel</a>, <a href="https://www.golem.de/specials/cpu/">Prozessor</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137339&amp;page=1&amp;ts=1540540260" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>10</slash:comments>
-        </item>
-        <item>
-            <title>Physik: Weg mit der Schönheit!</title>
-            <link>https://www.golem.de/news/physik-weg-mit-der-schoenheit-1810-137161-rss.html</link>
-            <description>Ist eine Theorie richtig, nur weil sie schön ist? Nein, sagt Sabine Hossenfelder. In ihrem Buch &quot;Das hässliche Universum&quot; zeigt die theoretische Physikerin, wie das Schönheitsdenken die Wissenschaft lähmt und erklärt dabei recht unterhaltsam die unterschiedlichen Theorien und Modelle der Teilchenphysik. Eine Rezension von Friedemann Zweynert (&lt;a href=&quot;https://www.golem.de/specials/physik/&quot;&gt;Physik&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/internet/&quot;&gt;Internet&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137161&amp;amp;page=1&amp;amp;ts=1540537380&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/internet/physik-weg-mit-der-schoenheit/121557,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 08:03:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137161-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137161-176716-176713_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Ist eine Theorie richtig, nur weil sie schön ist? Nein, sagt Sabine Hossenfelder. In ihrem Buch "Das hässliche Universum" zeigt die theoretische Physikerin, wie das Schönheitsdenken die Wissenschaft lähmt und erklärt dabei recht unterhaltsam die unterschiedlichen Theorien und Modelle der Teilchenphysik. Eine Rezension von Friedemann Zweynert (<a href="https://www.golem.de/specials/physik/">Physik</a>, <a href="https://www.golem.de/specials/internet/">Internet</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137161&amp;page=1&amp;ts=1540537380" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>86</slash:comments>
-        </item>
-        <item>
-            <title>Elon Musk: Teslas Model 3 für 35.000 US-Dollar derzeit unmöglich</title>
-            <link>https://www.golem.de/news/elon-musk-teslas-model-3-fuer-35-000-us-dollar-derzeit-unmoeglich-1810-137335-rss.html</link>
-            <description>Tesla-Chef Elon Musk hat eingeräumt, das bei 35.000 US-Dollar startende Basismodell des Elektroautos Model 3 immer noch nicht liefern zu können. (&lt;a href=&quot;https://www.golem.de/specials/tesla-model-3/&quot;&gt;Tesla Model 3&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/technologie/&quot;&gt;Technologie&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137335&amp;amp;page=1&amp;amp;ts=1540533540&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/automobil/elon-musk-teslas-model-3-fuer-35.000-us-dollar-derzeit-unmoeglich/121556,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 06:59:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137335-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137335-177428-177424_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Tesla-Chef Elon Musk hat eingeräumt, das bei 35.000 US-Dollar startende Basismodell des Elektroautos Model 3 immer noch nicht liefern zu können. (<a href="https://www.golem.de/specials/tesla-model-3/">Tesla Model 3</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137335&amp;page=1&amp;ts=1540533540" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>235</slash:comments>
-        </item>
-        <item>
-            <title>Solarzellen als Dach: Tesla-Solarschindeln verzögern sich bis 2019</title>
-            <link>https://www.golem.de/news/solarzellen-als-dach-tesla-solarschindeln-verzoegern-sich-auf-2019-1810-137334-rss.html</link>
-            <description>Tesla wird die Serienproduktion seiner Solardachziegel nicht mehr wie geplant in diesem Jahr starten. Nach Angaben von Firmenchef Elon Musk verschiebt sich das Vorhaben auf 2019. (&lt;a href=&quot;https://www.golem.de/specials/solarenergie/&quot;&gt;Solarenergie&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/technologie/&quot;&gt;Technologie&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137334&amp;amp;page=1&amp;amp;ts=1540532460&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wissenschaft/solarzellen-als-dach-tesla-solarschindeln-verzoegern-sich-bis-2019/121555,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 06:41:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137334-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1705/127761-139613-i_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Tesla wird die Serienproduktion seiner Solardachziegel nicht mehr wie geplant in diesem Jahr starten. Nach Angaben von Firmenchef Elon Musk verschiebt sich das Vorhaben auf 2019. (<a href="https://www.golem.de/specials/solarenergie/">Solarenergie</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137334&amp;page=1&amp;ts=1540532460" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>47</slash:comments>
-        </item>
-        <item>
-            <title>Uniti One: Elektroauto für 15.000 Euro wird in Großbritannien gebaut</title>
-            <link>https://www.golem.de/news/uniti-one-elektroauto-fuer-15-000-euro-wird-in-grossbritannien-gebaut-1810-137333-rss.html</link>
-            <description>Das schwedische Unternehmen Uniti will sein Elektroauto One in Großbritannien bauen. Einen fahrenden Prototyp des Uniti One gibt es schon. Das Auto soll je nach Modell für 15.000 bis 20.000 Euro auf den Markt kommen. (&lt;a href=&quot;https://www.golem.de/specials/elektroauto/&quot;&gt;Elektroauto&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/technologie/&quot;&gt;Technologie&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137333&amp;amp;page=1&amp;amp;ts=1540531080&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/automobil/uniti-one-elektroauto-fuer-15.000-euro-wird-in-grossbritannien-gebaut/121554,list.html</comments>
-            <pubDate>Fri, 26 Oct 2018 06:18:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137333-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1805/134432-163131-163128_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Das schwedische Unternehmen Uniti will sein Elektroauto One in Großbritannien bauen. Einen fahrenden Prototyp des Uniti One gibt es schon. Das Auto soll je nach Modell für 15.000 bis 20.000 Euro auf den Markt kommen. (<a href="https://www.golem.de/specials/elektroauto/">Elektroauto</a>, <a href="https://www.golem.de/specials/technologie/">Technologie</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137333&amp;page=1&amp;ts=1540531080" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>28</slash:comments>
-        </item>
-        <item>
-            <title>Quartalsbericht: Alphabet macht in drei Monaten 9,2 Milliarden Dollar Gewinn</title>
-            <link>https://www.golem.de/news/quartalsbericht-alphabet-macht-in-drei-monaten-9-2-milliarden-dollar-gewinn-1810-137337-rss.html</link>
-            <description>Alphabet erwirtschaftet weiter extrem hohe Gewinne, der Umsatz wächst nicht ganz so stark. Google muss zugleich auf eine Enthüllung in der US-Presse zu sexueller Belästigung um Android-Begründer Andy Rubin reagieren. (&lt;a href=&quot;https://www.golem.de/specials/google/&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/boerse/&quot;&gt;Börse&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137337&amp;amp;page=1&amp;amp;ts=1540504320&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/quartalsbericht-alphabet-macht-in-drei-monaten-9-2-milliarden-dollar-gewinn/121553,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 22:52:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137337-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137053-176114-176111_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Alphabet erwirtschaftet weiter extrem hohe Gewinne, der Umsatz wächst nicht ganz so stark. Google muss zugleich auf eine Enthüllung in der US-Presse zu sexueller Belästigung um Android-Begründer Andy Rubin reagieren. (<a href="https://www.golem.de/specials/google/">Google</a>, <a href="https://www.golem.de/specials/boerse/">Börse</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137337&amp;page=1&amp;ts=1540504320" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>12</slash:comments>
-        </item>
-        <item>
-            <title>Quartalsbericht: Amazon verfehlt die Umsatzprognosen</title>
-            <link>https://www.golem.de/news/quartalsbericht-amazon-verfehlt-die-umsatzprognosen-1810-137336-rss.html</link>
-            <description>Amazon weist erneut einen hohen Gewinn aus. Doch der Konzern lag beim Umsatz unter den Prognosen der Analysten. (&lt;a href=&quot;https://www.golem.de/specials/amazon/&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/onlineshop/&quot;&gt;Onlineshop&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137336&amp;amp;page=1&amp;amp;ts=1540500780&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/quartalsbericht-amazon-verfehlt-die-umsatzprognosen/121552,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 21:53:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137336-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137336-177432-177429_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Amazon weist erneut einen hohen Gewinn aus. Doch der Konzern lag beim Umsatz unter den Prognosen der Analysten. (<a href="https://www.golem.de/specials/amazon/">Amazon</a>, <a href="https://www.golem.de/specials/onlineshop/">Onlineshop</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137336&amp;page=1&amp;ts=1540500780" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>24</slash:comments>
-        </item>
-        <item>
-            <title>Datenskandal: Britische Datenschutzbehörde verurteilt Facebook</title>
-            <link>https://www.golem.de/news/datenskandal-britische-datenschutzbehoerde-verurteilt-facebook-1810-137332-rss.html</link>
-            <description>Im Skandal um Cambridge Analytica hat die britische Datenschutzbehörde die Höchststrafe von 500.000 Pfund verhängt. Facebook habe einen schweren Verstoß gegen geltendes Recht zugelassen. (&lt;a href=&quot;https://www.golem.de/specials/facebook/&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/socialnetwork/&quot;&gt;Soziales Netz&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137332&amp;amp;page=1&amp;amp;ts=1540483080&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/datenskandal-britische-datenschutzbehoerde-verurteilt-facebook/121550,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 16:58:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137332-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137332-177420-177419_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Im Skandal um Cambridge Analytica hat die britische Datenschutzbehörde die Höchststrafe von 500.000 Pfund verhängt. Facebook habe einen schweren Verstoß gegen geltendes Recht zugelassen. (<a href="https://www.golem.de/specials/facebook/">Facebook</a>, <a href="https://www.golem.de/specials/socialnetwork/">Soziales Netz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137332&amp;page=1&amp;ts=1540483080" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>35</slash:comments>
-        </item>
-        <item>
-            <title>Corsair: Neue K70 MK.2 kommt mit Cherrys Low-Profile-Switches</title>
-            <link>https://www.golem.de/news/corsair-neue-k70-mk-2-kommt-mit-cherrys-low-profile-switches-1810-137331-rss.html</link>
-            <description>Corsair erweitert sein Tastaturportefeuille um zwei Gaming-Tastaturen mit Cherrys flachen Low-Profile-Switches. Ein Modell hat Schalter mit einem besonders kurzem Auslöseweg von 1 mm - die Schalter darf Corsair exklusiv verwenden. (&lt;a href=&quot;https://www.golem.de/specials/corsair/&quot;&gt;Corsair&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/eingabegeraet/&quot;&gt;Eingabegerät&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137331&amp;amp;page=1&amp;amp;ts=1540480320&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/sonstiges/corsair-neue-k70-mk.2-kommt-mit-cherrys-low-profile-switches/121549,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 16:12:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137331-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137331-177413-177410_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Corsair erweitert sein Tastaturportefeuille um zwei Gaming-Tastaturen mit Cherrys flachen Low-Profile-Switches. Ein Modell hat Schalter mit einem besonders kurzem Auslöseweg von 1 mm - die Schalter darf Corsair exklusiv verwenden. (<a href="https://www.golem.de/specials/corsair/">Corsair</a>, <a href="https://www.golem.de/specials/eingabegeraet/">Eingabegerät</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137331&amp;page=1&amp;ts=1540480320" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>19</slash:comments>
-        </item>
-        <item>
-            <title>Cambridge-Analytica-Skandal: EU-Parlament fordert schärfere Kontrolle von Facebook</title>
-            <link>https://www.golem.de/news/cambridge-analytica-skandal-eu-parlament-fordert-schaerfere-kontrolle-von-facebook-1810-137329-rss.html</link>
-            <description>Die EU-Abgeordneten haben als Reaktion auf die Datenschutzverstöße von Facebook und Cambridge Analytica Behörden angehalten, ihre Aktivitäten auf dem Netzwerk zu überdenken. Profiling zu politischen Zwecken wollen sie verbieten. Von Stefan Krempl (&lt;a href=&quot;https://www.golem.de/specials/facebook/&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/socialnetwork/&quot;&gt;Soziales Netz&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137329&amp;amp;page=1&amp;amp;ts=1540479120&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/cambridge-analytica-skandal-eu-parlament-fordert-schaerfere-kontrolle-von-facebook/121548,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 15:52:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137329-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137329-177404-177403_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die EU-Abgeordneten haben als Reaktion auf die Datenschutzverstöße von Facebook und Cambridge Analytica Behörden angehalten, ihre Aktivitäten auf dem Netzwerk zu überdenken. Profiling zu politischen Zwecken wollen sie verbieten. Von Stefan Krempl (<a href="https://www.golem.de/specials/facebook/">Facebook</a>, <a href="https://www.golem.de/specials/socialnetwork/">Soziales Netz</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137329&amp;page=1&amp;ts=1540479120" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>3</slash:comments>
-        </item>
-        <item>
-            <title>Kuriosum: Das Hellgate London öffnet sich mal wieder</title>
-            <link>https://www.golem.de/news/kuriosum-das-hellgate-london-oeffnet-sich-mal-wieder-1810-137328-rss.html</link>
-            <description>Einer der großen Trash-Klassiker der Spielegeschichte wagt einen neuen Anlauf: Mitte November 2018 soll ein neue, für Einzelspieler ausgelegte Windows-Fassung von Hellgate London erscheinen. Das Ursprungskonzept hatten sich ehemalige Blizzard-Chefentwickler ausgedacht. (&lt;a href=&quot;https://www.golem.de/specials/rollenspiel/&quot;&gt;Rollenspiel&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/steam/&quot;&gt;Steam&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137328&amp;amp;page=1&amp;amp;ts=1540476600&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/games/kuriosum-das-hellgate-london-oeffnet-sich-mal-wieder/121547,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 15:10:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137328-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137328-177396-177392_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Einer der großen Trash-Klassiker der Spielegeschichte wagt einen neuen Anlauf: Mitte November 2018 soll ein neue, für Einzelspieler ausgelegte Windows-Fassung von Hellgate London erscheinen. Das Ursprungskonzept hatten sich ehemalige Blizzard-Chefentwickler ausgedacht. (<a href="https://www.golem.de/specials/rollenspiel/">Rollenspiel</a>, <a href="https://www.golem.de/specials/steam/">Steam</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137328&amp;page=1&amp;ts=1540476600" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>61</slash:comments>
-        </item>
-        <item>
-            <title>Tweether: 10 GBit/s über einen Quadratkilometer verteilt</title>
-            <link>https://www.golem.de/news/tweether-10-gbit-s-ueber-einen-quadratkilometer-verteilt-1810-137326-rss.html</link>
-            <description>Eine neue Technologie verteilt 10 GBit/s über eine große Fläche. Der erste Feldversuch ist erfolgreich verlaufen. Zum ersten Mal wurde ein stabiles drahtloses Netzwerk bei diesen Frequenzen und mit diesen Datenraten betrieben. (&lt;a href=&quot;https://www.golem.de/specials/wissenschaft/&quot;&gt;Wissenschaft&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/mobil/&quot;&gt;Mobil&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137326&amp;amp;page=1&amp;amp;ts=1540475400&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wissenschaft/tweether-10-gbit-s-ueber-einen-quadratkilometer-verteilt/121546,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 14:50:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137326-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137326-177391-177388_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Eine neue Technologie verteilt 10 GBit/s über eine große Fläche. Der erste Feldversuch ist erfolgreich verlaufen. Zum ersten Mal wurde ein stabiles drahtloses Netzwerk bei diesen Frequenzen und mit diesen Datenraten betrieben. (<a href="https://www.golem.de/specials/wissenschaft/">Wissenschaft</a>, <a href="https://www.golem.de/specials/mobil/">Mobil</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137326&amp;page=1&amp;ts=1540475400" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>20</slash:comments>
-        </item>
-        <item>
-            <title>Red Dead Redemption 2: Saloon-Prügelei (der Worte) im Livestream</title>
-            <link>https://www.golem.de/news/red-dead-redemption-2-saloon-pruegelei-der-worte-im-livestream-1810-137312-rss.html</link>
-            <description> Die Golem.de-Redakteure Peter Steinlechner und Michael Wieczorek diskutieren gemeinsam mit unserer Community über den Test zu Red Dead Redemption 2 live ab 18 Uhr. (&lt;a href=&quot;https://www.golem.de/specials/red-dead-redemption-2/&quot;&gt;Red Dead Redemption 2&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/spieletest/&quot;&gt;Spieletest&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137312&amp;amp;page=1&amp;amp;ts=1540474200&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/games/red-dead-redemption-2-saloon-pruegelei-der-worte-im-livestream/121545,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 14:30:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137312-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137312-177341-177338_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left"> Die Golem.de-Redakteure Peter Steinlechner und Michael Wieczorek diskutieren gemeinsam mit unserer Community über den Test zu Red Dead Redemption 2 live ab 18 Uhr. (<a href="https://www.golem.de/specials/red-dead-redemption-2/">Red Dead Redemption 2</a>, <a href="https://www.golem.de/specials/spieletest/">Spieletest</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137312&amp;page=1&amp;ts=1540474200" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments />
-        </item>
-        <item>
-            <title>Wolf Intelligence: Trojanerfirma aus Deutschland lässt interne Daten im Netz</title>
-            <link>https://www.golem.de/news/wolf-intelligence-trojanerfirma-aus-deutschland-laesst-interne-daten-im-netz-1810-137323-rss.html</link>
-            <description>Wolf Intelligence verkauft Schadsoftware an Staaten. Eine Sicherheitsfirma hat sensible Daten des Unternehmens öffentlich zugänglich im Internet gefunden. In einer Präsentation wurden die Funde gezeigt. (&lt;a href=&quot;https://www.golem.de/specials/trojaner/&quot;&gt;Trojaner&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/virus/&quot;&gt;Virus&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137323&amp;amp;page=1&amp;amp;ts=1540472400&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/wolf-intelligence-trojanerfirma-aus-deutschland-laesst-interne-daten-im-netz/121543,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 14:00:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137323-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137323-177383-177380_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Wolf Intelligence verkauft Schadsoftware an Staaten. Eine Sicherheitsfirma hat sensible Daten des Unternehmens öffentlich zugänglich im Internet gefunden. In einer Präsentation wurden die Funde gezeigt. (<a href="https://www.golem.de/specials/trojaner/">Trojaner</a>, <a href="https://www.golem.de/specials/virus/">Virus</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137323&amp;page=1&amp;ts=1540472400" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>16</slash:comments>
-        </item>
-        <item>
-            <title>NBN: Der Top-Nutzer verwendet 24 TByte im Monat</title>
-            <link>https://www.golem.de/news/nbn-der-top-nutzer-verwendet-24-tbyte-im-monat-1810-137324-rss.html</link>
-            <description> Ein staatliches FTTH-Netzwerk für fast alle in Australien bis 2017 war einst das Ziel. Doch davon ist beim (NBN) National Broadband Network nicht mehr viel übrig geblieben. In Berlin wurde eine Zwischenbilanz gezogen. (&lt;a href=&quot;https://www.golem.de/specials/festnetz/&quot;&gt;Festnetz&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/dsl/&quot;&gt;DSL&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137324&amp;amp;page=1&amp;amp;ts=1540471380&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/internet/nbn-der-top-nutzer-verwendet-24-tbyte-im-monat/121542,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 13:43:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137324-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137324-177387-177384_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left"> Ein staatliches FTTH-Netzwerk für fast alle in Australien bis 2017 war einst das Ziel. Doch davon ist beim (NBN) National Broadband Network nicht mehr viel übrig geblieben. In Berlin wurde eine Zwischenbilanz gezogen. (<a href="https://www.golem.de/specials/festnetz/">Festnetz</a>, <a href="https://www.golem.de/specials/dsl/">DSL</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137324&amp;page=1&amp;ts=1540471380" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>51</slash:comments>
-        </item>
-        <item>
-            <title>Linux-Kernel: Mit Machine Learning auf der Suche nach Bug-Fixes</title>
-            <link>https://www.golem.de/news/linux-kernel-mit-machine-learning-auf-der-suche-nach-bug-fixes-1810-137321-rss.html</link>
-            <description>Wichtige Patches, die in stabilen Kernel-Versionen landen sollten, werden von der Linux-Community oft vergessen oder übersehen. Abhilfe schaffen soll offenbar Machine Learning, wie die Entwickler Sasha Levin und Julia Lawall erklären. (&lt;a href=&quot;https://www.golem.de/specials/linux-kernel/&quot;&gt;Linux-Kernel&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/linux/&quot;&gt;Linux&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137321&amp;amp;page=1&amp;amp;ts=1540468800&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/security/linux-kernel-mit-machine-learning-auf-der-suche-nach-bug-fixes/121541,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 13:00:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137321-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137321-177375-177372_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Wichtige Patches, die in stabilen Kernel-Versionen landen sollten, werden von der Linux-Community oft vergessen oder übersehen. Abhilfe schaffen soll offenbar Machine Learning, wie die Entwickler Sasha Levin und Julia Lawall erklären. (<a href="https://www.golem.de/specials/linux-kernel/">Linux-Kernel</a>, <a href="https://www.golem.de/specials/linux/">Linux</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137321&amp;page=1&amp;ts=1540468800" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>4</slash:comments>
-        </item>
-        <item>
-            <title>Quartalszahlen: AMDs Aktie gibt wegen mäßiger Aussichten nach</title>
-            <link>https://www.golem.de/news/quartalszahlen-amds-aktie-gibt-wegen-maessiger-aussichten-nach-1810-137320-rss.html</link>
-            <description>Im dritten Quartal 2018 konnte AMD zwar Umsatz und Gewinn steigern, aber nicht so stark wie erwartet. Die Aktie brach dennoch von über 25 US-Dollar auf 17 US-Dollar ein, da das vierte Quartal schlechter laufen wird als von den Anlegern gedacht - hier wurde zu viel erwartet. (&lt;a href=&quot;https://www.golem.de/specials/amd/&quot;&gt;AMD&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/cpu/&quot;&gt;Prozessor&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137320&amp;amp;page=1&amp;amp;ts=1540467600&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/wirtschaft/quartalszahlen-amds-aktie-gibt-wegen-maessiger-aussichten-nach/121540,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 12:40:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137320-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137320-177379-177376_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Im dritten Quartal 2018 konnte AMD zwar Umsatz und Gewinn steigern, aber nicht so stark wie erwartet. Die Aktie brach dennoch von über 25 US-Dollar auf 17 US-Dollar ein, da das vierte Quartal schlechter laufen wird als von den Anlegern gedacht - hier wurde zu viel erwartet. (<a href="https://www.golem.de/specials/amd/">AMD</a>, <a href="https://www.golem.de/specials/cpu/">Prozessor</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137320&amp;page=1&amp;ts=1540467600" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>17</slash:comments>
-        </item>
-        <item>
-            <title>Projekt Broadband: Bahn will 3,5 Milliarden Euro vom Bund für Glasfasernetz</title>
-            <link>https://www.golem.de/news/projekt-broadband-bahn-will-3-5-milliarden-euro-vom-bund-fuer-glasfasernetz-1810-137322-rss.html</link>
-            <description>Die Pläne für das eigene Glasfasernetz der Deutschen Bahn werden konkret. Über die Finanzierung redet man jetzt mit der Regierung. Das Netz soll schnell gebaut werden. (&lt;a href=&quot;https://www.golem.de/specials/deutsche-bahn/&quot;&gt;Deutsche Bahn&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/umts/&quot;&gt;UMTS&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137322&amp;amp;page=1&amp;amp;ts=1540466580&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/internet/projekt-broadband-bahn-will-3-5-milliarden-euro-vom-bund-fuer-glasfasernetz/121539,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 12:23:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137322-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1808/136062-171340-171337_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Die Pläne für das eigene Glasfasernetz der Deutschen Bahn werden konkret. Über die Finanzierung redet man jetzt mit der Regierung. Das Netz soll schnell gebaut werden. (<a href="https://www.golem.de/specials/deutsche-bahn/">Deutsche Bahn</a>, <a href="https://www.golem.de/specials/umts/">UMTS</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137322&amp;page=1&amp;ts=1540466580" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>31</slash:comments>
-        </item>
-        <item>
-            <title>Red Dead Redemption 2 im Test: Der Revolverhelden-Simulator</title>
-            <link>https://www.golem.de/news/red-dead-redemption-2-im-test-der-revolverhelden-simulator-1810-137304-rss.html</link>
-            <description>Reiten, prügeln, kochen, jagen, schießen, böse sein oder (relativ) brav: In Red Dead Redemption 2 gibt es enorme Möglichkeiten, sich als Revolverheld in einer wunderschönen Westernwelt auszuleben. Das Actionspiel von Rockstar Games ist ein großer Spaß - aber nicht ganz so gut wie GTA 5. Von Peter Steinlechner (&lt;a href=&quot;https://www.golem.de/specials/red-dead-redemption-2/&quot;&gt;Red Dead Redemption 2&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/spieletest/&quot;&gt;Spieletest&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137304&amp;amp;page=1&amp;amp;ts=1540465260&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/games/red-dead-redemption-2-im-test-der-revolverhelden-simulator/121537,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 12:01:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137304-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137304-177303-177300_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Reiten, prügeln, kochen, jagen, schießen, böse sein oder (relativ) brav: In Red Dead Redemption 2 gibt es enorme Möglichkeiten, sich als Revolverheld in einer wunderschönen Westernwelt auszuleben. Das Actionspiel von Rockstar Games ist ein großer Spaß - aber nicht ganz so gut wie GTA 5. Von Peter Steinlechner (<a href="https://www.golem.de/specials/red-dead-redemption-2/">Red Dead Redemption 2</a>, <a href="https://www.golem.de/specials/spieletest/">Spieletest</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137304&amp;page=1&amp;ts=1540465260" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>107</slash:comments>
-        </item>
-        <item>
-            <title>Xiaomi: Das Mi Mix 3 hat keine Notch und eine versteckte Frontkamera</title>
-            <link>https://www.golem.de/news/xiaomi-das-mi-mix-3-hat-keine-notch-und-eine-versteckte-frontkamera-1810-137319-rss.html</link>
-            <description>Das Display von Xiaomis angekündigtem Smartphone Mi Mix 3 ist nahezu randlos. Die Frontkamera versteckt das Gerät hinter der aufschiebbaren Schale. Neu ist zudem, dass Xiaomi ein OLED-Panel verbaut und wieder den Qi-Ladestandard nutzt. (&lt;a href=&quot;https://www.golem.de/specials/xiaomi/&quot;&gt;Xiaomi&lt;/a&gt;, &lt;a href=&quot;https://www.golem.de/specials/smartphone/&quot;&gt;Smartphone&lt;/a&gt;) &lt;img src=&quot;https://cpx.golem.de/cpx.php?class=17&amp;amp;aid=137319&amp;amp;page=1&amp;amp;ts=1540464540&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
-            <comments>https://forum.golem.de/kommentare/handy/xiaomi-das-mi-mix-3-hat-keine-notch-und-eine-versteckte-frontkamera/121536,list.html</comments>
-            <pubDate>Thu, 25 Oct 2018 11:49:00 +0100</pubDate>
-            <guid>https://www.golem.de/1810/137319-rss.html</guid>
-            <content:encoded><![CDATA[<img src="https://www.golem.de/1810/137319-177371-177370_rc.jpg" width="140" height="140" vspace="3" hspace="8" align="left">Das Display von Xiaomis angekündigtem Smartphone Mi Mix 3 ist nahezu randlos. Die Frontkamera versteckt das Gerät hinter der aufschiebbaren Schale. Neu ist zudem, dass Xiaomi ein OLED-Panel verbaut und wieder den Qi-Ladestandard nutzt. (<a href="https://www.golem.de/specials/xiaomi/">Xiaomi</a>, <a href="https://www.golem.de/specials/smartphone/">Smartphone</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=137319&amp;page=1&amp;ts=1540464540" alt="" width="1" height="1" />]]></content:encoded>
-            <slash:comments>125</slash:comments>
-        </item>
-    </channel>
-</rss>

+ 0 - 79
internal/http/client/testdata/content-type-only-win-8859-1.xml

@@ -1,79 +0,0 @@
-<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<channel>
-	<title>Flux RSS du magazine de psychologie Le Cercle Psy</title>
-	<link>https://le-cercle-psy.scienceshumaines.com/rss</link>
-	<description>Flux RSS du magazine de psychologie Le Cercle Psy, le magazine de toutes les psychologies.</description>
-	<copyright>Le Cercle Psy</copyright>
-	
-			<item>
-				<title>Perturbateurs endocriniens : quels effets sur le cerveau ?</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/perturbateurs-endocriniens-quels-effets-sur-le-cerveau_sh_39995</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Si leur impact semble discret au premier abord, nombre d'études montrent que les perturbateurs endocriniens pourraient être à l'origine de troubles neuro-développementaux chez l'enfant.</description>
-			</item>
-						
-			<item>
-				<title>Masters en Psycho : une simplificationet#8230; très complexe </title>
-				<link>https://le-cercle-psy.scienceshumaines.com/masters-en-psycho-une-simplification-tres-complexe_sh_40065</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Une nouvelle nomenclature adoptée en 2014 a voulu simplifier les options proposées aux étudiants en Master de Psychologie. Mais on en revient à des choix aussi illisibles qu'auparavant !</description>
-			</item>
-				
-			<item>
-				<title>La criminalité liée surtout à... l'ennui ?</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/la-criminalite-liee-surtout-a-l-ennui_sh_39986</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>« L'oisiveté est mère de tous les vices », dit le proverbe... Certains chercheurs américains paraissent proches de cette position !</description>
-			</item>
-				
-			<item>
-				<title></title>
-				<link></link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description></description>
-			</item>
-						
-			<item>
-				<title>Caroline Eliacheff : « Dolto reste authentiquement subversive »</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/caroline-eliacheff-dolto-reste-authentiquement-subversive_sh_39992</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Françoise Dolto est morte il y a trente ans. D'abord adulée par des générations de parents et de collègues, on lui a ensuite reproché d'avoir favorisé l'émergence d'enfants-rois tyranniques. Et s'il existait une autre voie ?</description>
-			</item>
-						
-			<item>
-				<title>L'enfant doué : quand trop comprendre... empêche parfois de comprendre</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/l-enfant-doue-quand-trop-comprendre-empeche-parfois-de-comprendre_sh_40004</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>On ne le répètera jamais assez : réaliser le portrait-robot d'un enfant « doué », « surdoué », « à haut potentiel », peu importe la qualification choisie, est vain. Cet ouvrage nous rappelle que chaque facilité, talent, compétence ou même don, peut s'accompagner d'un versant potentiellement plus problématique. Mais insistons : potentiellement.</description>
-			</item>
-								
-			<item>
-				<title>Travail, organisations, emploi : les modèles européens</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/travail-organisations-emploi-les-modeles-europeens_sh_33090</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Les pays européens diffèrent en matière de performance, de niveau de chômage et de qualité de vie au travail. Certains pays réussissent mieux que d'autres et sont pris comme «modèles». Comment font-ils?</description>
-			</item>
-						
-			<item>
-				<title>Migrants : l'urgence thérapeutique</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/migrants-l-urgence-therapeutique_sh_39180</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Poussés à l'exil par les conflits, la pauvreté et l'espoir d'une vie meilleure, les migrants arrivent après un long parcours. Beaucoup sont blessés, brisés, désespérés parfois. Quelle réponse pour les aider ?</description>
-			</item>
-				
-			<item>
-				<title>Psy en prison, une mission impossible ?</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/psy-en-prison-une-mission-impossible_sh_38718</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Détenus proches de la psychose, manque cruel de moyens, hiérarchie intrusive... Les praticiens intervenant en prison n'ont pas un quotidien facile. Retour sur un sacerdoce des temps modernes.</description>
-			</item>
-				
-			<item>
-				<title>Psychologue à domicile : de la clinique à l'état brut</title>
-				<link>https://le-cercle-psy.scienceshumaines.com/psychologue-a-domicile-de-la-clinique-a-l-etat-brut_sh_35540</link>
-				<pubDate>Wed, 17 Oct 2018 10:30:00 GMT</pubDate>
-				<description>Si tu ne peux pas venir au psychologue, le psychologue viendra à toi ! L'intervention à domicile demeure une pratique encore peu répandue chez les psys. En quoi diffère-t-elle d'une consultation ordinaire ?</description>
-			</item>
-					</channel>
-</rss>
-

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 520
internal/http/client/testdata/gb2312.html


+ 0 - 48
internal/http/client/testdata/meta-charset-attribute.html

@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta charset="iso-8859-15"> <title>meta charset attribute</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="The character encoding of the page can be set by a meta element with charset attribute.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css">
-</head>
-<body>
-<p class='title'>meta charset attribute</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">The character encoding of the page can be set by a meta element with charset attribute.</p>
-<div class="notes"><p><p>The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00C3;&#x0153;&#x00C3;&#x20AC;&#x00C3;&#x0161;</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-015">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-009<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-009" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 48
internal/http/client/testdata/meta-content-attribute.html

@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html  lang="en" >
-<head>
- <meta http-equiv="content-type" content="text/html; charset=iso-8859-15"> <title>meta content attribute</title>
-<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
-<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'>
-<link rel="stylesheet" type="text/css" href="./generatedtests.css">
-<script src="http://w3c-test.org/resources/testharness.js"></script>
-<script src="http://w3c-test.org/resources/testharnessreport.js"></script>
-<meta name='flags' content='http'>
-<meta name="assert" content="The character encoding of the page can be set by a meta element with http-equiv and content attributes.">
-<style type='text/css'>
-.test div { width: 50px; }</style>
-<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css">
-</head>
-<body>
-<p class='title'>meta content attribute</p>
-
-
-<div id='log'></div>
-
-
-<div class='test'><div id='box' class='ýäè'>&#xA0;</div></div>
-
-
-
-
-
-<div class='description'>
-<p class="assertion" title="Assertion">The character encoding of the page can be set by a meta element with http-equiv and content attributes.</p>
-<div class="notes"><p><p>The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.&#x00C3;&#x0153;&#x00C3;&#x20AC;&#x00C3;&#x0161;</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p>
-</div>
-</div>
-<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-009">Next test</a></div><div class="doctype">HTML5</div>
-<p class="jump">the-input-byte-stream-007<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary &amp; related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-007" target="_blank">Detailed results for this test</a><br/>	<a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p>
-<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li>
-				<li>The test is read from a server that supports HTTP.</li></ul></div>
-</div>
-<script>
-test(function() {
-assert_equals(document.getElementById('box').offsetWidth, 100);
-}, " ");
-</script>
-
-</body>
-</html>
-
-

+ 0 - 374
internal/http/client/testdata/rdf_utf8.xml

@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">
-	<channel>
- 	 <title>heise online News</title>
- 	 <link>https://www.heise.de/newsticker/</link>
- 	 <description>Nachrichten nicht nur aus der Welt der Computer</description>
-	</channel>
-
-
-	<item>
-		<title>OLED-TVs: Vorsichtsmaßnahmen gegen Einbrennen</title>
-		<link>https://www.heise.de/newsticker/meldung/OLED-TVs-Vorsichtsmassnahmen-gegen-Einbrennen-4205274.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Wer gerade einen neuen OLED-Fernseher gekauft hat oder sich zu Weihnachten einen zuzulegen möchte, sollte unbedingt ein paar Hinweise beachten.</description>
-	</item>
-
-	<item>
-		<title>Mega-Deal: IBM übernimmt Red Hat</title>
-		<link>https://www.heise.de/newsticker/meldung/Mega-Deal-IBM-uebernimmt-Red-Hat-4205582.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Giganten-Hochzeit in den USA: Der Computerkonzern IBM übernimmt den Open-Source-Anbieter Red Hat für umgerechnet 30 Milliarden Euro.</description>
-	</item>
-
-	<item>
-		<title>Fortnite-Macher: Epic Games soll 15 Milliarden Dollar wert sein</title>
-		<link>https://www.heise.de/newsticker/meldung/Fortnite-Macher-Epic-Games-soll-15-Milliarden-Dollar-wert-sein-4205522.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Epic Games konnte bei einer Investionsrunde einige neue Geldgeber von sich überzeugen. Insgesamt flossen 1,25 Milliarden US-Dollar.</description>
-	</item>
-
-	<item>
-		<title>Erster nichtstaatlicher Raketenstart in China fehlgeschlagen</title>
-		<link>https://www.heise.de/newsticker/meldung/Erster-nichtstaatlicher-Rekatenstart-in-China-fehlgeschlagen-4205524.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Trägerrakete ZQ-1 hat es wegen unbekannter technischer Probleme nach dem Start nicht in die Erdumlaufbahn geschafft.</description>
-	</item>
-
-	<item>
-		<title>eARC: Immer mehr Hersteller schalten HDMI-Audio-Rückkanal frei</title>
-		<link>https://www.heise.de/newsticker/meldung/eARC-Hersteller-schalten-HDMI-Audio-Rueckkanal-frei-4205518.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Während andere HDMI-2.1-Funktionen auf sich warten lassen, ist der &quot;enhanced Audio Return Channel&quot; nach einem Firmware-Update schon bei AV-Receivern nutzbar.</description>
-	</item>
-
-	<item>
-		<title>Vorschau: Neue PC-Spiele im November 2018</title>
-		<link>https://www.heise.de/newsticker/meldung/Vorschau-Neue-PC-Spiele-im-November-2018-4202098.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Jeden Monat schicken Spiele-Hersteller zahlreiche neue Titel ins Rennen. Wir haben die wichtigsten Spiele-Neuerscheinungen im November herausgesucht.</description>
-	</item>
-
-	<item>
-		<title>Israelisches Start-up baut faltbares Elektroauto</title>
-		<link>https://www.heise.de/newsticker/meldung/Israelisches-Start-up-baut-faltbares-Elektroauto-4205501.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das zweisitzige Auto kann sein Fahrgestell zum Parken einklappen und passt dann auf einen Motorradparkplatz.</description>
-	</item>
-
-	<item>
-		<title>Flash-Speicher: WD will Produktion einschränken</title>
-		<link>https://www.heise.de/newsticker/meldung/Flash-Speicher-WD-will-Produktion-einschraenken-4205498.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Preise für NAND-Flash-Speicher kennen derzeit nur eine Richtung: abwärts. WD will dem mit Produktionseinschränkungen begegnen.</description>
-	</item>
-
-	<item>
-		<title>LED-Tastatur Aukey KM-G6 im Test: mechanisch, günstig und laut</title>
-		<link>https://www.techstage.de/news/Mechanische-Tastatur-Aukey-KM-G6-im-Test-guenstig-und-laut-4205068.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Aukey KM-G6 kostet weniger als 50 Euro und zeigt, dass mechanische Tastaturen nicht teuer sein müssen. Wir testen das Keyboard.</description>
-	</item>
-
-	<item>
-		<title>Einhörner zum Leben erwecken - Kultur-Hackathon in Mainz gestartet</title>
-		<link>https://www.heise.de/newsticker/meldung/Einhoerner-zum-Leben-erwecken-Kultur-Hackathon-in-Mainz-gestartet-4205490.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>In Museen, Bibliotheken und Archive stecken viele Daten, die sich kreativ nutzen lassen. Programmierer, Designer und Historiker haben sich das vorgenommen.</description>
-	</item>
-
-	<item>
-		<title>Impressionen von der SPIEL 2018: Gesellschaftsspiele für Nerds und Geeks</title>
-		<link>https://www.heise.de/newsticker/meldung/Impressionen-von-der-SPIEL-2018-Gesellschaftsspiele-fuer-Nerds-und-Geeks-4205405.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Weg von Bildschirm und Controller, hin zu Würfeln und Karten. Die SPIEL-Messe zeigt Neuheiten bei IT-affinen Brett-, Karten- und Tabletop-Spielen.</description>
-	</item>
-
-	<item>
-		<title>Missing Link: Vor 100 Jahren begann die deutsche Revolution</title>
-		<link>https://www.heise.de/newsticker/meldung/Missing-Link-Vor-100-Jahren-begann-die-deutsche-Revolution-4205422.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Von den Sturmvögeln zu den Stiefkindern der Revolution: Mit dem Matrosenaufstand startete Deutschland in die erste Republik.</description>
-	</item>
-
-	<item>
-		<title>4W: Was war. Was wird. Wettrüsten oder Waffelessen, das ist die Frage.</title>
-		<link>https://www.heise.de/newsticker/meldung/Was-war-Wettruesten-oder-Waffelessen-das-ist-die-Frage-4205432.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Zeit! Irgendwann gab es sie gar nicht, heute wird sie uns geschenkt. Ja, auch Hal Faber weiß, dass das Quatsch ist. Wie so vieles andere.</description>
-	</item>
-
-	<item>
-		<title>Kommentar: Vom DNS, aktuellen Hypes, Überwachung und Zensur</title>
-		<link>https://www.heise.de/newsticker/meldung/Kommentar-Vom-DNS-aktuellen-Hypes-Ueberwachung-und-Zensur-4205380.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das DNS ist gereift, es kann mit den Bedrohungen der Überwachung und Zensur umgehen. Eine Antwort von Lutz Donnerhacke auf &quot;Die Gruft DNS gehört ausgelüftet&quot;.</description>
-	</item>
-
-	<item>
-		<title>Microsoft will Militär und Geheimdienste beliefern</title>
-		<link>https://www.heise.de/newsticker/meldung/Microsoft-will-Militaer-und-Geheimdienste-beliefern-4205383.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Microsoft ist trotz Protesten von Mitarbeitern bereit, dem Militär und den Geheimdiensten des Landes KI-Systeme und sonstige Technologien zu verkaufen.</description>
-	</item>
-
-	<item>
-		<title>Zurück zur &quot;Normalzeit&quot;: Uhren werden (möglichweise zum letzten Mal) um eine Stunde zurückgestellt</title>
-		<link>https://www.heise.de/newsticker/meldung/Zurueck-zur-Normalzeit-Uhren-werden-moeglichweise-zum-letzten-Mal-um-eine-Stunde-zurueckgestellt-4205376.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Zeitumstellung könnte bald Geschichte sein. Es gibt aber Bereiche, in denen eine Umstellung sehr aufwendig werden könnte.</description>
-	</item>
-
-	<item>
-		<title>5G: Seehofer fordert Änderung der Vergaberegeln</title>
-		<link>https://www.heise.de/newsticker/meldung/5G-Seehofer-fordert-Aenderung-der-Vergaberegeln-4205373.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Bundesinnenminister sieht Bewohner ländlicher Gebiete durch die Ausschreibungsregeln für das 5G-Netz benachteiligt und verlangt Nachbesserungen.</description>
-	</item>
-
-	<item>
-		<title>Ausstellung erinnert an das Lebenswerk von Konrad Zuse</title>
-		<link>https://www.heise.de/newsticker/meldung/Ausstellung-erinnert-an-das-Lebenswerk-von-Konrad-Zuse-4205359.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>In Hopferau im Ostallgäu stellte Konrad Zuse seine Rechenmaschine Z4 fertig. Jetzt erinnert eine Ausstellung im Schloss Hopferau an den Computerpionier.</description>
-	</item>
-
-	<item>
-		<title>Test TrackerID LTS-450: GPS-Flaschenhalter am Fahrrad</title>
-		<link>https://www.techstage.de/news/Test-TrackerID-LTS-450-GPS-Flaschenhalter-am-Fahrrad-4205272.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Fahrraddiebe sind blöd, aber nicht dumm: Sehen sie einen GPS-Tracker, entfernen sie ihn. Deswegen tarnt sich der TrackerID LTS-450 in einem Flaschenhalter.</description>
-	</item>
-
-	<item>
-		<title>Fünf mobile Beamer im Vergleichstest</title>
-		<link>https://www.techstage.de/news/Fuenf-mobile-Beamer-im-Vergleichstest-4204823.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>In den vergangenen Wochen haben wir uns fünf kompakte Beamer mit integriertem Akku angeschaut. Im Vergleichstest zeigen wir Vor- und Nachteile.</description>
-	</item>
-
-	<item>
-		<title>In Japan geht ein weiterer Atomreaktor wieder ans Netz</title>
-		<link>https://www.heise.de/newsticker/meldung/In-Japan-geht-ein-weiterer-Atomreaktor-wieder-ans-Netz-4205351.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das Atomkraftwerk Ikata in Japan hat einen Reaktor wieder hochgefahren, gegen dessen Betrieb eine Bürgergruppe geklagt hatte.</description>
-	</item>
-
-	<item>
-		<title>FlyCroTug: Kleine Drohne mit großer Zugkraft</title>
-		<link>https://www.heise.de/newsticker/meldung/FlyCroTug-Kleine-Drohne-mit-grosser-Zugkraft-4205335.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Forscher haben 100 Gramm leichte Minidrohnen entwickelt, die von einem festen Haltepunkt aus das 40-fache ihres Gewichts bewegen können.
- </description>
-	</item>
-
-	<item>
-		<title>Google Office-Programme: Neue Dokumente in Browserzeile anlegen</title>
-		<link>https://www.heise.de/newsticker/meldung/Google-Docs-Neue-Dokumente-in-Browserzeile-anlegen-4205346.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Für seine webbasierten Office-Programme hat Google eine praktische Abkürzung direkt in die Anwendungen Docs, Sheets, Slides und Forms veröffentlicht.</description>
-	</item>
-
-	<item>
-		<title>Wo Hobby-Astronomen den Profis voraus sind</title>
-		<link>https://www.heise.de/newsticker/meldung/Wo-Hobby-Astronomen-den-Profis-voraus-sind-4205332.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Hobby-Astronomen leisten einen wertvollen Beitrag zur Wissenschaft, etwa durch das Beobachten veränderlicher Sterne oder die Suche nach Meteoriten.</description>
-	</item>
-
-	<item>
-		<title>Zahlen geschönt? FBI-Untersuchung gegen Tesla</title>
-		<link>https://www.heise.de/newsticker/meldung/Zahlen-geschoent-FBI-Untersuchung-gegen-Tesla-4205285.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Es besteht der Verdacht, dass Tesla Produktionszahlen wissentlich überoptimistisch vorhergesagt hat. Das FBI ermittelt strafrechtlich.</description>
-	</item>
-
-	<item>
-		<title>c't uplink 24.6: Linux mit UEFI / OLED-Defekte / Dropbox-Alternativen</title>
-		<link>https://www.heise.de/ct/artikel/c-t-uplink-24-6-Linux-mit-UEFI-OLED-Defekte-Dropbox-Alternativen-4205070.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die c't-uplink Show: Dieses Mal mit eingebrannten Logos bei OLED-TVs, Alternativen zu Dropbox und wie man Linux am besten mit UEFI verheiratet.</description>
-	</item>
-
-	<item>
-		<title>Die Bilder der Woche (KW 43): Von Porträt bis Landschaft</title>
-		<link>https://www.heise.de/foto/meldung/Die-Bilder-der-Woche-KW-43-Von-Portraet-bis-Landschaft-4204550.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Blickfang: Unsere Bilder des Tages haben in dieser Woche keine Scheu vor direktem Augenkontakt und Spiegelbildern.</description>
-	</item>
-
-	<item>
-		<title>BIOS-Option macht ThinkPads zu Briefbeschwerern</title>
-		<link>https://www.heise.de/newsticker/meldung/BIOS-Option-macht-ThinkPads-zu-Briefbeschwerern-4205185.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Ein einziger Klick im BIOS-Setup - und einige aktuelle Lenovo-Notebooks starten nicht mehr; eine Lösung des Problems fehlt noch.</description>
-	</item>
-
-	<item>
-		<title>Markenstreit um “Dash”: Bragi beantragt einstweilige Verfügung gegen Oneplus</title>
-		<link>https://www.heise.de/newsticker/meldung/Markenstreit-um-Dash-Bragi-beantragt-einstweilige-Verfuegung-gegen-Oneplus-4205223.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Hersteller der smarten Kopfhörer “The Dash” sieht seine Markenrechte durch die Schnelladegeräte der chinesischen Smartphones verletzt.</description>
-	</item>
-
-	<item>
-		<title>Übernahme von GitHub durch Microsoft abgeschlossen</title>
-		<link>https://www.heise.de/newsticker/meldung/Uebernahme-von-GitHub-durch-Microsoft-abgeschlossen-4205119.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Microsofts Übernahme von GitHub ist abgeschlossen. Ab Montag beginnt die Arbeit des neuen CEO Nat Friedman. Er will GitHub für die Entwickler besser machen.</description>
-	</item>
-
-	<item>
-		<title>Webhosting und Cloud Computing: Aus 1&amp;1 und ProfitBricks wird 1&amp;1 Ionos</title>
-		<link>https://www.heise.de/newsticker/meldung/Webhosting-und-Cloud-Computing-Aus-1-1-und-ProfitBricks-wird-1-1-Ionos-4205066.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>1&amp;1 bietet seine Webhosting- und Cloud-Produkte künftig unter dem Namen 1&amp;1 Ionos an. Besserer Service soll Unternehmen den Cloud-Start schmackhaft machen.</description>
-	</item>
-
-	<item>
-		<title>iPhone XR: Die 10 wichtigsten Testergebnisse</title>
-		<link>https://www.heise.de/mac-and-i/meldung/iPhone-XR-Die-10-wichtigsten-Testergebnisse-4204845.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Seit heute ist das dritte und günstigste von Apples neuen Smartphones im Handel. Mac &amp; i konnte es bereits testen.</description>
-	</item>
-
-	<item>
-		<title>Motorola One: Android-One-Smartphone für 299 Euro im Test</title>
-		<link>https://www.techstage.de/news/Motorola-One-im-Test-Android-One-Smartphone-mit-Notch-4203618.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das Motorola One ist ein Smartphone mit schickem Design und Android One als Betriebssystem. Ob und für wen sich der Kauf lohnt, hat TechStage getestet.</description>
-	</item>
-
-	<item>
-		<title>US Copyright Office: DRM darf für Reparaturen umgangen werden</title>
-		<link>https://www.heise.de/newsticker/meldung/US-Copyright-Office-DRM-darf-fuer-Reparaturen-umgangen-werden-4205173.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>In den USA ist es künftig legal, den Kopierschutz elektronischer Geräte zu knacken, um etwa sein Smartphone, Auto oder den vernetzten Kühlschrank zu reparieren.</description>
-	</item>
-
-	<item>
-		<title>Ausprobiert: Haptik-Datenhandschuhe von Senseglove</title>
-		<link>https://www.heise.de/newsticker/meldung/Ausprobiert-Haptik-Datenhandschuhe-von-Senseglove-4205142.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Senseglove-Datenhandschuh trackt nicht nur jeden Finger, sondern simuliert auch Widerstand und Haptik. Wir haben ihn ausprobiert.</description>
-	</item>
-
-	<item>
-		<title>Apple News soll &quot;Netflix für Nachrichten&quot; werden</title>
-		<link>https://www.heise.de/mac-and-i/meldung/Apple-News-soll-Netflix-fuer-Nachrichten-werden-4204886.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Apple betreibt für seinen hauseigenen Infodienst eine eigene Redaktion – und setzt kaum auf Algorithmen. Im Abo könnten bald diverse Magazine hinzukommen.</description>
-	</item>
-
-	<item>
-		<title>Xbox One X im 4K-Test: Spaßzentrale für UHD-TVs</title>
-		<link>https://www.techstage.de/news/Xbox-One-X-im-4K-Test-Spasszentrale-fuer-UHD-TVs-4204803.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die aktuelle Xbox One X bewirbt Microsoft als idealen Zuspieler für UHD-Fernseher. Wir haben ihre 4K-Fähigkeiten bei Filmen und Spielen getestet. </description>
-	</item>
-
-	<item>
-		<title>Red Dead Redemption 2: Die Entschleunigung des Action-Adventures</title>
-		<link>https://www.heise.de/newsticker/meldung/Red-Dead-Redemption-2-Die-Entschleunigung-des-Action-Adventures-4205034.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Nach dem Live-Stream: Unsere Eindrücke aus den ersten Stunden des Gaming-Blockbusters Red Dead Redemption 2.</description>
-	</item>
-
-	<item>
-		<title>Grüne: Netzbetreiber sollen Breitband-Universaldienst finanzieren</title>
-		<link>https://www.heise.de/newsticker/meldung/Gruene-Netzbetreiber-sollen-Breitband-Universaldienst-finanzieren-4205022.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Schwarz-Rot will bis spätestens 2025 einen Anspruch auf Breitband für alle gesetzlich verankern. Die Grünen sehen dagegen sofortigen Handlungsbedarf.</description>
-	</item>
-
-	<item>
-		<title>Programmiersprache: Rust 1.30 will mehr Klarheit schaffen</title>
-		<link>https://www.heise.de/developer/meldung/Programmiersprache-Rust-1-30-will-mehr-Klarheit-schaffen-4204893.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Umgang mit absoluten Pfaden und neue prozedurale Makros sind die Highlights der aktuellen Rust-Version.</description>
-	</item>
-
-	<item>
-		<title>Apples Oktober-Event: iPad Pro 2018 und neue Macs vor der Tür</title>
-		<link>https://www.heise.de/mac-and-i/meldung/Apples-Oktober-Event-iPad-Pro-2018-und-neue-Macs-vor-der-Tuer-4204922.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Nach der Einführung der iPhones wird sich Apple der Zukunft seiner Computer zuwenden: Wichtige Neuerungen stehen an. </description>
-	</item>
-
-	<item>
-		<title>Magento-Shops: Verwundbare Add-ons als Schlupfloch für Kreditkarten-Skimmer</title>
-		<link>https://www.heise.de/security/meldung/Magento-Shops-Verwundbare-Add-ons-als-Schlupfloch-fuer-Kreditkarten-Skimmer-4204828.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Ein Sicherheitsforscher warnt vor knapp über 20 Add-ons, die Onlineshops basierend auf der Magento-Software angreifbar machen. </description>
-	</item>
-
-	<item>
-		<title>Atomkraft: Gericht kippt Schließungs-Dekret für Fessenheim</title>
-		<link>https://www.heise.de/newsticker/meldung/Atomkraft-Gericht-kippt-Schliessungs-Dekret-fuer-Fessenheim-4204853.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Conseil d'État hat zu Gunsten der Gemeinde Fessenheim und der Gewerkschaften entschieden.</description>
-	</item>
-
-	<item>
-		<title>Qt Design Studio erreicht Version 1.0</title>
-		<link>https://www.heise.de/developer/meldung/Qt-Design-Studio-erreicht-Version-1-0-4204902.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Neue Funktionen wie die Qt Photoshop Bridge und zeitachsenbasierte Animationen sollen die Zusammenarbeit von Entwicklern und Designern vereinfachen.</description>
-	</item>
-
-	<item>
-		<title>Vodafone bringt Mini-Handy von Palm nach Deutschland</title>
-		<link>https://www.heise.de/newsticker/meldung/Vodafone-bringt-Mini-Handy-von-Palm-nach-Deutschland-4204878.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das neue Palm kommt auch in Deutschland auf den Markt: Vodafone bringt das kuriose Mini-Handy exklusiv in den Handel. </description>
-	</item>
-
-	<item>
-		<title>Xeons und Modems bescheren Intel Rekordquartal</title>
-		<link>https://www.heise.de/newsticker/meldung/Xeons-und-Modems-bescheren-Intel-Rekordquartal-4204869.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Starke Nachfrage nach Prozessoren für Cloud-Rechenzentren sowie LTE-Modems lassen bei Intel die Gewinne sprudeln und bescheren gute Aussichten.</description>
-	</item>
-
-	<item>
-		<title>KI druckt Kunst: Auktionshaus Christie's versteigert KI-Gemälde für 380.000 Euro</title>
-		<link>https://www.heise.de/newsticker/meldung/KI-druckt-Kunst-Auktionshaus-Christie-s-versteigert-KI-Gemaelde-fuer-380-000-Euro-4204793.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Das renommierte Auktionshaus Christie's hat erstmals ein von einer KI erschaffenes Bild versteigert. Der Preis war wesentlich höher als erwartet.</description>
-	</item>
-
-	<item>
-		<title>EU-Parlament verabschiedet Resolution zur Datenschutzuntersuchung bei Facebook </title>
-		<link>https://www.heise.de/newsticker/meldung/EU-Parlament-verabschiedet-Resolution-zur-Datenschutzuntersuchung-bei-Facebook-4204766.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Facebook soll mehr Aufklärung über seine Datenschutzpraxis leisten. Das EU-Parlament hat deshalb eine Untersuchung durch EU-Institutionen verabschiedet.</description>
-	</item>
-
-	<item>
-		<title>IBM setzt auf 277.000 Apple-Geräte</title>
-		<link>https://www.heise.de/mac-and-i/meldung/IBM-setzt-auf-277-000-Apple-Geraete-4204728.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Bei IBM stellen Macs inzwischen ein Viertel aller Laptops. Das Open-Source-Tool Mac@IBM soll auch Admins anderer Firmen die Einrichtung erleichtern.</description>
-	</item>
-
-	<item>
-		<title>heise-Angebot: #TGIQF - das c't-Retroquiz: 8 Bit &amp; mehr</title>
-		<link>https://www.heise.de/newsticker/meldung/TGIQF-das-c-t-Retroquiz-8-Bit-mehr-4202717.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>C64, ZX Spectrum, Apple II ... die Heimcomputer lösten eine IT-Revolution in den Kinderzimmern aus. Wie viel ist aus der Zeit bei Ihnen hängen geblieben?</description>
-	</item>
-
-	<item>
-		<title>heise-Angebot: c't Fotografie: Spiegeloses Vollformat im Test</title>
-		<link>https://www.heise.de/foto/meldung/c-t-Fotografie-Spiegeloses-Vollformat-im-Test-4201826.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Lange war Sony der einzige Anbieter für spiegellose Vollformatkameras. Mit der Canon EOS R und der Nikon Z-Serie werden die Karten neu gemischt.</description>
-	</item>
-
-	<item>
-		<title>British-Airways-Hack: 185.000 weitere Kunden betroffen</title>
-		<link>https://www.heise.de/newsticker/meldung/British-Airways-Hack-185-000-weitere-Kunden-betroffen-4204675.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Fluggesellschaft hat nun bekanntgegeben, dass bis dato Unbekannte Kreditkartendaten von noch mehr Kunden als bislang bekannt kopiert haben.</description>
-	</item>
-
-	<item>
-		<title>Google: 48 Mitarbeiter wegen sexueller Belästigung gefeuert</title>
-		<link>https://www.heise.de/newsticker/meldung/Google-48-Mitarbeiter-wegen-sexueller-Belaestigung-gefeuert-4204687.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Der Weggang von Android-Schöpfer Andy Rubin von Google war wohl nicht freiwillig – ihm wurde sexuelle Nötigung vorgeworfen. Und er war nicht der einzige.</description>
-	</item>
-
-	<item>
-		<title>Fujitsu schließt Werk in Augsburg</title>
-		<link>https://www.heise.de/newsticker/meldung/Fujitsu-schliesst-Werk-in-Augsburg-4204722.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Fujitsu plant einen Konzernumbau. In Augsburg sind davon 1500 Beschäftigte betroffen.</description>
-	</item>
-
-	<item>
-		<title>Ego-Shooter Metro 2033 bei Steam kostenlos</title>
-		<link>https://www.heise.de/newsticker/meldung/Metro-2033-ist-bei-Steam-heute-kostenlos-4204706.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Metro 2033 wird am heutigen Freitag auf Steam kostenlos angeboten. Der Ego-Shooter basiert auf dem gleichnamigen Roman von Dmitri Gluchowski.</description>
-	</item>
-
-	<item>
-		<title>Lightroom-Alternative: DxO bringt PhotoLab 2 </title>
-		<link>https://www.heise.de/foto/meldung/Lightroom-Alternative-DxO-bringt-PhotoLab-2-4204614.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>PhotoLab gibt es nun in Version 2: Verbessert wurde unter anderem die Bildverwaltung, zudem integriert DxO die von den Nik-Filtern bekannte U-Point-Technologie.</description>
-	</item>
-
-	<item>
-		<title>Google schaltet Nearby Notifcations in Android ab</title>
-		<link>https://www.heise.de/developer/meldung/Google-schaltet-Nearby-Notifcations-in-Android-ab-4204667.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Die Funktion für standortbasierte Benachrichtigungen lieferte wohl mehr Spam als nützliche Inhalte.</description>
-	</item>
-
-	<item>
-		<title>iPhone XR: Verkaufsstart ohne Ansturm</title>
-		<link>https://www.heise.de/mac-and-i/meldung/iPhone-XR-Verkaufsstart-ohne-Ansturm-4204679.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Apple bringt die billigeren und bunten iPhone-Modellreihe in den Handel. Groß anstehen mussten Kunden dafür nicht.
-</description>
-	</item>
-
-	<item>
-		<title>Snapchat: Aktienabsturz durch Nutzerschwund</title>
-		<link>https://www.heise.de/newsticker/meldung/Snapchat-Aktienabsturz-durch-Nutzerschwund-4204631.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Snapchat laufen weiterhin die Nutzer weg – und das wird sich vorerst nicht ändern, sagt Snap. Die Aktie stürzte trotz geringerer Verluste um zehn Prozent ab.</description>
-	</item>
-
-	<item>
-		<title>Mi Mix 3: Xiaomi-Flaggschiff mit Kamera-Slider und 10 GByte RAM</title>
-		<link>https://www.heise.de/newsticker/meldung/Mi-Mix-3-Xiaomi-Flaggschiff-mit-Kamera-Slider-und-10-GByte-RAM-4204655.html?wt_mc=rss.ho.beitrag.rdf</link>
-			<description>Xiaomis nächstes Flaggschiff bietet eine fast randlose Display-Front. Die Selfie-Kamera ist in einem magnetischen Slider-Mechanismus untergebracht.</description>
-	</item>
-
-
-
-</rdf:RDF>

+ 0 - 6217
internal/http/client/testdata/single_quote_xml_encoding.xml

@@ -1,6217 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<feed xmlns='http://www.w3.org/2005/Atom'>
-<title>GitLab</title>
-<id>https://about.gitlab.com/blog/</id>
-<link href='https://about.gitlab.com/blog/' />
-<updated>2018-12-12T00:00:00+00:00</updated>
-<author>
-<name>The GitLab Team</name>
-</author>
-<entry>
-<title>What to expect at Predict 2019, a virtual reality conference</title>
-<link href='https://about.gitlab.com/2018/12/12/what-to-expect-at-predict-2019/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/12/what-to-expect-at-predict-2019/</id>
-<published>2018-12-12T00:00:00+00:00</published>
-<updated>2018-12-12T00:00:00+00:00</updated>
-<author>
-<name>Tina Sturgis</name>
-</author>
-<content type='html'>&lt;p&gt;✅ Learn about up and coming tech trends in 2019&lt;&#x2F;p&gt;
-
-&lt;p&gt;✅ For free&lt;&#x2F;p&gt;
-
-&lt;p&gt;✅ Without leaving your desk&lt;&#x2F;p&gt;
-
-&lt;p&gt;If your response is &lt;a href=&quot;https:&#x2F;&#x2F;predict2019.com&quot;&gt;&quot;Sign me up!&quot;&lt;&#x2F;a&gt;, let&#x27;s talk about Predict 2019.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;what-is-predict-2019&quot;&gt;What is Predict 2019?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;predict2019.com&quot;&gt;Predict 2019&lt;&#x2F;a&gt; is the industry’s first truly immersive, virtual reality conference focused on predictions on the future of DevOps, Security, and related technology. Taking place on Dec. 18, &lt;a href=&quot;https:&#x2F;&#x2F;predict2019.com&quot;&gt;Predict 2019&lt;&#x2F;a&gt; is hosted on a platform that makes it look and feel like a real conference, with simulated theaters to view the keynotes and presentations, a conference lobby for chatting and socializing, and a virtual expo floor with exhibitor stands equipped with video, downloads, and even swag for you to take. This exciting event is offered through MediaOps, the company behind technical communities such as DevOps.com, Container Journal, Security Boulevard, and DevOps TV. So when GitLab had an opportunity to be a premier sponsor for Predict 2019, we jumped at the chance.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-b panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1547&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1547, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;h2 id=&quot;gitlab-at-predict-2019&quot;&gt;GitLab at Predict 2019&lt;&#x2F;h2&gt;
-
-&lt;h3 id=&quot;speakers&quot;&gt;Speakers&lt;&#x2F;h3&gt;
-
-&lt;p&gt;During the event on Dec. 18, GitLab&#x27;s &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#brandoncjung&quot;&gt;Brandon Jung&lt;&#x2F;a&gt;, VP of Alliances, will be speaking at a theater session called &quot;Accelerate software delivery: How to make 2019 your cloud-native year&quot; at 2 p.m. EST.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Additionally, Senior Product Marketing Manager &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#cblake2000&quot;&gt;Cindy Blake&lt;&#x2F;a&gt; will take part in a panel session, &quot;Ubiquitous Open Source makes for security challenges,&quot; at 12 p.m. EST.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Don’t worry if you are already booked for the day of the event; the virtual conference will be available to attend for 90 days afterwards too.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;booth-and-swag&quot;&gt;Booth and swag&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We will also have a GitLab virtual booth located in the exhibit hall where you will have access to loads of information in the form of videos, webpage links, and pdf files to download and review immediately or take with you for future reference.
-You won&#x27;t even need a bag to carry it all with you! Bonus!&lt;&#x2F;p&gt;
-
-&lt;p&gt;During the live event we will have GitLabbers on hand to chat with and answer your questions, and if you visit our booth we&#x27;ll arm you with a code for a FREE GitLab T-shirt from the &lt;a href=&quot;https:&#x2F;&#x2F;shop.gitlab.com&#x2F;&quot;&gt;GitLab swag store&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;alert alert-gitlab-purple&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;predict2019.com&#x2F;#join-us&quot;&gt;Sign up now to attend Predict 2019&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;note&quot;&gt;Photo by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;xGtHjC_QNJM?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;JESHOOTS.COM&lt;&#x2F;a&gt; on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;search&#x2F;photos&#x2F;virtual-reality?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;woman-wearing-vr-goggles.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab&#x27;s HackerOne Bug Bounty Program is public today</title>
-<link href='https://about.gitlab.com/2018/12/12/gitlab-hackerone-bug-bounty-program-is-public-today/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/12/gitlab-hackerone-bug-bounty-program-is-public-today/</id>
-<published>2018-12-12T00:00:00+00:00</published>
-<updated>2018-12-12T00:00:00+00:00</updated>
-<author>
-<name>Kathy Wang</name>
-</author>
-<content type='html'>&lt;p&gt;Today, we are announcing that our HackerOne bug bounty program is now &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;gitlab&quot;&gt;public&lt;&#x2F;a&gt;. Since we opened our private bounty program in December, 2017, we have been preparing to take this program public by working through some of the challenges of managing a bug bounty program. We have awarded over $200,000 in bounties since the bug bounty program went live last year. This means we mitigated nearly 200 vulnerabilities reported to us.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Our first response time to newly submitted findings has decreased significantly, from an average time of 48+ hours to 7 hours. That is a significant reduction achieved through security automation, and will help us scale, and better engage the hacker community.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-b panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1547&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1547, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;On average, our mean time to mitigation (MTTR) for critical security issues is currently less than 30 days. Our current goal is to now focus on bringing the MTTR metric for medium-high security issues to less than 60 days, on average.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Yesterday, we released a &lt;a href=&quot;https:&#x2F;&#x2F;www.hackerone.com&#x2F;resources&#x2F;gitlab-hps-for-startups&quot;&gt;webinar&lt;&#x2F;a&gt; to announce our plans to be a public bug bounty program. In managing a &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;gitlab&quot;&gt;public bug bounty program&lt;&#x2F;a&gt;, we will now be able to reward our hacker community for reporting security vulnerabilities to us directly through the program.&lt;&#x2F;p&gt;
-
-&lt;p&gt;The past year has been a great journey of learning about managing a bug bounty program, and we have plans to further expand upon our public program in 2019 and beyond. We would also like to acknowledge some of our top contributors from the hacker community, including &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;ngalog&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;jobert&quot;&gt;jobert&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;fransrosen&quot;&gt;fransrosen&lt;&#x2F;a&gt;. Check out the &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;gitlab&quot;&gt;program&lt;&#x2F;a&gt; to see how you can contribute!&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;security-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Announcing GitLab Serverless</title>
-<link href='https://about.gitlab.com/2018/12/11/introducing-gitlab-serverless/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/11/introducing-gitlab-serverless/</id>
-<published>2018-12-11T00:00:00+00:00</published>
-<updated>2018-12-11T00:00:00+00:00</updated>
-<author>
-<name>Priyanka Sharma</name>
-</author>
-<content type='html'>&lt;p&gt;Serverless is the latest innovation in cloud computing that promises to alter the cost-benefit equation for enterprises. As our CEO, &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#sytses&quot;&gt;Sid Sijbrandij&lt;&#x2F;a&gt; says, &quot;All roads lead to compute.&quot; There is a race among providers to acquire as many workloads from enterprises as possible, at the cheapest cost. The latter is where serverless comes in: serverless computing is an execution model in which the cloud provider acts as the server, dynamically managing the allocation of machine resources. Pricing is based on the actual resources consumed by an application, rather than on pre-purchased units of capacity.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This field began with the release of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;AWS_Lambda&quot;&gt;AWS Lambda&lt;&#x2F;a&gt; in November 2014. In the four short years since then, it has become a well-known workflow that enterprises are eager to adopt. Today, we are announcing &lt;a href=&quot;&#x2F;product&#x2F;serverless&#x2F;&quot;&gt;GitLab Serverless&lt;&#x2F;a&gt; to enable our users to take advantage of the benefits of serverless.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-serverless-is-launching-dec-22&quot;&gt;GitLab Serverless is launching Dec. 22&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab is the only single application for the entire DevOps lifecycle. As part of that vision, we will release GitLab Serverless in GitLab 11.6, coming later this month, to allow enterprises to plan, build, and manage serverless workloads with the rest of their code from within the same GitLab UI. It leverages &lt;a href=&quot;https:&#x2F;&#x2F;cloud.google.com&#x2F;knative&#x2F;&quot;&gt;Knative&lt;&#x2F;a&gt;, which enables &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Autoscaling&quot;&gt;autoscaling&lt;&#x2F;a&gt; down to zero and back up to run serverless workloads on Kubernetes. This allows businesses to employ a multi-cloud strategy and leverage the value of serverless without being locked into a specific cloud provider.&lt;&#x2F;p&gt;
-
-&lt;p&gt;In order to bring the best-in-class to our users, we partnered with &lt;a href=&quot;https:&#x2F;&#x2F;triggermesh.com&#x2F;&quot;&gt;TriggerMesh&lt;&#x2F;a&gt; founder &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;sebgoa&quot;&gt;Sebastien Goasguen&lt;&#x2F;a&gt; and his team. Sebastien has been part of the serverless landscape since the beginning. He built a precursor to Knative, Kubeless. He is actively involved with the Knative community and understands the workflow from soup to nuts. Sebastien says, &quot;We are excited to help GitLab enable all their users to deploy functions directly on the Knative function-as-a-service clusters. We believe that these additions to GitLab will give those users the best possible experience for complete serverless computing from beginning to end.&quot;&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;serverless-first&quot;&gt;&quot;Serverless first&quot;&lt;&#x2F;h2&gt;
-
-&lt;p&gt;As any attendees at &lt;a href=&quot;&#x2F;2018&#x2F;12&#x2F;06&#x2F;aws-reinvent-recap&#x2F;&quot;&gt;AWS re:Invent&lt;&#x2F;a&gt; would have noticed, the behemoth is putting all its energies behind serverless. We heard &lt;a href=&quot;https:&#x2F;&#x2F;www.computerworlduk.com&#x2F;cloud-computing&#x2F;how-trustpilot-takes-serverless-first-approach-engineering-with-aws-3688267&#x2F;&quot;&gt;stories from the likes of TrustPilot&lt;&#x2F;a&gt; about changing their engineering culture to &quot;serverless first.&quot; This is because serverless cloud providers save money by not having to keep idle machines provisioned and running, and are passing on the benefits to their customers. While this is amazing news, it is hard to truly embrace a workflow if it lives outside of developers&#x27; entrenched habits. GitLab has millions of users and is used by over 100,000 organizations, and with GitLab Serverless they can now enjoy the cost savings and elegant code design serverless brings, from the comfort of their established workflows.&lt;&#x2F;p&gt;
-
-&lt;p&gt;As with all GitLab endeavors, making serverless multi-cloud and accessible to everyone is a big, hairy, audacious goal. Today, Knative can be installed to a Kubernetes cluster with a single click via the GitLab Kubernetes integration. It shipped in &lt;a href=&quot;&#x2F;2018&#x2F;11&#x2F;22&#x2F;gitlab-11-5-released&#x2F;#easily-deploy-and-integrate-knative-with-gitlab&quot;&gt;GitLab 11.5&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;how-to-activate-gitlab-serverless&quot;&gt;How to activate GitLab Serverless&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Starting with the release of GitLab 11.6 on Dec. 22, the &quot;Serverless&quot; tab will be available for users as an alpha offering. Please do check it out and share your feedback with us.&lt;&#x2F;p&gt;
-
-&lt;ol&gt;
-  &lt;li&gt;Go to your GitLab instance and pick your project of choice.&lt;&#x2F;li&gt;
-  &lt;li&gt;Click on the &lt;code&gt;Operations&lt;&#x2F;code&gt; menu item in the sidebar.&lt;&#x2F;li&gt;
-  &lt;li&gt;Pick &lt;code&gt;Serverless&lt;&#x2F;code&gt; to view the list of all the functions you have defined. You will also be able to see a brief description as well as the Knative cluster the function is deploying to.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-
-&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;uploads&#x2F;8b821d4aaa1bb75375dc54567a4313ad&#x2F;CE-project__serverless-grouped.png&quot; alt=&quot;Serverless list view&quot; title=&quot;Serverless list view&quot; class=&quot;shadow large center&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;p&gt;To dig further, click into the function for more info.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;uploads&#x2F;9e1e3893aa5369a2a165d1dd95c98dd8&#x2F;CE-project__serverless--function-details.png&quot; alt=&quot;function detail view&quot; title=&quot;function detail view&quot; class=&quot;shadow large center&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;p&gt;All this goodness will be available Dec. 22. In the meantime, we would love to see you at &lt;a href=&quot;&#x2F;events&quot;&gt;KubeCon Seattle&lt;&#x2F;a&gt;, where our product and engineering experts are attending to talk all things serverless with attendees. Hope to see you at booth S44!&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-serverless-blog.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Friends don&#x27;t let friends add options to code</title>
-<link href='https://about.gitlab.com/2018/12/10/friends-dont-let-friends-add-options-to-code/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/10/friends-dont-let-friends-add-options-to-code/</id>
-<published>2018-12-10T00:00:00+00:00</published>
-<updated>2018-12-10T00:00:00+00:00</updated>
-<author>
-<name>Suri Patel</name>
-</author>
-<content type='html'>&lt;p&gt;Sometimes, when trying to make it easier to work in an application, our instinct is to add
-optional features that users can enable if their situations require a specific functionality.
-Our intentions may be good, but these actions can actually cause &lt;em&gt;more&lt;&#x2F;em&gt; problems, since we invite users
- to second-guess their choices by adding extra steps into the user experience.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;the-disadvantages-of-a-choose-your-own-adventure-model&quot;&gt;The disadvantages of a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Choose_Your_Own_Adventure&quot;&gt;choose your own adventure&lt;&#x2F;a&gt; model&lt;&#x2F;h2&gt;
-
-&lt;p&gt;One of the most celebrated aspects of &lt;a href=&quot;&#x2F;solutions&#x2F;open-source&#x2F;&quot;&gt;open source&lt;&#x2F;a&gt;
-is the freedom that allows developers to brighten a user’s day by adding an
-optional feature that may not be for everyone, but allows a small portion of users
-to engage with a project in a specific way. While it may seem like a great idea
-to cater to individual needs, there are several disadvantages to making something
-an option.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;it-creates-more-work-for-developers&quot;&gt;It creates more work for developers&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Creating extra options means more work for both frontend and backend teams.
-These features add additional code, tests, and documentation for each setting,
-and the various states alter the UI. Adding options hurts you in every step of
-the development process.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;it-places-a-burden-on-the-user-to-choose&quot;&gt;It places a burden on the user to choose&lt;&#x2F;h3&gt;
-
-&lt;p&gt;When we solve problems by including options, we force a user to think about the
-function and consider its purpose and drawbacks, placing a burden on them to
-control how they use an application. A user hesitates and has to make a decision
-about whether this is something that should be enabled. After all, if an option
-significantly enhanced the user experience, then wouldn’t it have been automatically
-integrated?&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;it-makes-future-functionality-more-difficult-to-implement&quot;&gt;It makes future functionality more difficult to implement&lt;&#x2F;h3&gt;
-
-&lt;p&gt;There&#x27;s also the long-term impact of additional options. Just one extra option can lead to one of two
-paths, which might influence other parts of an application. So, every
-time we add an option, the number of states of the application doubles. That&#x27;s
-exponential growth and it adds up quickly, making it harder to diagnose errors. Multiple
-options can lead to the creation of states of which we’re unaware, so
-it’s harder for the user to understand how an application should behave, because
-they don&#x27;t know whether errors are due to an option or not. And, if it is an
-option causing the error, &lt;em&gt;which&lt;&#x2F;em&gt; option is the problem?&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;how-we-avoid-adding-options-bask-in-the-glow-of-iteration&quot;&gt;How we avoid adding options: Bask in the glow of iteration&lt;&#x2F;h2&gt;
-
-&lt;p&gt;So, how do you know if a feature should be optional or not? At GitLab, we ship
-the first &lt;a href=&quot;&#x2F;handbook&#x2F;values&#x2F;#iteration&quot;&gt;iteration&lt;&#x2F;a&gt; and keep delivering based on
-user feedback. Some of the features that we anticipated may never roll out,
-because users didn’t request them. Iteration allows us to reduce the scope of
-development and avoid including features that aren’t popular or useable.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-b panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1547&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1547, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Whenever users need something new, try to create a solution that&#x27;s acceptable
-for the most number of people. Rely on your development and operations teams to
-provide feedback and ask them to relate to the end user. Conducting
-&lt;a href=&quot;&#x2F;handbook&#x2F;engineering&#x2F;ux&#x2F;ux-research&#x2F;#ux-research&quot;&gt;UX research&lt;&#x2F;a&gt; with your users
-also helps identify pain points and needs.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Teams are continually constrained by development capacity, and adding options to
-applications can absorb previous time and effort. We suggest shipping your
-application without an option and waiting to see whether people request it or
-make a
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues?label_name%5B%5D=feature+proposal&quot;&gt;feature proposal&lt;&#x2F;a&gt;
-for it. In the end, our role is to solve users’ problems, and our goal is to
-identify the underlying cause of a challenge and fix it in a way that doesn&#x27;t
-need an option.&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;pKeF6Tt3c08&quot;&gt;Cover image&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;@bdchu614&quot;&gt;Brendan Church&lt;&#x2F;a&gt; on Unsplash&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;options.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Git Protocol v2 now enabled for SSH on GitLab.com</title>
-<link href='https://about.gitlab.com/2018/12/10/git-protocol-v2-enabled-for-ssh-on-gitlab-dot-com/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/10/git-protocol-v2-enabled-for-ssh-on-gitlab-dot-com/</id>
-<published>2018-12-10T00:00:00+00:00</published>
-<updated>2018-12-10T00:00:00+00:00</updated>
-<author>
-<name>James Ramsay</name>
-</author>
-<content type='html'>&lt;p&gt;GitLab added support for &lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;22&#x2F;gitlab-11-4-released&#x2F;#git-protocol-v2&quot;&gt;Git Protocol v2 over HTTP and SSH in GitLab 11.4&lt;&#x2F;a&gt;, and enabled Protocol v2 over HTTP on GitLab.com, but not for SSH. On Nov. 23, we enabled &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;gl-infra&#x2F;infrastructure&#x2F;issues&#x2F;5244&quot;&gt;Git Protocol v2 over SSH on GitLab.com&lt;&#x2F;a&gt;. You can view Git Protocol usage on our &lt;a href=&quot;https:&#x2F;&#x2F;dashboards.gitlab.com&#x2F;d&#x2F;pqlQq0xik&#x2F;git-protocol-versions?refresh=5m&amp;amp;orgId=1&quot;&gt;public dashboard&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Git Protocol v2 is supported from Git v2.18.0 and is opt-in. To enable globally, run &lt;code&gt;git config --global protocol.version 2&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;what-git-protocol-v2-means-for-you&quot;&gt;What Git Protocol v2 means for you&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Git 2.18 introduced support for Protocol v2, which defines how clones, fetches, and pushes are communicated between the client (your computer) and the server (GitLab). The new &lt;a href=&quot;https:&#x2F;&#x2F;www.kernel.org&#x2F;pub&#x2F;software&#x2F;scm&#x2F;git&#x2F;docs&#x2F;technical&#x2F;pack-protocol.html&quot;&gt;wire protocol&lt;&#x2F;a&gt; improves the performance of fetch commands and enables future protocol improvements. &lt;a href=&quot;https:&#x2F;&#x2F;opensource.googleblog.com&#x2F;2018&#x2F;05&#x2F;introducing-git-protocol-version-2.html&quot;&gt;Read more about Protocol v2&lt;&#x2F;a&gt; in the release post by the author of the change.&lt;&#x2F;p&gt;
-
-&lt;p&gt;To see the reduction in network traffic with Protocol v2 you can run the commands below:&lt;&#x2F;p&gt;
-
-&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;# Original Git wire protocol
-GIT_TRACE_PACKET=1 git -c protocol.version=0 ls-remote git@gitlab.com:gitlab-org&#x2F;gitlab-ce.git master
-
-# New Git wire protocol v2
-GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote git@gitlab.com:gitlab-org&#x2F;gitlab-ce.git master
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;In moving from Protocol v0 to v2, on this repo the number of lines (&quot;packets&quot;) sent behind the scenes drops from over 36,000 to fewer than 30.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Highlights from AWS re:Invent 2018</title>
-<link href='https://about.gitlab.com/2018/12/06/aws-reinvent-recap/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/06/aws-reinvent-recap/</id>
-<published>2018-12-06T00:00:00+00:00</published>
-<updated>2018-12-06T00:00:00+00:00</updated>
-<author>
-<name>Priyanka Sharma</name>
-</author>
-<content type='html'>&lt;p&gt;Last week GitLab was at AWS re:Invent 2018, the marquee event for cloud computing in the US. As the frontrunner in the space, Amazon has built re:Invent to be a juggernaut. This year it commanded most of the Las Vegas strip and had over 50,000 attendees. As a first-time visitor myself, I was impressed by the sheer scale and efficiency of the event. I was also thrilled to achieve my personal goal of giving my first talk with a live demo using code and GitLab. As for GitLab, we saw that our company emerged as a leader in the DevOps space with a single application for the whole software development lifecycle.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;&#x2F;h2&gt;
-
-&lt;h3 id=&quot;reinventing-cicd-pipelines&quot;&gt;Reinventing CI&#x2F;CD pipelines&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Our CEO &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#sytses&quot;&gt;Sid Sijbrandij&lt;&#x2F;a&gt; and I did a talk and live demo about reinventing CI&#x2F;CD pipelines using GitLab, &lt;a href=&quot;&#x2F;kubernetes&quot;&gt;Kubernetes&lt;&#x2F;a&gt;, and EKS. This was our first hint that this re:Invent was going to be special. The talk was bursting at the seams with attendees, as we shared both the challenges of the toolchain crisis engulfing our ecosystem, and about how a single application for the entire DevOps lifecycle can make an improvement of over 200 percent in cycle times. You can &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1x1g4pfpoaav9lhcYkjAJylLMl-9S0JFTeKXlNF98O-I&#x2F;edit?usp=sharing&quot;&gt;check out the presentation here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;aws-2018&#x2F;aws_2018_sid_talk_stage.jpeg&quot; alt=&quot;Sid Sijbrandij and Priyanka Sharma on stage at AWS re:Invent&quot; class=&quot;shadow medium center&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;p&gt;The demo, which showed us running a CI&#x2F;CD pipeline and deploying code to Kubernetes on EKS, is an example of the &lt;a href=&quot;&#x2F;cloud-native&#x2F;&quot;&gt;cloud native workflows&lt;&#x2F;a&gt; users can push via GitLab. It is such competency that makes Kubernetes on EKS a breeze and is the reason GitLab was awarded the &lt;a href=&quot;&#x2F;2018&#x2F;11&#x2F;28&#x2F;gitlab-achieves-aws-devops-competency-certification&#x2F;&quot;&gt;AWS Partner DevOps Competency Certification&lt;&#x2F;a&gt; to confirm our viability and excellence as a DevOps solution for companies using AWS Cloud.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;validation-for-our-vision&quot;&gt;Validation for our vision&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Our experience at re:Invent was one of validation and emergence. As a company, we saw that our efforts to build the first single application for the entire DevOps lifecycle have paid off and our users resonated with our message. Most folks who came to our booth were aware that GitLab played a part in multiple stages (if not all) of their workflow and many were avid &lt;a href=&quot;&#x2F;product&#x2F;continuous-integration&#x2F;&quot;&gt;GitLab CI&lt;&#x2F;a&gt; fans. Gone are the days when &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;gitlab_flow.html&quot;&gt;version control&lt;&#x2F;a&gt; was the only thing GitLab was associated with.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;aws-2018&#x2F;aws_booth_collage.jpeg&quot; alt=&quot;Collage from GitLab at AWS re:Invent&quot; class=&quot;medium center&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;p&gt;Our VP of Alliances, &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#brandoncjung&quot;&gt;Brandon Jung&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=Ejs5xGAhL8s&quot;&gt;appeared on theCUBE&lt;&#x2F;a&gt; with a company called Beacon. As the former head of partnerships at Google Cloud, Brandon has a long history with GitLab. He has seen the company grow over the years and shared how our rocketship ascent across the DevOps lifecycle convinced him of the potential. He said, &quot;In just over two years, &lt;a href=&quot;&#x2F;2017&#x2F;09&#x2F;27&#x2F;gitlab-leader-continuous-integration-forrester-wave&#x2F;&quot;&gt;GitLab became the frontrunner for continuous integration&lt;&#x2F;a&gt;, according to Forrester. That&#x27;s impressive.&quot;&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;livestream-with-the-new-stack&quot;&gt;Livestream with The New Stack&lt;&#x2F;h3&gt;
-
-&lt;p&gt;I also represented GitLab on &lt;a href=&quot;https:&#x2F;&#x2F;www.pscp.tv&#x2F;w&#x2F;1eaJbODAepnxX&quot;&gt;a livestream podcast&lt;&#x2F;a&gt; with &lt;a href=&quot;https:&#x2F;&#x2F;thenewstack.io&#x2F;&quot;&gt;The New Stack&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;biilmann?lang=en&quot;&gt;Matt Biilmann&lt;&#x2F;a&gt;, CEO of &lt;a href=&quot;&#x2F;2018&#x2F;06&#x2F;13&#x2F;netlify-launches-gitlab-support&#x2F;&quot;&gt;Netlify&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;jbeda&quot;&gt;Joe Beda&lt;&#x2F;a&gt;, founder of &lt;a href=&quot;https:&#x2F;&#x2F;heptio.com&#x2F;&quot;&gt;Heptio&lt;&#x2F;a&gt; and creator of Kubernetes. We discussed GitOps, NoOps, and the toolchain crisis. As Matt wisely said, &quot;Trust in open source is critical to cloud computing and the ecosystem. Companies like GitLab will keep the players honest.&quot;&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;center&quot;&gt;
-
-  &lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;GitOps, NoOps and the tool chain crisis. &lt;a href=&quot;https:&#x2F;&#x2F;t.co&#x2F;mtfm8OaYYD&quot;&gt;https:&#x2F;&#x2F;t.co&#x2F;mtfm8OaYYD&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;&amp;mdash; The New Stack (@thenewstack) &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;thenewstack&#x2F;status&#x2F;1067881587214184448?ref_src=twsrc%5Etfw&quot;&gt;November 28, 2018&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt;
-  &lt;script async=&quot;&quot; src=&quot;https:&#x2F;&#x2F;platform.twitter.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We thank AWS for creating this amazing ecosystem of end users and practitioners who came together in Vegas last week. Next year will be bigger, better. Until then, see you all at &lt;a href=&quot;&#x2F;events&#x2F;&quot;&gt;KubeCon&lt;&#x2F;a&gt;! 😃&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;aws-2018&#x2F;aws_booth_2018.jpeg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Critical Security Release: 11.5.3, 11.4.10, 11.3.12</title>
-<link href='https://about.gitlab.com/2018/12/06/critical-security-release-gitlab-11-dot-5-dot-3-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/06/critical-security-release-gitlab-11-dot-5-dot-3-released/</id>
-<published>2018-12-06T00:00:00+00:00</published>
-<updated>2018-12-06T00:00:00+00:00</updated>
-<author>
-<name>Ethan Strike</name>
-</author>
-<content type='html'>&lt;p&gt;Today we are releasing versions 11.5.3, 11.4.10, and 11.3.12 for GitLab Community Edition (CE) and Enterprise Edition (EE).&lt;&#x2F;p&gt;
-
-&lt;p&gt;These versions contain an important security fix, and we strongly recommend that all GitLab installations be upgraded to one of these versions immediately.&lt;&#x2F;p&gt;
-
-
-
-&lt;p&gt;The vulnerability details will be made public on our issue tracker in approximately 30 days.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Please read on for more information regarding this release.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;directory-traversal-in-templates-api&quot;&gt;Directory Traversal in Templates API&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The templates api was vulnerable to a directory traversal issue which could allow an attacker to read arbitrary files on a GitLab server. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19856&quot;&gt;CVE-2018-19856&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;nyangawa&quot;&gt;@nyangawa&lt;&#x2F;a&gt; of Chaitin Tech for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.11 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-
-&lt;p&gt;To update, check out our &lt;a href=&quot;&#x2F;update&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Runner update required to use SAST in Auto DevOps</title>
-<link href='https://about.gitlab.com/2018/12/06/gitlab-runner-update-required-to-use-auto-devops-and-sast/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/06/gitlab-runner-update-required-to-use-auto-devops-and-sast/</id>
-<published>2018-12-06T00:00:00+00:00</published>
-<updated>2018-12-06T00:00:00+00:00</updated>
-<author>
-<name>Fabio Busatto</name>
-</author>
-<content type='html'>&lt;p&gt;We are introducing a major change for the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;sast.html&quot;&gt;SAST&lt;&#x2F;a&gt; job definition for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;topics&#x2F;autodevops&#x2F;&quot;&gt;Auto DevOps&lt;&#x2F;a&gt; with &lt;strong&gt;GitLab 11.6&lt;&#x2F;strong&gt;, shipping Dec. 22.
-As a result, SAST jobs will fail after the upgrade to GitLab 11.6 if they are picked up by a version of &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;runner&#x2F;&quot;&gt;GitLab Runner&lt;&#x2F;a&gt;
-prior to 11.5. The jobs will fail, but they will not block pipelines. However, you won&#x27;t see results
-for SAST in the merge request or at the pipeline level anymore.&lt;&#x2F;p&gt;
-
-&lt;p&gt;The same change will happen for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;dependency_scanning.html&quot;&gt;Dependency Scanning&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;container_scanning.html&quot;&gt;Container Scanning&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;dast.html&quot;&gt;DAST&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;license_management.html&quot;&gt;License Management&lt;&#x2F;a&gt; in future releases.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;why-did-this-happen&quot;&gt;Why did this happen?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;sast.html&quot;&gt;new job definition&lt;&#x2F;a&gt; uses the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;README.html#artifactsreportssast-ultimate&quot;&gt;&lt;code&gt;reports&lt;&#x2F;code&gt; syntax&lt;&#x2F;a&gt;, which is necessary to show SAST results in the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;security_dashboard&#x2F;&quot;&gt;Group Security Dashboard&lt;&#x2F;a&gt;.
-Unfortunately, this syntax is not supported by GitLab Runner prior to 11.5.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;who-is-affected&quot;&gt;Who is affected?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;You are affected by this change if you meet &lt;strong&gt;all&lt;&#x2F;strong&gt; the requirements in the following list:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-  &lt;li&gt;You are using Auto DevOps &lt;strong&gt;AND&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;you have at least one GitLab Runner 11.4 or older set up for your projects &lt;strong&gt;AND&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;you are interested in security reports.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-
-&lt;h2 id=&quot;who-is-not-affected&quot;&gt;Who is not affected?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;You are &lt;strong&gt;not&lt;&#x2F;strong&gt; affected by this change if you meet &lt;strong&gt;at least one&lt;&#x2F;strong&gt; of the requirements in the following list:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-  &lt;li&gt;You are not using Auto DevOps &lt;strong&gt;OR&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;you are using only GitLab Runner 11.5 or newer &lt;strong&gt;OR&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;you are using only shared runners on GitLab.com (we already upgraded them) &lt;strong&gt;OR&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;you are not interested in security reports.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-
-&lt;h2 id=&quot;how-to-solve-the-problem&quot;&gt;How to solve the problem&lt;&#x2F;h2&gt;
-
-&lt;p&gt;If you are not affected by the change, you don&#x27;t need to take any action.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you are affected, you should upgrade your GitLab Runners to version 11.5 or newer as soon as possible.
-If you don&#x27;t, you will not have new SAST reports until you do upgrade. If you upgrade your runners later, SAST will
-start to work again correctly.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;which-is-the-expected-timeline&quot;&gt;Which is the expected timeline?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab 11.6 will be released on &lt;strong&gt;Dec. 22&lt;&#x2F;strong&gt;.  This change may also be shipped in an early release
-candidate (RC) version.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you are using a &lt;strong&gt;self-managed&lt;&#x2F;strong&gt; GitLab instance, and you don&#x27;t install RC versions, you will be affected when
-you&#x27;ll upgrade to GitLab 11.6.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you are using &lt;strong&gt;GitLab.com&lt;&#x2F;strong&gt;, you will be affected as soon as the RC version with the change will be deployed.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Feel free to reach out to us with any further questions!&lt;&#x2F;p&gt;
-
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Introducing Patroni as the Postgres Failover Manager on GitLab.com</title>
-<link href='https://about.gitlab.com/2018/12/05/availability-postgres-patroni/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/05/availability-postgres-patroni/</id>
-<published>2018-12-05T00:00:00+00:00</published>
-<updated>2018-12-05T00:00:00+00:00</updated>
-<author>
-<name>Gerardo Lopez-Fernandez</name>
-</author>
-<content type='html'>&lt;h2 id=&quot;upcoming-maintenance-windows-for-patroni-deployment&quot;&gt;Upcoming Maintenance Windows for Patroni Deployment&lt;&#x2F;h2&gt;
-
-&lt;p&gt;We are writing this post to let our community know we are planning on performing the work necessary 
-to deploy &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zalando&#x2F;patroni&quot;&gt;Patroni&lt;&#x2F;a&gt; as the Postgres Failover Manager on GitLab.com over two weekends: a dry-run to test
-our migration plan and tools on Saturday, Dec 8, 2018, and the actual deployment on Saturday, December
-15, 2018.&lt;&#x2F;p&gt;
-
-&lt;p&gt;During the maintenance windows, the following services will be unavailable:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;SaaS website (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;&quot;&gt;GitLab.com&lt;&#x2F;a&gt; will be offline, but &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;&quot;&gt;about.gitlab.com&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;&quot;&gt;docs.gitlab.com&lt;&#x2F;a&gt; will still be available)&lt;&#x2F;li&gt;
-  &lt;li&gt;Git ssh&lt;&#x2F;li&gt;
-  &lt;li&gt;Git https&lt;&#x2F;li&gt;
-  &lt;li&gt;registry&lt;&#x2F;li&gt;
-  &lt;li&gt;CI&#x2F;CD&lt;&#x2F;li&gt;
-  &lt;li&gt;Pages&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;h3 id=&quot;maintenance-window---dry-run---saturday-december-8-at-1300-utc&quot;&gt;Maintenance Window - Dry run - Saturday, December 8 at 13:00 UTC&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We will perform testing and validation of our deployment procedures and tools during this maintenance
-window to do final readiness checks. This maintenance window should last 30 minutes.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;maintenance-window---actual-cutover---saturday-december-15-at-1300-utc&quot;&gt;Maintenance Window - Actual Cutover - Saturday, December 15 at 13:00 UTC&lt;&#x2F;h3&gt;
-
-&lt;p&gt;On the day of the cutover, we are planning to start at 13:00 UTC.  The time window for GitLab.com to be
-in maintenance is currently planned to be 30 minutes. Should any times for this change, we will be updating
-on the channels listed below. When this window is completed GitLab.com will be running Patroni.&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;status.gitlab.com&#x2F;&quot;&gt;GitLab Status page&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlabstatus&quot;&gt;GitLab Status Twitter&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-gke-integration-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Patch Release: 11.5.2</title>
-<link href='https://about.gitlab.com/2018/12/04/gitlab-11-5-2-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/04/gitlab-11-5-2-released/</id>
-<published>2018-12-04T00:00:00+00:00</published>
-<updated>2018-12-04T00:00:00+00:00</updated>
-<author>
-<name>Cindy Pallares</name>
-</author>
-<content type='html'>&lt;p&gt;Today we are releasing version 11.5.2 for GitLab Community Edition and Enterprise Edition.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This version resolves a number of regressions and bugs in
-&lt;a href=&quot;&#x2F;2018&#x2F;11&#x2F;22&#x2F;gitlab-11-5-released&#x2F;&quot;&gt;this month&#x27;s 11.5.0 release&lt;&#x2F;a&gt; and
-prior versions.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-community-edition-and-enterprise-edition&quot;&gt;GitLab Community Edition and Enterprise Edition&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Available in GitLab Core, Starter, Premium, and Ultimate:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22916&quot;&gt;Fix impersonation token value not displaying after creation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23112&quot;&gt;Fix emoji not rendering in filter dropdown&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23195&quot;&gt;Fix the dimensions of image diffs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23306&quot;&gt;Correctly handle data-loss scenarios when encrypting columns&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23244&quot;&gt;Fix stuck tooltip on stop env button&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23279&quot;&gt;Allow commenting to resolved non-diff discussions&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23314&quot;&gt;Remove Site Statistic&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23308&quot;&gt;Clear BatchLoader context between Sidekiq jobs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23321&quot;&gt;Update issue boards images for recent cards redesign&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23247&quot;&gt;New Crowdin translations&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;p&gt;Available in GitLab Starter, Premium, and Ultimate:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8543&quot;&gt;Fill timestamp for Approver bulk insertion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8509&quot;&gt;Fix issues analytics query&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8466&quot;&gt;Exclude code owner from merge request participants to avoid spam&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;p&gt;Available in GitLab Ultimate:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8494&quot;&gt;Add additional requirements to Security Dashboard&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8459&quot;&gt;Resolve inability to scroll operations dashboard&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;h2 id=&quot;omnibus-gitlab&quot;&gt;Omnibus GitLab&lt;&#x2F;h2&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2871&quot;&gt;Make remote-syslog template use correct log directory&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
-and start again, no matter how “big” or “small” the upgrade is. This behavior
-can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; file,
-which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-
-&lt;p&gt;To update, check out our &lt;a href=&quot;&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-subscriptions&quot;&gt;GitLab subscriptions&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Access to GitLab Starter, Premium, and Ultimate features is granted by a paid &lt;a href=&quot;&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Alternativelly, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;users&#x2F;sign_in&quot;&gt;sign up for GitLab.com&lt;&#x2F;a&gt;
-to use GitLab&#x27;s own infrastructure.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Crossplane lowers the barrier to a multi-cloud future</title>
-<link href='https://about.gitlab.com/2018/12/04/opensource-multi-cloud-crossplane/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/04/opensource-multi-cloud-crossplane/</id>
-<published>2018-12-04T00:00:00+00:00</published>
-<updated>2018-12-04T00:00:00+00:00</updated>
-<author>
-<name>Sid Sijbrandij</name>
-</author>
-<content type='html'>&lt;p&gt;Cloud computing has become the dominant IT paradigm and multi-cloud looks poised to be the primary approach, with &lt;a href=&quot;https:&#x2F;&#x2F;www.rightscale.com&#x2F;blog&#x2F;cloud-industry-insights&#x2F;cloud-computing-trends-2018-state-cloud-survey&quot;&gt;81 percent of enterprises&lt;&#x2F;a&gt; already adopting a multi-cloud strategy.&lt;&#x2F;p&gt;
-
-&lt;p&gt;A multi-cloud strategy prevents vendor lock-in, which is increasingly important as three major providers (AWS, GCP, and Azure) dominate the market. Despite the many benefits of a multi-cloud strategy, deploying across multiple clouds is still incredibly complex. While Kubernetes has emerged as the standard container orchestration platform, most organizations are running more than just container workloads, and there’s currently no standard for workload portability across managed services. What’s needed is a consistent, multi-cloud, open source interface, and we think there’s a new, interesting project up for the challenge.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;crossplane-aims-to-simplify-multi-cloud-strategy&quot;&gt;Crossplane aims to simplify multi-cloud strategy&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Crossplane, &lt;a href=&quot;https:&#x2F;&#x2F;crossplane.io&#x2F;&quot;&gt;announced today&lt;&#x2F;a&gt;, is an open source multi-cloud control plane sponsored by &lt;a href=&quot;https:&#x2F;&#x2F;upbound.io&quot;&gt;Upbound&lt;&#x2F;a&gt;. Crossplane  introduces a set of workload resource abstractions on top of existing managed services and cloud offerings to enable an unprecedented degree of workload portability across cloud providers. There are &lt;a href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;gitlab-magazine&#x2F;multi-cloud-maturity-model-2de185c01dd7&quot;&gt;six levels of multi-cloud maturity&lt;&#x2F;a&gt; and until today, application portability (i.e. the ability to run an app on any cloud) is incredibly rare and has been difficult to achieve.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Upbound is the sponsoring company behind &lt;a href=&quot;https:&#x2F;&#x2F;rook.io&quot;&gt;Rook.io&lt;&#x2F;a&gt;, a cloud native storage service for Kubernetes, and are experts in running managed services  the cloud native way. With this project, Upbound strives for Crossplane to become a universal API for cloud computing, and a control plane for smart controllers that can work across clouds. The end goal is to enable a clean separation of concerns between developers who want to consume resources without knowing the details of how they are provisioned or managed, and administrators who want to tightly control the details of implementation and policies.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;how-does-crossplane-compare-to-existing-tools&quot;&gt;How does Crossplane compare to existing tools?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Similar projects exist, but are not nearly as flexible in their ability to support workload portability across multiple clouds. For example, Terraform and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;awslabs&#x2F;aws-service-operator&quot;&gt;AWS Service Operator&lt;&#x2F;a&gt; are similar infrastructure provisioning tools, but they do not support workload portability across cloud providers. Terraform can dynamically provision infrastructure and typically performs changes only when the tool is run by a human, and AWS Service Operator can only provision managed services in AWS.&lt;&#x2F;p&gt;
-
-&lt;p&gt;As a result of an open API approach, Crossplane has an opportunity to change the cloud industry as we know it, and we’re excited that they&#x27;ve chosen GitLab to be the first complex app deployed with them.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;why-crossplane--gitlab&quot;&gt;Why Crossplane + GitLab?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;&quot;GitLab has a proven track record supporting multi-cloud DevOps,” says Bassam Tabbara, founder and CEO at Upbound. “Customers value the simplicity of the toolchain and the flexibility of the diverse deployment environments that GitLab offers them. Their open collaboration and culture made them the natural fit to be the first complex app deployed with Crossplane.&quot;&lt;&#x2F;p&gt;
-
-&lt;p&gt;At GitLab, we’ve committed to multi-cloud DevOps, as detailed in my recent post on &lt;a href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;gitlab-magazine&#x2F;there-are-3-public-clouds-left-and-well-use-all-of-them-214858d793e9&quot;&gt;why GitLab will use all three public clouds&lt;&#x2F;a&gt;. Most of our customers are already leveraging a multi-cloud strategy using &lt;a href=&quot;&#x2F;product&#x2F;continuous-integration&#x2F;&quot;&gt;GitLab CI&#x2F;CD&lt;&#x2F;a&gt; and are increasingly looking for more ways to deploy their code across multiple cloud environments. The choices available today are too complex and vendor driven, but with Crossplane the ability to orchestrate clouds becomes simple. We look forward to collaborating with them on this vision and as the first complex app deployed with Crossplane.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Once GitLab has been successfully deployed with Crossplane, the next step is to use the project to deploy applications from GitLab. We’ll provide updates as they become available.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;crossplane.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Patch Release: 11.4.9</title>
-<link href='https://about.gitlab.com/2018/12/04/gitlab-11-4-9-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/12/04/gitlab-11-4-9-released/</id>
-<published>2018-12-04T00:00:00+00:00</published>
-<updated>2018-12-04T00:00:00+00:00</updated>
-<author>
-<name>Steve Azzopardi</name>
-</author>
-<content type='html'>&lt;!-- For detailed instructions on how to complete this, please see https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;release&#x2F;docs&#x2F;blob&#x2F;master&#x2F;general&#x2F;patch&#x2F;blog-post.md --&gt;
-
-&lt;p&gt;Today we are releasing version 11.4.9 for GitLab Community Edition and Enterprise Edition.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This version resolves a number of regressions and bugs in
-&lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;22&#x2F;gitlab-11-4-released&quot;&gt;last month&#x27;s 11.4 release&lt;&#x2F;a&gt; and
-prior versions.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-community-edition-and-enterprise-edition&quot;&gt;GitLab Community Edition and Enterprise Edition&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Available in GitLab Core, Starter, Premium, and Ultimate:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22916&quot;&gt;Display impersonation token value after creation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;23306&quot;&gt;Correctly handle data-loss scenarios when encrypting columns&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;
-
-&lt;p&gt;This version does not include any new migrations, and should not require any
-downtime.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
-and start again, no matter how “big” or “small” the upgrade is. This behavior
-can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; file,
-which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-
-&lt;p&gt;To update, check out our &lt;a href=&quot;&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-subscriptions&quot;&gt;GitLab subscriptions&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Access to GitLab Starter, Premium, and Ultimate features is granted by a paid &lt;a href=&quot;&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Alternativelly, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;users&#x2F;sign_in&quot;&gt;sign up for GitLab.com&lt;&#x2F;a&gt;
-to use GitLab&#x27;s own infrastructure.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>What went down at the Q4&#x27;2018 GitLab Hackathon</title>
-<link href='https://about.gitlab.com/2018/11/29/q4-hackathon-recap/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/29/q4-hackathon-recap/</id>
-<published>2018-11-29T00:00:00+00:00</published>
-<updated>2018-11-29T00:00:00+00:00</updated>
-<author>
-<name>Ray Paik</name>
-</author>
-<content type='html'>&lt;p&gt;Following the success of the &lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;09&#x2F;hackathon-recap&#x2F;&quot;&gt;inaugural GitLab Hackathon in September&lt;&#x2F;a&gt;, the GitLab community again gathered on Nov. 14-15 for the Q4 hackathon. Many first-time contributors also participated in this event and the community contribution far exeeded what we saw from the first Hackathon.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;so-what-did-we-accomplish&quot;&gt;So what did we accomplish?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;One of the key goals of the event was to encourage community members to contribute Merge Requests (MRs), and the community delivered 65 of them, with 46 merged as of Nov. 26. You can check out the status of MRs at &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;marketing&#x2F;community-relations&#x2F;contributor-program&#x2F;gitlab-hackathon&#x2F;q4-2018-hackathon&#x2F;issues&#x2F;1&quot;&gt;Hackathon Community MRs&lt;&#x2F;a&gt;. This is almost the triple the number of MRs from the September Hackathon, as we easily surpassed the September total by the end of Day 1. Beyond the number of MRs, what was also impressive was community&#x27;s participation across a wide variety of GitLab projects. In addition to GitLab &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&quot;&gt;Community&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&quot;&gt;Enterprise&lt;&#x2F;a&gt; editions, we saw MRs for &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-development-kit&quot;&gt;GitLab Development Kit (GDK)&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-shell&quot;&gt;GitLab Shell&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitter&#x2F;webapp&quot;&gt;Gitter&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&quot;&gt;the GitLab website&lt;&#x2F;a&gt;, and more.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;what-else-happened-during-the-event&quot;&gt;What else happened during the event?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;In addition to hacking, we had several community experts deliver tutorial sessions on topics ranging from &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=0WatxtwgLDE&quot;&gt;Meltano&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=mCec7g6Ml70&quot;&gt;Omnibus&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=0GVtrxZ5_a8&quot;&gt;GitLab Architecture&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=LFWTW6PbJOQ&quot;&gt;Gitter&lt;&#x2F;a&gt;. Recordings&#x2F;slides from all the sessions can also be found on the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;marketing&#x2F;community-relations&#x2F;contributor-program&#x2F;gitlab-hackathon&#x2F;q4-2018-hackathon&#x2F;wikis&#x2F;home&quot;&gt;Hackathon wiki page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;when-is-the-next-hackathon&quot;&gt;When is the next Hackathon?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;We will be having another Hackathon in mid-Q1&#x27;2019, and will announce the dates in January. Please stay tuned for further announcements in another blog post and discussions on the
-&lt;a href=&quot;https:&#x2F;&#x2F;gitter.im&#x2F;gitlabhq&#x2F;community&quot;&gt;GitLab Community room in Gitter&lt;&#x2F;a&gt; and on the &lt;a href=&quot;https:&#x2F;&#x2F;forum.gitlab.com&#x2F;c&#x2F;announcements&quot;&gt;GitLab forum&lt;&#x2F;a&gt;. More importantly, if you have any suggestions for topics and&#x2F;or feedback on last month&#x27;s event,
-please mention them on the &lt;a href=&quot;https:&#x2F;&#x2F;gitter.im&#x2F;gitlabhq&#x2F;community&quot;&gt;GitLab Community room in Gitter&lt;&#x2F;a&gt; to help us improve future Hackathons.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;hackathon-prizes&quot;&gt;Hackathon prizes&lt;&#x2F;h2&gt;
-
-&lt;p&gt;As we announced at the Hackathon kickoff, everyone who had MRs merged will receive a token of our appreciation for their contribution. During the Hackathon period, 19 people had MRs merged and the &quot;grand prize&quot; winner with most MRs merged is once again &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gtsiolis&quot;&gt;George Tsiolis&lt;&#x2F;a&gt;, with 13 merged MRs!
-Congratulations to everyone! I will reach out to all winners shortly.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;how-do-i-get-started-with-contributing&quot;&gt;How do I get started with contributing?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;A good place to start is the &lt;a href=&quot;&#x2F;community&#x2F;contribute&#x2F;&quot;&gt;Contributing to GitLab page&lt;&#x2F;a&gt;, where you can learn how you can
-contribute to GitLab code, documentation, translation, and UX design.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you have any questions, you are always welcome to reach me at rpaik@gitlab.com.&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;ZV_64LdGoao&quot;&gt;&quot;Gitlab application screengrab&quot;&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;@pankajpatel&quot;&gt;Pankaj Patel&lt;&#x2F;a&gt; on Unsplash&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;2018-09-13-gitlab-hackathon-cover.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Security Release: 11.5.1, 11.4.8, and 11.3.11</title>
-<link href='https://about.gitlab.com/2018/11/28/security-release-gitlab-11-dot-5-dot-1-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/28/security-release-gitlab-11-dot-5-dot-1-released/</id>
-<published>2018-11-28T00:00:00+00:00</published>
-<updated>2018-11-28T00:00:00+00:00</updated>
-<author>
-<name>Ethan Strike</name>
-</author>
-<content type='html'>&lt;p&gt;Today we are releasing versions 11.5.1, 11.4.8, and 11.3.11 for GitLab Community Edition (CE) and Enterprise Edition (EE).&lt;&#x2F;p&gt;
-
-&lt;p&gt;These versions contain a number of important security fixes, and we strongly recommend that all GitLab installations be upgraded to one of these versions immediately.&lt;&#x2F;p&gt;
-
-
-
-&lt;p&gt;The vulnerability details will be made public on our issue tracker in approximately 30 days.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Please read on for more information regarding this release.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;view-names-of-private-groups&quot;&gt;View Names of Private Groups&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The Todos dashboard permitted an unauthorized user to view the names of private groups. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19494&quot;&gt;CVE-2018-19494&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ashish_r_padelkar&quot;&gt;@ashish_r_padelkar&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 11.2 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;persistent-xss-in-environments&quot;&gt;Persistent XSS in Environments&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The Environments page contained a lack of input validation and output encoding issue which resulted in a persistent XSS. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19493&quot;&gt;CVE-2018-19493&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;xanbanx&quot;&gt;@xanbanx&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-1&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 11.0 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-1&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;ssrf-in-prometheus-integration&quot;&gt;SSRF in Prometheus integration&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The Prometheus integration was vulnerable to an SSRF issue which allowed an attacker to make requests to any local network resource accessible from the GitLab server. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19495&quot;&gt;CVE-2018-19495&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;bull&quot;&gt;@bull&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-2&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 9.0 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-2&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;unauthorized-promotion-of-milestones&quot;&gt;Unauthorized Promotion of Milestones&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Milestones were vulnerable to an insecure object reference issue where a user with insufficient privilieges could promote a project milestone to a group milestone. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19496&quot;&gt;CVE-2018-19496&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;sandeep_hodkasia&quot;&gt;@sandeep_hodkasia&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-3&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 10.2 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-3&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;exposure-of-confidential-issue-title&quot;&gt;Exposure of Confidential Issue Title&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The commits listing page in a project permitted an unauthorized user to view the title of a confidential issue. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19577&quot;&gt;CVE-2018-19577&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;@ngalog&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-4&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.6 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-4&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;persisent-xss-in-markdown-fields-via-mermaid-script&quot;&gt;Persisent XSS in Markdown Fields via Mermaid Script&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Fields that accept Markdown contained incomplete input validation and output encoding when accepting Mermaid script, which resulted in a persistent XSS. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19573&quot;&gt;CVE-2018-19573&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;fransrosen&quot;&gt;@fransrosen&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-5&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 10.3 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-5&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;persistent-xss-in-markdown-fields-via-unrecognized-html-tags&quot;&gt;Persistent XSS in Markdown Fields via Unrecognized HTML Tags&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Fields that accept Markdown contained incomplete input validation and output encoding when accepting unrecognized HTML tags, which resulted in a persistent XSS. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19570&quot;&gt;CVE-2018-19570&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;otr&quot;&gt;@otr&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-6&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 11.3 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-6&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;symlink-race-condition-in-pages&quot;&gt;Symlink Race Condition in Pages&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab Pages had a symlink race condition that would allow unauthorized access to files in the Pages chroot. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19572&quot;&gt;CVE-2018-19572&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;waldi&quot;&gt;Bastian Blank&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-7&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE 8.17 &amp;amp; EE 8.3 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-7&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;unauthorized-changes-by-guest-user-in-issues&quot;&gt;Unauthorized Changes by Guest User in Issues&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab issues were vulnerable to an insecure object reference issue that allowed a Guest user to make changes to, or delete their own comments after an issue had been made confidential. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19576&quot;&gt;CVE-2018-19576&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;sandeep_hodkasia&quot;&gt;@sandeep_hodkasia&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-8&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.6 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-8&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;unauthorized-comments-on-locked-issues&quot;&gt;Unauthorized Comments on Locked Issues&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab issues were vulnerable to an insecure object reference issue that allowed an unauthorized user to make comments after an issue had been locked. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19575&quot;&gt;CVE-2018-19575&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;@ngalog&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-9&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 10.1 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-9&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;improper-enforcement-of-token-scope&quot;&gt;Improper Enforcement of Token Scope&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The GitLab web interface was vulnerable to an authorization issue that allowed access to the web-UI as a user using their Personal Access Token (PAT) of any scope. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19569&quot;&gt;CVE-2018-19569&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this fix, the use of PATs is limited to the API, the RSS feed, and the registry, which could break any existing automation scripts that don&#x27;t use the API. The impact is expected to be limited.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to Jan Alsenz of Oneconsult AG for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;em&gt;Updated: 2018-11-28:&lt;&#x2F;em&gt; We have received reports that this change has impacted how repo files and job artifacts are downloaded for some users. For instructions on how to do so through the API, please see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;54572#note_120859334&quot;&gt;our support issue&lt;&#x2F;a&gt;. Thank you to the users participating in this issue. Your feedback is important to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-10&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.8 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-10&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;crlf-injection-in-project-mirroring&quot;&gt;CRLF Injection in Project Mirroring&lt;&#x2F;h2&gt;
-
-&lt;p&gt;When using the Git protocol, project mirroring was vulnerable to a CRLF injection vulnerability. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19585&quot;&gt;CVE-2018-19585&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;chromium1337&quot;&gt;@chromium1337&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-11&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.18 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-11&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;xss-in-oauth-authorization&quot;&gt;XSS in OAuth Authorization&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The OAuth authorization process contained a lack of input validation and output encoding which resulted in an XSS. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19574&quot;&gt;CVE-2018-19574&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;fransrosen&quot;&gt;@fransrosen&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-12&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 7.6 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-12&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;ssrf-in-webhooks&quot;&gt;SSRF in Webhooks&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Webhooks were vulnerable to an SSRF vulnerability that allowed an attacker to make requests to any local network resource accessible from the GitLab server. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19571&quot;&gt;CVE-2018-19571&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;nyangawa&quot;&gt;@nyangawa&lt;&#x2F;a&gt; of Chaitin Tech for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-13&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.18 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-13&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;send-email-on-email-address-change&quot;&gt;Send Email on Email Address Change&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Previously, GitLab did not send an email to the old email address when an email address change was made. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19580&quot;&gt;CVE-2018-19580&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;muon4&quot;&gt;@muon4&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-14&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects all versions of GitLab CE&#x2F;EE.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-14&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;workhorse-logs-contained-tokens&quot;&gt;Workhorse Logs Contained Tokens&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Workhorse was logging access tokens, which allowed administrators with access to the logs to see the tokens of other users. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19583&quot;&gt;CVE-2018-19583&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-15&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab CE&#x2F;EE 8.0 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-15&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;unauthorized-publishing-of-draft-comments&quot;&gt;Unauthorized Publishing of Draft Comments&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The discussion drafts endpoint, used in merge requests, contained an insecure object reference vulnerability that permitted an unauthorized user to publish the drafts of another user. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19582&quot;&gt;CVE-2018-19582&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;lucky_sen&quot;&gt;@lucky_sen&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-16&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab EE 11.4 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-16&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;guest-can-set-weight-of-a-new-issue&quot;&gt;Guest Can Set Weight of a New Issue&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab issues were vulnerable to an insecure object reference issue that allowed a Guest user to set the weight of an issue they created. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19581&quot;&gt;CVE-2018-19581&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;@ngalog&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-17&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab EE 8.3 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-17&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;disclosure-of-private-groups-members-and-milestones&quot;&gt;Disclosure of Private Group&#x27;s Members and Milestones&lt;&#x2F;h2&gt;
-
-&lt;p&gt;An insecure direct object reference vulnerability in issue boards allowed authenticated, but unauthorized users to view members and milestone details of private groups. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19584&quot;&gt;CVE-2018-19584&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;@ngalog&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-18&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab EE 11.0 and later.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-18&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;persisent-xss-in-operations&quot;&gt;Persisent XSS in Operations&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The Operations page contained a lack of input validation and output encoding which resulted in a persistent XSS. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19579&quot;&gt;CVE-2018-19579&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;ngalog&quot;&gt;@ngalog&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-19&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab EE 11.5.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-19&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;reporter-can-view-operations-page&quot;&gt;Reporter Can View Operations Page&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Due to incomplete permissions validation, a user with Reporter privileges was permitted to view the Jaeger Tracing Operations page. The issue is now mitigated in the latest release and is assigned &lt;a href=&quot;https:&#x2F;&#x2F;cve.mitre.org&#x2F;cgi-bin&#x2F;cvename.cgi?name=CVE-2018-19578&quot;&gt;CVE-2018-19578&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;vijay_kumar1110&quot;&gt;@vijay_kumar1110&lt;&#x2F;a&gt; for responsibly reporting this vulnerability to us.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;versions-affected-20&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Affects GitLab EE 11.5.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;remediation-20&quot;&gt;Remediation&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;upgrade-to-redis-3212&quot;&gt;Upgrade to Redis 3.2.12&lt;&#x2F;h2&gt;
-
-&lt;p&gt;The version of Redis used in the Omnibus package was upgraded in the GitLab 11.3 release. This upgrade was previously included in GitLab 11.4 and 11.5 Omnibus packages, and includes several security fixes.
-The upgrade to Redis was incorrectly reported in the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2018&#x2F;10&#x2F;29&#x2F;security-release-gitlab-11-dot-4-dot-3-released&#x2F;&quot;&gt;October security release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-
-&lt;p&gt;To update, check out our &lt;a href=&quot;&#x2F;update&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab achieves AWS DevOps Competency certification</title>
-<link href='https://about.gitlab.com/2018/11/28/gitlab-achieves-aws-devops-competency-certification/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/28/gitlab-achieves-aws-devops-competency-certification/</id>
-<published>2018-11-28T00:00:00+00:00</published>
-<updated>2018-11-28T00:00:00+00:00</updated>
-<author>
-<name>Tina Sturgis and Eliran Mesika</name>
-</author>
-<content type='html'>&lt;p&gt;Today, we are proud to announce GitLab has been certified with &lt;a href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;devops&#x2F;partner-solutions&#x2F;&quot;&gt;AWS DevOps Competency&lt;&#x2F;a&gt;, affirming our further commitment as a technology partner with Amazon Web Services (AWS).&lt;&#x2F;p&gt;
-
-&lt;p&gt;Building on the foundation of our AWS partnership over the last three years, with this DevOps certification we’ve now received the highest level of accreditation available from AWS. We bring proven customer success with &lt;a href=&quot;&#x2F;customers&#x2F;axway&#x2F;&quot;&gt;measurable return on investment&lt;&#x2F;a&gt; for customers running GitLab on AWS and &lt;a href=&quot;&#x2F;solutions&#x2F;aws&#x2F;&quot;&gt;using GitLab to deploy their software to AWS&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;DevOps_competency_badge.png&quot; alt=&quot;AWS DevOps Competency badge&quot; class=&quot;small right wrap-text&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;why-the-aws-devops-competency-matters&quot;&gt;Why the AWS DevOps Competency matters&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Achieving this certification sets GitLab apart as an AWS Partner Network (APN) member that provides demonstrated DevOps technical proficiency and proven customer success, with specific focus in the &lt;a href=&quot;&#x2F;product&#x2F;continuous-integration&#x2F;&quot;&gt;Continuous Integration&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;product&#x2F;continuous-delivery&#x2F;&quot;&gt;Continuous Delivery&lt;&#x2F;a&gt; category.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is important for our own customers who are either looking to move to AWS or are already using it, as well as for current AWS customers. Potential users of GitLab with AWS can be assured that the GitLab solution has been reviewed and approved by an AWS Architect Review Board and that it meets &lt;a href=&quot;https:&#x2F;&#x2F;d0.awsstatic.com&#x2F;whitepapers&#x2F;Security&#x2F;AWS_Security_Best_Practices.pdf&quot;&gt;AWS Security Best Practices&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Through this process we were able to demonstrate our product is production ready on AWS for DevOps, specifically for improving application delivery, application build&#x2F;test, or infrastructure&#x2F;configuration management.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;gitlab-and-aws-customer-success&quot;&gt;GitLab and AWS customer success&lt;&#x2F;h3&gt;
-
-&lt;p&gt;To learn more about the GitLab customer case studies considered for this competency, please review both the &lt;a href=&quot;&#x2F;customers&#x2F;axway&#x2F;&quot;&gt;Axway &lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;customers&#x2F;trek10&#x2F;&quot;&gt;Trek10&lt;&#x2F;a&gt; case studies. You can also access information about other customers on the &lt;a href=&quot;&#x2F;customers&#x2F;&quot;&gt;GitLab customers page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;more-about-the-aws-competency-program&quot;&gt;More about the AWS Competency Program&lt;&#x2F;h3&gt;
-
-&lt;p&gt;AWS established the program to help customers identify, through the AWS Partner Network, partners with deep industry experience and expertise in specialized solution areas. Attaining an AWS Competency allows partners to differentiate themselves to customers by showcasing expertise in a specific solution area.&lt;&#x2F;p&gt;
-
-&lt;p&gt;We are honored to obtain this AWS DevOps Competency status, and believe this helps advance &lt;a href=&quot;&#x2F;company&#x2F;strategy&#x2F;#mission&quot;&gt;our mission to allow everyone to contribute&lt;&#x2F;a&gt;. Our definition of everyone now extends further, to those who are small and large users of AWS and AWS Services on their DevOps journey.   &lt;&#x2F;p&gt;
-
-&lt;p&gt;For more information on GitLab’s partnership with AWS, check out &lt;a href=&quot;&#x2F;solutions&#x2F;aws&#x2F;&quot;&gt;about.gitlab.com&#x2F;solutions&#x2F;aws&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;To learn more about GitLab’s Technology Partners, visit &lt;a href=&quot;&#x2F;partners&#x2F;&quot;&gt;about.gitlab.com&#x2F;partners&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-aws-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>It&#x27;s raining repos: The microservices repo explosion, and what we&#x27;re doing about it</title>
-<link href='https://about.gitlab.com/2018/11/26/microservices-integrated-solution/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/26/microservices-integrated-solution/</id>
-<published>2018-11-26T00:00:00+00:00</published>
-<updated>2018-11-26T00:00:00+00:00</updated>
-<author>
-<name>Aricka Flowers</name>
-</author>
-<content type='html'>&lt;p&gt;Gone are the days of &quot;set it and forget it&quot;-style software development. The increased demand for code and operations on all projects, especially microservices, means more repos. This calls for a more integrated solution to incorporate testing, security updates, monitoring, and more, says GitLab CEO &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#sytses&quot;&gt;Sid Sijbrandij&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
-
-&lt;blockquote&gt;
-  &lt;p&gt;&quot;The bar&#x27;s going up for software development. It&#x27;s no longer enough to just write the code; you also have to write the tests. It&#x27;s no longer enough to just ship it; you also have to monitor it. You can no longer make it once and forget about it; you have to stay current with security updates. For every product you make you have to integrate more of these tools. It used to be that only the big projects got all these things, but now every single service you ship should have these features, because other projects are dependent on it. One security vulnerability can be enough to take a company down.&quot;&lt;&#x2F;p&gt;
-&lt;&#x2F;blockquote&gt;
-
-&lt;p&gt;An increasing number of project repos means exponential growth in the number of tools needed to handle them – bad news for those saddled managing project dependencies. A streamlined workflow is essential to alleviate this burden – here&#x27;s how we want to help you get there.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;everything-under-one-roof&quot;&gt;Everything under one roof&lt;&#x2F;h3&gt;
-
-&lt;p&gt;&quot;With GitLab, we want to enable you to simply commit your code and have all the tools you need integrated out of the box,&quot; Sid said. &quot;You don&#x27;t have to do anything else. It&#x27;s monitored; we measure whether your dependencies have a vulnerability and fix it for you automatically. I think that&#x27;s the big benefit of GitLab; that you don&#x27;t have to go into stitching together 10 tools for every project that you make.&quot;&lt;&#x2F;p&gt;
-
-&lt;p&gt;By using an integrated solution to manage an ever-growing number of microservices, you can avoid having engineers siloed off with their respective teams and tools. Creating visibility among teams and getting rid of the need for handoffs leads to a faster DevOps lifecycle while also ensuring that your projects deploy and remain stable, Sid explains.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-b panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1547&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1547, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;&quot;Our customers that switched from a fragmented setup and were only able to get projects through that cycle a few times a year are now deploying a few times a week,&quot; Sid said. &quot;The ability to go from planning to monitoring it in production is what GitLab brings to the table. We have an ample amount of customer case studies showing how we helped improve their speed.&quot;&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;better-support-for-microservices&quot;&gt;Better support for microservices&lt;&#x2F;h3&gt;
-
-&lt;p&gt;We are boning up our support of microservices, and have a number of features in the works to improve this area, including &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;34758&quot;&gt;group level Kubernetes clusters&lt;&#x2F;a&gt;, a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49336&quot;&gt;global Docker registry browser&lt;&#x2F;a&gt;, and adding the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22972&quot;&gt;ability to define multiple pipelines&lt;&#x2F;a&gt;. This is to build on what&#x27;s already there:&lt;&#x2F;p&gt;
-
-&lt;p&gt;&quot;We have great support for microservices. GitLab has &lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;31&#x2F;use-multiproject-pipelines-with-gitlab-cicd&#x2F;&quot;&gt;multi-project pipelines&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;triggers&#x2F;README.html#ci-job-token&quot;&gt;can trigger pipelines from multi-projects via API&lt;&#x2F;a&gt;,&quot; Sid detailed. &quot;The CI Working Group of the CNCF (Cloud Native Computing Foundation), the most cloud native organization in the world probably, uses GitLab to test their projects. We&#x27;ve got great support for things like &lt;a href=&quot;&#x2F;kubernetes&quot;&gt;Kubernetes&lt;&#x2F;a&gt; and cloud native technologies. In GitLab, every project you have can be attached to a Kubernetes cluster, and GitLab uses that to run everything that’s going on. We know that a lot of our users and customers are using microservices, and we work great with them.&quot;&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;future-focus-best-in-class-solutions&quot;&gt;Future focus: best-in-class solutions&lt;&#x2F;h3&gt;
-
-&lt;p&gt;GitLab is much more than just version control. Having started with the planning, creating and verifying stages in 2011 and 2012, we’ve had time to make those capabilities very strong. We are now strengthening our offerings in the other steps of the DevOps lifecycle: managing, packaging, releasing, configuring, monitoring and security.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&quot;We are seeing enormous progress in those areas, but they can&#x27;t go head to head with the best-in-class solutions just yet. So that&#x27;s going be the theme for GitLab next year, to make sure each of our solutions is best in class instead of just the three things we started with,&quot; Sid says. &quot;And we won&#x27;t take our eyes off the ball.&quot;&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;wplxPRCF7gA&quot;&gt;Cover image&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;@rubavi78&quot;&gt;Ruben Bagues&lt;&#x2F;a&gt; on Unsplash&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;microservices-explosion.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab 11.5 released with Group Security and Operations Dashboards, and Access Control for Pages</title>
-<link href='https://about.gitlab.com/2018/11/22/gitlab-11-5-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/22/gitlab-11-5-released/</id>
-<published>2018-11-22T00:00:00+00:00</published>
-<updated>2018-11-22T00:00:00+00:00</updated>
-<author>
-<name>Fabio Busatto</name>
-</author>
-<content type='html'>
-&lt;h2 class=&quot;intro-header&quot; id=&quot;group-dashboard-for-security-teams&quot;&gt;Group dashboard for security teams&lt;&#x2F;h2&gt;
-
-&lt;p&gt;For a long time, developers have used GitLab as a tool to secure their code. But now,
-GitLab is making security teams first-class citizens so they can use GitLab to effect better application security and ensure compliance. With 11.5, the
-&lt;a href=&quot;#group-security-dashboard&quot;&gt;Group Security Dashboard&lt;&#x2F;a&gt; pulls together all of the information security personnel need into one place, so folks like CISOs,
-CIOs, and application security leaders get a specific view designed for them.
-The group dashboard has a redesigned look and new visualizations, bringing together
-security information across multiple projects and providing a high-level view while
-also enabling the ability to drill down into specific reports. With 11.5, we&#x27;re
-starting with SAST reports, and we&#x27;ll be adding more to the group dashboard in
-the future. Our goal is to build a single tool that security teams can use
-instead of needing to switch back and forth between multiple tools.&lt;&#x2F;p&gt;
-
-&lt;h2 class=&quot;intro-header&quot; id=&quot;new-dashboard-for-operations-teams&quot;&gt;New dashboard for operations teams&lt;&#x2F;h2&gt;
-
-&lt;p&gt;In the same way that the Group Security Dashboard makes security teams first-class citizens, the &lt;a href=&quot;#operations-dashboard&quot;&gt;Operations Dashboard&lt;&#x2F;a&gt; provides a
-tailored experience for operations professionals. This instance-wide dashboard
-provides a single view across projects to get a summary of each project’s
-operational health, including pipeline and alert status.&lt;&#x2F;p&gt;
-
-&lt;h2 class=&quot;intro-header&quot; id=&quot;control-access-to-gitlab-pages&quot;&gt;Control access to GitLab Pages&lt;&#x2F;h2&gt;
-
-&lt;p&gt;&lt;a href=&quot;&#x2F;product&#x2F;pages&#x2F;&quot;&gt;GitLab Pages&lt;&#x2F;a&gt; is an easy way to
-serve static content on the web, making it perfect for use cases such as
-documentation for your project. But what about private projects where
-documentation and other static artifacts should only be accessed by project
-members? In the past, you&#x27;d either have to make your assets public to take
-advantage of Pages, or you would not be able to use the feature at all.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Now, in GitLab 11.5, the same access control permissions that apply to your
-issues and code can also be applied to static webpages served by GitLab Pages.
-Unauthenticated users will get a 404 when visiting the link. As of today,
-&lt;a href=&quot;#access-control-for-pages&quot;&gt;access controls for GitLab pages&lt;&#x2F;a&gt; is available for self-managed GitLab,
-with GitLab.com support coming soon.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is a unique feature that we&#x27;re particularly proud of because it comes
-from our open source community. Access control for Pages has been one of our
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;33422&quot;&gt;most requested features&lt;&#x2F;a&gt;
-and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-pages&#x2F;merge_requests&#x2F;94&quot;&gt;the code has been community contributed&lt;&#x2F;a&gt; as well!&lt;&#x2F;p&gt;
-
-&lt;h2 class=&quot;intro-header&quot; id=&quot;knative-for-kubernetes&quot;&gt;Knative for Kubernetes&lt;&#x2F;h2&gt;
-
-&lt;p&gt;“Serverless” is a popular, yet often misunderstood industry term. Some folks equate
-serverless with &quot;Function as a Service,&quot; or FaaS, but this &lt;a href=&quot;https:&#x2F;&#x2F;martinfowler.com&#x2F;articles&#x2F;serverless.html&quot;&gt;isn&#x27;t quite accurate&lt;&#x2F;a&gt;. In a nutshell, serverless enables a programming paradigm where you are able
-to focus on writing business logic without having to understand or even
-worry about the underlying infrastructure where your software is deployed.
-As such, both functions and applications can be serverless.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;cloud.google.com&#x2F;knative&#x2F;&quot;&gt;Knative&lt;&#x2F;a&gt; is a Kubernetes-based platform
-to build, deploy, and manage modern serverless workloads, and GitLab 11.5
-comes with the ability to &lt;a href=&quot;#easily-deploy-and-integrate-knative-with-gitlab&quot;&gt;easily deploy and integrate Knative with GitLab&lt;&#x2F;a&gt;. You can now install Knative to your &lt;a href=&quot;&#x2F;solutions&#x2F;kubernetes&#x2F;&quot;&gt;connected Kubernetes cluster&lt;&#x2F;a&gt; with a single click. With GitLab 11.5, you&#x27;ll be able to use Knative for your serverless applications, with
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;43959&quot;&gt;serverless functions coming in 11.6&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Today, Knative is still in alpha, but there are some compelling reasons to deploy applications using Knative as it comes with some powerful functionality out-of-the-box. In particular, Knative manages pod scaling for you so you can automatically scale up, or even scale down to zero without additional configuration. Additionally, Knative comes with eventing built in so using it to deploy microservices makes it easier to manage inter-process communication between your producer and consumer services.&lt;&#x2F;p&gt;
-
-&lt;h2 class=&quot;intro-header&quot; id=&quot;and-so-much-more&quot;&gt;And so much more!&lt;&#x2F;h2&gt;
-
-&lt;p&gt;With so many great features in this release, we couldn&#x27;t pack them all into
-the intro. Be sure to read up on other exciting new features like
-&lt;a href=&quot;#parallel-attribute-for-faster-pipelines&quot;&gt;the parallel attribute for faster pipelines&lt;&#x2F;a&gt;,
-&lt;a href=&quot;#issue-board-cards-redesigned&quot;&gt;redesigned Issue Board cards&lt;&#x2F;a&gt;, and an initial
-&lt;a href=&quot;#open-jaeger-from-gitlab&quot;&gt;Jaeger integration&lt;&#x2F;a&gt;.
-We’ve made big improvements in this release to make code review easier and more useful, including the ability to
-&lt;a href=&quot;#comment-on-unchanged-lines-in-merge-request&quot;&gt;comment on unchanged lines in merge requests&lt;&#x2F;a&gt;,
-&lt;a href=&quot;#preview-merge-request-review-before-submitting-it&quot;&gt;preview merge request reviews before submitting&lt;&#x2F;a&gt;, and
-&lt;a href=&quot;#assign-approvers-based-on-code-owners&quot;&gt;assign approvers based on Code Owners&lt;&#x2F;a&gt; along with
-&lt;a href=&quot;#review-app-direct-link&quot;&gt;Review App direct links&lt;&#x2F;a&gt;.
-Keep reading to see all of the features that are part of this release.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;11_5&#x2F;11_5-cover-image.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;
-&lt;!-- CTA --&gt;
-&lt;p class=&#x27;cta text-center&#x27;&gt;
-&lt;a href=&quot;&#x2F;events&#x2F;&quot; class=&quot;btn btn-red webcast-button&quot; target=&quot;_blank&quot;&gt;Join us for an upcoming event&lt;&#x2F;a&gt;
-&lt;&#x2F;p&gt;
-&lt;!-- MVP --&gt;
-&lt;section class=&#x27;mvp gray-section&#x27; id=&#x27;mvp&#x27;&gt;
-&lt;div class=&#x27;release-post-section&#x27;&gt;
-&lt;img alt=&#x27;GitLab MVP badge&#x27; src=&#x27;&#x2F;images&#x2F;mvp_badge.png&#x27; &#x2F;&gt;
-&lt;h2 id=&#x27;mvp&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#mvp&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-This month&#x27;s Most Valuable Person (&lt;a href=&#x27;&#x2F;community&#x2F;mvp&#x2F;&#x27;&gt;MVP&lt;&#x2F;a&gt;) is
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;tuomoa&quot;&gt;Tuomo Ala-Vannesluoma&lt;&#x2F;a&gt;
-&lt;&#x2F;h2&gt;
-&lt;p&gt;Tuomo did an amazing job by implementing &lt;a href=&quot;#access-control-for-pages&quot;&gt;Access control for Pages&lt;&#x2F;a&gt;, a highly requested feature.
-Private projects can now restrict access to their content to authorized users. This enables groups of
-people to host internal web pages that may contain sensitive information, for example.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Thank you, Tuomo! This feature required a significant amount of work across
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;18589&quot;&gt;&lt;code&gt;gitlab-ce&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-pages&#x2F;merge_requests&#x2F;94&quot;&gt;&lt;code&gt;gitlab-pages&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
-and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2583&quot;&gt;&lt;code&gt;omnibus-gitlab&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; GitLab projects.&lt;&#x2F;p&gt;
-
-&lt;&#x2F;div&gt;
-&lt;&#x2F;section&gt;
-&lt;!-- top feature --&gt;
-&lt;section class=&#x27;release-post-section&#x27; id=&#x27;top-feature&#x27;&gt;
-&lt;div class=&#x27;release-post-section text-center&#x27;&gt;
-&lt;h2 class=&#x27;features-released&#x27; id=&#x27;key-features-released&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#key-features&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Key features released in GitLab 11.5
-&lt;&#x2F;h2&gt;
-&lt;&#x2F;div&gt;
-&lt;h2 id=&#x27;group-security-dashboard&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#group-security-dashboard&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Group Security Dashboard
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Security teams need to easily access information about the security status of all their projects,
-so they know which is the most important task to take next. This is even more important for Directors
-of Security that need to have a high-level view of possible critical issues affecting the
-entire development.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With GitLab 11.5, a first iteration of a new Security Dashboard is available at group level. It
-provides a summary for all the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;sast.html&quot;&gt;SAST&lt;&#x2F;a&gt;
-vulnerabilities in all the projects in that group, and a list of
-actionable entries that can be used to start a remediation process. For example, you can open an issue
-with a suggested solution, or simply dismiss the entry if you classify it as a false positive.
-Support for other tests (Dependency Scanning, Container Scanning, DAST) will be added in the future.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; The Group Security Dashboard requires the new &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;README.html#artifactsreports&quot;&gt;&lt;code&gt;reports&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
-syntax and GitLab Runner 11.5 or higher in order to display results.
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;topics&#x2F;autodevops&#x2F;&quot;&gt;Auto DevOps&lt;&#x2F;a&gt; will be supported in a future release.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;img alt=&#x27;Group Security Dashboard&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;group-security-dashboard.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;security_dashboard&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;6709&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;section&gt;
-&lt;hr &#x2F;&gt;
-&lt;!-- primary features --&gt;
-&lt;section id=&#x27;primary-features&#x27;&gt;
-&lt;div class=&#x27;release-row&#x27;&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;h2 id=&#x27;operations-dashboard&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#operations-dashboard&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Operations Dashboard
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;For organizations who have embraced DevOps, and for teams with more operations-leaning members, it is important to be able to quickly
-ascertain the health of the projects in your organization.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab 11.5 introduces a new, operations-focused dashboard, providing a summary of the key operational metrics of each project
-a user is interested in. This includes the time since the last deployment, most recent commit, as well as whether there are any active alerts.&lt;&#x2F;p&gt;
-
-&lt;p&gt;The dashboard can be set as a user’s preferred homepage, or accessed via clicking on the new dashboard icon in the top bar.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;operations_dashboard&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;5781&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;img alt=&#x27;Operations Dashboard&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;ops-dashboard.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr &#x2F;&gt;
-&lt;div class=&#x27;release-row image-left&#x27;&gt;
-&lt;div class=&#x27;column text-column&#x27;&gt;
-&lt;h2 id=&#x27;access-control-for-pages&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#access-control-for-pages&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Access control for Pages
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;The 11.5 release introduces a fantastic new community-contributed feature which enables
-access control for Pages. Now, instead of only supporting use cases where the content
-associated with the product is public, you can use Pages to build and publish protected
-content that should only be accessible by project members. Operational documentation, internal
-secrets, or even just private planning or other information can now be confidently published
-automatically in an easy-to-access way, while ensuring only the right people are able to see
-it.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is currently not enabled on GitLab.com, you can follow
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;gl-infra&#x2F;infrastructure&#x2F;issues&#x2F;5576&quot;&gt;issue 5576&lt;&#x2F;a&gt;
-for more information.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;pages&#x2F;introduction.html#gitlab-pages-access-control-core-only&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;33422&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;column image-column&#x27;&gt;
-&lt;img alt=&#x27;Access control for Pages&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;access-control-pages.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr &#x2F;&gt;
-&lt;div class=&#x27;release-row&#x27;&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;h2 id=&#x27;easily-deploy-and-integrate-knative-with-gitlab&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#easily-deploy-and-integrate-knative-with-gitlab&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Easily deploy and integrate Knative with GitLab
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Building serverless applications enables teams to focus their time on making a great product
-and eliminates the need of provisioning, managing, and operating servers.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Starting in GitLab 11.5, you can now deploy &lt;a href=&quot;https:&#x2F;&#x2F;cloud.google.com&#x2F;knative&#x2F;&quot;&gt;Knative&lt;&#x2F;a&gt; to your
-existing Kubernetes cluster with a single click using the GitLab Kubernetes integration. Knative
-is a Kubernetes-based platform to build, deploy, and manage modern serverless workloads. Tasks that
-were once difficult, such as source-to-container builds, routing and managing traffic,
-and scaling-to-zero, now work effortlessly out of the box.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;clusters&#x2F;serverless&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;54027&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;img alt=&#x27;Easily deploy and integrate Knative with GitLab&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;knative.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr &#x2F;&gt;
-&lt;div class=&#x27;release-row image-left&#x27;&gt;
-&lt;div class=&#x27;column text-column&#x27;&gt;
-&lt;h2 id=&#x27;assign-approvers-based-on-code-owners&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#assign-approvers-based-on-code-owners&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Assign approvers based on Code Owners
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Knowing who to ask to review your merge request isn’t always obvious.
-Code Owners, which allow files to be assigned to the responsible team
-members, are now automatically assigned as merge request approvers.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Assigning approvers automatically based on Code Owners will notify the
-relevant Code Owners of impending changes so that they are able to
-review and approve the changes.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Support for defining Code Owners was introduced in
-&lt;a href=&quot;&#x2F;2018&#x2F;09&#x2F;22&#x2F;gitlab-11-3-released&#x2F;#code-owners&quot;&gt;GitLab 11.3&lt;&#x2F;a&gt;. In
-upcoming releases, Code Owners will be further integrated into the
-merge request workflow with
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4418&quot;&gt;required approvals&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;merge_request_approvals.html#eligible-approvers&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;1012&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;column image-column&#x27;&gt;
-&lt;img alt=&#x27;Assign approvers based on Code Owners&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;approvals.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr &#x2F;&gt;
-&lt;div class=&#x27;release-row&#x27;&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;h2 id=&#x27;parallel-attribute-for-faster-pipelines&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#parallel-attribute-for-faster-pipelines&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Parallel attribute for faster pipelines
-&lt;&#x2F;h2&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;The speed of pipelines is an important factor for any team, and running tests or other parallelizable tasks
-tends to take a big chunk of the time for any build. Adding this new keyword gives teams the ability to
-simply parallelize tests, allowing everyone to accelerate their software delivery process. To use this
-feature, simply set the parallel attribute to how many copies of the task you’d like to split it into,
-and GitLab will handle the work of automatically creating the appropriate number of jobs running your task.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;#parallel&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-sm product-icon&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;21480&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;column&#x27;&gt;
-&lt;img alt=&#x27;Parallel attribute for faster pipelines&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;parallel-keyword.png&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;section&gt;
-&lt;!-- secondary features --&gt;
-&lt;section id=&#x27;secodary-features&#x27;&gt;
-&lt;div class=&#x27;release-post-section text-center zero-bottom-margin&#x27;&gt;
-&lt;h2 class=&#x27;features-released&#x27; id=&#x27;other-improvements-in-gitlab&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#other-improvements-in-gitlab&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Other improvements in GitLab 11.5
-&lt;&#x2F;h2&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;release-row align-top divider&#x27;&gt;
-&lt;div class=&#x27;secondary-release-column&#x27;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;comment-on-unchanged-lines-in-merge-request&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#comment-on-unchanged-lines-in-merge-request&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Comment on unchanged lines in merge request
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;An important purpose of code review is to draw attention to aspects of
-the proposed change that may not have been considered. Often this means
-pointing out unforseen consequences in areas of the code base that are
-unchanged.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab now supports commenting on both changed and unchanged lines in
-merge request diffs, so that you can directly draw the attention of the
-author to changes that are required that have not yet been made. When
-reviewing a merge request diff you can expand collapsed, unchanged lines
-using the ellipsis (&lt;strong&gt;…&lt;&#x2F;strong&gt;) button.&lt;&#x2F;p&gt;
-
-&lt;p&gt;In upcoming releases, support for commenting on unchanged lines will be
-expanded from changed files to
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;52501&quot;&gt;unchanged files&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Comment on unchanged lines in merge request&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;unchanged-comment.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;discussions&#x2F;index.html#resolvable-discussions&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;13950&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;group-file-templates&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#group-file-templates&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Group file templates
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;File templates for &lt;code&gt;LICENSE&lt;&#x2F;code&gt;, &lt;code&gt;.gitignore&lt;&#x2F;code&gt;, &lt;code&gt;Dockerfile&lt;&#x2F;code&gt;, and
-&lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; files make it easy to add these common files to
-projects. Custom file templates can now be shared with all the projects
-in a group and sub-groups, by configuring a template repository for the
-group.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Custom templates are useful when the templates provided by GitLab are
-too generic, for example a custom license that should be used for every
-project in the company, or a complex Dockerfile that should be used for
-every microservice.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Support for instance-wide template repositories was &lt;a href=&quot;&#x2F;2018&#x2F;09&#x2F;22&#x2F;gitlab-11-3-released&#x2F;#custom-file-templates-for-self-managed-instances&quot;&gt;introduced
-in GitLab 11.3&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Group file templates&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;group-templates.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;#group-level-file-templates-premium&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;5987&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;review-app-direct-link&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#review-app-direct-link&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Review App direct link
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;When you’re working on a branch and have only changed a few files, it’s not very helpful for the
-Review App link to take you to the root of the website. To make this more useful, we’ve added a
-dropdown selector to the Review App link which can now take you directly to the page(s) that you’ve
-changed.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Review App direct link&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;direct-page-link.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;environments.html#go-directly-from-source-files-to-public-pages-on-the-environment&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;33418&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;issue-analytics&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#issue-analytics&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Issue Analytics
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;In this release, we have provided a dynamic chart showing the number of
-issues created in your group, per month, for the past year. There is even
-a filter that allows you to filter down to a particular scope of issues.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This will help teams dig more deeply into their issue analytics. For example,
-you can quickly see how many bug issues have been created, if you use a
-bug label.&lt;&#x2F;p&gt;
-
-&lt;p&gt;See how we plan to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;epics&#x2F;313&quot;&gt;expand on charting capabilities&lt;&#x2F;a&gt;
-and please participate in the discussion.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Issue Analytics&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;issue-analytics.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;issues_analytics&#x2F;index.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7478&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;preview-merge-request-review-before-submitting-it&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#preview-merge-request-review-before-submitting-it&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Preview merge request review before submitting it
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Code review is an essential practice of successful projects, but
-providing clear and actionable feedback can be difficult. A particular
-challenge is avoiding leaving comments that become irrelevant or
-incomplete as one’s understanding of the changes improves as one reads
-more of the diff.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release you are now able to preview your merge request review
-before submitting. Merge request reviews, introduced in GitLab 11.4,
-allow reviewers to draft many items of feedback and submit them all as
-a single action.&lt;&#x2F;p&gt;
-
-&lt;p&gt;In future iterations, we will improve the feature to send
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4326&quot;&gt;one email notification&lt;&#x2F;a&gt;
-per merge request review.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Preview merge request review before submitting it&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;review-preview.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;discussions&#x2F;index.html#merge-request-reviews-premium&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4327&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;keep-your-email-address-private&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#keep-your-email-address-private&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Keep your email address private
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;It’s important to know who is contributing code to your project and be
-able to look up a commit author in the GitLab interface, using Git locally,
-or on a fork hosted elsewhere, but this exposes your email publicly.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab now provides a &lt;code&gt;noreply&lt;&#x2F;code&gt; email address that can be used locally
-and for web commits to help make it easier to keep your email address
-private.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Keep your email address private&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;noreply-email.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;profile&#x2F;#private-commit-email&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;43521&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;new-cicd-syntax-for-security-quality-and-performance-report-types&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#new-cicd-syntax-for-security-quality-and-performance-report-types&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-New CI&#x2F;CD syntax for security, quality, and performance report types
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Before GitLab 11.5, reports like SAST or DAST relied on a combination
-of job and artifacts names to be recognized as such by the system. This
-was not optimal to scale and to support more advanced features
-like the Group Security Dashboard, because of the performance implications to access artifacts. With the previous syntax you needed to use specific job names (like &lt;code&gt;sast&lt;&#x2F;code&gt;) but now you can specify custom job names.&lt;&#x2F;p&gt;
-
-&lt;p&gt;In GitLab 11.5 a new implementation has been introduced to leverage the new &lt;code&gt;reports&lt;&#x2F;code&gt; syntax. New job
-definitions are now available for
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;sast.html&quot;&gt;SAST&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;dast.html&quot;&gt;DAST&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;dependency_scanning.html&quot;&gt;Dependency Scanning&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;container_scanning.html&quot;&gt;Container Scanning&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;license_management.html&quot;&gt;License Management&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;code_quality.html&quot;&gt;Code Quality&lt;&#x2F;a&gt;, and
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;&#x2F;ci&#x2F;examples&#x2F;browser_performance.html&quot;&gt;Browser Performance Testing&lt;&#x2F;a&gt;.
-The &lt;a href=&quot;#old-ci&#x2F;cd-syntax-for-security,-quality,-and-performance-report-types&quot;&gt;old syntax has been deprecated&lt;&#x2F;a&gt; and could be removed in a future release.
-You are encouraged to upgrade your definitions in order to benefit from improved
-performances and the Group Security Dashboard, even if the old syntax is still working.
-The new syntax requires GitLab Runner 11.5 or above.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;README.html#artifactsreports&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;52323&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;open-a-merge-request-with-a-patch-via-email&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#open-a-merge-request-with-a-patch-via-email&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Open a merge request with a patch via email
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;GitLab has supported opening a merge request via email for a long time,
-but before sending the email the branch must already exist on the
-server. Now you can open a merge request with only an email by
-attaching one or more patch files (&lt;code&gt;.patch&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-
-&lt;p&gt;Patch files are the standard for sharing and transmitting changes
-between systems. In future releases of GitLab we will build on this
-foundation for
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;epics&#x2F;260&quot;&gt;distributed merge requests&lt;&#x2F;a&gt;,
-which will allow merge requests between GitLab instances, and other
-Git hosting tools too.&lt;&#x2F;p&gt;
-
-&lt;figure class=&#x27;video_container&#x27;&gt;
-&lt;iframe allowfullscreen=&#x27;true&#x27; frameborder=&#x27;0&#x27; src=&#x27;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Y6jb_3hV8Po&#x27;&gt;&lt;&#x2F;iframe&gt;
-&lt;&#x2F;figure&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;#adding-patches-when-creating-a-merge-request-via-e-mail&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;40830&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;empty-state-for-wiki-only-projects&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#empty-state-for-wiki-only-projects&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Empty state for Wiki-only projects
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We’ve improved the experience for Wiki-only projects without a default
-project overview page.
-The empty state for this project setup now better encourages users to add
-a page to the relevant Wiki and get these projects off to a great start.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Empty state for Wiki-only projects&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;wiki-project-empty-state.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;wiki&#x2F;index.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;48731&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;open-jaeger-from-gitlab&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#open-jaeger-from-gitlab&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Open Jaeger from GitLab
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Tracing provides deep introspection into the performance and health of a deployed application, tracking each function or microservice
-which handles a given request. This makes it easy to understand the end-to-end flow of a request, regardless of whether you are using
-a monolithic or distributed system.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab 11.5 includes an initial integration with &lt;a href=&quot;https:&#x2F;&#x2F;www.jaegertracing.io&quot;&gt;Jaeger&lt;&#x2F;a&gt;, the &lt;a href=&quot;https:&#x2F;&#x2F;www.cncf.io&quot;&gt;CNCF&lt;&#x2F;a&gt;-hosted tracing project,
-allowing users to easily open the Jaeger UI from GitLab.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Open Jaeger from GitLab&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;jaeger.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;operations&#x2F;tracing.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4753&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;consistent-status-check-names-for-github-integration&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#consistent-status-check-names-for-github-integration&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Consistent status-check names for GitHub integration
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;It is now possible to configure status checks on the GitHub side that can be marked as “required”
-without having to configure this one by one, based on their name. Previously, the check
-names included the branch name, so it was not possible to do this easily. This feature is
-enabled via the GitHub integration configuration section.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Consistent status-check names for GitHub integration&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;consistent-check-names.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;integrations&#x2F;github.html#static--dynamic-status-check-names&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;6696&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;omnibus-go-apps-now-use-the-gitlab-cert-directory&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#omnibus-go-apps-now-use-the-gitlab-cert-directory&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Omnibus Go apps now use the GitLab cert directory
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;GitLab includes a number of Go-based applications. Prior to 11.5, these applications utilized the standard OS
-system location for trusted certificates, instead of the Omnibus GitLab directory.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release, Go applications now use the same directory for trusted certificates as the rest of GitLab,
-by default &lt;code&gt;&#x2F;opt&#x2F;gitlab&#x2F;embedded&#x2F;ssl&#x2F;certs&#x2F;&lt;&#x2F;code&gt;, making certificate management easier and more straightforward.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab installations which depended upon the Go applications using the system directory should move those certificates
-to the standard Omnibus GitLab location.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;settings&#x2F;ssl.html#install-custom-public-certificates&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;issues&#x2F;3701&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;close-epic-notification&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#close-epic-notification&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Close epic notification
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We recently released the ability to close epics, namely having different
-open and closed states for epics. In this release, we are adding notifications
-for closing and reopening epics, to help users follow more closely on work
-they are interested in.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Close epic notification&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;epic-closed-notification.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;notifications.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7272&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;json-logging-for-audit-events&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#json-logging-for-audit-events&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-JSON logging for audit events
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;In order to make audit events easier to analyze and ingest outside of GitLab, we’ve added &lt;code&gt;audit_json.log&lt;&#x2F;code&gt; to
-capture audit events in a structured log file. With this change, shipping and parsing logs becomes much easier –
-especially for visualization and analysis in other tools.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;audit_events.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;54244&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;autocomplete-epic-in-issue-and-merge-request&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#autocomplete-epic-in-issue-and-merge-request&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Autocomplete epic in issue and merge request
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;You can now more easily search and refer to epics while working in an issue
-or merge request. Just type &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt; and enter a few numbers or characters in
-the issue or merge request’s description or a comment. GitLab’s autocomplete
-will search for epics in the immediate parent group, allowing you to select
-one easily all without leaving the current page.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Autocomplete epic in issue and merge request&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;autocomplete-epic.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;markdown.html#special-gitlab-references&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7472&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;file-list-for-browsing-merge-request-diff&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#file-list-for-browsing-merge-request-diff&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-File list for browsing merge request diff
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Moving backwards and forwards between files in the merge request diff
-is necessary in all but the smallest of changes. In addition to the
-&lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;22&#x2F;gitlab-11-4-released&#x2F;#file-tree-for-browsing-merge-request-diff&quot;&gt;file tree added in
-GitLab 11.4&lt;&#x2F;a&gt;,
-GitLab now includes a searchable file list of changes to
-make it easy to see which files have changed and jump between them,
-whether you prefer a tree or a list.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;File list for browsing merge request diff&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;mr-tree-list.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;index.html#merge-request-diff-file-navigation&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51859&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;more-information-about-deployments-in-merge-requests&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#more-information-about-deployments-in-merge-requests&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-More information about deployments in merge requests
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Currently, environment information is hidden when a newer pipeline is running. With this change
-we are adding information on in-progress deployments to the widget, so you know that an update
-is on its way.&lt;&#x2F;p&gt;
-
-&lt;p&gt;One of the most exciting results of this functionality in this release is that the link to the
-current deployment will remain available in cases where a new deployment is running, allowing
-you to still find the link to the Review App. In cases where lots of deployments were constantly
-running, this previously made it quite difficult to get the timing right in some cases.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;More information about deployments in merge requests&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;enhanced-deploy-information-MR.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;index.html#pipeline-status-in-merge-requests&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;25140&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;authenticate-with-jira-cloud-using-email-address-and-api-token&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#authenticate-with-jira-cloud-using-email-address-and-api-token&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Authenticate with Jira Cloud using email address and API token
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Jira Cloud is &lt;a href=&quot;https:&#x2F;&#x2F;confluence.atlassian.com&#x2F;cloud&#x2F;blog&#x2F;2018&#x2F;06&#x2F;say-goodbye-to-usernames-in-atlassian-cloud&quot;&gt;removing usernames for authentication&lt;&#x2F;a&gt;.
-So to support this change, we now allow you to use an email address and
-API token to authenticate with Jira Cloud instead.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Authenticate with Jira Cloud using email address and API token&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;jira-email-api-token.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;integrations&#x2F;jira.html#configuring-gitlab&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49936&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;automatically-navigate-to-last-visited-board&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#automatically-navigate-to-last-visited-board&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Automatically navigate to last visited board
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;As teams use more and more issue boards, it can become cumbersome to navigate
-among many of them in the dropdown navigation. With this release, GitLab
-will automatically send you to the last visited board, whenever you access
-the boards navigation from the sidebar menu of a given project or a group.
-This is saved to the system, so even if you use GitLab between different
-browsers and devices, the last visited board will be saved.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Note that you can still directly link to a specific board by saving the
-URL of the board when you are viewing it.&lt;&#x2F;p&gt;
-
-&lt;p&gt;See upcoming planned improvements to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;epics&#x2F;336&quot;&gt;managing multiple boards&lt;&#x2F;a&gt;
-and participate in the comments.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;issue_board.html#multiple-issue-boards-starter&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7760&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;filter-by-open-or-closed-epics-in-api&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#filter-by-open-or-closed-epics-in-api&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Filter by open or closed epics in API
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We recently released the ability to close epics, namely having different
-open and closed states for epics. In this release, we are exposing that
-state in the API itself, so that you can filter on open or closed epics
-when retrieving a list of them, as well as see the state in a single epic
-retrieved itself.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;api&#x2F;epics.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7615&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;milestone-changed-notification&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#milestone-changed-notification&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Milestone changed notification
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;GitLab milestones are useful for teams to plan and track work to be done
-in a time-boxed period or to associate with a code release. These dates
-are important for teams to communicate timelines with each other and
-stakeholders in general. So when milestones change, it is critical that
-people are updated.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release, we’ve added email notifications for changing milestones
-in issues and merge requests, so that people can stay updated if a piece
-of work has been delayed, moved earlier, or just de-scoped.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Milestone changed notification&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;milestone-changed-notification.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;notifications.html#issue--merge-request-events&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51520&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;epic-keyboard-shortcuts&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#epic-keyboard-shortcuts&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Epic keyboard shortcuts
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Similar to issues and merge requests, you can perform basic operations in
-an epic page with keyboard shortcuts, helping those users who want to get
-more done, more quickly, without leaving the keyboard.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Use &lt;kbd&gt;r&lt;&#x2F;kbd&gt; to start a new comment. (It will even quote selected text.)
-Use &lt;kbd&gt;e&lt;&#x2F;kbd&gt; to edit the description. And use &lt;kbd&gt;l&lt;&#x2F;kbd&gt; to change
-labels.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;shortcuts.html#epics&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4187&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;issue-board-cards-redesigned&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#issue-board-cards-redesigned&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Issue Board cards redesigned
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;A central place of collaboration in GitLab is Issue Boards, where teams
-can organize and view planned and ongoing work in one location. With this
-release, we’ve improved the design of issue cards, showing relevant information
-in a simple and organized manner. We are showing the issue title, time-tracking
-information, confidentiality, labels, due date, weight, and assignee, all
-in the card.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Issue Board cards redesigned&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;board-card-design.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;issue_board.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;47008&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;render-index-files-like-readmes-in-repositories&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#render-index-files-like-readmes-in-repositories&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Render &#x27;index&#x27; files like &#x27;README&#x27;s in repositories
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;When a &lt;code&gt;README.*&lt;&#x2F;code&gt; file is present in a directory of a repository, it’s
-rendered automatically by GitLab without the need to explicitly
-open it. With GitLab 11.5, it’s now possible to do the same thing with
-an &lt;code&gt;index.*&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is particularly useful when you also deploy your content online
-using a static site generator. Previously, if you used &lt;code&gt;README.md&lt;&#x2F;code&gt; it
-would render to &lt;code&gt;README.html&lt;&#x2F;code&gt;, whereas with &lt;code&gt;index.html&lt;&#x2F;code&gt; you can now
-have clean URLs since most web servers treat
-&lt;code&gt;http:&#x2F;&#x2F;example.com&#x2F;page&#x2F;index.html&lt;&#x2F;code&gt; and &lt;code&gt;http:&#x2F;&#x2F;example.com&#x2F;page&#x2F;&lt;&#x2F;code&gt; the
-same.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is not limited to Markdown files as GitLab supports a number of
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;repository&#x2F;index.html#supported-markup-languages-and-extensions&quot;&gt;markup languages&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Render &amp;#39;index&amp;#39; files like &amp;#39;README&amp;#39;s in repositories&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;index-file-repository.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;repository&#x2F;index.html#repository-readme-and-index-files&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;18933&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;rbac-creates-service-account-restricted-to-projects-namespace&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#rbac-creates-service-account-restricted-to-projects-namespace&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-RBAC creates service account restricted to project&#x27;s namespace
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Securing Kubernetes instances is paramount for running production-ready, mission-critical apps. RBAC
-provides great power and flexibility in securing your cluster.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Starting in GitLab 11.5, our Kubernetes integration will create a dedicated service account and role
-binding for each project’s namespace which will be used in GitLab CI jobs. This eliminates the need to
-use the &lt;code&gt;cluster-admin&lt;&#x2F;code&gt; token when interacting with GitLab CI runners.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;clusters&#x2F;#role-based-access-control-rbac&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51716&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;discussion-activity-filter-in-issues-and-merge-requests&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#discussion-activity-filter-in-issues-and-merge-requests&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Discussion activity filter in issues and merge requests
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We are glad to see teams collaborating actively in issue and merge request
-comments. For more involved discussions and longer-lived issues and merge
-requests, the discussion activity can become very long, with a lot of generated
-system notes.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release, we’ve implemented a filter to allow you to focus on just
-comments or system activity in the discussion area of an issue or merge request.
-Your selection is saved for all issues or all merge requests in GitLab.
-So if you prefer one mode, you can just make the selection once, and it
-will persist forever.&lt;&#x2F;p&gt;
-
-&lt;p&gt;We are planning to bring &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7526&quot;&gt;the same functionality to epics&lt;&#x2F;a&gt;
-too.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Discussion activity filter in issues and merge requests&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;discussion-activity-filter.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;discussions&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51323&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;update-git-submodules-via-api&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#update-git-submodules-via-api&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Update Git submodules via API
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Git submodules allow you to include a Git repository within another Git
-repository. GitLab now supports updating the submodule reference via
-the API. This is particularly useful for automation, allowing you to
-keep your project up to date with the latest dependencies using the
-API.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;api&#x2F;repository_submodules.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;41213&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;show-feedback-if-git-push-validation-takes-too-long&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#show-feedback-if-git-push-validation-takes-too-long&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Show feedback if Git push validation takes too long
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Every time you push changes to a Git repository on GitLab, GitLab
-performs checks on each commit to enforce permissions, repository size
-restrictions and validates the presence of LFS objects. In some cases
-large pushes can fail without feedback when validation takes too long.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab now provides feedback when Git push operations time out because
-validation is taking too long. This will help debug the source of the
-problem by providing better feedback to the user.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;topics&#x2F;git&#x2F;troubleshooting_git.html#timeout-during-git-pushpull&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;42790&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;discussion-activity-redesign-in-issues-merge-requests-and-epics&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#discussion-activity-redesign-in-issues-merge-requests-and-epics&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Discussion activity redesign in issues, merge requests, and epics
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;In this release, we’ve improved the design of discussion activity in issues,
-merge requests, and epics. We’ve made it easier to read comments and parse
-system note activity, so you can focus on the information that’s relevant to
-you at the given moment.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Discussion activity redesign in issues, merge requests, and epics&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;discussion-activity-design.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;discussions&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;29294&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;quick-access-to-prioritized-group-settings&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#quick-access-to-prioritized-group-settings&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Quick access to prioritized Group settings
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With GitLab 11.5, we are iterating on the settings page of Groups to
-prioritize the most sought-after configuration options. The top-most
-section is expanded by default, and we’ve clarified labels and links to
-provide clear direction on where to find settings and what they do.
-We’re continuously working on this – Project and Admin settings improvements
-are coming soon!&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Quick access to prioritized Group settings&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;group-settings-quick-access.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49417&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;create-new-group-page-redesign&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#create-new-group-page-redesign&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-&#x27;Create new group&#x27; page redesign
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With this release, we are aligning the ‘New group’ page with the ‘New
-project’ page, consolidating and repositioning relevant fields for clarity
-and consistency.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;&amp;#39;Create new group&amp;#39; page redesign&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;create-new-group-redesign.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;50962&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;help-menu-in-top-navigation&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#help-menu-in-top-navigation&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Help menu in top navigation
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With this release, we are updating the top navigation bar by moving two
-items into a new, dedicated Help menu section.
-We’ll continue to add additional items there related to instance-level
-support and feedback in future iterations coming soon!&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Help menu in top navigation&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;top-navigation-help-item.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;50728&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;remediation-info-for-gemnasium&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#remediation-info-for-gemnasium&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Remediation info for Gemnasium
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;dependency_scanning.html&quot;&gt;Dependency Scanning&lt;&#x2F;a&gt;
-relies on the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;security-products&#x2F;gemnasium&quot;&gt;Gemnasium service&lt;&#x2F;a&gt; for the
-majority of supported languages. This allows GitLab to report known vulnerabilities in packages, but
-this information was missing a remediation that helps developers to easily fix the problem.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With GitLab 11.5, Gemnasium service provides remediations every time the information is available.
-This is then reported in the vulnerability details window, and in the related issue. For example, the
-remediation could report the minimum version a library should be updated to in order to fix the security
-problem.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Remediation info for Gemnasium&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;gemnasium-remediation.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;dependency_scanning.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7069&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;audit-event-logging-for-project-features-and-group-settings&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#audit-event-logging-for-project-features-and-group-settings&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Audit event logging for project features and group settings
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Audit Events captures important events that take place on your GitLab instance, and we’re now capturing additional changes in 11.5:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8027&quot;&gt;Project-level feature settings changes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8051&quot;&gt;Group settings changes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;audit_events.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;gitlab-helm-chart-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#gitlab-helm-chart-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-GitLab Helm chart improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;LDAP and OmniAuth settings have been &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;charts&#x2F;gitlab&#x2F;blob&#x2F;master&#x2F;doc&#x2F;charts&#x2F;globals.md#omniauth&quot;&gt;unified in the &lt;code&gt;global&lt;&#x2F;code&gt; settings&lt;&#x2F;a&gt;, making it easier to configure. Users currently configuring it individually for each subchart will need to update their settings to upgrade to 11.5.&lt;&#x2F;li&gt;
-  &lt;li&gt;Git protocol v2 is now enabled.&lt;&#x2F;li&gt;
-  &lt;li&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;pseudonymizer.html&quot;&gt;GitLab Pseudonymizer&lt;&#x2F;a&gt; is &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;charts&#x2F;gitlab&#x2F;blob&#x2F;master&#x2F;doc&#x2F;charts&#x2F;globals.md#pseudonymizer-settings&quot;&gt;now supported&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;Maven package support is &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;charts&#x2F;gitlab&#x2F;tree&#x2F;master&#x2F;doc&#x2F;advanced&#x2F;external-object-storage#lfs-artifacts-uploads-packages&quot;&gt;now available&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;charts&#x2F;gitlab&#x2F;tree&#x2F;master&#x2F;doc&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;activity-dashboard-redesign&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#activity-dashboard-redesign&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Activity dashboard redesign
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With this release, we are updating the activity dashboard design to give a better view into who is
-doing what in your GitLab instance. The new activity feed gives a reader more context on what
-actions have taken place to keep you always up to date.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Activity dashboard redesign&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;activity-dashboard-redesign.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49403&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;gitlab-runner-115&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#gitlab-runner-115&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-GitLab Runner 11.5
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We’re also releasing GitLab Runner 11.5 today! GitLab Runner is the open source project
-that is used to run your CI&#x2F;CD jobs and send the results back to GitLab.&lt;&#x2F;p&gt;
-
-&lt;h4 id=&quot;most-interesting-changes&quot;&gt;Most interesting changes:&lt;&#x2F;h4&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-runner&#x2F;merge_requests&#x2F;1057&quot;&gt;Support RAW artifacts&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-runner&#x2F;merge_requests&#x2F;1051&quot;&gt;Add failure reason for execution timeout&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;p&gt;A list of all changes can be found in GitLab Runner’s &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-runner&#x2F;blob&#x2F;v11.5.0&#x2F;CHANGELOG.md&quot;&gt;CHANGELOG&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;runner&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;geo-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#geo-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Geo improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We continually focus on improving our &lt;a href=&quot;&#x2F;solutions&#x2F;geo&#x2F;&quot;&gt;Geo&lt;&#x2F;a&gt; feature for distributed teams. Some of the additional noteworthy improvements in GitLab 11.5 include:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7963&quot;&gt;Rails console now always displays primary&#x2F;secondary state correctly&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8124&quot;&gt;Secondary instances now show a more specific flash message on actionable pages&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8121&quot;&gt;Geo nodes projects list is now searchable&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8120&quot;&gt;Recheck&#x2F;resync of projects can now be triggered for all projects&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;6070&quot;&gt;Improved performance of Geo SQL queries&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;geo&#x2F;replication&#x2F;&quot;&gt;Major documentation improvements&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;geo&#x2F;replication&#x2F;configuration.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;boards&#x2F;805065?milestone_title=11.5&amp;amp;label_name[]=Geo&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h6a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H5zm1 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-5h1a1 1 0 0 1 0 2H9a1 1 0 1 1 0-2zm0 3h1a1 1 0 0 1 0 2H9a1 1 0 1 1 0-2zm-3 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-2h1a1 1 0 0 1 0 2H9a1 1 0 0 1 0-2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue Board
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;omnibus-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#omnibus-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Omnibus improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;GitLab 11.5 includes &lt;a href=&quot;https:&#x2F;&#x2F;mattermost.com&#x2F;blog&#x2F;mattermost-5-4-user-focused-features-new-data-export-tool-mobile-enhancements-and-more&#x2F;&quot;&gt;Mattermost 5.4&lt;&#x2F;a&gt;, an &lt;a href=&quot;https:&#x2F;&#x2F;mattermost.com&#x2F;&quot;&gt;open source Slack-alternative&lt;&#x2F;a&gt; whose newest release includes user-focused features, new data export tool, plus much more. This version also includes &lt;a href=&quot;http:&#x2F;&#x2F;about.mattermost.com&#x2F;security-updates&#x2F;&quot;&gt;security updates&lt;&#x2F;a&gt; and upgrade is recommended.&lt;&#x2F;li&gt;
-  &lt;li&gt;It is now possible to set the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;settings&#x2F;configuration.html#disable-user-and-group-account-management&quot;&gt;desired group name&lt;&#x2F;a&gt; for each GitLab services to run as.&lt;&#x2F;li&gt;
-  &lt;li&gt;Go-based applications included in GitLab Omnibus now utilize the standard Omnibus Gitlab directory for trusted certificates.&lt;&#x2F;li&gt;
-  &lt;li&gt;The maximum number of concurrent connections to GitLab Pages can now be configured using &lt;code&gt;gitlab_pages[&#x27;max_connections&#x27;]&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;code&gt;bundler&lt;&#x2F;code&gt; has been updated to 1.16.6, &lt;code&gt;unicode-display_width&lt;&#x2F;code&gt; to 1.4.0, &lt;code&gt;gitlab-monitor&lt;&#x2F;code&gt; to 2.19.1, and &lt;code&gt;gitlab-elasticsearch-indexer&lt;&#x2F;code&gt; to 0.3.0&lt;&#x2F;li&gt;
-  &lt;li&gt;We have improved the readability of the &lt;a href=&quot;http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;omnibus-gitlab&#x2F;licenses.html&quot;&gt;list of open source licenses in use by GitLab&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;div class=&#x27;hidden-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;performance-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#performance-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Performance improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Some of the more noteworthy performance improvements in GitLab 11.5 include:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;43034&quot;&gt;Issue board lists perform fewer SQL queries&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22606&quot;&gt;Improved performance of the snippets dashboards by a factor of 250&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22732&quot;&gt;License Management doesn’t require Docker-in-Docker, and can now be cached by GitLab Runner&lt;&#x2F;a&gt;. See the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;license_management.html&quot;&gt;new job definition&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8027&quot;&gt;Improve performance of rendering large reports&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22725&quot;&gt;Significantly cut memory and SQL queries when reloading diffs&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22325&quot;&gt;Use cached readme blobs where appropriate&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22731&quot;&gt;Optimize merge request refresh by using the database to check commit SHAs&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22709&quot;&gt;Reduce SQL queries needed to load open merge requests&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; data-placement=&#x27;auto&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;merge_requests?scope=all&amp;amp;utf8=%E2%9C%93&amp;amp;state=merged&amp;amp;label_name%5B%5D=performance&amp;amp;milestone_title=11.5&#x27; target=&#x27;_blank&#x27; title=&#x27;See all the performance improvements in GitLab 11.5&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M3.161 8.425l-2.016.063a.3.3 0 0 1-.222-.512l2.415-2.414a.3.3 0 0 1 .145-.08l2.139-.492c-.072.097-.146.196-.221.3-.36.491-1.734 2.433-1.973 2.765l-.267.37zm7.82 1.922l-.492 2.14a.3.3 0 0 1-.08.146l-2.415 2.414a.3.3 0 0 1-.511-.221l.063-2.017.356-.258c.364-.261 2.295-1.628 2.778-1.982l.301-.222zm-3.13-6.47c1.445-1.445 3.306-1.892 5.584-1.341.54 2.288.093 4.15-1.342 5.584-1.19 1.19-3.234 2.47-5.729 4.315-.127.094-.366.32-.716.68a1 1 0 0 1-1.423.01l-1.379-1.38a1 1 0 0 1 .01-1.423c.359-.35.585-.588.68-.715C5.373 7.12 6.652 5.076 7.85 3.877zm1.341 2.901a1 1 0 1 0 1.415-1.414 1 1 0 0 0-1.415 1.414z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Performance improvements
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;secondary-release-column&#x27;&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;group-file-templates&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#group-file-templates&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Group file templates
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;File templates for &lt;code&gt;LICENSE&lt;&#x2F;code&gt;, &lt;code&gt;.gitignore&lt;&#x2F;code&gt;, &lt;code&gt;Dockerfile&lt;&#x2F;code&gt;, and
-&lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; files make it easy to add these common files to
-projects. Custom file templates can now be shared with all the projects
-in a group and sub-groups, by configuring a template repository for the
-group.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Custom templates are useful when the templates provided by GitLab are
-too generic, for example a custom license that should be used for every
-project in the company, or a complex Dockerfile that should be used for
-every microservice.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Support for instance-wide template repositories was &lt;a href=&quot;&#x2F;2018&#x2F;09&#x2F;22&#x2F;gitlab-11-3-released&#x2F;#custom-file-templates-for-self-managed-instances&quot;&gt;introduced
-in GitLab 11.3&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Group file templates&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;group-templates.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;#group-level-file-templates-premium&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;5987&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;issue-analytics&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#issue-analytics&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Issue Analytics
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;In this release, we have provided a dynamic chart showing the number of
-issues created in your group, per month, for the past year. There is even
-a filter that allows you to filter down to a particular scope of issues.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This will help teams dig more deeply into their issue analytics. For example,
-you can quickly see how many bug issues have been created, if you use a
-bug label.&lt;&#x2F;p&gt;
-
-&lt;p&gt;See how we plan to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;epics&#x2F;313&quot;&gt;expand on charting capabilities&lt;&#x2F;a&gt;
-and please participate in the discussion.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Issue Analytics&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;issue-analytics.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;issues_analytics&#x2F;index.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7478&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;keep-your-email-address-private&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#keep-your-email-address-private&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Keep your email address private
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;It’s important to know who is contributing code to your project and be
-able to look up a commit author in the GitLab interface, using Git locally,
-or on a fork hosted elsewhere, but this exposes your email publicly.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab now provides a &lt;code&gt;noreply&lt;&#x2F;code&gt; email address that can be used locally
-and for web commits to help make it easier to keep your email address
-private.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Keep your email address private&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;noreply-email.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;profile&#x2F;#private-commit-email&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;43521&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;open-a-merge-request-with-a-patch-via-email&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#open-a-merge-request-with-a-patch-via-email&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Open a merge request with a patch via email
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;GitLab has supported opening a merge request via email for a long time,
-but before sending the email the branch must already exist on the
-server. Now you can open a merge request with only an email by
-attaching one or more patch files (&lt;code&gt;.patch&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-
-&lt;p&gt;Patch files are the standard for sharing and transmitting changes
-between systems. In future releases of GitLab we will build on this
-foundation for
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;epics&#x2F;260&quot;&gt;distributed merge requests&lt;&#x2F;a&gt;,
-which will allow merge requests between GitLab instances, and other
-Git hosting tools too.&lt;&#x2F;p&gt;
-
-&lt;figure class=&#x27;video_container&#x27;&gt;
-&lt;iframe allowfullscreen=&#x27;true&#x27; frameborder=&#x27;0&#x27; src=&#x27;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Y6jb_3hV8Po&#x27;&gt;&lt;&#x2F;iframe&gt;
-&lt;&#x2F;figure&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;#adding-patches-when-creating-a-merge-request-via-e-mail&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;40830&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;open-jaeger-from-gitlab&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#open-jaeger-from-gitlab&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Open Jaeger from GitLab
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Tracing provides deep introspection into the performance and health of a deployed application, tracking each function or microservice
-which handles a given request. This makes it easy to understand the end-to-end flow of a request, regardless of whether you are using
-a monolithic or distributed system.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab 11.5 includes an initial integration with &lt;a href=&quot;https:&#x2F;&#x2F;www.jaegertracing.io&quot;&gt;Jaeger&lt;&#x2F;a&gt;, the &lt;a href=&quot;https:&#x2F;&#x2F;www.cncf.io&quot;&gt;CNCF&lt;&#x2F;a&gt;-hosted tracing project,
-allowing users to easily open the Jaeger UI from GitLab.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Open Jaeger from GitLab&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;jaeger.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;operations&#x2F;tracing.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4753&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;omnibus-go-apps-now-use-the-gitlab-cert-directory&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#omnibus-go-apps-now-use-the-gitlab-cert-directory&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Omnibus Go apps now use the GitLab cert directory
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;GitLab includes a number of Go-based applications. Prior to 11.5, these applications utilized the standard OS
-system location for trusted certificates, instead of the Omnibus GitLab directory.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release, Go applications now use the same directory for trusted certificates as the rest of GitLab,
-by default &lt;code&gt;&#x2F;opt&#x2F;gitlab&#x2F;embedded&#x2F;ssl&#x2F;certs&#x2F;&lt;&#x2F;code&gt;, making certificate management easier and more straightforward.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab installations which depended upon the Go applications using the system directory should move those certificates
-to the standard Omnibus GitLab location.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;settings&#x2F;ssl.html#install-custom-public-certificates&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;issues&#x2F;3701&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;json-logging-for-audit-events&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#json-logging-for-audit-events&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-JSON logging for audit events
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;In order to make audit events easier to analyze and ingest outside of GitLab, we’ve added &lt;code&gt;audit_json.log&lt;&#x2F;code&gt; to
-capture audit events in a structured log file. With this change, shipping and parsing logs becomes much easier –
-especially for visualization and analysis in other tools.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;audit_events.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;54244&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;file-list-for-browsing-merge-request-diff&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#file-list-for-browsing-merge-request-diff&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-File list for browsing merge request diff
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Moving backwards and forwards between files in the merge request diff
-is necessary in all but the smallest of changes. In addition to the
-&lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;22&#x2F;gitlab-11-4-released&#x2F;#file-tree-for-browsing-merge-request-diff&quot;&gt;file tree added in
-GitLab 11.4&lt;&#x2F;a&gt;,
-GitLab now includes a searchable file list of changes to
-make it easy to see which files have changed and jump between them,
-whether you prefer a tree or a list.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;File list for browsing merge request diff&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;mr-tree-list.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;index.html#merge-request-diff-file-navigation&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51859&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;authenticate-with-jira-cloud-using-email-address-and-api-token&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#authenticate-with-jira-cloud-using-email-address-and-api-token&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Authenticate with Jira Cloud using email address and API token
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Jira Cloud is &lt;a href=&quot;https:&#x2F;&#x2F;confluence.atlassian.com&#x2F;cloud&#x2F;blog&#x2F;2018&#x2F;06&#x2F;say-goodbye-to-usernames-in-atlassian-cloud&quot;&gt;removing usernames for authentication&lt;&#x2F;a&gt;.
-So to support this change, we now allow you to use an email address and
-API token to authenticate with Jira Cloud instead.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Authenticate with Jira Cloud using email address and API token&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;jira-email-api-token.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;integrations&#x2F;jira.html#configuring-gitlab&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49936&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;filter-by-open-or-closed-epics-in-api&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#filter-by-open-or-closed-epics-in-api&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Filter by open or closed epics in API
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We recently released the ability to close epics, namely having different
-open and closed states for epics. In this release, we are exposing that
-state in the API itself, so that you can filter on open or closed epics
-when retrieving a list of them, as well as see the state in a single epic
-retrieved itself.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;api&#x2F;epics.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7615&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;epic-keyboard-shortcuts&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#epic-keyboard-shortcuts&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Epic keyboard shortcuts
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Similar to issues and merge requests, you can perform basic operations in
-an epic page with keyboard shortcuts, helping those users who want to get
-more done, more quickly, without leaving the keyboard.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Use &lt;kbd&gt;r&lt;&#x2F;kbd&gt; to start a new comment. (It will even quote selected text.)
-Use &lt;kbd&gt;e&lt;&#x2F;kbd&gt; to edit the description. And use &lt;kbd&gt;l&lt;&#x2F;kbd&gt; to change
-labels.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;shortcuts.html#epics&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;4187&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;render-index-files-like-readmes-in-repositories&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#render-index-files-like-readmes-in-repositories&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Render &#x27;index&#x27; files like &#x27;README&#x27;s in repositories
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;When a &lt;code&gt;README.*&lt;&#x2F;code&gt; file is present in a directory of a repository, it’s
-rendered automatically by GitLab without the need to explicitly
-open it. With GitLab 11.5, it’s now possible to do the same thing with
-an &lt;code&gt;index.*&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is particularly useful when you also deploy your content online
-using a static site generator. Previously, if you used &lt;code&gt;README.md&lt;&#x2F;code&gt; it
-would render to &lt;code&gt;README.html&lt;&#x2F;code&gt;, whereas with &lt;code&gt;index.html&lt;&#x2F;code&gt; you can now
-have clean URLs since most web servers treat
-&lt;code&gt;http:&#x2F;&#x2F;example.com&#x2F;page&#x2F;index.html&lt;&#x2F;code&gt; and &lt;code&gt;http:&#x2F;&#x2F;example.com&#x2F;page&#x2F;&lt;&#x2F;code&gt; the
-same.&lt;&#x2F;p&gt;
-
-&lt;p&gt;This is not limited to Markdown files as GitLab supports a number of
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;repository&#x2F;index.html#supported-markup-languages-and-extensions&quot;&gt;markup languages&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Render &amp;#39;index&amp;#39; files like &amp;#39;README&amp;#39;s in repositories&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;index-file-repository.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;repository&#x2F;index.html#repository-readme-and-index-files&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;18933&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;discussion-activity-filter-in-issues-and-merge-requests&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#discussion-activity-filter-in-issues-and-merge-requests&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Discussion activity filter in issues and merge requests
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We are glad to see teams collaborating actively in issue and merge request
-comments. For more involved discussions and longer-lived issues and merge
-requests, the discussion activity can become very long, with a lot of generated
-system notes.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With this release, we’ve implemented a filter to allow you to focus on just
-comments or system activity in the discussion area of an issue or merge request.
-Your selection is saved for all issues or all merge requests in GitLab.
-So if you prefer one mode, you can just make the selection once, and it
-will persist forever.&lt;&#x2F;p&gt;
-
-&lt;p&gt;We are planning to bring &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7526&quot;&gt;the same functionality to epics&lt;&#x2F;a&gt;
-too.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Discussion activity filter in issues and merge requests&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;discussion-activity-filter.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;discussions&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;51323&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;show-feedback-if-git-push-validation-takes-too-long&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#show-feedback-if-git-push-validation-takes-too-long&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Show feedback if Git push validation takes too long
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Every time you push changes to a Git repository on GitLab, GitLab
-performs checks on each commit to enforce permissions, repository size
-restrictions and validates the presence of LFS objects. In some cases
-large pushes can fail without feedback when validation takes too long.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab now provides feedback when Git push operations time out because
-validation is taking too long. This will help debug the source of the
-problem by providing better feedback to the user.&lt;&#x2F;p&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;topics&#x2F;git&#x2F;troubleshooting_git.html#timeout-during-git-pushpull&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;42790&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;quick-access-to-prioritized-group-settings&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#quick-access-to-prioritized-group-settings&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Quick access to prioritized Group settings
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With GitLab 11.5, we are iterating on the settings page of Groups to
-prioritize the most sought-after configuration options. The top-most
-section is expanded by default, and we’ve clarified labels and links to
-provide clear direction on where to find settings and what they do.
-We’re continuously working on this – Project and Admin settings improvements
-are coming soon!&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Quick access to prioritized Group settings&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;group-settings-quick-access.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;group&#x2F;&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49417&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;help-menu-in-top-navigation&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#help-menu-in-top-navigation&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Help menu in top navigation
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With this release, we are updating the top navigation bar by moving two
-items into a new, dedicated Help menu section.
-We’ll continue to add additional items there related to instance-level
-support and feedback in future iterations coming soon!&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Help menu in top navigation&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;top-navigation-help-item.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;50728&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;audit-event-logging-for-project-features-and-group-settings&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#audit-event-logging-for-project-features-and-group-settings&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Audit event logging for project features and group settings
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Audit Events captures important events that take place on your GitLab instance, and we’re now capturing additional changes in 11.5:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8027&quot;&gt;Project-level feature settings changes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8051&quot;&gt;Group settings changes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;audit_events.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;activity-dashboard-redesign&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#activity-dashboard-redesign&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Activity dashboard redesign
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;With this release, we are updating the activity dashboard design to give a better view into who is
-doing what in your GitLab instance. The new activity feed gives a reader more context on what
-actions have taken place to keep you always up to date.&lt;&#x2F;p&gt;
-
-&lt;img alt=&#x27;Activity dashboard redesign&#x27; class=&#x27;shadow&#x27; src=&#x27;&#x2F;images&#x2F;11_5&#x2F;activity-dashboard-redesign.png&#x27; &#x2F;&gt;
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;49403&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.892 3.072l1.048.185a3 3 0 0 1 2.433 3.476l-.868 4.924a3 3 0 0 1-3.12 2.474A3.98 3.98 0 0 0 11 12.03a.999.999 0 0 0 .535-.72l.869-4.924a1 1 0 0 0-.811-1.158L11 5.122V4c0-.32-.037-.63-.108-.928zM4 1h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H4z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;geo-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#geo-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Geo improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Not available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Not available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;We continually focus on improving our &lt;a href=&quot;&#x2F;solutions&#x2F;geo&#x2F;&quot;&gt;Geo&lt;&#x2F;a&gt; feature for distributed teams. Some of the additional noteworthy improvements in GitLab 11.5 include:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;7963&quot;&gt;Rails console now always displays primary&#x2F;secondary state correctly&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8124&quot;&gt;Secondary instances now show a more specific flash message on actionable pages&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8121&quot;&gt;Geo nodes projects list is now searchable&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;8120&quot;&gt;Recheck&#x2F;resync of projects can now be triggered for all projects&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;6070&quot;&gt;Improved performance of Geo SQL queries&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;geo&#x2F;replication&#x2F;&quot;&gt;Major documentation improvements&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;geo&#x2F;replication&#x2F;configuration.html&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h4.244a2 2 0 0 1 1.434.606l2.756 2.834A2 2 0 0 1 14 5.835V12a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5.835L9.244 3H5zm1.5 7h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1zM8 2l3 1.995L13 7H9a1 1 0 0 1-1-1V2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Documentation
-&lt;&#x2F;a&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;-&#x2F;boards&#x2F;805065?milestone_title=11.5&amp;amp;label_name[]=Geo&#x27; target=&#x27;_blank&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M5 1h6a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H5zm1 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-5h1a1 1 0 0 1 0 2H9a1 1 0 1 1 0-2zm0 3h1a1 1 0 0 1 0 2H9a1 1 0 1 1 0-2zm-3 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-2h1a1 1 0 0 1 0 2H9a1 1 0 0 1 0-2z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Issue Board
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;visible-lg secondary-column-feature&#x27;&gt;
-&lt;h3 id=&#x27;performance-improvements&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#performance-improvements&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Performance improvements
-&lt;&#x2F;h3&gt;
-&lt;div class=&#x27;badge-container dark&#x27;&gt;
-&lt;div class=&#x27;top-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Core&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;CORE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Starter&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;STARTER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Premium&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;PREMIUM&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#self-managed&#x27; title=&#x27;Available in GitLab Ultimate&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;ULTIMATE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&#x27;bottom-row&#x27;&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Free&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;FREE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Bronze&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;BRONZE&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Silver&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;SILVER&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;a data-placement=&#x27;top&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;&#x2F;pricing&#x2F;#gitlab-com&#x27; title=&#x27;Available in GitLab.com Gold&#x27;&gt;
-&lt;div class=&#x27;available badge&#x27;&gt;GOLD&lt;&#x2F;div&gt;
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;p&gt;Some of the more noteworthy performance improvements in GitLab 11.5 include:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;43034&quot;&gt;Issue board lists perform fewer SQL queries&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22606&quot;&gt;Improved performance of the snippets dashboards by a factor of 250&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22732&quot;&gt;License Management doesn’t require Docker-in-Docker, and can now be cached by GitLab Runner&lt;&#x2F;a&gt;. See the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;license_management.html&quot;&gt;new job definition&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8027&quot;&gt;Improve performance of rendering large reports&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22725&quot;&gt;Significantly cut memory and SQL queries when reloading diffs&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22325&quot;&gt;Use cached readme blobs where appropriate&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22731&quot;&gt;Optimize merge request refresh by using the database to check commit SHAs&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;22709&quot;&gt;Reduce SQL queries needed to load open merge requests&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;div class=&#x27;row reference-buttons ref-buttons-second-features&#x27;&gt;
-&lt;div class=&#x27;col-md-12 col-sm-12&#x27;&gt;
-&lt;a class=&#x27;btn btn-default btn-xs product-icon-xm&#x27; data-placement=&#x27;auto&#x27; data-toggle=&#x27;tooltip&#x27; href=&#x27;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;merge_requests?scope=all&amp;amp;utf8=%E2%9C%93&amp;amp;state=merged&amp;amp;label_name%5B%5D=performance&amp;amp;milestone_title=11.5&#x27; target=&#x27;_blank&#x27; title=&#x27;See all the performance improvements in GitLab 11.5&#x27;&gt;
-&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M3.161 8.425l-2.016.063a.3.3 0 0 1-.222-.512l2.415-2.414a.3.3 0 0 1 .145-.08l2.139-.492c-.072.097-.146.196-.221.3-.36.491-1.734 2.433-1.973 2.765l-.267.37zm7.82 1.922l-.492 2.14a.3.3 0 0 1-.08.146l-2.415 2.414a.3.3 0 0 1-.511-.221l.063-2.017.356-.258c.364-.261 2.295-1.628 2.778-1.982l.301-.222zm-3.13-6.47c1.445-1.445 3.306-1.892 5.584-1.341.54 2.288.093 4.15-1.342 5.584-1.19 1.19-3.234 2.47-5.729 4.315-.127.094-.366.32-.716.68a1 1 0 0 1-1.423.01l-1.379-1.38a1 1 0 0 1 .01-1.423c.359-.35.585-.588.68-.715C5.373 7.12 6.652 5.076 7.85 3.877zm1.341 2.901a1 1 0 1 0 1.415-1.414 1 1 0 0 0-1.415 1.414z&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
-
-Performance improvements
-&lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;hr class=&#x27;hidden-lg&#x27; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;section&gt;
-&lt;!-- complementary information --&gt;
-&lt;!-- deprecations --&gt;
-&lt;section class=&#x27;release-post-section&#x27; id=&#x27;deprecations&#x27;&gt;
-&lt;h2 class=&#x27;text-center&#x27; id=&#x27;release-deprecations&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#release-deprecations&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Deprecations
-&lt;&#x2F;h2&gt;
-&lt;h3 id=&#x27;&amp;lt;code&amp;gt;sast_container&amp;lt;&#x2F;code&amp;gt;-value-in-&amp;lt;code&amp;gt;gitlab_features&amp;lt;&#x2F;code&amp;gt;-environment-variable&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#&amp;lt;code&amp;gt;sast_container&amp;lt;&#x2F;code&amp;gt;-value-in-&amp;lt;code&amp;gt;gitlab_features&amp;lt;&#x2F;code&amp;gt;-environment-variable&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-&lt;code&gt;sast_container&lt;&#x2F;code&gt; value in &lt;code&gt;GITLAB_FEATURES&lt;&#x2F;code&gt; environment variable
-&lt;&#x2F;h3&gt;
-&lt;p&gt;The &lt;code&gt;GITLAB_FEATURES&lt;&#x2F;code&gt; &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;variables&#x2F;#predefined-variables-environment-variables&quot;&gt;environment variable&lt;&#x2F;a&gt;,
-available to CI&#x2F;CD jobs, lists all the available features based on the current license&#x2F;tier.&lt;&#x2F;p&gt;
-
-&lt;p&gt;The &lt;code&gt;sast_container&lt;&#x2F;code&gt; value for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;container_scanning.html&quot;&gt;Container Scanning&lt;&#x2F;a&gt;
-is now deprecated, and replaced with &lt;code&gt;container_scanning&lt;&#x2F;code&gt;. The old value could be removed in GitLab 12.0.&lt;&#x2F;p&gt;
-
-&lt;p&gt;
-Removal date:
-&lt;strong&gt;Mar. 22, 2019.&lt;&#x2F;strong&gt;
-&lt;&#x2F;p&gt;
-&lt;h3 id=&#x27;old-ci&#x2F;cd-syntax-for-security,-quality,-and-performance-report-types&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#old-ci&#x2F;cd-syntax-for-security,-quality,-and-performance-report-types&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Old CI&#x2F;CD syntax for security, quality, and performance report types
-&lt;&#x2F;h3&gt;
-&lt;p&gt;Before GitLab 11.5, jobs and artifacts had to be named specifically to automatically extract report data and show it in the merge request widget.
-While these old job definitions are still working, they have been deprecated and may be removed in the next major release, GitLab 12.0.&lt;&#x2F;p&gt;
-
-&lt;p&gt;You are advised to update your current &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; configuration to reflect that change. You can find the new definitions in our
-documentation for
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;sast.html&quot;&gt;SAST&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;dast.html&quot;&gt;DAST&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;dependency_scanning.html&quot;&gt;Dependency Scanning&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;container_scanning.html&quot;&gt;Container Scanning&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;license_management.html&quot;&gt;License Management&lt;&#x2F;a&gt;,
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;examples&#x2F;code_quality.html&quot;&gt;Code Quality&lt;&#x2F;a&gt;, and
-&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;&#x2F;ci&#x2F;examples&#x2F;browser_performance.html&quot;&gt;Browser Performance Testing&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;The new syntax requires GitLab Runner 11.5 or newer to work correctly.&lt;&#x2F;p&gt;
-
-&lt;p&gt;
-Removal date:
-&lt;strong&gt;Mar. 22, 2019.&lt;&#x2F;strong&gt;
-&lt;&#x2F;p&gt;
-&lt;h3 id=&#x27;pipelines-older-than-three-months-are-no-longer-re-runnable&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#pipelines-older-than-three-months-are-no-longer-re-runnable&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Pipelines older than three months are no longer re-runnable
-&lt;&#x2F;h3&gt;
-&lt;p&gt;As of this release, older jobs (&amp;gt;3 months) will no longer be allowed to be “played” or “retried,” and rollback
-will no longer be available. As of now we are not actually deleting this data so we can receive feedback on
-potential problems with this change. Please join the discussion in &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;50939&quot;&gt;#50939&lt;&#x2F;a&gt; if
-you have concerns.&lt;&#x2F;p&gt;
-
-&lt;p&gt;
-Removal date:
-&lt;strong&gt;Nov. 22, 2018.&lt;&#x2F;strong&gt;
-&lt;&#x2F;p&gt;
-&lt;h3 id=&#x27;elasticsearch-5.5-and-earlier-not-supported-in-gitlab-11.5&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#elasticsearch-5.5-and-earlier-not-supported-in-gitlab-11.5&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Elasticsearch 5.5 and earlier not supported in GitLab 11.5
-&lt;&#x2F;h3&gt;
-&lt;p&gt;GitLab 11.5 will no longer support Elasticsearch 5.5 and below. It will only
-support Elasticsearch 5.6 and 6.x. See the &lt;a href=&quot;&#x2F;2018&#x2F;11&#x2F;16&#x2F;new-elasticsearch-version-requirements&#x2F;&quot;&gt;blog post&lt;&#x2F;a&gt;
-for additional details.&lt;&#x2F;p&gt;
-
-&lt;p&gt;
-Removal date:
-&lt;strong&gt;Nov. 22, 2018.&lt;&#x2F;strong&gt;
-&lt;&#x2F;p&gt;
-&lt;h3 id=&#x27;support-for-prometheus-1.x-in-omnibus-gitlab&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#support-for-prometheus-1.x-in-omnibus-gitlab&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Support for Prometheus 1.x in Omnibus GitLab
-&lt;&#x2F;h3&gt;
-&lt;p&gt;With GitLab 11.4 (Oct. 22, 2018) the bundled Prometheus 1.0 version is deprecated in Omnibus GitLab. Prometheus 2.0 is &lt;a href=&quot;#prometheus-20-upgrade-for-omnibus-gitlab&quot;&gt;now included&lt;&#x2F;a&gt;,
-however the metrics format is incompatible with 1.0. Existing installations can upgrade to 2.0 and optionally migrate their data &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;gitlab_11_changes.html#11-4&quot;&gt;using an included tool&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;With GitLab 12.0 any installation not yet running Prometheus 2.0 will be automatically upgraded. Metric data from Prometheus 1.0 will not be migrated, and will be lost.&lt;&#x2F;p&gt;
-
-&lt;p&gt;
-Removal date:
-&lt;strong&gt;GitLab 12.0&lt;&#x2F;strong&gt;
-&lt;&#x2F;p&gt;
-&lt;&#x2F;section&gt;
-&lt;!-- Updgrade barometer --&gt;
-&lt;section class=&#x27;release-post-section&#x27; id=&#x27;upgrade-barometer&#x27;&gt;
-&lt;h2 class=&#x27;text-center&#x27; id=&#x27;barometer&#x27;&gt;
-&lt;a class=&#x27;header-link&#x27; href=&#x27;#barometer&#x27;&gt;
-&lt;i class=&#x27;fas fa-link&#x27;&gt;&lt;&#x2F;i&gt;
-&lt;&#x2F;a&gt;
-Upgrade barometer
-&lt;&#x2F;h2&gt;
-&lt;p&gt;To upgrade to GitLab 11.5 from the latest 11.4 version, no downtime is required. To upgrade without downtime, please consult the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;update&#x2F;README.html#upgrading-without-downtime&quot;&gt;documentation on downtimeless upgrades&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;For this release we have migrations, post-deploy migrations, and to help with the larger migrations we have introduced background migrations.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab.com migrations took approximately 9 minutes and post-deploy migrations amounted for a total of around 32 minutes. Background migrations on the other hand are sidekiq jobs that will run synchronously, for this release these migrations took around 2 days to complete, no side effects were expected nor present, these target older kubernetes cluster integrations so newer kubernets cluster integrations are not affected.&lt;&#x2F;p&gt;
-
-&lt;p&gt;GitLab Geo users, please consult the documentation on &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;geo&#x2F;replication&#x2F;updating_the_geo_nodes.html&quot;&gt;upgrading Geo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Go apps in Omnibus &lt;a href=&quot;#go-apps-in-omnibus-now-use-standard-gitlab-certificate-directory&quot;&gt;now use the standard GitLab certificate directory&lt;&#x2F;a&gt;. Installations which depended upon the Go applications using the system directory, should move those certificates to the standard Omnibus GitLab location.&lt;&#x2F;p&gt;
-
-&lt;&#x2F;section&gt;
-
-</content>
-</entry>
-<entry>
-<title>GitLab Patch Release: 11.4.7</title>
-<link href='https://about.gitlab.com/2018/11/21/gitlab-11-4-7-released/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/21/gitlab-11-4-7-released/</id>
-<published>2018-11-21T00:00:00+00:00</published>
-<updated>2018-11-21T00:00:00+00:00</updated>
-<author>
-<name>Jan Provaznik</name>
-</author>
-<content type='html'>&lt;!-- For detailed instructions on how to complete this, please see https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;release&#x2F;docs&#x2F;blob&#x2F;master&#x2F;general&#x2F;patch&#x2F;blog-post.md --&gt;
-
-&lt;p&gt;Today we are releasing version 11.4.7 for GitLab Community Edition and
-Enterprise Edition. This release only contains a fix for GitLab Enterprise
-Edition, GitLab Community Edition has no changes compared to 11.4.6.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-enterprise-edition&quot;&gt;GitLab Enterprise Edition&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Available in GitLab Starter, Premium, and Ultimate:&lt;&#x2F;p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;8248&quot;&gt;Fix code owner suggestion missing in GitLab Starter&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-
-&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;
-
-&lt;p&gt;This version does not include any new migrations, and should not require any
-downtime.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
-and start again, no matter how “big” or “small” the upgrade is. This behavior
-can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; file,
-which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-
-&lt;p&gt;To update, check out our &lt;a href=&quot;&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;gitlab-subscriptions&quot;&gt;GitLab subscriptions&lt;&#x2F;h2&gt;
-
-&lt;p&gt;Access to GitLab Starter, Premium, and Ultimate features is granted by a paid &lt;a href=&quot;&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Alternativelly, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;users&#x2F;sign_in&quot;&gt;sign up for GitLab.com&lt;&#x2F;a&gt;
-to use GitLab&#x27;s own infrastructure.&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>How we maintain product velocity with monthly releases</title>
-<link href='https://about.gitlab.com/2018/11/21/why-gitlab-uses-a-monthly-release-cycle/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/21/why-gitlab-uses-a-monthly-release-cycle/</id>
-<published>2018-11-21T00:00:00+00:00</published>
-<updated>2018-11-21T00:00:00+00:00</updated>
-<author>
-<name>Suri Patel</name>
-</author>
-<content type='html'>&lt;p&gt;We eagerly await the 22nd of each month, because we get to share the hard work of our team and community
-with our users. Our &lt;a href=&quot;&#x2F;releases&#x2F;&quot;&gt;release&lt;&#x2F;a&gt; schedule illustrates our belief in the
-&lt;a href=&quot;&#x2F;handbook&#x2F;engineering&#x2F;#the-importance-of-velocity&quot;&gt;importance of velocity&lt;&#x2F;a&gt; and our
-commitment to delivering value in the form of features. Monthly releases might
-seem aggressive to outsiders, but we believe our ability to deliver
-features quickly is a competitive advantage that has helped us find success.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;three-cheers-for-monthly-releases&quot;&gt;Three cheers for monthly releases!&lt;&#x2F;h2&gt;
-
-&lt;p&gt;A monthly release schedule is great for users, because it adds value at a
-predictable pace. Most of GitLab&#x27;s installations are self managed, helping users
-identify when new functionality will arrive. As a user, you can look forward to the 22nd of
-every month, knowing that&#x27;s when new features become available.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;releasebirthday.png&quot; alt=&quot;A screenshot of a user&#x27;s comment, which says that he is looking forward to February 22 more than 21, which is his birthday&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;a-predictable-schedule-helps-with-planning-team-capacity&quot;&gt;A predictable schedule helps with planning team capacity&lt;&#x2F;h3&gt;
-
-&lt;p&gt;The team has also found that it&#x27;s easier to determine how much capacity we have
-when we&#x27;re planning our workload, because there&#x27;s no need to agree on
-deadlines. GitLabbers know exactly how many days they have to work on something,
-and we can plan in advance. Working with such a short timeframe forces us to
-build features as small as possible. We can&#x27;t say, &quot;I need two releases for this,&quot; so we have to really think about how we
-can make a feature smaller, an idea that&#x27;s reinforced by our
-&lt;a href=&quot;&#x2F;handbook&#x2F;values&#x2F;#iteration&quot;&gt;iteration value&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-a panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1546&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1546, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;blockquote&gt;
-  &lt;p&gt;&quot;Sometimes, team members will propose having longer release cycles, because
-we&#x27;d be able to fit more into it, or we&#x27;d be able to do better quality control,
-but I think that&#x27;s short sighted. It&#x27;s true that in a longer release cycle, you
-can fit more in, but that will require bigger steps, and we know that
-iteration is what makes us achieve velocity. So, the smaller the steps we take,
-the faster we can go and the easier it is to do quality control. We think a
-monthly release cycle is the optimal frequency.&quot; – &lt;a href=&quot;&#x2F;company&#x2F;team&#x2F;#sytses&quot;&gt;Sid Sijbrandij&lt;&#x2F;a&gt;, GitLab CEO&lt;&#x2F;p&gt;
-&lt;&#x2F;blockquote&gt;
-
-&lt;h2 id=&quot;challenges-posed-by-monthly-releases&quot;&gt;Challenges posed by monthly releases&lt;&#x2F;h2&gt;
-
-&lt;h3 id=&quot;its-not-always-easy-to-stick-to-the-plan&quot;&gt;It&#x27;s not always easy to stick to the plan&lt;&#x2F;h3&gt;
-
-&lt;p&gt;It&#x27;s not all sunshine and rainbows. While we&#x27;re strong proponents of the monthly release, we realize that there are
-quite a few challenges. A few of the drawbacks relate to our actual deadline
-and staying on track with the &lt;a href=&quot;&#x2F;direction&#x2F;&quot;&gt;direction&lt;&#x2F;a&gt; of GitLab. For example,
-a release might be far away, but we want to ship something now. Or, we want to
-ship something, but the release just passed, and now we have to wait. Sometimes
-we try to cram in something just before the merge window closes even
-though it&#x27;s not ready. When these situations arise, we remember to
-&lt;a href=&quot;&#x2F;2015&#x2F;12&#x2F;07&#x2F;why-we-shift-objectives-and-not-release-dates-at-gitlab&#x2F;&quot;&gt;shift objectives&lt;&#x2F;a&gt;
-and focus on providing value to our users.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;theres-a-big-impact-on-morale&quot;&gt;There&#x27;s a big impact on morale&lt;&#x2F;h3&gt;
-
-&lt;p&gt;One of the most bittersweet aspects of monthly releases is that morale can soar
-or suffer, depending on the processes that are put in place. We&#x27;re thrilled
-when we make something and quickly see the benefits. With our schedule, GitLabbers see
-their hard work in action within a month, which is way better than
-in some enterprise organizations in which someone might make something that won&#x27;t
-get released for six months. At GitLab, people can rapidly effect change with
-their contributions and feel like their work matters.&lt;&#x2F;p&gt;
-
-&lt;p&gt;There were times in the past, however, when our release schedule dampened morale.
-In the early days, we had a few times when things came down to the wire, and we
-battled bugs right until the end, making the 22nd look like an impossibility.
-The rush towards the end caused quite a bit of stress on the team, so we decided
-to create a bigger buffer between the release and the closing of our merge window.
-We also developed a
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;release&#x2F;docs&#x2F;blob&#x2F;master&#x2F;README.md&quot;&gt;release process&lt;&#x2F;a&gt;
-to help keep us on track. Our
-&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;release-tools&#x2F;blob&#x2F;master&#x2F;templates&#x2F;monthly.md.erb&quot;&gt;release template&lt;&#x2F;a&gt;
-has helped us identify problems earlier so that we&#x27;re not feeling pressured at
-the end, which could be detrimental to everyone&#x27;s motivation.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;how-to-determine-the-right-cadence&quot;&gt;How to determine the right cadence&lt;&#x2F;h2&gt;
-
-&lt;p&gt;While we&#x27;ve found success with monthly releases, we understand that it&#x27;s not
-right for everyone. If you&#x27;re a SaaS provider, you don&#x27;t need releases and can
-just ship whenever something is finished. If you&#x27;re shipping software that people
-manage themselves, you&#x27;re going to have to do versioning, so that people know
-what version they&#x27;re on and are aware of releases, patches, and upgrades. A
-monthly release cycle forces you into this, so in that case, this cadence would
-work well for your team. If there&#x27;s hardware in the loop, extensive testing, or
-human testing that&#x27;s needed, then a longer release cadence is required, because
-you have to factor in significant fixed costs.&lt;&#x2F;p&gt;
-
-&lt;p&gt;Identifying the right cadence for your organization comes down to experimentation
-and what your users will accept. Some user bases may only want to update every
-quarter or twice a year, while others want more frequent versions to stay current
-with industry changes. Because we strongly believe that smaller steps let you
-deliver faster, we encourage you to start with monthly releases and work towards
-settling on the pacing that works best. &lt;a href=&quot;&#x2F;handbook&#x2F;values&#x2F;#collaboration&quot;&gt;Collaborate&lt;&#x2F;a&gt;
-with your team to create processes that simplify actions and hold
-&lt;a href=&quot;&#x2F;handbook&#x2F;engineering&#x2F;management&#x2F;team-retrospectives&#x2F;&quot;&gt;retrospectives&lt;&#x2F;a&gt; to make
-adjustments. We&#x27;ve found that our
-&lt;a href=&quot;&#x2F;2017&#x2F;02&#x2F;14&#x2F;our-retrospective-and-kickoff-are-public&#x2F;&quot;&gt;retrospectives&lt;&#x2F;a&gt; are
-extremely helpful in identifying consistent problem areas.&lt;&#x2F;p&gt;
-
-&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.pexels.com&#x2F;photo&#x2F;22-apartment-architecture-building-210790&#x2F;&quot;&gt;Cover image&lt;&#x2F;a&gt; licensed under &lt;a href=&quot;https:&#x2F;&#x2F;www.pexels.com&#x2F;creative-commons-images&#x2F;&quot;&gt;CC 0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;monthlyrelease.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>GitLab Code Contributor: Hannes Rosenögger</title>
-<link href='https://about.gitlab.com/2018/11/20/contributor-post-hannes/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/20/contributor-post-hannes/</id>
-<published>2018-11-20T00:00:00+00:00</published>
-<updated>2018-11-20T00:00:00+00:00</updated>
-<author>
-<name>Ray Paik</name>
-</author>
-<content type='html'>&lt;p&gt;For this month&#x27;s blog post, we&#x27;re featuring another &lt;a href=&quot;&#x2F;community&#x2F;core-team&#x2F;&quot;&gt;Core Team&lt;&#x2F;a&gt; member &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;haynes&quot;&gt;Hannes Rosenögger&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;when-did-you-first-contribute-to-gitlab&quot;&gt;When did you first contribute to GitLab?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;My first &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;263&quot;&gt;MR to close multiple issues with one commit&lt;&#x2F;a&gt; was back in December 2014. So that&#x27;s almost four years ago!&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;why-and-how-did-you-decide-to-contribute-to-gitlab&quot;&gt;Why and how did you decide to contribute to GitLab?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;I used the Community Edition privately and noticed that mentioning multiple issues in an MR only closed the first issue. Since GitLab was open source and the fix was easy, I decided to fix it myself. GitLab&#x27;s open policy about everything within the company was also a huge factor.&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-a panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1546&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1546, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;h3 id=&quot;which-areas-of-the-gitlab-product-have-you-been-contributing-to&quot;&gt;Which area(s) of the GitLab product have you been contributing to?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;I guess it&#x27;s been pretty random for me. Most of my contributions have been on the backend side and documentation fixes, but if I see something that I can easily fix or I need a feature for my work, I try to make a contribution. I also provide support on the #gitlab IRC channel on freenode. My IRC handle is &lt;code&gt;haynes&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;can-you-tell-us-what-you-do-professionally&quot;&gt;Can you tell us what you do professionally?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;I am a Java software developer for a public sector organization in Germany.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;what-do-you-like-to-do-when-youre-not-working&quot;&gt;What do you like to do when you&#x27;re not working?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;When I&#x27;m not working, I&#x27;m probably doing something for my local scout group. I enjoy working with the kids and teaching. I also like to fix things from coffee machines to cars. Basically anything that I can fix with a bit of work.&lt;&#x2F;p&gt;
-
-&lt;!-- carousel --&gt;
-
-&lt;div id=&quot;carousel-example-generic-5&quot; class=&quot;carousel slide medium center&quot; data-ride=&quot;carousel&quot; data-interval=&quot;10000&quot;&gt;
-  &lt;!-- Indicators --&gt;
-  &lt;ol class=&quot;carousel-indicators&quot;&gt;
-    &lt;li data-target=&quot;#carousel-example-generic-5&quot; data-slide-to=&quot;0&quot; class=&quot;active&quot;&gt;&lt;&#x2F;li&gt;
-    &lt;li data-target=&quot;#carousel-example-generic-5&quot; data-slide-to=&quot;1&quot;&gt;&lt;&#x2F;li&gt;
-    &lt;li data-target=&quot;#carousel-example-generic-5&quot; data-slide-to=&quot;2&quot;&gt;&lt;&#x2F;li&gt;
-  &lt;&#x2F;ol&gt;
-
-  &lt;!-- Wrapper for slides --&gt;
-  &lt;div class=&quot;carousel-inner&quot; role=&quot;listbox&quot;&gt;
-    &lt;div class=&quot;item active&quot;&gt;
-          &lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;Hannes-blogpost&#x2F;workbench.jpg&quot; alt=&quot;Hannes on workbench&quot; &#x2F;&gt;
-    &lt;&#x2F;div&gt;
-    &lt;div class=&quot;item&quot;&gt;
-      &lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;Hannes-blogpost&#x2F;dishwasher.jpg&quot; alt=&quot;Hannes working on his dishwasher&quot; &#x2F;&gt;
-    &lt;&#x2F;div&gt;
-    &lt;div class=&quot;item&quot;&gt;
-      &lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;Hannes-blogpost&#x2F;washing_machine.jpg&quot; alt=&quot;Washing machine repair&quot; &#x2F;&gt;
-    &lt;&#x2F;div&gt;
-
-  &lt;&#x2F;div&gt;
-
-  &lt;!-- Controls --&gt;
-  &lt;a class=&quot;left carousel-control&quot; href=&quot;#carousel-example-generic-5&quot; role=&quot;button&quot; data-slide=&quot;prev&quot;&gt;
-    &lt;svg class=&quot;glyphicon glyphicon-chevron-left&quot; width=&quot;11&quot; height=&quot;19&quot; viewBox=&quot;0 0 11 19&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M.44 10.13l8.345 8.345 2.007-2.007-6.814-6.814 6.814-6.815L8.785.832.44 9.177a.652.652 0 0 0-.202.477c0 .183.067.343.202.477z&quot; fill-rule=&quot;evenodd&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;
-    &lt;span class=&quot;sr-only&quot;&gt;Previous&lt;&#x2F;span&gt;
-  &lt;&#x2F;a&gt;
-  &lt;a class=&quot;right carousel-control&quot; href=&quot;#carousel-example-generic-5&quot; role=&quot;button&quot; data-slide=&quot;next&quot;&gt;
-    &lt;svg class=&quot;glyphicon glyphicon-chevron-right&quot; width=&quot;11&quot; height=&quot;19&quot; viewBox=&quot;0 0 11 19&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;&gt;&lt;path d=&quot;M10.59 10.13l-8.344 8.345L.24 16.468l6.814-6.814L.24 2.839 2.246.832l8.345 8.345a.652.652 0 0 1 .201.477.652.652 0 0 1-.201.477z&quot; fill-rule=&quot;evenodd&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;
-    &lt;span class=&quot;sr-only&quot;&gt;Next&lt;&#x2F;span&gt;
-  &lt;&#x2F;a&gt;
-&lt;&#x2F;div&gt;
-
-&lt;h3 id=&quot;what-advice-do-you-have-for-others-who-may-be-interested-in-contributing-to-gitlab&quot;&gt;What advice do you have for others who may be interested in contributing to GitLab?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Contributing to GitLab is easier than it looks at a first glance and you can contribute to the community in many different ways. For example, if you want to help out translating the GitLab user interface to your native language on &lt;a href=&quot;https:&#x2F;&#x2F;translate.gitlab.com&#x2F;&quot;&gt;CrowdIn&lt;&#x2F;a&gt;, this does not require programming skills or any special setup on your laptop. Also when you want to contribute code, reviewers are normally quite fast in getting back to you and are more than happy to help if you have any questions.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you are unsure how to get started or you need help, anyone should feel free to ping me on Twitter (&lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hrosenoegger&quot;&gt;@hrosenoegger&lt;&#x2F;a&gt;) or in the #gitlab IRC channel on &lt;a href=&quot;http:&#x2F;&#x2F;freenode.net&#x2F;&quot;&gt;freenode&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;anything-else-you-want-to-share-with-the-community&quot;&gt;Anything else you want to share with the community?&lt;&#x2F;h3&gt;
-
-&lt;p&gt;I love the fact that GitLab actually listens to the community. Even after they make a decision to add a new, paid feature, when community members believe it makes more sense to have the feature in &lt;a href=&quot;&#x2F;pricing&#x2F;#self-managed&quot;&gt;GitLab Core&lt;&#x2F;a&gt; or the free tier of &lt;a href=&quot;&#x2F;pricing&#x2F;&quot;&gt;GitLab.com&lt;&#x2F;a&gt;, they will actually port it back. The &lt;a href=&quot;&#x2F;2018&#x2F;06&#x2F;22&#x2F;gitlab-11-0-released&#x2F;#squash-and-merge-in-gitlab-core-and-gitlabcom-free&quot;&gt;Squash and Merge feature&lt;&#x2F;a&gt; is a good example of that.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;interested-in-learning-how-you-can-contribute&quot;&gt;Interested in learning how you can contribute?&lt;&#x2F;h2&gt;
-
-&lt;p&gt;A good place to start is the &lt;a href=&quot;&#x2F;community&#x2F;contribute&#x2F;&quot;&gt;Contributing to GitLab page&lt;&#x2F;a&gt;, where you can learn how you can contribute to GitLab code, documentation, translation, and UX design.&lt;&#x2F;p&gt;
-
-&lt;p&gt;If you have any questions, you are always welcome to reach me at rpaik@gitlab.com.&lt;&#x2F;p&gt;
-
-&lt;p&gt;&lt;em&gt;Note: This post is part of a series featuring people who contribute to GitLab. Read the &lt;a href=&quot;&#x2F;2018&#x2F;10&#x2F;04&#x2F;contributor-post-luke&#x2F;&quot;&gt;October Code Contributor post&lt;&#x2F;a&gt;, &lt;a href=&quot;&#x2F;2018&#x2F;09&#x2F;06&#x2F;contributor-post-jacopo&#x2F;&quot;&gt;September Code Contributor post&lt;&#x2F;a&gt;, and &lt;a href=&quot;&#x2F;2018&#x2F;08&#x2F;08&#x2F;contributor-post-vitaliy&#x2F;&quot;&gt;August Code Contributor post&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;contributors-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-<entry>
-<title>Our top 6 tips for making the most of AWS re:Invent</title>
-<link href='https://about.gitlab.com/2018/11/19/aws-pre-event-post/' rel='alternate' />
-<id>https://about.gitlab.com/2018/11/19/aws-pre-event-post/</id>
-<published>2018-11-19T00:00:00+00:00</published>
-<updated>2018-11-19T00:00:00+00:00</updated>
-<author>
-<name>William Chia</name>
-</author>
-<content type='html'>&lt;p&gt;This year&#x27;s &lt;a href=&quot;&#x2F;events&#x2F;aws-reinvent&#x2F;&quot;&gt;AWS re:Invent&lt;&#x2F;a&gt;, Nov. 26-30, looks to be an amazing show. &lt;a href=&quot;&#x2F;solutions&#x2F;aws&#x2F;&quot;&gt;GitLab works great together with AWS&lt;&#x2F;a&gt; and as an &lt;a href=&quot;&#x2F;partners&#x2F;#strategic-partners&quot;&gt;AWS partner&lt;&#x2F;a&gt; we&#x27;re excited to be a part of the show. To help you prepare, the team has put together some top tips for getting the most out of re:Invent, along with a list of all the places you can find GitLab on site.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;top-6-tips-for-aws&quot;&gt;Top 6 tips for AWS&lt;&#x2F;h2&gt;
-
-&lt;h3 id=&quot;1-strategize&quot;&gt;1. Strategize&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Know what is a must-do&#x2F;-see for you and plan accordingly, including all talks and networking events. The week has so much going on and you, unfortunately, cannot do it all, so prioritize what is most important to you, and what you will get the most value out of.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;2-manage-your-time&quot;&gt;2. Manage your time&lt;&#x2F;h3&gt;
-
-&lt;p&gt;All transportation takes longer than you think it will or should during your time in Las Vegas. The conference footprint is huge. Give yourself a buffer to get to talks and plan on arriving early if you want to attend some of the more popular talks.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;3-set-goals&quot;&gt;3. Set goals&lt;&#x2F;h3&gt;
-
-&lt;p&gt;It is easy to get sidetracked, so having a set list of things you want to accomplish or a reminder of why you have chosen to invest your resources and time to be there can be key. When you are are starting to wear down on the morning of day three and need to remind yourself why you came, a list of goals can help you get out of bed 😃&lt;&#x2F;p&gt;
-
-&lt;div class=&quot;newsletter-cta-a panel panel-default panel-newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-body newsletter-cta&quot;&gt;
-&lt;div class=&quot;panel-header&quot;&gt;
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;svg width=&quot;56px&quot; height=&quot;52px&quot; viewBox=&quot;0 0 56 52&quot; version=&quot;1.1&quot; xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; xmlns:xlink=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;1999&#x2F;xlink&quot;&gt;
-    &lt;defs&gt;&lt;&#x2F;defs&gt;
-    &lt;g id=&quot;Desktop&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;
-        &lt;g id=&quot;blog-newsletter-cta-graphic-v2&quot; transform=&quot;translate(-1070.000000, -383.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;
-            &lt;g id=&quot;gitlab-newsletter-cta-b&quot; transform=&quot;translate(948.000000, 363.000000)&quot;&gt;
-                &lt;g id=&quot;Page-1&quot; transform=&quot;translate(122.000000, 20.000000)&quot;&gt;
-                    &lt;path d=&quot;M53.1397841,30.8022957 L34.558125,44.3561117 L51.1622841,22.9844307 L53.4156477,29.9385534 C53.5192159,30.2590074 53.4081705,30.6062589 53.1397841,30.8022957 Z M2.86117045,30.8027742 C2.59198864,30.6062589 2.48094318,30.2590074 2.58419318,29.9395104 L4.83819318,22.9833141 L21.4412386,44.3634491 L2.86117045,30.8027742 Z M11.2584659,3.11293374 L16.410625,19.0155227 L6.12523864,19.0155227 L11.2584659,3.11293374 Z M36.0973295,21.5676699 L28.0054886,46.5780748 L19.9136477,21.5676699 L36.0973295,21.5676699 Z M44.7420114,3.11277423 L49.8844659,19.0155227 L39.5995568,19.0155227 L44.7420114,3.11277423 Z M31.4494886,44.2040994 L33.126625,39.0203693 L38.7700568,21.578038 L49.0266477,21.578038 L32.9091477,42.3254 L31.4494886,44.2040994 Z M17.2337614,21.578038 L24.5527386,44.1996331 L6.98544318,21.578038 L17.2337614,21.578038 Z M55.8366932,29.1508969 L52.8941477,20.069719 C52.8793523,19.9864552 52.8535795,19.904946 52.8220795,19.8248724 L46.9193295,1.57207485 C46.5984432,0.615657669 45.7433295,-4.78527557e-05 44.7385114,-4.78527557e-05 L44.725625,-4.78527557e-05 C43.7206477,0.00521595093 42.8707841,0.62730184 42.5600795,1.58547362 L36.9236477,19.0155227 L19.0866932,19.0155227 L13.4396023,1.58483558 C13.1295341,0.62746135 12.2796705,0.00537546013 11.2746932,-4.78527557e-05 C10.2687614,-0.00563067484 9.40314773,0.611669939 9.07589773,1.58611166 L3.17648864,19.8628356 C3.17092045,19.8781485 3.16344318,19.8923448 3.15851136,19.9076577 L0.163147727,29.151854 C-0.280556818,30.5249092 0.201329545,32.0172773 1.36269318,32.8658663 L27.2447159,51.755584 C27.4696705,51.919719 27.7320114,51.9999521 27.9932386,51.9999521 C28.2622614,51.9999521 28.5292159,51.9133387 28.7525795,51.746492 C28.753375,51.745854 28.7543295,51.745535 28.755125,51.7448969 L54.6377841,32.8655472 C55.7988295,32.0172773 56.2807159,30.5249092 55.8366932,29.1508969 Z&quot; id=&quot;Fill-1&quot;&gt;&lt;&#x2F;path&gt;
-                &lt;&#x2F;g&gt;
-            &lt;&#x2F;g&gt;
-        &lt;&#x2F;g&gt;
-    &lt;&#x2F;g&gt;
-&lt;&#x2F;svg&gt;
-&lt;div id=&quot;above-cta-form&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-New blog posts directly to your inbox
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-Sign up for our bi-monthly newsletter
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div id=&quot;confirm-cta-form&quot; style=&quot;display: none;&quot;&gt;
-&lt;div class=&quot;newsletter-preamble&quot;&gt;
-Thanks, you’re
-&lt;br &#x2F;&gt;
-signed up!
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-sub-preamble&quot;&gt;
-GitLab is coming to your inbox
-&lt;&#x2F;div&gt;
-&lt;img class=&quot;success-image&quot; src=&quot;&#x2F;images&#x2F;emojis&#x2F;newsletter-signup-success.png&quot; &#x2F;&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-&lt;div class=&quot;newsletter-form&quot;&gt;
-&lt;form class=&quot;notdefined&quot; id=&quot;mktoForm_1546&quot;&gt;
-&lt;script src=&quot;&#x2F;&#x2F;app-ab13.marketo.com&#x2F;js&#x2F;forms2&#x2F;js&#x2F;forms2.min.js&quot;&gt;&lt;&#x2F;script&gt;
-&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
-MktoForms2.loadForm(&quot;&#x2F;&#x2F;app-ab13.marketo.com&quot;, &quot;194-VVC-221&quot;, 1546, function(form) {
-  form.onSuccess(function(values, followUpUrl) {
-
-    form.getFormElem().hide();
-    document.getElementById(&#x27;above-cta-form&#x27;).style.display = &#x27;none&#x27;;
-    document.getElementById(&#x27;confirm-cta-form&#x27;).style.display = &#x27;block&#x27;;
-
-    dataLayer.push({event: &#x27;mktoLead&#x27;,mktoFormId: form.getId()});
-    return false;
-  });
-  function getgacid() {
-    try {
-      var tracker = ga.getAll()[0];
-      return tracker.get(&#x27;clientId&#x27;);
-    } catch (e) {
-      return &#x27;n&#x2F;a&#x27;;
-    }
-  }
-  form.vals({
-    &#x27;gacid&#x27;: getgacid()
-  });
-});
-
-&lt;&#x2F;script&gt;
-&lt;&#x2F;form&gt;
-&lt;&#x2F;div&gt;
-&lt;&#x2F;div&gt;
-
-&lt;&#x2F;div&gt;
-
-&lt;h3 id=&quot;4-take-care-of-yourself&quot;&gt;4. Take care of yourself&lt;&#x2F;h3&gt;
-
-&lt;p&gt;This is a simple tip that can make all the difference during networking and negotiations. It is a long week and to make the most of it you do need to practice some self-care. Hydrate regularly, eat meals at regular hours, and stick to your exercise routine. Bring your most comfortable shoes instead of your best looking ones. You will thank yourself when you are walking the strip for the 30th time. Actually, bring two pairs of comfortable shoes. Having the option to switch it up if one pair is rubbing you the wrong way can turn a frustrating experience into a non-issue.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;5-pack-your-go-bag-the-night-before&quot;&gt;5. Pack your go-bag the night before&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Bring a full stock of business cards and external power banks. The days are long and networking strong. Make sure to charge all your devices overnight and don&#x27;t forget anything you may need for a full day away from your hotel.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;6-be-open-to-learning-and-new-experiences&quot;&gt;6. Be open to learning and new experiences&lt;&#x2F;h3&gt;
-
-&lt;p&gt;This takes us back to the underlying question of why we gather at conferences such as re:Invent. Simply put, to learn from thought leaders and our peers. You are there to connect, share best practices, and expand your point of view. Hopefully, you&#x27;ll leave with some new approaches, more solutions, and more questions to explore when you get home. Plan on taking notes of your interactions and the connections you make. At GitLab, we create issues for all actionable takeaways from the event. This is a great way for us to make sure the info doesn&#x27;t get lost and gets disseminated to the rest of the team.&lt;&#x2F;p&gt;
-
-&lt;h2 id=&quot;come-join-gitlab-at-aws-2018&quot;&gt;Come join GitLab at AWS 2018&lt;&#x2F;h2&gt;
-
-&lt;p&gt;GitLab will be on site in Las Vegas with pleny of demos and tutorials you won&#x27;t want to miss.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;sign-up-to-book-a-time-with-gitlab&quot;&gt;Sign up to book a time with GitLab&lt;&#x2F;h3&gt;
-
-&lt;p&gt;re:Invent can be an extrodinarily busy event with more people to meet and things to see than you&#x27;ll have time for. To ensure you get time to talk with the GitLab experts on site, &lt;a href=&quot;&#x2F;events&#x2F;aws-reinvent&#x2F;&quot;&gt;book some time in advance&lt;&#x2F;a&gt; to make sure you get a scheduled slot you can count on.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;stop-by-booth-2608-on-the-expo-floor-in-the-venetian&quot;&gt;Stop by booth 2608 on the expo floor in The Venetian&lt;&#x2F;h3&gt;
-
-&lt;p&gt;The team will be staffing our booth during all expo hours. We&#x27;ll have some unique swag to hand out along with demos and experts to answer your questions.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;come-see-our-ceo-show-off-gitlab--eks&quot;&gt;Come see our CEO show off GitLab + EKS&lt;&#x2F;h3&gt;
-
-&lt;p&gt;On Tuesday, Nov. 27 at 12:10 p.m. in the Pilvi Theater, &lt;a href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;sijbrandij&#x2F;&quot;&gt;Sid&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;pritianka&#x2F;&quot;&gt;Priyanka&lt;&#x2F;a&gt; will be showing how to &lt;a href=&quot;https:&#x2F;&#x2F;www.portal.reinvent.awsevents.com&#x2F;connect&#x2F;search.ww#loadSearch-searchPhrase=%22GitLab%22&amp;amp;searchType=session&amp;amp;tc=0&amp;amp;sortBy=abbreviationSort&amp;amp;p=&quot;&gt;reinvent your pipelines with GitLab, Kubernetes, and Amazon EKS&lt;&#x2F;a&gt; along with a live demo.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;demo-set-up-your-pipelines-in-five-minutes&quot;&gt;Demo: Set up your pipelines in five minutes&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Join &lt;a href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;jshlmbrt&#x2F;&quot;&gt;Joshua&lt;&#x2F;a&gt; at the GitLab booth (2608) on Wednesday, Nov. 28 at 1 p.m. for a live demo of GitLab &lt;a href=&quot;&#x2F;product&#x2F;auto-devops&#x2F;&quot;&gt;Auto DevOps&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;h3 id=&quot;gitlab-ci-101&quot;&gt;GitLab CI 101&lt;&#x2F;h3&gt;
-
-&lt;p&gt;Join &lt;a href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;reb33&#x2F;&quot;&gt;Reb&lt;&#x2F;a&gt; at the GitLab booth (2608) on Tuesday, Nov. 27 at 2 p.m. for a tutorial on getting up and going with &lt;a href=&quot;&#x2F;product&#x2F;continuous-integration&#x2F;&quot;&gt;GitLab continuous integration&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-
-&lt;p&gt;See you there!&lt;&#x2F;p&gt;
-&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;events&#x2F;IMG_4756.jpeg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
-</entry>
-</feed>

+ 0 - 1
internal/http/client/testdata/smallfile.xml

@@ -1 +0,0 @@
-<?xml version="1.0"?>

+ 0 - 226
internal/http/client/testdata/urdu.xml

@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
-    <channel>
-        <title><![CDATA[BBC News  اردو - پاکستان کے لیے امریکی امداد کی بہار و خزاں]]></title>
-        <description><![CDATA[BBC News  اردو - پاکستان کے لیے امریکی امداد کی بہار و خزاں]]></description>
-        <link>http://www.bbcurdu.com</link>
-        <image>
-            <url>http://www.bbc.co.uk/urdu/images/gel/rss_logo.gif</url>
-            <title>BBC News  اردو - پاکستان کے لیے امریکی امداد کی بہار و خزاں</title>
-            <link>http://www.bbcurdu.com</link>
-        </image>
-        <generator>RSS for Node</generator>
-        <lastBuildDate>Wed, 24 Oct 2018 07:25:10 GMT</lastBuildDate>
-        <copyright><![CDATA[کاپی رائٹ بی بی سی ]]></copyright>
-        <language><![CDATA[ur]]></language>
-        <managingEditor><![CDATA[urdu@bbc.co.uk]]></managingEditor>
-        <ttl>15</ttl>
-        <item>
-            <title><![CDATA[امریکی عسکری امداد کی بندش کی وجوہات: انڈیا سے جنگ، جوہری پروگرام اور اب دہشت گردوں کی پشت پناہی]]></title>
-            <description><![CDATA[امریکہ اور پاکستان کے 70 سالہ تعلقات میں جب بھی زیادہ کشیدگی آتی ہے تو اس میں پہلی تلوار پاکستان کو ملنے والی عسکری امداد پر چلتی ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42575603</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42575603</guid>
-            <pubDate>Fri, 05 Jan 2018 16:51:00 GMT</pubDate>
-            <media:thumbnail width="1024" height="576" url="http://c.files.bbci.co.uk/A787/production/_99478824_gettyimages-856735580.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ کے ساتھ خفیہ معلومات کا تبادلہ اور فوجی تعاون معطل کر دیا: وزیر دفاع]]></title>
-            <description><![CDATA[پاکستان کے وزیر دفاع خرم دستگیر نے کہا ہے کہ امریکہ کی جانب سے عسکری امداد کی معطلی کے بعد پاکستان نے امریکہ سے خفیہ معلومات کا تبادلہ اور فوجی تعاون بند کر دیا ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42645212</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42645212</guid>
-            <pubDate>Thu, 11 Jan 2018 13:20:55 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/13C09/production/_99550908_3f6467e7-5086-43e5-9c31-918be66a17ad.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان ان دہشت گرد گروہوں کے خلاف کارروائی کرے جن کے خلاف ہم چاہتے ہیں: امریکہ]]></title>
-            <description><![CDATA[امریکی محکمۂ دفاع کا کہنا ہے کہ امریکہ چاہتا ہے کہ پاکستان دہشت گردوں کے خلاف فیصلہ کن کارروائی کرے اور یہ کہ امریکہ کو بعض معاملات پر شدید اختلافات ہیں اور ان پر کام کیا جا رہا ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/world-42615276</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/world-42615276</guid>
-            <pubDate>Tue, 09 Jan 2018 02:59:43 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/5B55/production/_99518332_mediaitem99518331.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستانی وزیر دفاع کہتے ہیں کہ امریکہ کو ایک کامیابی ملی ہے، وہ بھی پاکستان کی مرہون منت]]></title>
-            <description><![CDATA[پاکستان کے وزیر دفاع خرم دستگیر نے کہا ہے کہ افغانستان کی صورتحال کی تمام ذمہ داری پاکستان پر نہیں ڈالی جا سکتی۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42554318</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42554318</guid>
-            <pubDate>Wed, 03 Jan 2018 15:50:55 GMT</pubDate>
-            <media:thumbnail width="1024" height="576" url="http://c.files.bbci.co.uk/16765/production/_99450029_p05snlw4.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[صدر ٹرمپ کے ٹویٹ کو سنجیدگی سے لیتے ہیں: وزیر دفاع]]></title>
-            <description><![CDATA[پاکستان کے وزیر دفاع خرم دستگیر نے کہا کہ پاکستان امریکی صدر ٹرمپ کے پاکستان کے بارے میں ٹویٹ کو سنجیدگی سے لیتے ہیں اور تہذیب کے دائرے میں رہتے ہوئے امریکہ سے بے لاگ بات ہو گی۔]]></description>
-            <link>http://www.bbc.com/urdu/42547605</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/42547605</guid>
-            <pubDate>Tue, 02 Jan 2018 17:27:36 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/5AA4/production/_99440232_p05sk783.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکی وزیرِ خارجہ کی پاکستان آمد]]></title>
-            <description><![CDATA[امریکی وزیرِ خارجہ ریکس ٹلرسن نے پاکستان آمد کے بعد وزیراعظم ہاؤس میں پاکستان کی اعلیٰ سول اور فوجی قیادت سے ملاقات کی۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41739055</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41739055</guid>
-            <pubDate>Tue, 24 Oct 2017 13:08:06 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/10293/production/_98459166_p05ktkrj.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ اور پاکستان ایک دوسرے کا کیا بگاڑ سکتے ہیں؟]]></title>
-            <description><![CDATA[تجزیہ کار کہتے ہیں کہ حقیقتاً افغانستان میں پاکستان اور امریکہ دونوں ہی ناکام ہوئے ہیں اور دونوں یہ سمجھتے ہیں کہ دوسرے کو شکست دے کر وہ پورے افغانستان پر اثر و رسوخ قائم کر سکیں گے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42542988</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42542988</guid>
-            <pubDate>Tue, 02 Jan 2018 16:28:18 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/1AED/production/_99439860_gettyimages-839854052.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ اور پاکستان کے کشیدہ تعلقات میں اربوں ڈالر کی امداد پر بھی تنازع]]></title>
-            <description><![CDATA[پاکستان اور امریکہ کے کشیدہ تعلقات میں اربوں ڈالر کی امداد پر بھی تنازع ہے جس میں دونوں ممالک الگ الگ اعداد و شمار بتاتے ہیں۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42532582</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42532582</guid>
-            <pubDate>Tue, 02 Jan 2018 10:28:02 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/9281/production/_99050573__98456547_d3ee46a1-51a1-48b1-a24f-9a41cf21361e.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[’امریکہ انسداد دہشتگردی سیکھنے کے بجائے دشنام طرازی کر رہا ہے‘]]></title>
-            <description><![CDATA[پاکستان کے وزیر دفاع خرم دستگیر خان نے کہا ہے کہ پاکستان میں دہشت گردوں کی خفیہ پناہ گاہیں نہیں ہیں اور اگر باقیات ہیں تو انہیں رد الفساد کے تحت ختم کیا جا رہا ہے تاکہ پاکستان کا مستقبل محفوظ ہو سکے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42548010</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42548010</guid>
-            <pubDate>Wed, 03 Jan 2018 05:04:13 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/9B36/production/_99443793_image1.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان بھی ’مذہبی آزادیوں کی خلاف ورزیاں‘ کرنے والے ممالک میں شامل]]></title>
-            <description><![CDATA[امریکہ کی وزارتِ خارجہ نے پاکستان کا نام ان ملکوں کی فہرست میں شامل کر دیا ہے جہاں مبینہ طور پر مذہبی آزادیوں کی یا تو سنگین خلاف ورزیوں کا ارتکاب کیا جاتا ہے یا مذہبی آزادیوں پر پابندیاں عائد ہیں۔]]></description>
-            <link>http://www.bbc.com/urdu/world-42571559</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/world-42571559</guid>
-            <pubDate>Thu, 04 Jan 2018 17:12:58 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/184A8/production/_99469499_gettyimages-894786806.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان کی سکیورٹی امداد معطل: ’دہشت گردی کے خلاف عزم پر اثرانداز نہیں ہو سکتی‘]]></title>
-            <description><![CDATA[امریکہ کی طرف سے پاکستان کی فوجی امداد کے بند کیے جانے پر پاکستان کے دفتر خارجہ نے کہا ہے کہ یک طرفہ بیانات، مرضی سے دی گئی ڈیڈ لائنز اور اہداف کی مستقل تبدیلی مشترکہ مفادات کے حصول میں سودمند ثابت نہیں ہو سکتی۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42577314</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42577314</guid>
-            <pubDate>Fri, 05 Jan 2018 12:32:27 GMT</pubDate>
-            <media:thumbnail width="640" height="360" url="http://c.files.bbci.co.uk/0935/production/_99475320_556f3020-6286-47a8-a4b1-3026ff6dc95f.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[ڈونلڈ ٹرمپ: پاکستان نے ہمیں جھوٹ اور دھوکے کے سوا کچھ نہیں دیا]]></title>
-            <description><![CDATA[امریکی صدر ڈونلڈ ٹرمپ کا کہنا ہے کہ گذشتہ15 برس میں 33 ارب ڈالر کی امداد لینے کے باوجود پاکستان نے امریکہ کو سوائے جھوٹ اور دھوکے کے کچھ نہیں دیا۔]]></description>
-            <link>http://www.bbc.com/urdu/world-42534486</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/world-42534486</guid>
-            <pubDate>Mon, 01 Jan 2018 17:59:24 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/A5CE/production/_99264424_gettyimages-894923566.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان: اتحادی ایک دوسرے کو تنبیہ جاری نہیں کیا کرتے]]></title>
-            <description><![CDATA[امریکی نائب صدر مائیک پینس کے پاکستان کے بارے میں بگرام کے ہوائی اڈے پر دیے جانے والے بیان پر تبصرہ کرتے ہوئے پاکستان کی وزارتِ خارجہ کے ترجمان نے کہا کہ یہ بیان امریکی انتظامیہ کے ساتھ ہونے والے تفصیلی مذاکرات کے منافی ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/world-42451883</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/world-42451883</guid>
-            <pubDate>Fri, 22 Dec 2017 08:50:54 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/12825/production/_99331857_gettyimages-896767012.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ: کون سے ممالک ہیں جن پر امداد بند کر دینے کی دھمکی کارگر ثابت نہیں ہوئی]]></title>
-            <description><![CDATA[سب سے زیادہ امریکی امداد وصول کرنے والے 12 ملکوں کی فہرست میں اسرائیل کے علاوہ ایک بھی ملک ایسا نہیں جس نے جنرل اسمبلی میں یروشلم کے بارے میں امریکی صدر کے فیصلے کے خلاف قرارداد کی مخالفت میں ووٹ دیا ہو۔]]></description>
-            <link>http://www.bbc.com/urdu/world-42457273</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/world-42457273</guid>
-            <pubDate>Fri, 22 Dec 2017 15:29:44 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/1331F/production/_99332687_gettyimages-882119996.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان امریکہ تعلقات، بیان بدلتے ہیں لیکن عینک نہیں]]></title>
-            <description><![CDATA[پاکستان اور امریکہ کے نرم گرم تعلقات کی تاریخ صرف افغانستان تک محدود نہیں، لیکن حالیہ برسوں میں دونوں اکثر ایک دوسرے کو ایک ہی عینک سے دیکھنے کی کوشش کرتے ہیں۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42225606</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42225606</guid>
-            <pubDate>Mon, 04 Dec 2017 13:36:14 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/9281/production/_99050573__98456547_d3ee46a1-51a1-48b1-a24f-9a41cf21361e.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان امریکہ تعلقات: ’باتیں دھمکی کی زبان سے نہیں صلح کی زبان سے طے ہوں گی‘]]></title>
-            <description><![CDATA[پاکستان کے وزیر خارجہ خواجہ آصف نے کہا ہے کہ امریکہ اور پاکستان کے درمیان اعتماد کا فقدان راتوں رات ختم نہیں ہو گا کیونکہ دونوں ممالک کے تعلقات پر جمی برف پگھلنے میں وقت لگے گا۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41742387</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41742387</guid>
-            <pubDate>Wed, 25 Oct 2017 01:19:34 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/15BE/production/_98466550_844059008.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ کے ساتھ تعاون ختم کرنے پر غور کیا جائے: قرارداد]]></title>
-            <description><![CDATA[پاکستان کی پارلیمان نے ایک متفقہ قرارداد میں امریکی صدر کی حالیہ تقریراور افغانستان میں امریکی کمانڈر جنرل جان نکلسن کے بیان کو مسترد کر دیا ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41097529</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41097529</guid>
-            <pubDate>Wed, 30 Aug 2017 16:19:55 GMT</pubDate>
-            <media:thumbnail width="640" height="360" url="http://c.files.bbci.co.uk/8C50/production/_97602953_3ad0abf1-2480-41b0-bc0a-9d89393c71e4.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[’پاکستان کو قربانی کا بکرا بناکر افغانستان میں امن نہیں لایا جاسکتا‘]]></title>
-            <description><![CDATA[پاکستان کی اعلیٰ سیاسی اور عسکری قیادت نے امریکی صدر ڈونلڈ ٹرمپ کی جانب سے اپنے حالیہ خطاب میں پاکستان پر لگائے گئے الزامات کو مسترد کرتے ہوئے کہا ہے کہ پاکستان پر الزام تراشیوں سے افغانستان کو مستحکم نہیں کیا جا سکتا۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41038882</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41038882</guid>
-            <pubDate>Thu, 24 Aug 2017 14:35:50 GMT</pubDate>
-            <media:thumbnail width="640" height="360" url="http://c.files.bbci.co.uk/38EA/production/_97507541_gettyimages-831217164.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ سے امداد کے نہیں اعتماد کے خواہاں ہیں: جنرل باجوہ]]></title>
-            <description><![CDATA[پاکستان کے آرمی چیف قمر جاوید باجوہ نے کہا ہے کہ پاکستان امریکہ سے کسی مادی یا مالی امداد کا خواہاں نہیں بلکہ چاہتا ہے کہ اس پر اعتماد کرتے ہوئے اس کی کارکردگی کا اعتراف کیا جائے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41024731</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41024731</guid>
-            <pubDate>Wed, 23 Aug 2017 13:11:20 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/E6B3/production/_97495095_dh6cwc3xuaawzfm.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[’پاکستان نے اپنے رویے کو تبدیل نہ کیا تو امریکی مراعات کھو سکتا ہے‘]]></title>
-            <description><![CDATA[امریکی وزیر خارجہ ریکس ٹیلرسن نے افغان طالبان کی مبینہ حمایت پر کہا ہے کہ اگر پاکستان اپنے رویے میں تبدیلی لانے میں ناکام رہتا ہے تو امریکی مراعات کھو سکتا ہے جبکہ پاکستان نے کہا ہے کہ امریکہ محفوظ پناہ گاہوں کے جھوٹے بیانیے کے بجائے دہشت گردی کے خلاف مل کر کام کرے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41019799</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41019799</guid>
-            <pubDate>Tue, 22 Aug 2017 23:06:07 GMT</pubDate>
-            <media:thumbnail width="640" height="360" url="http://c.files.bbci.co.uk/1710E/production/_97487449_gettyimages-825293218.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ کا پاکستان کو ’نوٹس‘ کیا اور کتنا سنگین ہے؟]]></title>
-            <description><![CDATA[امریکی صدر ڈونلڈ ٹرمپ نے ٹویٹ کے ذریعے اپنے ارادے تو ظاہر کر دیے ہیں لیکن دیکھنا یہ ہے کیا امریکہ کی دھمکی محض افغان طالبان تک محدود ہے یا پھر انڈیا مخالف گروپس بھی اس میں شامل ہوں گے۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42550677</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42550677</guid>
-            <pubDate>Wed, 03 Jan 2018 07:47:12 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/14B12/production/_99445748_18215753-eb0c-4c5d-b4b7-06aa87bfcd39.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[کمال ہے، اتنی دہشت؟]]></title>
-            <description><![CDATA[مجھے تو تینتیس ارب ڈالر کے پاکستانی روپے ہی بنانے نہیں آ ت ، بھیا ٹرمپ! ہم سے حساب کیا مانگتے ہو؟ جن کو دیا تھا صاف صاف ان کا نام لو یا تم بھی غائب ہونے سے ڈرتے ہو؟]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42594820</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42594820</guid>
-            <pubDate>Sun, 07 Jan 2018 03:49:01 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/5F27/production/_99495342_cf7d6805-64db-4438-8fe7-85fd61e470cf.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[کیا امداد بند کرنے سے امریکہ کا مقصد پورا ہو گا؟]]></title>
-            <description><![CDATA[امریکہ کی جانب سے پاکستان کی عسکری امداد بند کیے جانے پر ماہرین کا کہنا ہے کہ اس اقدام سے کمزور اقتصادی صورتحال میں پاکستان پر دباؤ پڑے گا اور دہشت گردی کے خلاف جنگ بھی متاثر ہو گئی۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42575493</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42575493</guid>
-            <pubDate>Fri, 05 Jan 2018 08:27:04 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/D4AF/production/_99474445_gettyimages-482348300.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[وہ تازیانے لگے ہوش سب ٹھکانے لگے]]></title>
-            <description><![CDATA[وہ قوم جو 30 برس پہلے تک ناک پے مکھی نہیں بیٹھنے دیتی تھی اس کا یہ حال ہوگیا کہ چابک چھوڑ چابک کے سائے سے بھی ڈر جاتی ہے۔]]></description>
-            <link>http://www.bbc.com/urdu/42596931</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/42596931</guid>
-            <pubDate>Sun, 07 Jan 2018 12:37:26 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/863B/production/_99036343_batsebat.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[امریکہ پاکستان سے چاہتا کیا ہے؟]]></title>
-            <description><![CDATA[امریکی وزیر خارجہ ریکس ٹلرسن پاکستان کے مختصر دورے پر اسلام آباد پہنچ گئے جہاں وہ چند ’مخصوص‘ مطالبات بھی پیش کریں گے۔ آخر امریکہ پاکستان سے چاہتا کیا ہے اور یہ مطالبات کیا ہو سکتے ہیں؟]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-41736761</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-41736761</guid>
-            <pubDate>Tue, 24 Oct 2017 12:53:37 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/12345/production/_98456547_d3ee46a1-51a1-48b1-a24f-9a41cf21361e.jpg"/>
-        </item>
-        <item>
-            <title><![CDATA[پاکستان امریکہ تعلقات میں ’ڈو مور‘ کا نیا ایڈیشن جو آج تک چل رہا]]></title>
-            <description><![CDATA[افغانستان میں بین الاقوامی سیاست اور ترجیحات سمجھنے کے لیے یہ جاننا ضروری ہے کہ 2001 میں امریکی آمد کے بعد سے بعض ایسی چیزیں ہیں جو تبدیل نہیں ہو رہیں۔]]></description>
-            <link>http://www.bbc.com/urdu/pakistan-42422392</link>
-            <guid isPermaLink="true">http://www.bbc.com/urdu/pakistan-42422392</guid>
-            <pubDate>Wed, 20 Dec 2017 12:23:23 GMT</pubDate>
-            <media:thumbnail width="976" height="549" url="http://c.files.bbci.co.uk/7CB9/production/_99292913_gettyimages-884411870.jpg"/>
-        </item>
-    </channel>
-</rss>

+ 0 - 242
internal/http/client/testdata/windows_1251.html

@@ -1,242 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<meta http-equiv="Pragma" content="no-cache" />
-	<meta http-equiv="expires" content="0" />
-	<meta http-equiv="Cache-control" content="no-cache" />
-	<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
-	<meta name="keywords" content="bash.org.ru, iBASH.org.ru, цитатник рунета" />
-	<meta name="description" content="ibash.org.ru — Новый цитатник Рунета" />
-
-	<link href="/favicon.ico" rel="shortcut icon" />
-	<link href="/css.css" rel="stylesheet" type="text/css" />
-	<link href="http://ibash.org.ru/rss.xml" rel="alternate" type="application/rss+xml" />
-
-	<title>ibash.org.ru — Новый цитатник Рунета</title>
-
-	<script type="text/javascript" src="/voting.js"></script>
-</head>
-
-<body>
-
-	<div class="header">
-		<h1>ibash.org.ru — Новый цитатник Рунета</h1>
-	</div>
-	<div class="menu">
-		 [&nbsp;По дате&nbsp;]  [&nbsp;<a href="/best.php">По рейтингу</a>&nbsp;]  [&nbsp;<a href="/random.php">Случайно</a>&nbsp;]  [&nbsp;<a href="/add.php">Добавить цитату</a>&nbsp;]  [&nbsp;<a href="/search.php">Поиск</a>&nbsp;]  [&nbsp;<a href="/skins.php">Шкурки</a>&nbsp;]  <!--[&nbsp;<a href="/trash.php">;)</a>&nbsp;]-->  [&nbsp;<a href="/rss.xml">RSS</a>&nbsp;]  [&nbsp;<a href="/forum/"><b>Форум</b></a>&nbsp;] 
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17703"><b>#17703</b></a></span> <span><a href="/quote.php?id=17703&amp;vote=plus" onclick="return vote(17703,'plus');">+</a> ( <span class="rate" id="q17703"> 25103 </span> ) <a href="/quote.php?id=17703&amp;vote=minus" onclick="return vote(17703,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: есть у кого жаба программер <br />xxx: кот немного пхп знает? <br />yyy: то что кот PHP немного знает, я бы ещё может поверил <br />yyy: но вот жаба-программер - это ты по-моему загнул</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17705"><b>#17705</b></a></span> <span><a href="/quote.php?id=17705&amp;vote=plus" onclick="return vote(17705,'plus');">+</a> ( <span class="rate" id="q17705"> 20507 </span> ) <a href="/quote.php?id=17705&amp;vote=minus" onclick="return vote(17705,'minus');">–</a></span></div>
-		<div class="quotbody">ххх: 1С изначально проектировалась для небольшого количества пользователей, поэтому оператору предоставлялась бо&#039;льшая свобода действий. <br />ууу: Я склоняюсь к версии что 1С изначально вообще не проектировалась, а сразу писалась.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17707"><b>#17707</b></a></span> <span><a href="/quote.php?id=17707&amp;vote=plus" onclick="return vote(17707,'plus');">+</a> ( <span class="rate" id="q17707"> 16743 </span> ) <a href="/quote.php?id=17707&amp;vote=minus" onclick="return vote(17707,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: У меня сейчас такое странное чувство <br />xxx: Вот представь, что ты летишь на самолете. И вдруг ты узнаешь, что двигатель прикреплен к турбине резинкой от трусов <br />xxx: Вот я сейчас прочитал доки ACPI и очень похожее чувство возникает <br />yyy: Гы. А что там? <br />xxx: Там описание бинаря в BNF. И в нем циклы. <br />xxx: А еще виндовом парсере бага. А производители железа пишут ACPI для своего железа по принципу &quot;на винде работает, значит сойдет&quot; <br />xxx: Итого, 60% таблиц не соответствуют стандарту <br />yyy: Тогда это тебе только кажется, что это резинка от трусов. Это резинка от трусов только по документации и внешнему виду. На самом деле это рисунок резинки от трусов, напечатанный на туалетной бумаге</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17698"><b>#17698</b></a></span> <span><a href="/quote.php?id=17698&amp;vote=plus" onclick="return vote(17698,'plus');">+</a> ( <span class="rate" id="q17698"> 21515 </span> ) <a href="/quote.php?id=17698&amp;vote=minus" onclick="return vote(17698,'minus');">–</a></span></div>
-		<div class="quotbody">(о DRM, защите от копирования) <br />— Диссоциативное Расстройство Меркантильности — очень частое психическое расстройство внутренней жабы, встречающееся у разработчиков игр, сопровождаемое сильными приступами паранойи. В восприятии больного его игра, будучи установленной на несколько устройств, как бы расщепляется на разные игры, за которые, по его мнению, должно быть заплачено отдельно. При этом больной становится одержим навязчивой идеей, что все его обворовывают. В большинстве случаев, это сопровождается визуальными галлюцинациями: больному мерещатся некие «пираты». Когда болезнь достигает критической стадии пациент начинает оберегать «свою прелесть» с таким усердием, что поиграть в нее становится затруднительно даже тем, кто честно за все заплатил.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17714"><b>#17714</b></a></span> <span><a href="/quote.php?id=17714&amp;vote=plus" onclick="return vote(17714,'plus');">+</a> ( <span class="rate" id="q17714"> 20101 </span> ) <a href="/quote.php?id=17714&amp;vote=minus" onclick="return vote(17714,'minus');">–</a></span></div>
-		<div class="quotbody">Новость: в споре, что лучше - AMD или nVidia - один программист зарубил другого топором. <br />Лучший камент: Радеон Раскольников.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17715"><b>#17715</b></a></span> <span><a href="/quote.php?id=17715&amp;vote=plus" onclick="return vote(17715,'plus');">+</a> ( <span class="rate" id="q17715"> 19260 </span> ) <a href="/quote.php?id=17715&amp;vote=minus" onclick="return vote(17715,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: есть у кого жаба программер <br />xxx: кот немного пхп знает? <br />yyy: то что кот PHP немного знает, я бы ещё может поверил <br />yyy: но вот жаба-программер - это ты по-моему загнул</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17722"><b>#17722</b></a></span> <span><a href="/quote.php?id=17722&amp;vote=plus" onclick="return vote(17722,'plus');">+</a> ( <span class="rate" id="q17722"> 19419 </span> ) <a href="/quote.php?id=17722&amp;vote=minus" onclick="return vote(17722,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: из машинного перевода инструкции к бытовой технике: &quot;с 1 по 20 мая пройдут выборы ценностей в ранге&quot; (values within range 1 to 20 may be selected)</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17475"><b>#17475</b></a></span> <span><a href="/quote.php?id=17475&amp;vote=plus" onclick="return vote(17475,'plus');">+</a> ( <span class="rate" id="q17475"> 19325 </span> ) <a href="/quote.php?id=17475&amp;vote=minus" onclick="return vote(17475,'minus');">–</a></span></div>
-		<div class="quotbody">&lt;L29Ah&gt; [[ clang++ == *g++ ]] &amp;&amp; echo yay <br />&lt;L29Ah&gt; yay <br />&lt;Minoru&gt; «*g++»? Указатели в моём шелле?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17430"><b>#17430</b></a></span> <span><a href="/quote.php?id=17430&amp;vote=plus" onclick="return vote(17430,'plus');">+</a> ( <span class="rate" id="q17430"> 19644 </span> ) <a href="/quote.php?id=17430&amp;vote=minus" onclick="return vote(17430,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: Все програмисты поcле смерти в аду варятся в говнокоде :) <br />yyy: нет, в говнокоде мы варимся уже при жизни, в аду мы его рефакторим</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17419"><b>#17419</b></a></span> <span><a href="/quote.php?id=17419&amp;vote=plus" onclick="return vote(17419,'plus');">+</a> ( <span class="rate" id="q17419"> 22285 </span> ) <a href="/quote.php?id=17419&amp;vote=minus" onclick="return vote(17419,'minus');">–</a></span></div>
-		<div class="quotbody">&quot;OpenNET: QEMU/KVM и Xen подвержены уязвимости в коде эмуляции VGA&quot; <br /> <br />xx: proxmox на форуме написали что у них падает windows в среде эмуляции после патчей, ппц.	 <br />yy: Правильный патч. Многоцелевой.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17414"><b>#17414</b></a></span> <span><a href="/quote.php?id=17414&amp;vote=plus" onclick="return vote(17414,'plus');">+</a> ( <span class="rate" id="q17414"> 19815 </span> ) <a href="/quote.php?id=17414&amp;vote=minus" onclick="return vote(17414,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: 600 Гб логов? У меня &gt;3 ТБ было. Дальше также место кончилось. Причина: случайно запись в лог внутри цикла написал, вместо вне него. Странно, что оно вообще работало.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17396"><b>#17396</b></a></span> <span><a href="/quote.php?id=17396&amp;vote=plus" onclick="return vote(17396,'plus');">+</a> ( <span class="rate" id="q17396"> 19330 </span> ) <a href="/quote.php?id=17396&amp;vote=minus" onclick="return vote(17396,'minus');">–</a></span></div>
-		<div class="quotbody">в офисе Apple: <br />- Может сделаем новый дизайн? <br />- Та не, мы меняли его уже пару лет назад, у кого еще идеи? <br />- А давайте исправим глюки на старых девайсах? <br />- Зачем? пусть покупают новые! <br />- Давайте добавим новые Emoji? <br />- Гениально! Так и сделаем!</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17394"><b>#17394</b></a></span> <span><a href="/quote.php?id=17394&amp;vote=plus" onclick="return vote(17394,'plus');">+</a> ( <span class="rate" id="q17394"> 18914 </span> ) <a href="/quote.php?id=17394&amp;vote=minus" onclick="return vote(17394,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: Саша, речь не о том, что теоретически возможно прочесть произведения классики, и даже есть те, кто прочитывает. Мануал администратора фриБЗДи Ты тоже, наверно, одолел, и возможно, что на одном дыхании - Ты станешь на этом основании утверждать, что рекомый мануал есть выдающийся памятник словесности, написан легко, увлекательно и очень душевно? <br /> <br />yyy: Мануал администратора фрибсд, сравнительно с оракловой документацией, это выдающийся, мать его так, памятник словесности. Написан легко, увлекательно, и очень душевно.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17386"><b>#17386</b></a></span> <span><a href="/quote.php?id=17386&amp;vote=plus" onclick="return vote(17386,'plus');">+</a> ( <span class="rate" id="q17386"> 18888 </span> ) <a href="/quote.php?id=17386&amp;vote=minus" onclick="return vote(17386,'minus');">–</a></span></div>
-		<div class="quotbody">&gt; Компания Mail.Ru &lt;...&gt; будет предоставлять услуги коммерческой поддержки решений на базе свободной СУБД Tarantool <br /> <br />SELECT * FROM cars; <br /> <br />+------+--------------------+ <br />| id   | name               | <br />+------+--------------------+ <br />| 1    | &quot;Mazda CX-3&quot;       | <br />| 2    | &quot;Audi Q1&quot;          | <br />| 3    | &quot;BMW X1&quot;           | <br />| 4    | &quot;Mazda CX-5&quot;       | <br />| 5    | &quot;Cadillac XT5&quot;     | <br />| NULL | &quot;Спутник@Mail.Ru&quot;  | <br />| NULL | &quot;Guard@Mail.ru&quot;    | <br />| NULL | &quot;Агент@Mail.ru &quot;   | <br />| NULL | &quot;Mail.ru Updater&quot;  | <br />+------+--------------------+</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17381"><b>#17381</b></a></span> <span><a href="/quote.php?id=17381&amp;vote=plus" onclick="return vote(17381,'plus');">+</a> ( <span class="rate" id="q17381"> 19273 </span> ) <a href="/quote.php?id=17381&amp;vote=minus" onclick="return vote(17381,'minus');">–</a></span></div>
-		<div class="quotbody">Дело в том, что любые новые фичи C++ должны пройти через комитет трёх фанатиков. <br /> <br />Первый фанатик обожает исключения. Всё собрание этот ворчливый старик кажется спящим, но в самый неудобный момент вскакаивает и перебивает говорящего криком «и тут мы бросаем исключение!» После этого конечно всё ломается. Этот старик мало кому нравится, но все вынуждены его терпеть. <br /> <br />Второй фанатик обожает шаблоны. Любую фичу он нежно оборачивает в шаблоны, которые заворачивает в шаблоны, которые заворачивает в шаблоны… пока она опять не сломается. В свободное время пытается написать программу по вычислению смысла жизни и вообще на этапе компиляции. <br /> <br />Третий фанатик, самый молодой, обожает всё параллельное. В отличие от других, он не критикует сразу. Он с энтузиазмом хватается за предложенную фичу, сразу переводит его в параллельность, убеждается что всё ломается и со вздохом «в наш век параллельного программирования так делать нельзя» отправляет фичу в корзину. Говорят, у него множество личностей, которые друг перебивают часто друга.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17375"><b>#17375</b></a></span> <span><a href="/quote.php?id=17375&amp;vote=plus" onclick="return vote(17375,'plus');">+</a> ( <span class="rate" id="q17375"> 34347 </span> ) <a href="/quote.php?id=17375&amp;vote=minus" onclick="return vote(17375,'minus');">–</a></span></div>
-		<div class="quotbody">клиент: Непингуется хост serv29. Посмотрите что с ним. <br />админ: Посмотрел на него, пинг появился. <br />клиент: А что с ним было? <br />админ: хз. я только посмотел. Могу объяснить это приниципом неопределенности: наблюдение влияет на результат.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17371"><b>#17371</b></a></span> <span><a href="/quote.php?id=17371&amp;vote=plus" onclick="return vote(17371,'plus');">+</a> ( <span class="rate" id="q17371"> 626 </span> ) <a href="/quote.php?id=17371&amp;vote=minus" onclick="return vote(17371,'minus');">–</a></span></div>
-		<div class="quotbody">это гениально - вырядиться в костюм пингвина и ходить по улице, приставая к людям с вопросом: &quot;не хотите ли вы поговорить о линуксе?&quot; После чего вручать брошюрки про gentoo... хД</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17370"><b>#17370</b></a></span> <span><a href="/quote.php?id=17370&amp;vote=plus" onclick="return vote(17370,'plus');">+</a> ( <span class="rate" id="q17370"> 677 </span> ) <a href="/quote.php?id=17370&amp;vote=minus" onclick="return vote(17370,'minus');">–</a></span></div>
-		<div class="quotbody">Обсуждение российского моноблока &quot;Таволга&quot;: <br />zzz: &quot;Как нам пояснили в компании &quot;???&quot;, &quot;не хотелось придумывать очередное безликое латинизированное название, обычно ассоциирующееся с IT, или аббревиатуру. Нам хотелось, чтобы название было узнаваемо русским, а не псевдо-западным, мелодичным и при этом не банальным – вот так из множества вариантов выбрали Таволгу&quot;.&quot; <br /> <br />скоро так начнут и кодить на кирили...ах, ну да <br /> <br />xxx: Процессор Intel Core i5-5287U <br /> <br />yyy: Таволга, или Лаба&amp;#769;зник (лат. Filip&amp;#233;ndula) — род многолетних трав семейства Розовые (Rosaceae). Насчитывает 10—13 видов[3], произрастающих в умеренной зоне Северного полушария. <br />Садовое применение: <br />Великолепно отпугивает мух, комаров, слепней. <br /> <br />Походу попали в точку <br /> <br />zzz: Так ребята там здоровенный фумигатор на пятом коре запилили</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17369"><b>#17369</b></a></span> <span><a href="/quote.php?id=17369&amp;vote=plus" onclick="return vote(17369,'plus');">+</a> ( <span class="rate" id="q17369"> 1293 </span> ) <a href="/quote.php?id=17369&amp;vote=minus" onclick="return vote(17369,'minus');">–</a></span></div>
-		<div class="quotbody">Grother: все знают много историй про то, как шампунь или ещё какая хрень в ванной путалась с её кремом для депиляции. Но мало кому известны истории о том, как она мазала прыщи из симпатичного маленького тюбика с непонятным названием Pasta silikonova termoprzewodzaca.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17367"><b>#17367</b></a></span> <span><a href="/quote.php?id=17367&amp;vote=plus" onclick="return vote(17367,'plus');">+</a> ( <span class="rate" id="q17367"> 21 </span> ) <a href="/quote.php?id=17367&amp;vote=minus" onclick="return vote(17367,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: Свеже-родившийся анекдот - сколько нужно айтишников чтобы переткнуть сервер в другую подсеть? <br />xxx: Ответ: пять. Два тестировщика, два инжнера и админ. <br />xxx: Тестировщикам нужно но они не знают, инженеры знают но им нельзя. А админ пустил всех в серверную.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17363"><b>#17363</b></a></span> <span><a href="/quote.php?id=17363&amp;vote=plus" onclick="return vote(17363,'plus');">+</a> ( <span class="rate" id="q17363"> -17 </span> ) <a href="/quote.php?id=17363&amp;vote=minus" onclick="return vote(17363,'minus');">–</a></span></div>
-		<div class="quotbody">Программисту по багам программы: <br />1.При выборе даты постоянно вылетает необрабатываемое исключение. <br />2.Если нажать на кнопку &quot;фильтр&quot; пока идёт создание фильтра - возникает необрабатываемое исключение. <br />Ответ: <br />П.1 Это ошибка не программы а её окружения, т.е. пофикси винду. <br />П.2 куда ты торопишься?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17359"><b>#17359</b></a></span> <span><a href="/quote.php?id=17359&amp;vote=plus" onclick="return vote(17359,'plus');">+</a> ( <span class="rate" id="q17359"> 41 </span> ) <a href="/quote.php?id=17359&amp;vote=minus" onclick="return vote(17359,'minus');">–</a></span></div>
-		<div class="quotbody">Обсуждение ReactOS 0.4 на ЛОРе: <br /> <br />Oxdeadbeef: Оно может в x86_64? <br /> <br />Jedi-to-be: Может, но пока нет.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17358"><b>#17358</b></a></span> <span><a href="/quote.php?id=17358&amp;vote=plus" onclick="return vote(17358,'plus');">+</a> ( <span class="rate" id="q17358"> 9 </span> ) <a href="/quote.php?id=17358&amp;vote=minus" onclick="return vote(17358,'minus');">–</a></span></div>
-		<div class="quotbody">&lt;dsmirnov&gt; на супермикро и в отвратительных шкафах ..... а вы лабутены, лабутены ....</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17357"><b>#17357</b></a></span> <span><a href="/quote.php?id=17357&amp;vote=plus" onclick="return vote(17357,'plus');">+</a> ( <span class="rate" id="q17357"> 37 </span> ) <a href="/quote.php?id=17357&amp;vote=minus" onclick="return vote(17357,'minus');">–</a></span></div>
-		<div class="quotbody">разраб: деплоим. 20 пендингов <br />тестер: боже, сохрани <br />разраб: не поможет, место на облаке закончилось</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17356"><b>#17356</b></a></span> <span><a href="/quote.php?id=17356&amp;vote=plus" onclick="return vote(17356,'plus');">+</a> ( <span class="rate" id="q17356"> 17 </span> ) <a href="/quote.php?id=17356&amp;vote=minus" onclick="return vote(17356,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: Программно-аппаратная платформа удаленного администрирования автоматизированных систем. Сокращенно - ПАПУАС</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17354"><b>#17354</b></a></span> <span><a href="/quote.php?id=17354&amp;vote=plus" onclick="return vote(17354,'plus');">+</a> ( <span class="rate" id="q17354"> 13 </span> ) <a href="/quote.php?id=17354&amp;vote=minus" onclick="return vote(17354,'minus');">–</a></span></div>
-		<div class="quotbody">Nick&gt; Что вы вообще понимаете в тормозных серверах <br />Nick&gt; Мой пишет “System information disabled due to load higher than 1.0” <br />Nick&gt; Вот только при этом вилка локалки рядом на столе лежит, вынутая из сетевухи <br />Nick&gt; Для селерона 400, в который через PCI-адаптер SATA воткнут терабайтник… <br />Nick&gt; да для него просто дышать — и то уже физкультура</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17353"><b>#17353</b></a></span> <span><a href="/quote.php?id=17353&amp;vote=plus" onclick="return vote(17353,'plus');">+</a> ( <span class="rate" id="q17353"> 6 </span> ) <a href="/quote.php?id=17353&amp;vote=minus" onclick="return vote(17353,'minus');">–</a></span></div>
-		<div class="quotbody">Мой мир никогда не станет прежним. Сегодня я узнал, что RoHS это не название китайской фирмы по выпуску электронных компонентов, а директива по содержанию в них вредных веществ</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17316"><b>#17316</b></a></span> <span><a href="/quote.php?id=17316&amp;vote=plus" onclick="return vote(17316,'plus');">+</a> ( <span class="rate" id="q17316"> 33 </span> ) <a href="/quote.php?id=17316&amp;vote=minus" onclick="return vote(17316,'minus');">–</a></span></div>
-		<div class="quotbody">Елена: Дали строителям проект, они строили-строили и наконец построили. Приезжает заказчик. В грунте выкопана цилиндрическая яма метров 15 в глубину. На дне сияет прожектор. Заказчик переворачивает чертёж на 180 градусов и говорит: “Всё хорошо, но по проекту здесь должен был быть МАЯК”. <br />Dmitry: Боженьки мои ))))) <br />Елена: немножко похоже на историю из жизни программистов <br />Dmitry: ага ) только программист может потом решить, что будет легче все корабли сделать подземными, чем переделывать маяк.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17314"><b>#17314</b></a></span> <span><a href="/quote.php?id=17314&amp;vote=plus" onclick="return vote(17314,'plus');">+</a> ( <span class="rate" id="q17314"> 3 </span> ) <a href="/quote.php?id=17314&amp;vote=minus" onclick="return vote(17314,'minus');">–</a></span></div>
-		<div class="quotbody">Kikimorra: Изучаю джаваскрипт на онлайн-курсах. Чувак у доски рассказывает, как удалять ноды. Приводимая в пример веб-страница выглядит так: <br /> <br />It&#039;s a nice day! <br />и кнопка <br />Delete all children! <br /> <br />Прям кодишь и чувствуешь, как рога с хвостом прорастают &gt;.&lt;</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17312"><b>#17312</b></a></span> <span><a href="/quote.php?id=17312&amp;vote=plus" onclick="return vote(17312,'plus');">+</a> ( <span class="rate" id="q17312"> 15 </span> ) <a href="/quote.php?id=17312&amp;vote=minus" onclick="return vote(17312,'minus');">–</a></span></div>
-		<div class="quotbody">xxx:после апдейта винда взяла и переставила панель задач слева обратно вниз <br />xxx:мол, не выёбывайся <br />ххх:тебе не убунта</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17306"><b>#17306</b></a></span> <span><a href="/quote.php?id=17306&amp;vote=plus" onclick="return vote(17306,'plus');">+</a> ( <span class="rate" id="q17306"> 25 </span> ) <a href="/quote.php?id=17306&amp;vote=minus" onclick="return vote(17306,'minus');">–</a></span></div>
-		<div class="quotbody">aaa: Есть же специальные для тачскринов, там кончики пальцев сделаны из проводящего материала. <br />bbb: Оо, как они называются? А то я видел только вязаные igloves, которые рвутся через месяц использования, И в мороз в них не походишь. <br />ccc: Купите металлизированные нитки и сделайте несколько стежков под подушечками пальцев. Начинайте прошивать изнутри оставив конец нитки после узелка подлиннее, чтобы обеспечить лучшую проводимость. <br />ddd: — Как ты работаешь с айпадом в перчатках? <br />— Я их перепрошил.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17304"><b>#17304</b></a></span> <span><a href="/quote.php?id=17304&amp;vote=plus" onclick="return vote(17304,'plus');">+</a> ( <span class="rate" id="q17304"> -1 </span> ) <a href="/quote.php?id=17304&amp;vote=minus" onclick="return vote(17304,'minus');">–</a></span></div>
-		<div class="quotbody">&lt;&gt; нет ничего приятнее теплого лампового диалапа... <br />&lt;&gt; когда жужжание фрезы сливается с звуками хэндшейка в гармоничную мелодию?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17297"><b>#17297</b></a></span> <span><a href="/quote.php?id=17297&amp;vote=plus" onclick="return vote(17297,'plus');">+</a> ( <span class="rate" id="q17297"> -11 </span> ) <a href="/quote.php?id=17297&amp;vote=minus" onclick="return vote(17297,'minus');">–</a></span></div>
-		<div class="quotbody">[15:15:56] r@ttler: говно успешно прилеплено и оттестировано. говно оказалось говном <br />[15:16:05] ZimM: внезапно <br />[15:17:30] r@ttler: ну я пока его прилеплял мне аж привидилась картина: замок разраба говна. дорога к нему увенчана костылями. как вот копья вешали с черепами врагов, так тут костыли с черепами разрабов <br />[15:17:59] r@ttler: и табличка на воротах &quot;оставь свой мозг, всяк сюда входящий&quot;</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17291"><b>#17291</b></a></span> <span><a href="/quote.php?id=17291&amp;vote=plus" onclick="return vote(17291,'plus');">+</a> ( <span class="rate" id="q17291"> 8 </span> ) <a href="/quote.php?id=17291&amp;vote=minus" onclick="return vote(17291,'minus');">–</a></span></div>
-		<div class="quotbody">Если бы врачи были ИТ-шниками: <br /> <br />- У меня не работает клавиатура. <br /> <br />- Сдайте пробы на подклавиатурный сахар и лактозу, сделайте рентген и функциональный тест клавиш.... <br />[через 2 месяца и 20 тысяч рублей]...Действительно, обнаружена карамельная бляшка под пробелом. <br /> <br />- Что же делать? <br /> <br />- Вам показана консервативная терапия: ежедневно постукивайте 15 минут по перевернутой клавиатуре, затем 15 минут протирайте клавишу спиртом, потом разрабатывайте клавишу вручную. До конца срока службы вашего системного блока старайтесь как можно реже и аккуратнее пользоваться пробелом. Поставьте виртуальную клавиатуру и печатайте мышкой.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17285"><b>#17285</b></a></span> <span><a href="/quote.php?id=17285&amp;vote=plus" onclick="return vote(17285,'plus');">+</a> ( <span class="rate" id="q17285"> 0 </span> ) <a href="/quote.php?id=17285&amp;vote=minus" onclick="return vote(17285,'minus');">–</a></span></div>
-		<div class="quotbody">ZimM: нуу... with great power comes great responsibility <br />r@ttler: great chances to shoot your own leg <br />ZimM: ну это да. другое дело, что для этого все равно нужно постараться <br />r@ttler: work hard to shoot your own leg? <br />r@ttler: ну тогда ты совсем лол <br />r@ttler: впадло было делать по-нормальному, потому помучался и таки сделал через жопу <br />ZimM: ну, я думал, что отстрелю себе фалангу мизинца, а оторвал пол-туловища, потому что пол-туловища мне показались похожими на фалангу мизинца...</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17280"><b>#17280</b></a></span> <span><a href="/quote.php?id=17280&amp;vote=plus" onclick="return vote(17280,'plus');">+</a> ( <span class="rate" id="q17280"> 11 </span> ) <a href="/quote.php?id=17280&amp;vote=minus" onclick="return vote(17280,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: Вот говорят иногда &quot;зоопарк браузеров&quot; (операционных систем, железок и так далее), а я тут внезапно понял, что у меня самый настоящий бордель виртуальных машин. Потому что их у меня четыре, названы женскими именами, чтобы быстро различать, и я с ними трахаюсь. Причём в данный момент со всеми четырьмя одновременно, потому что делаю лабораторную по сетям.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17279"><b>#17279</b></a></span> <span><a href="/quote.php?id=17279&amp;vote=plus" onclick="return vote(17279,'plus');">+</a> ( <span class="rate" id="q17279"> 2 </span> ) <a href="/quote.php?id=17279&amp;vote=minus" onclick="return vote(17279,'minus');">–</a></span></div>
-		<div class="quotbody">Val: США провели третье и последнее испытание новой атомной бомбы B61-12. Бомбу без заряда, в соответствии с международным договором о запрете ядерных взрывов, сбросили с истребителя F-15E на полигоне &quot;Тонопа&quot; в Неваде 20 октября. <br />Val: какое интересное испытание. При ударе о землю она выбросила флажок &quot;БУМ&quot;? <br />Кир: Отправила в твиттер &quot;БДЫЩ!&quot; - она жы высокотехнологичная</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17276"><b>#17276</b></a></span> <span><a href="/quote.php?id=17276&amp;vote=plus" onclick="return vote(17276,'plus');">+</a> ( <span class="rate" id="q17276"> 25 </span> ) <a href="/quote.php?id=17276&amp;vote=minus" onclick="return vote(17276,'minus');">–</a></span></div>
-		<div class="quotbody">dimgel: (ссылка на ленту.ру) &quot;Linux.Encoder.1 — относится к классу троянцев-шифровальщиков. После запуска с правами администратора...&quot; <br />Бгг. Ещё сто лет назад шутка ходила про линуксовые вирусы: &quot;распакуйте меня пожалуйста и пропишите в автозапуск демоном от имени рута&quot;. <br />dimgel: Я смотрю, ни хера не меняется в этой жизни. <br />garik: на ещё надо пару патчей найти и накатить <br />garik: иначе не скомпилится <br />dimgel: обязательно <br />dimgel: причём для разных дистров патчи будут разные <br />dimgel: Народ! Как пропатчить Linux.Encoder.1 под FreeBSD?!</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17272"><b>#17272</b></a></span> <span><a href="/quote.php?id=17272&amp;vote=plus" onclick="return vote(17272,'plus');">+</a> ( <span class="rate" id="q17272"> -5 </span> ) <a href="/quote.php?id=17272&amp;vote=minus" onclick="return vote(17272,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: когда читаю такие ограничения дурацкие, хочется спросить, каким местом пишутся драйвера <br />yyy: Но тут хоть плюс, что он сам не падает, а ошибку только выдаёт. <br />xxx: андроид разработчик... <br />xxx: ну хорошо хоть не падает вместе с системой!! <br />xxx: а то что всё в говне и не работает это мелочи <br />xxx: дальше будет &quot;ну хоть не сносит систему&quot; <br />xxx: &quot;ну хоть не выжигает гпу&quot; <br />yyy: &quot;ну, хоть не выжигает глаза&quot; <br />xxx: &quot;ну хоть не подключается к скайнету и не выжигает поверхность планеты&quot; <br />yyy: &quot;ну, хотя бы не уничтожает вселенную&quot; <br />xxx: вот видишь, повезло-то как!</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17259"><b>#17259</b></a></span> <span><a href="/quote.php?id=17259&amp;vote=plus" onclick="return vote(17259,'plus');">+</a> ( <span class="rate" id="q17259"> 17 </span> ) <a href="/quote.php?id=17259&amp;vote=minus" onclick="return vote(17259,'minus');">–</a></span></div>
-		<div class="quotbody">обсуждение странного результата трейсроута <br />[19:27:36] ZimM: пробил по геоип. реально Europe, но если по координатам глянуть - то швейцария <br />[19:28:01] r@ttler: и пробей соседний. реально сша? <br />[19:28:30] ZimM: реально сша <br />[19:28:49] r@ttler: ну значит лол <br />[19:29:01] r@ttler: сто раз туда-сюда по трансатлантике? <br />[19:29:08] ZimM: ну а хуле <br />[19:29:14] r@ttler: вокруг света за 80 хопов?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17236"><b>#17236</b></a></span> <span><a href="/quote.php?id=17236&amp;vote=plus" onclick="return vote(17236,'plus');">+</a> ( <span class="rate" id="q17236"> 13 </span> ) <a href="/quote.php?id=17236&amp;vote=minus" onclick="return vote(17236,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: &quot;Как перестать юзать чужой код и научиться прогать самостоятельно&quot;, новый бестселлер Алан Карра</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17235"><b>#17235</b></a></span> <span><a href="/quote.php?id=17235&amp;vote=plus" onclick="return vote(17235,'plus');">+</a> ( <span class="rate" id="q17235"> 12 </span> ) <a href="/quote.php?id=17235&amp;vote=minus" onclick="return vote(17235,'minus');">–</a></span></div>
-		<div class="quotbody">xx: Флеш умер, google его выпилит скоро :) <br /> <br />yy: Джобс тоже так говорил) <br /> <br />zz: Джобса уже бог (или ктулху, или матрица - кому что нравится) выпилил, а флэш еще барахтается <br /> <br />tt: Ну разве не ясно, что это флеш его и выпилил?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17233"><b>#17233</b></a></span> <span><a href="/quote.php?id=17233&amp;vote=plus" onclick="return vote(17233,'plus');">+</a> ( <span class="rate" id="q17233"> 4 </span> ) <a href="/quote.php?id=17233&amp;vote=minus" onclick="return vote(17233,'minus');">–</a></span></div>
-		<div class="quotbody">К новости &quot;Отечественный защищённый Linux-дистрибутив Заря готов к внедрению&quot;: <br /> <br />xxx: Теперь будет сборка-разборка не только автомата, но и ядра. Норматив 3 минуты.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17230"><b>#17230</b></a></span> <span><a href="/quote.php?id=17230&amp;vote=plus" onclick="return vote(17230,'plus');">+</a> ( <span class="rate" id="q17230"> 24 </span> ) <a href="/quote.php?id=17230&amp;vote=minus" onclick="return vote(17230,'minus');">–</a></span></div>
-		<div class="quotbody">С Хабра: <br />Смотрели Last Exile, где были шахматы для воздушных кораблей — с фиксацией? Вот термос для поезда. У него горлышко как у чайника, но оно перекрыто. Кнопка на ручке открывает возможность лить из термоса наружу. Это классика страховки от ошибок. Пользоваться потенциально опасной функцией можно только сознательно. <br />[...] <br />Это ещё и защита от дурака, в частности, важная для техники безопасности. У нас на производстве есть станок, который умеет прошибать гильотинным ножиком сразу огромную пачку бумаги. Так вот, чтобы его запустить нужно: <br /> <br />1) Положить бумагу под датчик бумаги <br />2) Положить левую руку на левую пусковую кнопку далеко слева <br />3) Правую руку — на правую пусковую кнопку далеко справа <br />4) Нажать педаль ногой (в этом положении физически невозможно засунуть голову в рабочую область станка) <br />5) Нажать обе пусковые кнопки одновременно <br />6) Но, видимо, рабочие научились действовать вдвоём или блокировать кнопки — и поэтому ещё нужно убрать всё из рабочей зоны, чтобы инфракрасные лучи не пересекались. Только после этого случится пуск.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17226"><b>#17226</b></a></span> <span><a href="/quote.php?id=17226&amp;vote=plus" onclick="return vote(17226,'plus');">+</a> ( <span class="rate" id="q17226"> 15 </span> ) <a href="/quote.php?id=17226&amp;vote=minus" onclick="return vote(17226,'minus');">–</a></span></div>
-		<div class="quotbody">Архитекторы, емае, это источник нескончаемого умиления. Планерка, разбор какого-то легаси модуля. Говорят переписывать будем. Архитектор его анализировал неделю. Читал там код, компилил что-то, виртуалок поднял кучу, думал спеку, ходил курить каждые 15 и посадил картридж в принтере. Вот выходит этот мегачеловече к вайтборду докладывать комманде об устройстве этой вундервафли. Берет маркер, долго думает, рисует кружок. Еще думает, закрашивает. Думает еще, рисует входящую стрелку. Потом еще исходящую. Поворачивается к комманде: <br /> <br />-- В общем, коллеги, это жопа. Работает все через нее. А теперь посмотрим дему и обсудим баги. <br /> <br />Я вообще удивлен что в они в свой UML до сих пор стандартный символ не добавили.</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17227"><b>#17227</b></a></span> <span><a href="/quote.php?id=17227&amp;vote=plus" onclick="return vote(17227,'plus');">+</a> ( <span class="rate" id="q17227"> 7 </span> ) <a href="/quote.php?id=17227&amp;vote=minus" onclick="return vote(17227,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: О, Боже! Я начинаю получать кайф от пользования линуксом... Развернул убунту, понадобилось пару программ поставить, я ему пишу в консоли аптгет инсталл со списком желаемого, а он сам ищет, ставит и настраивает, и не надо дистрибутивы искать, по сайтам лазить, качать...</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17223"><b>#17223</b></a></span> <span><a href="/quote.php?id=17223&amp;vote=plus" onclick="return vote(17223,'plus');">+</a> ( <span class="rate" id="q17223"> 12 </span> ) <a href="/quote.php?id=17223&amp;vote=minus" onclick="return vote(17223,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: 40 Ватт, бывали у АМД и помощнее, если вы понимаете... <br />yyy: у меня был пентиум D <br />yyy: этим все сказано <br />yyy: когда я запускал эклипс - зимой наступало лето <br />zzz: у меня тоже греет комнату хорошо :) <br />zzz: сейчас 80 градусов <br />xxx: да это не комната - это баня ))) <br />yyy: живучий однако <br />yyy: мой спалил три мамки <br />yyy: у всех диагноз - микротрещины <br />yyy: это была середина 2000х, обычный офисный корпус, потолок регистрировал примерно 120 градусов <br />yyy: я летом морозил лед и крошил его в миску перед воздухозаборным отверстием <br />yyy: и менял его раз в час <br />yyy: когда грузилась моя винда, запотевали окна соседних домов <br />yyy: однажды, когда я архивировал сериал на флешку, ученые отметили глобальное потепление на 5 градусов <br />yyy: каждый раз, как я компилировал проект, в антарктиде семейство пингвинов оставалось без гнезда <br />xxx: мне кажется, что Чак тебе начинает завидовать <br />yyy: чак приходил ко мне домой разгоревать свой завтрак <br />yyy: свой процессор я отдал ученым, и в итоге он лег в основу ИТЭР</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17224"><b>#17224</b></a></span> <span><a href="/quote.php?id=17224&amp;vote=plus" onclick="return vote(17224,'plus');">+</a> ( <span class="rate" id="q17224"> 23 </span> ) <a href="/quote.php?id=17224&amp;vote=minus" onclick="return vote(17224,'minus');">–</a></span></div>
-		<div class="quotbody">— Человек, который работает в ИБ, не знает, что такое NDA? <br />— Может быть ему по NDA нельзя говорить, что знает?</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17221"><b>#17221</b></a></span> <span><a href="/quote.php?id=17221&amp;vote=plus" onclick="return vote(17221,'plus');">+</a> ( <span class="rate" id="q17221"> 32 </span> ) <a href="/quote.php?id=17221&amp;vote=minus" onclick="return vote(17221,'minus');">–</a></span></div>
-		<div class="quotbody">duzorg: <br />У кондиционера заклинило дренаж и вся вода вылилась внутрь серверной. Благо я туда случайно зашёл. Там серваки стояли на деревянной столешнице, а её водой размыло, она посередине где то на 15-20см прогнулась. Еще бы немного и рухнули бы все серваки на пол. Тысяч на 100 попали бы... <br />Или скорее даже больше чем на 100. <br />duzorg: <br />А в серверную я зашёл, потому что микротик завис. А микротик впервые за 4 года завис. %) <br />Funkryer: <br />вот так повезло <br />отличный был бы отзыв о микротике =) <br />мол завис 1 раз за 4 года и то только для того, чтобы спасти наши серваки <br />duzorg: <br />Не только работает стабильно, но и заботится о стабильной работе рядом находящегося оборудования ))) <br />duzorg: <br />На самом деле может его от большой влажности чё нить клинануло... хз... <br />Funkryer: <br />ну, начал, не порть магию!</div>
-	</div><hr />
-	<div class="quote">
-		<div class="quothead"><span><a href="/quote.php?id=17220"><b>#17220</b></a></span> <span><a href="/quote.php?id=17220&amp;vote=plus" onclick="return vote(17220,'plus');">+</a> ( <span class="rate" id="q17220"> 12 </span> ) <a href="/quote.php?id=17220&amp;vote=minus" onclick="return vote(17220,'minus');">–</a></span></div>
-		<div class="quotbody">xxx: конструктор запросов как всегда гентален <br />xxx: :( <br />xxx: хм хотел написать гениален, но генитален тоже пойдет</div>
-	</div><hr />
-	<div class="pages">
-		Страницы:  1  <a href="/?page=2">2</a>  <a href="/?page=3">3</a>  <a href="/?page=4">4</a>  <a href="/?page=5">5</a>  <a href="/?page=6">6</a>  <a href="/?page=7">7</a>  <a href="/?page=8">8</a>  <a href="/?page=9">9</a>  <a href="/?page=10">10</a>  <a href="/?page=11">11</a>  <a href="/?page=12">12</a>  <a href="/?page=13">13</a>  <a href="/?page=14">14</a>  <a href="/?page=15">15</a>  <a href="/?page=16">16</a>  <a href="/?page=17">17</a>  <a href="/?page=18">18</a>  <a href="/?page=19">19</a>  <a href="/?page=20">20</a>  <a href="/?page=21">21</a>  <a href="/?page=22">22</a>  <a href="/?page=23">23</a>  <a href="/?page=24">24</a>  <a href="/?page=25">25</a>  <a href="/?page=26">26</a>  <a href="/?page=27">27</a>  <a href="/?page=28">28</a>  <a href="/?page=29">29</a>  <a href="/?page=30">30</a>  <a href="/?page=31">31</a>  <a href="/?page=32">32</a>  <a href="/?page=33">33</a>  <a href="/?page=34">34</a>  <a href="/?page=35">35</a>  <a href="/?page=36">36</a>  <a href="/?page=37">37</a>  <a href="/?page=38">38</a>  <a href="/?page=39">39</a>  <a href="/?page=40">40</a>  <a href="/?page=41">41</a>  <a href="/?page=42">42</a>  <a href="/?page=43">43</a>  <a href="/?page=44">44</a>  <a href="/?page=45">45</a>  <a href="/?page=46">46</a>  <a href="/?page=47">47</a>  <a href="/?page=48">48</a>  <a href="/?page=49">49</a>  <a href="/?page=50">50</a>  <a href="/?page=51">51</a>  <a href="/?page=52">52</a>  <a href="/?page=53">53</a>  <a href="/?page=54">54</a>  <a href="/?page=55">55</a> 	</div><hr />
-	<div class="menu">
-		 [&nbsp;По дате&nbsp;]  [&nbsp;<a href="/best.php">По рейтингу</a>&nbsp;]  [&nbsp;<a href="/random.php">Случайно</a>&nbsp;]  [&nbsp;<a href="/add.php">Добавить цитату</a>&nbsp;]  [&nbsp;<a href="/search.php">Поиск</a>&nbsp;]  [&nbsp;<a href="/skins.php">Шкурки</a>&nbsp;]  <!--[&nbsp;<a href="/trash.php">;)</a>&nbsp;]-->  [&nbsp;<a href="/rss.xml">RSS</a>&nbsp;]  [&nbsp;<a href="/forum/"><b>Форум</b></a>&nbsp;] 
-	</div><hr />
-	<div class="copy">
-		«ibash.org.ru — Новый цитатник Рунета»<br />
-		Почта вебмастера: <a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;%20%69&#109;&#097;&#105;%6c%40%69&#098;%61&#115;%68&#046;%6f&#114;%67&#046;&#114;&#117;">&#105;&#109;&#097;&#105;&#108;@&#105;&#098;&#097;&#115;&#104;&#046;&#111;&#114;&#103;&#046;&#114;&#117;</a>
-	</div>
-
-	<div class="topline"> </div>
-
-</body>
-
-</html>

+ 0 - 359
internal/http/client/testdata/windows_1251.xml

@@ -1,359 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<rss version="2.0">
-	<channel>
-		<title>iBash.Org.Ru</title>
-		<link>http://ibash.org.ru/</link>
-		<description>Новый цитатник Рунета</description>
-		<language>ru</language>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17703</guid>
-			<link>http://ibash.org.ru/quote.php?id=17703</link>
-			<title>Цитата #17703</title>
-			<pubDate>Wed, 21 Mar 2018 10:27:32 +0300</pubDate>
-			<description><![CDATA[xxx: есть у кого жаба программер <br />xxx: кот немного пхп знает? <br />yyy: то что кот PHP немного знает, я бы ещё может поверил <br />yyy: но вот жаба-программер - это ты по-моему загнул]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17705</guid>
-			<link>http://ibash.org.ru/quote.php?id=17705</link>
-			<title>Цитата #17705</title>
-			<pubDate>Wed, 21 Mar 2018 10:27:22 +0300</pubDate>
-			<description><![CDATA[ххх: 1С изначально проектировалась для небольшого количества пользователей, поэтому оператору предоставлялась бо&#039;льшая свобода действий. <br />ууу: Я склоняюсь к версии что 1С изначально вообще не проектировалась, а сразу писалась.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17707</guid>
-			<link>http://ibash.org.ru/quote.php?id=17707</link>
-			<title>Цитата #17707</title>
-			<pubDate>Wed, 21 Mar 2018 10:26:48 +0300</pubDate>
-			<description><![CDATA[xxx: У меня сейчас такое странное чувство <br />xxx: Вот представь, что ты летишь на самолете. И вдруг ты узнаешь, что двигатель прикреплен к турбине резинкой от трусов <br />xxx: Вот я сейчас прочитал доки ACPI и очень похожее чувство возникает <br />yyy: Гы. А что там? <br />xxx: Там описание бинаря в BNF. И в нем циклы. <br />xxx: А еще виндовом парсере бага. А производители железа пишут ACPI для своего железа по принципу &quot;на винде работает, значит сойдет&quot; <br />xxx: Итого, 60% таблиц не соответствуют стандарту <br />yyy: Тогда это тебе только кажется, что это резинка от трусов. Это резинка от трусов только по документации и внешнему виду. На самом деле это рисунок резинки от трусов, напечатанный на туалетной бумаге]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17698</guid>
-			<link>http://ibash.org.ru/quote.php?id=17698</link>
-			<title>Цитата #17698</title>
-			<pubDate>Thu, 15 Mar 2018 10:15:42 +0300</pubDate>
-			<description><![CDATA[(о DRM, защите от копирования) <br />— Диссоциативное Расстройство Меркантильности — очень частое психическое расстройство внутренней жабы, встречающееся у разработчиков игр, сопровождаемое сильными приступами паранойи. В восприятии больного его игра, будучи установленной на несколько устройств, как бы расщепляется на разные игры, за которые, по его мнению, должно быть заплачено отдельно. При этом больной становится одержим навязчивой идеей, что все его обворовывают. В большинстве случаев, это сопровождается визуальными галлюцинациями: больному мерещатся некие «пираты». Когда болезнь достигает критической стадии пациент начинает оберегать «свою прелесть» с таким усердием, что поиграть в нее становится затруднительно даже тем, кто честно за все заплатил.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17714</guid>
-			<link>http://ibash.org.ru/quote.php?id=17714</link>
-			<title>Цитата #17714</title>
-			<pubDate>Thu, 15 Mar 2018 10:14:00 +0300</pubDate>
-			<description><![CDATA[Новость: в споре, что лучше - AMD или nVidia - один программист зарубил другого топором. <br />Лучший камент: Радеон Раскольников.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17715</guid>
-			<link>http://ibash.org.ru/quote.php?id=17715</link>
-			<title>Цитата #17715</title>
-			<pubDate>Thu, 15 Mar 2018 10:13:35 +0300</pubDate>
-			<description><![CDATA[xxx: есть у кого жаба программер <br />xxx: кот немного пхп знает? <br />yyy: то что кот PHP немного знает, я бы ещё может поверил <br />yyy: но вот жаба-программер - это ты по-моему загнул]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17722</guid>
-			<link>http://ibash.org.ru/quote.php?id=17722</link>
-			<title>Цитата #17722</title>
-			<pubDate>Thu, 15 Mar 2018 10:13:03 +0300</pubDate>
-			<description><![CDATA[xxx: из машинного перевода инструкции к бытовой технике: &quot;с 1 по 20 мая пройдут выборы ценностей в ранге&quot; (values within range 1 to 20 may be selected)]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17475</guid>
-			<link>http://ibash.org.ru/quote.php?id=17475</link>
-			<title>Цитата #17475</title>
-			<pubDate>Thu, 15 Mar 2018 10:05:41 +0300</pubDate>
-			<description><![CDATA[&lt;L29Ah&gt; [[ clang++ == *g++ ]] &amp;&amp; echo yay <br />&lt;L29Ah&gt; yay <br />&lt;Minoru&gt; «*g++»? Указатели в моём шелле?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17430</guid>
-			<link>http://ibash.org.ru/quote.php?id=17430</link>
-			<title>Цитата #17430</title>
-			<pubDate>Thu, 15 Mar 2018 09:59:50 +0300</pubDate>
-			<description><![CDATA[xxx: Все програмисты поcле смерти в аду варятся в говнокоде :) <br />yyy: нет, в говнокоде мы варимся уже при жизни, в аду мы его рефакторим]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17419</guid>
-			<link>http://ibash.org.ru/quote.php?id=17419</link>
-			<title>Цитата #17419</title>
-			<pubDate>Thu, 15 Mar 2018 09:59:01 +0300</pubDate>
-			<description><![CDATA[&quot;OpenNET: QEMU/KVM и Xen подвержены уязвимости в коде эмуляции VGA&quot; <br /> <br />xx: proxmox на форуме написали что у них падает windows в среде эмуляции после патчей, ппц.	 <br />yy: Правильный патч. Многоцелевой.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17414</guid>
-			<link>http://ibash.org.ru/quote.php?id=17414</link>
-			<title>Цитата #17414</title>
-			<pubDate>Thu, 15 Mar 2018 09:58:30 +0300</pubDate>
-			<description><![CDATA[xxx: 600 Гб логов? У меня &gt;3 ТБ было. Дальше также место кончилось. Причина: случайно запись в лог внутри цикла написал, вместо вне него. Странно, что оно вообще работало.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17396</guid>
-			<link>http://ibash.org.ru/quote.php?id=17396</link>
-			<title>Цитата #17396</title>
-			<pubDate>Thu, 15 Mar 2018 09:56:44 +0300</pubDate>
-			<description><![CDATA[в офисе Apple: <br />- Может сделаем новый дизайн? <br />- Та не, мы меняли его уже пару лет назад, у кого еще идеи? <br />- А давайте исправим глюки на старых девайсах? <br />- Зачем? пусть покупают новые! <br />- Давайте добавим новые Emoji? <br />- Гениально! Так и сделаем!]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17394</guid>
-			<link>http://ibash.org.ru/quote.php?id=17394</link>
-			<title>Цитата #17394</title>
-			<pubDate>Thu, 15 Mar 2018 09:56:28 +0300</pubDate>
-			<description><![CDATA[xxx: Саша, речь не о том, что теоретически возможно прочесть произведения классики, и даже есть те, кто прочитывает. Мануал администратора фриБЗДи Ты тоже, наверно, одолел, и возможно, что на одном дыхании - Ты станешь на этом основании утверждать, что рекомый мануал есть выдающийся памятник словесности, написан легко, увлекательно и очень душевно? <br /> <br />yyy: Мануал администратора фрибсд, сравнительно с оракловой документацией, это выдающийся, мать его так, памятник словесности. Написан легко, увлекательно, и очень душевно.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17386</guid>
-			<link>http://ibash.org.ru/quote.php?id=17386</link>
-			<title>Цитата #17386</title>
-			<pubDate>Thu, 15 Mar 2018 09:55:30 +0300</pubDate>
-			<description><![CDATA[&gt; Компания Mail.Ru &lt;...&gt; будет предоставлять услуги коммерческой поддержки решений на базе свободной СУБД Tarantool <br /> <br />SELECT * FROM cars; <br /> <br />+------+--------------------+ <br />| id   | name               | <br />+------+--------------------+ <br />| 1    | &quot;Mazda CX-3&quot;       | <br />| 2    | &quot;Audi Q1&quot;          | <br />| 3    | &quot;BMW X1&quot;           | <br />| 4    | &quot;Mazda CX-5&quot;       | <br />| 5    | &quot;Cadillac XT5&quot;     | <br />| NULL | &quot;Спутник@Mail.Ru&quot;  | <br />| NULL | &quot;Guard@Mail.ru&quot;    | <br />| NULL | &quot;Агент@Mail.ru &quot;   | <br />| NULL | &quot;Mail.ru Updater&quot;  | <br />+------+--------------------+]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17381</guid>
-			<link>http://ibash.org.ru/quote.php?id=17381</link>
-			<title>Цитата #17381</title>
-			<pubDate>Thu, 15 Mar 2018 09:54:50 +0300</pubDate>
-			<description><![CDATA[Дело в том, что любые новые фичи C++ должны пройти через комитет трёх фанатиков. <br /> <br />Первый фанатик обожает исключения. Всё собрание этот ворчливый старик кажется спящим, но в самый неудобный момент вскакаивает и перебивает говорящего криком «и тут мы бросаем исключение!» После этого конечно всё ломается. Этот старик мало кому нравится, но все вынуждены его терпеть. <br /> <br />Второй фанатик обожает шаблоны. Любую фичу он нежно оборачивает в шаблоны, которые заворачивает в шаблоны, которые заворачивает в шаблоны… пока она опять не сломается. В свободное время пытается написать программу по вычислению смысла жизни и вообще на этапе компиляции. <br /> <br />Третий фанатик, самый молодой, обожает всё параллельное. В отличие от других, он не критикует сразу. Он с энтузиазмом хватается за предложенную фичу, сразу переводит его в параллельность, убеждается что всё ломается и со вздохом «в наш век параллельного программирования так делать нельзя» отправляет фичу в корзину. Говорят, у него множество личностей, которые друг перебивают часто друга.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17375</guid>
-			<link>http://ibash.org.ru/quote.php?id=17375</link>
-			<title>Цитата #17375</title>
-			<pubDate>Thu, 15 Mar 2018 09:53:54 +0300</pubDate>
-			<description><![CDATA[клиент: Непингуется хост serv29. Посмотрите что с ним. <br />админ: Посмотрел на него, пинг появился. <br />клиент: А что с ним было? <br />админ: хз. я только посмотел. Могу объяснить это приниципом неопределенности: наблюдение влияет на результат.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17371</guid>
-			<link>http://ibash.org.ru/quote.php?id=17371</link>
-			<title>Цитата #17371</title>
-			<pubDate>Thu, 15 Mar 2018 09:53:46 +0300</pubDate>
-			<description><![CDATA[это гениально - вырядиться в костюм пингвина и ходить по улице, приставая к людям с вопросом: &quot;не хотите ли вы поговорить о линуксе?&quot; После чего вручать брошюрки про gentoo... хД]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17370</guid>
-			<link>http://ibash.org.ru/quote.php?id=17370</link>
-			<title>Цитата #17370</title>
-			<pubDate>Thu, 15 Mar 2018 09:53:28 +0300</pubDate>
-			<description><![CDATA[Обсуждение российского моноблока &quot;Таволга&quot;: <br />zzz: &quot;Как нам пояснили в компании &quot;???&quot;, &quot;не хотелось придумывать очередное безликое латинизированное название, обычно ассоциирующееся с IT, или аббревиатуру. Нам хотелось, чтобы название было узнаваемо русским, а не псевдо-западным, мелодичным и при этом не банальным – вот так из множества вариантов выбрали Таволгу&quot;.&quot; <br /> <br />скоро так начнут и кодить на кирили...ах, ну да <br /> <br />xxx: Процессор Intel Core i5-5287U <br /> <br />yyy: Таволга, или Лаба&amp;#769;зник (лат. Filip&amp;#233;ndula) — род многолетних трав семейства Розовые (Rosaceae). Насчитывает 10—13 видов[3], произрастающих в умеренной зоне Северного полушария. <br />Садовое применение: <br />Великолепно отпугивает мух, комаров, слепней. <br /> <br />Походу попали в точку <br /> <br />zzz: Так ребята там здоровенный фумигатор на пятом коре запилили]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17369</guid>
-			<link>http://ibash.org.ru/quote.php?id=17369</link>
-			<title>Цитата #17369</title>
-			<pubDate>Thu, 15 Mar 2018 09:52:38 +0300</pubDate>
-			<description><![CDATA[Grother: все знают много историй про то, как шампунь или ещё какая хрень в ванной путалась с её кремом для депиляции. Но мало кому известны истории о том, как она мазала прыщи из симпатичного маленького тюбика с непонятным названием Pasta silikonova termoprzewodzaca.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17367</guid>
-			<link>http://ibash.org.ru/quote.php?id=17367</link>
-			<title>Цитата #17367</title>
-			<pubDate>Thu, 15 Mar 2018 09:52:20 +0300</pubDate>
-			<description><![CDATA[xxx: Свеже-родившийся анекдот - сколько нужно айтишников чтобы переткнуть сервер в другую подсеть? <br />xxx: Ответ: пять. Два тестировщика, два инжнера и админ. <br />xxx: Тестировщикам нужно но они не знают, инженеры знают но им нельзя. А админ пустил всех в серверную.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17363</guid>
-			<link>http://ibash.org.ru/quote.php?id=17363</link>
-			<title>Цитата #17363</title>
-			<pubDate>Thu, 15 Mar 2018 09:51:55 +0300</pubDate>
-			<description><![CDATA[Программисту по багам программы: <br />1.При выборе даты постоянно вылетает необрабатываемое исключение. <br />2.Если нажать на кнопку &quot;фильтр&quot; пока идёт создание фильтра - возникает необрабатываемое исключение. <br />Ответ: <br />П.1 Это ошибка не программы а её окружения, т.е. пофикси винду. <br />П.2 куда ты торопишься?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17359</guid>
-			<link>http://ibash.org.ru/quote.php?id=17359</link>
-			<title>Цитата #17359</title>
-			<pubDate>Thu, 15 Mar 2018 09:51:10 +0300</pubDate>
-			<description><![CDATA[Обсуждение ReactOS 0.4 на ЛОРе: <br /> <br />Oxdeadbeef: Оно может в x86_64? <br /> <br />Jedi-to-be: Может, но пока нет.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17358</guid>
-			<link>http://ibash.org.ru/quote.php?id=17358</link>
-			<title>Цитата #17358</title>
-			<pubDate>Thu, 15 Mar 2018 09:51:04 +0300</pubDate>
-			<description><![CDATA[&lt;dsmirnov&gt; на супермикро и в отвратительных шкафах ..... а вы лабутены, лабутены ....]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17357</guid>
-			<link>http://ibash.org.ru/quote.php?id=17357</link>
-			<title>Цитата #17357</title>
-			<pubDate>Thu, 15 Mar 2018 09:50:55 +0300</pubDate>
-			<description><![CDATA[разраб: деплоим. 20 пендингов <br />тестер: боже, сохрани <br />разраб: не поможет, место на облаке закончилось]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17356</guid>
-			<link>http://ibash.org.ru/quote.php?id=17356</link>
-			<title>Цитата #17356</title>
-			<pubDate>Thu, 15 Mar 2018 09:50:51 +0300</pubDate>
-			<description><![CDATA[xxx: Программно-аппаратная платформа удаленного администрирования автоматизированных систем. Сокращенно - ПАПУАС]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17354</guid>
-			<link>http://ibash.org.ru/quote.php?id=17354</link>
-			<title>Цитата #17354</title>
-			<pubDate>Thu, 15 Mar 2018 09:50:41 +0300</pubDate>
-			<description><![CDATA[Nick&gt; Что вы вообще понимаете в тормозных серверах <br />Nick&gt; Мой пишет “System information disabled due to load higher than 1.0” <br />Nick&gt; Вот только при этом вилка локалки рядом на столе лежит, вынутая из сетевухи <br />Nick&gt; Для селерона 400, в который через PCI-адаптер SATA воткнут терабайтник… <br />Nick&gt; да для него просто дышать — и то уже физкультура]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17353</guid>
-			<link>http://ibash.org.ru/quote.php?id=17353</link>
-			<title>Цитата #17353</title>
-			<pubDate>Thu, 15 Mar 2018 09:49:52 +0300</pubDate>
-			<description><![CDATA[Мой мир никогда не станет прежним. Сегодня я узнал, что RoHS это не название китайской фирмы по выпуску электронных компонентов, а директива по содержанию в них вредных веществ]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17316</guid>
-			<link>http://ibash.org.ru/quote.php?id=17316</link>
-			<title>Цитата #17316</title>
-			<pubDate>Thu, 15 Mar 2018 09:47:42 +0300</pubDate>
-			<description><![CDATA[Елена: Дали строителям проект, они строили-строили и наконец построили. Приезжает заказчик. В грунте выкопана цилиндрическая яма метров 15 в глубину. На дне сияет прожектор. Заказчик переворачивает чертёж на 180 градусов и говорит: “Всё хорошо, но по проекту здесь должен был быть МАЯК”. <br />Dmitry: Боженьки мои ))))) <br />Елена: немножко похоже на историю из жизни программистов <br />Dmitry: ага ) только программист может потом решить, что будет легче все корабли сделать подземными, чем переделывать маяк.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17314</guid>
-			<link>http://ibash.org.ru/quote.php?id=17314</link>
-			<title>Цитата #17314</title>
-			<pubDate>Thu, 15 Mar 2018 09:46:52 +0300</pubDate>
-			<description><![CDATA[Kikimorra: Изучаю джаваскрипт на онлайн-курсах. Чувак у доски рассказывает, как удалять ноды. Приводимая в пример веб-страница выглядит так: <br /> <br />It&#039;s a nice day! <br />и кнопка <br />Delete all children! <br /> <br />Прям кодишь и чувствуешь, как рога с хвостом прорастают &gt;.&lt;]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17312</guid>
-			<link>http://ibash.org.ru/quote.php?id=17312</link>
-			<title>Цитата #17312</title>
-			<pubDate>Thu, 15 Mar 2018 09:46:33 +0300</pubDate>
-			<description><![CDATA[xxx:после апдейта винда взяла и переставила панель задач слева обратно вниз <br />xxx:мол, не выёбывайся <br />ххх:тебе не убунта]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17306</guid>
-			<link>http://ibash.org.ru/quote.php?id=17306</link>
-			<title>Цитата #17306</title>
-			<pubDate>Thu, 15 Mar 2018 09:46:21 +0300</pubDate>
-			<description><![CDATA[aaa: Есть же специальные для тачскринов, там кончики пальцев сделаны из проводящего материала. <br />bbb: Оо, как они называются? А то я видел только вязаные igloves, которые рвутся через месяц использования, И в мороз в них не походишь. <br />ccc: Купите металлизированные нитки и сделайте несколько стежков под подушечками пальцев. Начинайте прошивать изнутри оставив конец нитки после узелка подлиннее, чтобы обеспечить лучшую проводимость. <br />ddd: — Как ты работаешь с айпадом в перчатках? <br />— Я их перепрошил.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17304</guid>
-			<link>http://ibash.org.ru/quote.php?id=17304</link>
-			<title>Цитата #17304</title>
-			<pubDate>Thu, 15 Mar 2018 09:45:51 +0300</pubDate>
-			<description><![CDATA[&lt;&gt; нет ничего приятнее теплого лампового диалапа... <br />&lt;&gt; когда жужжание фрезы сливается с звуками хэндшейка в гармоничную мелодию?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17297</guid>
-			<link>http://ibash.org.ru/quote.php?id=17297</link>
-			<title>Цитата #17297</title>
-			<pubDate>Thu, 15 Mar 2018 09:44:04 +0300</pubDate>
-			<description><![CDATA[[15:15:56] r@ttler: говно успешно прилеплено и оттестировано. говно оказалось говном <br />[15:16:05] ZimM: внезапно <br />[15:17:30] r@ttler: ну я пока его прилеплял мне аж привидилась картина: замок разраба говна. дорога к нему увенчана костылями. как вот копья вешали с черепами врагов, так тут костыли с черепами разрабов <br />[15:17:59] r@ttler: и табличка на воротах &quot;оставь свой мозг, всяк сюда входящий&quot;]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17291</guid>
-			<link>http://ibash.org.ru/quote.php?id=17291</link>
-			<title>Цитата #17291</title>
-			<pubDate>Thu, 15 Mar 2018 09:42:11 +0300</pubDate>
-			<description><![CDATA[Если бы врачи были ИТ-шниками: <br /> <br />- У меня не работает клавиатура. <br /> <br />- Сдайте пробы на подклавиатурный сахар и лактозу, сделайте рентген и функциональный тест клавиш.... <br />[через 2 месяца и 20 тысяч рублей]...Действительно, обнаружена карамельная бляшка под пробелом. <br /> <br />- Что же делать? <br /> <br />- Вам показана консервативная терапия: ежедневно постукивайте 15 минут по перевернутой клавиатуре, затем 15 минут протирайте клавишу спиртом, потом разрабатывайте клавишу вручную. До конца срока службы вашего системного блока старайтесь как можно реже и аккуратнее пользоваться пробелом. Поставьте виртуальную клавиатуру и печатайте мышкой.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17285</guid>
-			<link>http://ibash.org.ru/quote.php?id=17285</link>
-			<title>Цитата #17285</title>
-			<pubDate>Thu, 15 Mar 2018 09:40:57 +0300</pubDate>
-			<description><![CDATA[ZimM: нуу... with great power comes great responsibility <br />r@ttler: great chances to shoot your own leg <br />ZimM: ну это да. другое дело, что для этого все равно нужно постараться <br />r@ttler: work hard to shoot your own leg? <br />r@ttler: ну тогда ты совсем лол <br />r@ttler: впадло было делать по-нормальному, потому помучался и таки сделал через жопу <br />ZimM: ну, я думал, что отстрелю себе фалангу мизинца, а оторвал пол-туловища, потому что пол-туловища мне показались похожими на фалангу мизинца...]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17280</guid>
-			<link>http://ibash.org.ru/quote.php?id=17280</link>
-			<title>Цитата #17280</title>
-			<pubDate>Thu, 15 Mar 2018 09:37:53 +0300</pubDate>
-			<description><![CDATA[xxx: Вот говорят иногда &quot;зоопарк браузеров&quot; (операционных систем, железок и так далее), а я тут внезапно понял, что у меня самый настоящий бордель виртуальных машин. Потому что их у меня четыре, названы женскими именами, чтобы быстро различать, и я с ними трахаюсь. Причём в данный момент со всеми четырьмя одновременно, потому что делаю лабораторную по сетям.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17279</guid>
-			<link>http://ibash.org.ru/quote.php?id=17279</link>
-			<title>Цитата #17279</title>
-			<pubDate>Thu, 15 Mar 2018 09:37:50 +0300</pubDate>
-			<description><![CDATA[Val: США провели третье и последнее испытание новой атомной бомбы B61-12. Бомбу без заряда, в соответствии с международным договором о запрете ядерных взрывов, сбросили с истребителя F-15E на полигоне &quot;Тонопа&quot; в Неваде 20 октября. <br />Val: какое интересное испытание. При ударе о землю она выбросила флажок &quot;БУМ&quot;? <br />Кир: Отправила в твиттер &quot;БДЫЩ!&quot; - она жы высокотехнологичная]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17276</guid>
-			<link>http://ibash.org.ru/quote.php?id=17276</link>
-			<title>Цитата #17276</title>
-			<pubDate>Thu, 15 Mar 2018 09:29:42 +0300</pubDate>
-			<description><![CDATA[dimgel: (ссылка на ленту.ру) &quot;Linux.Encoder.1 — относится к классу троянцев-шифровальщиков. После запуска с правами администратора...&quot; <br />Бгг. Ещё сто лет назад шутка ходила про линуксовые вирусы: &quot;распакуйте меня пожалуйста и пропишите в автозапуск демоном от имени рута&quot;. <br />dimgel: Я смотрю, ни хера не меняется в этой жизни. <br />garik: на ещё надо пару патчей найти и накатить <br />garik: иначе не скомпилится <br />dimgel: обязательно <br />dimgel: причём для разных дистров патчи будут разные <br />dimgel: Народ! Как пропатчить Linux.Encoder.1 под FreeBSD?!]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17272</guid>
-			<link>http://ibash.org.ru/quote.php?id=17272</link>
-			<title>Цитата #17272</title>
-			<pubDate>Thu, 15 Mar 2018 09:28:44 +0300</pubDate>
-			<description><![CDATA[xxx: когда читаю такие ограничения дурацкие, хочется спросить, каким местом пишутся драйвера <br />yyy: Но тут хоть плюс, что он сам не падает, а ошибку только выдаёт. <br />xxx: андроид разработчик... <br />xxx: ну хорошо хоть не падает вместе с системой!! <br />xxx: а то что всё в говне и не работает это мелочи <br />xxx: дальше будет &quot;ну хоть не сносит систему&quot; <br />xxx: &quot;ну хоть не выжигает гпу&quot; <br />yyy: &quot;ну, хоть не выжигает глаза&quot; <br />xxx: &quot;ну хоть не подключается к скайнету и не выжигает поверхность планеты&quot; <br />yyy: &quot;ну, хотя бы не уничтожает вселенную&quot; <br />xxx: вот видишь, повезло-то как!]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17259</guid>
-			<link>http://ibash.org.ru/quote.php?id=17259</link>
-			<title>Цитата #17259</title>
-			<pubDate>Thu, 15 Mar 2018 09:25:43 +0300</pubDate>
-			<description><![CDATA[обсуждение странного результата трейсроута <br />[19:27:36] ZimM: пробил по геоип. реально Europe, но если по координатам глянуть - то швейцария <br />[19:28:01] r@ttler: и пробей соседний. реально сша? <br />[19:28:30] ZimM: реально сша <br />[19:28:49] r@ttler: ну значит лол <br />[19:29:01] r@ttler: сто раз туда-сюда по трансатлантике? <br />[19:29:08] ZimM: ну а хуле <br />[19:29:14] r@ttler: вокруг света за 80 хопов?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17236</guid>
-			<link>http://ibash.org.ru/quote.php?id=17236</link>
-			<title>Цитата #17236</title>
-			<pubDate>Thu, 15 Mar 2018 09:23:51 +0300</pubDate>
-			<description><![CDATA[xxx: &quot;Как перестать юзать чужой код и научиться прогать самостоятельно&quot;, новый бестселлер Алан Карра]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17235</guid>
-			<link>http://ibash.org.ru/quote.php?id=17235</link>
-			<title>Цитата #17235</title>
-			<pubDate>Thu, 15 Mar 2018 09:23:49 +0300</pubDate>
-			<description><![CDATA[xx: Флеш умер, google его выпилит скоро :) <br /> <br />yy: Джобс тоже так говорил) <br /> <br />zz: Джобса уже бог (или ктулху, или матрица - кому что нравится) выпилил, а флэш еще барахтается <br /> <br />tt: Ну разве не ясно, что это флеш его и выпилил?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17233</guid>
-			<link>http://ibash.org.ru/quote.php?id=17233</link>
-			<title>Цитата #17233</title>
-			<pubDate>Thu, 15 Mar 2018 09:23:33 +0300</pubDate>
-			<description><![CDATA[К новости &quot;Отечественный защищённый Linux-дистрибутив Заря готов к внедрению&quot;: <br /> <br />xxx: Теперь будет сборка-разборка не только автомата, но и ядра. Норматив 3 минуты.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17230</guid>
-			<link>http://ibash.org.ru/quote.php?id=17230</link>
-			<title>Цитата #17230</title>
-			<pubDate>Thu, 15 Mar 2018 09:22:21 +0300</pubDate>
-			<description><![CDATA[С Хабра: <br />Смотрели Last Exile, где были шахматы для воздушных кораблей — с фиксацией? Вот термос для поезда. У него горлышко как у чайника, но оно перекрыто. Кнопка на ручке открывает возможность лить из термоса наружу. Это классика страховки от ошибок. Пользоваться потенциально опасной функцией можно только сознательно. <br />[...] <br />Это ещё и защита от дурака, в частности, важная для техники безопасности. У нас на производстве есть станок, который умеет прошибать гильотинным ножиком сразу огромную пачку бумаги. Так вот, чтобы его запустить нужно: <br /> <br />1) Положить бумагу под датчик бумаги <br />2) Положить левую руку на левую пусковую кнопку далеко слева <br />3) Правую руку — на правую пусковую кнопку далеко справа <br />4) Нажать педаль ногой (в этом положении физически невозможно засунуть голову в рабочую область станка) <br />5) Нажать обе пусковые кнопки одновременно <br />6) Но, видимо, рабочие научились действовать вдвоём или блокировать кнопки — и поэтому ещё нужно убрать всё из рабочей зоны, чтобы инфракрасные лучи не пересекались. Только после этого случится пуск.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17226</guid>
-			<link>http://ibash.org.ru/quote.php?id=17226</link>
-			<title>Цитата #17226</title>
-			<pubDate>Thu, 15 Mar 2018 09:20:48 +0300</pubDate>
-			<description><![CDATA[Архитекторы, емае, это источник нескончаемого умиления. Планерка, разбор какого-то легаси модуля. Говорят переписывать будем. Архитектор его анализировал неделю. Читал там код, компилил что-то, виртуалок поднял кучу, думал спеку, ходил курить каждые 15 и посадил картридж в принтере. Вот выходит этот мегачеловече к вайтборду докладывать комманде об устройстве этой вундервафли. Берет маркер, долго думает, рисует кружок. Еще думает, закрашивает. Думает еще, рисует входящую стрелку. Потом еще исходящую. Поворачивается к комманде: <br /> <br />-- В общем, коллеги, это жопа. Работает все через нее. А теперь посмотрим дему и обсудим баги. <br /> <br />Я вообще удивлен что в они в свой UML до сих пор стандартный символ не добавили.]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17227</guid>
-			<link>http://ibash.org.ru/quote.php?id=17227</link>
-			<title>Цитата #17227</title>
-			<pubDate>Thu, 15 Mar 2018 09:20:46 +0300</pubDate>
-			<description><![CDATA[xxx: О, Боже! Я начинаю получать кайф от пользования линуксом... Развернул убунту, понадобилось пару программ поставить, я ему пишу в консоли аптгет инсталл со списком желаемого, а он сам ищет, ставит и настраивает, и не надо дистрибутивы искать, по сайтам лазить, качать...]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17223</guid>
-			<link>http://ibash.org.ru/quote.php?id=17223</link>
-			<title>Цитата #17223</title>
-			<pubDate>Thu, 15 Mar 2018 09:19:38 +0300</pubDate>
-			<description><![CDATA[xxx: 40 Ватт, бывали у АМД и помощнее, если вы понимаете... <br />yyy: у меня был пентиум D <br />yyy: этим все сказано <br />yyy: когда я запускал эклипс - зимой наступало лето <br />zzz: у меня тоже греет комнату хорошо :) <br />zzz: сейчас 80 градусов <br />xxx: да это не комната - это баня ))) <br />yyy: живучий однако <br />yyy: мой спалил три мамки <br />yyy: у всех диагноз - микротрещины <br />yyy: это была середина 2000х, обычный офисный корпус, потолок регистрировал примерно 120 градусов <br />yyy: я летом морозил лед и крошил его в миску перед воздухозаборным отверстием <br />yyy: и менял его раз в час <br />yyy: когда грузилась моя винда, запотевали окна соседних домов <br />yyy: однажды, когда я архивировал сериал на флешку, ученые отметили глобальное потепление на 5 градусов <br />yyy: каждый раз, как я компилировал проект, в антарктиде семейство пингвинов оставалось без гнезда <br />xxx: мне кажется, что Чак тебе начинает завидовать <br />yyy: чак приходил ко мне домой разгоревать свой завтрак <br />yyy: свой процессор я отдал ученым, и в итоге он лег в основу ИТЭР]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17224</guid>
-			<link>http://ibash.org.ru/quote.php?id=17224</link>
-			<title>Цитата #17224</title>
-			<pubDate>Thu, 15 Mar 2018 09:19:36 +0300</pubDate>
-			<description><![CDATA[— Человек, который работает в ИБ, не знает, что такое NDA? <br />— Может быть ему по NDA нельзя говорить, что знает?]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17221</guid>
-			<link>http://ibash.org.ru/quote.php?id=17221</link>
-			<title>Цитата #17221</title>
-			<pubDate>Thu, 15 Mar 2018 09:17:22 +0300</pubDate>
-			<description><![CDATA[duzorg: <br />У кондиционера заклинило дренаж и вся вода вылилась внутрь серверной. Благо я туда случайно зашёл. Там серваки стояли на деревянной столешнице, а её водой размыло, она посередине где то на 15-20см прогнулась. Еще бы немного и рухнули бы все серваки на пол. Тысяч на 100 попали бы... <br />Или скорее даже больше чем на 100. <br />duzorg: <br />А в серверную я зашёл, потому что микротик завис. А микротик впервые за 4 года завис. %) <br />Funkryer: <br />вот так повезло <br />отличный был бы отзыв о микротике =) <br />мол завис 1 раз за 4 года и то только для того, чтобы спасти наши серваки <br />duzorg: <br />Не только работает стабильно, но и заботится о стабильной работе рядом находящегося оборудования ))) <br />duzorg: <br />На самом деле может его от большой влажности чё нить клинануло... хз... <br />Funkryer: <br />ну, начал, не порть магию!]]></description>
-		</item>
-		<item>
-			<guid>http://ibash.org.ru/quote.php?id=17220</guid>
-			<link>http://ibash.org.ru/quote.php?id=17220</link>
-			<title>Цитата #17220</title>
-			<pubDate>Thu, 15 Mar 2018 09:16:48 +0300</pubDate>
-			<description><![CDATA[xxx: конструктор запросов как всегда гентален <br />xxx: :( <br />xxx: хм хотел написать гениален, но генитален тоже пойдет]]></description>
-		</item>
-	</channel>
-</rss>

+ 5 - 2
internal/integration/rssbridge/rssbridge.go

@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
 package rssbridge // import "miniflux.app/integration/rssbridge"
 
 import (
@@ -29,14 +32,14 @@ func DetectBridges(rssbridgeURL, websiteURL string) (bridgeResponse []Bridge, er
 
 	response, err := http.Get(u.String())
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("RSS-Bridge: unable to excute request: %w", err)
 	}
 	defer response.Body.Close()
 	if response.StatusCode == http.StatusNotFound {
 		return
 	}
 	if response.StatusCode > 400 {
-		return nil, fmt.Errorf("RSS-Bridge: server failure (%d)", response.StatusCode)
+		return nil, fmt.Errorf("RSS-Bridge: unexpected status code %d", response.StatusCode)
 	}
 	if err := json.NewDecoder(response.Body).Decode(&bridgeResponse); err != nil {
 		return nil, fmt.Errorf("RSS-Bridge: unable to decode bridge response: %w", err)

+ 52 - 0
internal/locale/error.go

@@ -0,0 +1,52 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package locale // import "miniflux.app/v2/internal/locale"
+
+import "errors"
+
+type LocalizedErrorWrapper struct {
+	originalErr     error
+	translationKey  string
+	translationArgs []any
+}
+
+func NewLocalizedErrorWrapper(originalErr error, translationKey string, translationArgs ...any) *LocalizedErrorWrapper {
+	return &LocalizedErrorWrapper{
+		originalErr:     originalErr,
+		translationKey:  translationKey,
+		translationArgs: translationArgs,
+	}
+}
+
+func (l *LocalizedErrorWrapper) Error() error {
+	return l.originalErr
+}
+
+func (l *LocalizedErrorWrapper) Translate(language string) string {
+	if l.translationKey == "" {
+		return l.originalErr.Error()
+	}
+	return NewPrinter(language).Printf(l.translationKey, l.translationArgs...)
+}
+
+type LocalizedError struct {
+	translationKey  string
+	translationArgs []any
+}
+
+func NewLocalizedError(translationKey string, translationArgs ...any) *LocalizedError {
+	return &LocalizedError{translationKey: translationKey, translationArgs: translationArgs}
+}
+
+func (v *LocalizedError) String() string {
+	return NewPrinter("en_US").Printf(v.translationKey, v.translationArgs...)
+}
+
+func (v *LocalizedError) Error() error {
+	return errors.New(v.String())
+}
+
+func (v *LocalizedError) Translate(language string) string {
+	return NewPrinter(language).Printf(v.translationKey, v.translationArgs...)
+}

+ 24 - 20
internal/locale/translations/de_DE.json

@@ -436,25 +436,29 @@
         "vor %d Jahr",
         "vor %d Jahren"
     ],
-    "This feed already exists (%s)": "Diese Abonnement existiert bereits (%s)",
-    "Unable to fetch feed (Status Code = %d)": "Abonnement konnte nicht abgerufen werden (code=%d)",
-    "Unable to open this link: %v": "Dieser Link konnte nicht geöffnet werden: %v",
-    "Unable to analyze this page: %v": "Diese Seite konnte nicht analysiert werden: %v",
-    "Unable to execute request: %v": "Diese Anfrage konnte nicht ausgeführt werden: %v",
-    "Unable to parse OPML file: %q": "OPML Datei konnte nicht gelesen werden: %q",
-    "Unable to parse RSS feed: %q": "RSS Abonnement konnte nicht gelesen werden: %q",
-    "Unable to parse Atom feed: %q": "Atom Abonnement konnte nicht gelesen werden: %q",
-    "Unable to parse JSON feed: %q": "JSON Abonnement konnte nicht gelesen werden: %q",
-    "Unable to parse RDF feed: %q": "RDF Abonnement konnte nicht gelesen werden: %q",
-    "Unable to normalize encoding: %q": "Zeichenkodierung konnte nicht normalisiert werden: %q",
-    "This feed is empty": "Dieses Abonnement ist leer",
-    "This web page is empty": "Diese Webseite ist leer",
-    "Invalid SSL certificate (original error: %q)": "Ungültiges SSL-Zertifikat (ursprünglicher Fehler: %q)",
-    "This website is unreachable (original error: %q)": "Diese Webseite ist nicht erreichbar (ursprünglicher Fehler: %q)",
-    "Website unreachable, the request timed out after %d seconds": "Webseite nicht erreichbar, die Anfrage endete nach %d Sekunden",
-    "You are not authorized to access this resource (invalid username/password)": "Sie sind nicht berechtigt, auf diese Ressource zuzugreifen (Benutzername/Passwort ungültig)",
-    "Unable to fetch this resource (Status Code = %d)": "Ressource konnte nicht abgerufen werden (code=%d)",
-    "Resource not found (404), this feed doesn't exist anymore, check the feed URL": "Ressource nicht gefunden (404), dieses Abonnement existiert nicht mehr, überprüfen Sie die Abonnement-URL",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/el_EL.json

@@ -437,5 +437,28 @@
         "πριν %d έτη"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/en_US.json

@@ -437,5 +437,28 @@
         "%d years ago"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/es_ES.json

@@ -437,5 +437,28 @@
         "hace %d años"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/fi_FI.json

@@ -437,5 +437,28 @@
         "%d vuotta sitten"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 20
internal/locale/translations/fr_FR.json

@@ -436,25 +436,29 @@
         "il y a %d an",
         "il y a %d ans"
     ],
-    "This feed already exists (%s)": "Cet abonnement existe déjà (%s)",
-    "Unable to fetch feed (Status Code = %d)": "Impossible de récupérer cet abonnement (code=%d)",
-    "Unable to open this link: %v": "Impossible d'ouvrir ce lien : %v",
-    "Unable to analyze this page: %v": "Impossible d'analyzer cette page : %v",
-    "Unable to execute request: %v": "Impossible d'exécuter cette requête: %v",
-    "Unable to parse OPML file: %q": "Impossible de lire ce fichier OPML : %q",
-    "Unable to parse RSS feed: %q": "Impossible de lire ce flux RSS : %q",
-    "Unable to parse Atom feed: %q": "Impossible de lire ce flux Atom : %q",
-    "Unable to parse JSON feed: %q": "Impossible de lire ce flux JSON : %q",
-    "Unable to parse RDF feed: %q": "Impossible de lire ce flux RDF : %q",
-    "Unable to normalize encoding: %q": "Impossible de normaliser l'encodage : %q",
-    "This feed is empty": "Cet abonnement est vide",
-    "This web page is empty": "Cette page web est vide",
-    "Invalid SSL certificate (original error: %q)": "Certificat SSL invalide (erreur originale : %q)",
-    "This website is unreachable (original error: %q)": "Ce site web n'est pas joignable (erreur originale : %q)",
-    "Website unreachable, the request timed out after %d seconds": "Site web injoignable, la requête à échouée après %d secondes",
-    "You are not authorized to access this resource (invalid username/password)": "Vous n'êtes pas autorisé à accéder à cette ressource (nom d'utilisateur / mot de passe incorrect)",
-    "Unable to fetch this resource (Status Code = %d)": "Impossible de récupérer cette ressource (code=%d)",
-    "Resource not found (404), this feed doesn't exist anymore, check the feed URL": "Page introuvable (404), cet abonnement n'existe plus, vérifiez l'adresse du flux",
     "alert.too_many_feeds_refresh": "Vous avez déclenché trop d'actualisations de flux. Veuillez attendre 30 minutes avant de réessayer.",
-    "alert.background_feed_refresh": "Les abonnements sont en cours d'actualisation en arrière-plan. Vous pouvez continuer à naviguer dans l'application."
+    "alert.background_feed_refresh": "Les abonnements sont en cours d'actualisation en arrière-plan. Vous pouvez continuer à naviguer dans l'application.",
+    "error.http_response_too_large": "La réponse HTTP est trop volumineuse. Vous pouvez augmenter la limite de taille de réponse HTTP dans les paramètres de l'application (redémarrage de l'application nécessaire).",
+    "error.http_body_read": "Impossible de lire le corps de la réponse HTTP.",
+    "error.http_empty_response_body": "Le corps de la réponse HTTP est vide.",
+    "error.http_empty_response": "La réponse HTTP est vide. Peut-être que ce site web bloque Miniflux avec une protection anti-bot ?",
+    "error.tls_error": "Erreur TLS : %v. Vous pouvez désactiver la vérification TLS dans les paramètres de l'abonnement.",
+    "error.network_operation": "Miniflux n'est pas en mesure de se connecter à ce site web à cause d'un problème réseau : %v.",
+    "error.network_timeout": "Ce site web est trop lent à répondre : %v.",
+    "error.http_client_error": "Erreur du client HTTP : %v.",
+    "error.http_not_authorized": "Accès non autorisé à ce site web. Veuillez vérifier les identifiants de cet abonnement.",
+    "error.http_too_many_requests": "Miniflux a généré trop de requêtes vers ce site web. Veuillez réessayer plus tard ou changez la configuration de l'application.",
+    "error.http_forbidden": "Accès interdit à ce site web. Il se peut que ce site web bloque Miniflux avec une protection anti-bot.",
+    "error.http_resource_not_found": "La resource demandée n'existe pas sur ce site web. Veuillez vérifier l'URL.",
+    "error.http_internal_server_error": "Le site web n'est pas disponible pour le moment à cause d'une erreur interne au serveur. Le problème ne vient pas de Miniflux. Veuillez réessayer plus tard.",
+    "error.http_bad_gateway": "Le site web n'est pas disponible pour le moment à cause d'une erreur de passerelle réseau. Le problème ne vient pas de Miniflux. Veuillez réessayer plus tard.",
+    "error.http_service_unavailable": "Le site web n'est pas disponible pour le moment. Le problème ne vient pas de Miniflux. Veuillez réessayer plus tard.",
+    "error.http_gateway_timeout": "Le site web n'est pas disponible pour le moment à cause d'un délai d'attente dépassé. Le problème ne vient pas de Miniflux. Veuillez réessayer plus tard.",
+    "error.http_unexpected_status_code": "Le site web a répondu avec un code HTTP inattendu : %d. Le problème ne vient pas de Miniflux. Veuillez réessayer plus tard.",
+    "error.database_error": "Erreur de la base de données : %v.",
+    "error.category_not_found": "Cette catégorie n'existe pas ou n'appartient pas à cet utilisateur.",
+    "error.duplicated_feed": "Ce flux existe déjà.",
+    "error.unable_to_parse_feed": "Impossible d'analyser ce flux : %v.",
+    "error.feed_not_found": "Impossible de trouver ce flux.",
+    "error.unable_to_detect_rssbridge": "Impossible de détecter un flux RSS en utilisant RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/hi_IN.json

@@ -437,5 +437,28 @@
         "%d वर्षों पहले"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 20
internal/locale/translations/id_ID.json

@@ -427,25 +427,29 @@
     "time_elapsed.years": [
     "%d tahun yang lalu"
     ],
-    "This feed already exists (%s)": "Umpan ini sudah ada (%s)",
-    "Unable to fetch feed (Status Code = %d)": "Tidak bisa mengambil umpan (Kode Status = %d)",
-    "Unable to open this link: %v": "Tidak bisa membuka tautan ini: %v",
-    "Unable to analyze this page: %v": "Tidak bisa menganalisis halaman ini: %v",
-    "Unable to execute request: %v": "Tidak bisa mengeksekusi permintaan: %v",
-    "Unable to parse OPML file: %q": "Tidak bisa mengurai berkas OPML: %q",
-    "Unable to parse RSS feed: %q": "Tidak bisa mengurai umpan RSS: %q",
-    "Unable to parse Atom feed: %q": "Tidak bisa mengurai umpan Atom: %q",
-    "Unable to parse JSON feed: %q": "Tidak bisa mengurai umpan JSON: %q",
-    "Unable to parse RDF feed: %q": "Tidak bisa mengurai umpan RDF: %q",
-    "Unable to normalize encoding: %q": "Tidak dapat menormalisasi enkode: %q",
-    "This feed is empty": "Umpan ini kosong",
-    "This web page is empty": "Halaman web ini kosong",
-    "Invalid SSL certificate (original error: %q)": "Sertifikat SSL tidak valid (galat: %q)",
-    "This website is unreachable (original error: %q)": "Situs ini tidak dapat tersambung (galat: %q)",
-    "Website unreachable, the request timed out after %d seconds": "Situs tidak dapat tersambung, permintaan galat setelah %d detik",
-    "You are not authorized to access this resource (invalid username/password)": "Anda tidak memiliki izin yang cukup untuk mengakses umpan ini (nama pengguna/kata sandi tidak valid)",
-    "Unable to fetch this resource (Status Code = %d)": "Tidak bisa mengambil umpan ini (Kode Status = %d)",
-    "Resource not found (404), this feed doesn't exist anymore, check the feed URL": "Umpan tidak ditemukan (404), umpan ini tidak ada lagi, periksa URL umpan",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/it_IT.json

@@ -437,5 +437,28 @@
         "%d anni fa"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/ja_JP.json

@@ -437,5 +437,28 @@
         "%d 年前"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 18
internal/locale/translations/nl_NL.json

@@ -436,23 +436,29 @@
         "%d jaar geleden",
         "%d jaar geleden"
     ],
-    "This feed already exists (%s)": "Deze feed bestaat al (%s)",
-    "Unable to fetch feed (Status Code = %d)": "Kon feed niet updaten (statuscode = %d)",
-    "Unable to open this link: %v": "Kon link niet volgen: %v",
-    "Unable to analyze this page: %v": "Kon pagina niet analyseren: %v",
-    "Unable to execute request: %v": "Kon request niet uitvoeren: %v",
-    "Unable to parse OPML file: %q": "Kon OPML niet parsen: %q",
-    "Unable to parse RSS feed: %q": "Kon RSS-feed niet parsen: %q",
-    "Unable to parse Atom feed: %q": "Kon Atom-feed niet parsen: %q",
-    "Unable to parse JSON feed: %q": "Kon JSON-feed niet parsen: %q",
-    "Unable to parse RDF feed: %q": "Kon RDF-feed niet parsen: %q",
-    "Unable to normalize encoding: %q": "Kon encoding niet normaliseren: %q",
-    "Unable to create this category.": "Kon categorie niet aanmaken.",
-    "Category not found for this user": "Categorie niet gevonden voor deze gebruiker",
-    "This web page is empty": "Deze webpagina is leeg",
-    "Invalid SSL certificate (original error: %q)": "Ongeldig SSL-certificaat (originele error: %q)",
-    "This website is unreachable (original error: %q)": "Deze website is onbereikbaar (originele error: %q)",
-    "Website unreachable, the request timed out after %d seconds": "Website onbereikbaar, de request gaf een timeout na %d seconden",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 18
internal/locale/translations/pl_PL.json

@@ -444,23 +444,29 @@
         "%d lat temu",
         "%d lat temu"
     ],
-    "This feed already exists (%s)": "Ten kanał już istnieje (%s)",
-    "Unable to fetch feed (Status Code = %d)": "Kanał nie mógł zostać pobrany (kod=%d)",
-    "Unable to open this link: %v": "Nie można było otworzyć tego linku: %v",
-    "Unable to analyze this page: %v": "Nie można przeanalizować tej strony: %v",
-    "Unable to execute request: %v": "To polecenie nie mogło zostać wykonane: %v",
-    "Unable to parse OPML file: %q": "Plik OPML nie mógł zostać odczytany: %q",
-    "Unable to parse RSS feed: %q": "Nie można było odczytać kanału RSS: %q",
-    "Unable to parse Atom feed: %q": "Nie można było odczytać kanału Atom: %q",
-    "Unable to parse JSON feed: %q": "Nie można było odczytać kanału JSON: %q",
-    "Unable to parse RDF feed: %q": "Nie można było odczytać kanału RDF: %q",
-    "Unable to normalize encoding: %q": "Kodowanie znaków nie mogło zostać znormalizowane: %q",
-    "Category not found for this user": "Kategoria nie znaleziona dla tego użytkownika",
-    "This feed is empty": "Ten kanał jest pusty",
-    "This web page is empty": "Ta strona jest pusta",
-    "Invalid SSL certificate (original error: %q)": "Certyfikat SSL jest nieprawidłowy (błąd: %q)",
-    "This website is unreachable (original error: %q)": "Ta strona jest niedostępna (błąd: %q)",
-    "Website unreachable, the request timed out after %d seconds": "Strona internetowa nieosiągalna, żądanie wygasło po %d sekundach",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/pt_BR.json

@@ -437,5 +437,28 @@
         "há %d anos"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/ru_RU.json

@@ -445,5 +445,28 @@
         "%d лет назад"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/tr_TR.json

@@ -437,5 +437,28 @@
         "%d yıl önce"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 1
internal/locale/translations/uk_UA.json

@@ -446,5 +446,28 @@
         "%d років тому"
     ],
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 19
internal/locale/translations/zh_CN.json

@@ -428,24 +428,29 @@
     "time_elapsed.years": [
         "%d 年前"
     ],
-    "This feed already exists (%s)": "源已存在 (%s)",
-    "Unable to fetch feed (Status Code = %d)": "无法获取源 (错误代码=%d)",
-    "Unable to open this link: %v": "无法打开这一链接: %v",
-    "Unable to analyze this page: %v": "无法分析这一页面: %v",
-    "Unable to execute request: %v": "无法执行这一请求: %v",
-    "Unable to parse OPML file: %q": "无法解析 OPML 文件: %q",
-    "Unable to parse RSS feed: %q": "无法解析 RSS 源: %q",
-    "Unable to parse Atom feed: %q": "无法解析 Atom 源: %q",
-    "Unable to parse JSON feed: %q": "无法解析 JSON 源: %q",
-    "Unable to parse RDF feed: %q": "无法解析 RDF 源: %q",
-    "Unable to read data: %q": "无法读取数据: %q",
-    "Unable to normalize encoding: %q": "无法正则化编码: %q",
-    "Category not found for this user": "未找到该用户的这一分类",
-    "This feed is empty": "该源是空的",
-    "This web page is empty": "该网页是空的",
-    "Invalid SSL certificate (original error: %q)": "无效的 SSL 证书 (原始错误: %q)",
-    "This website is unreachable (original error: %q)": "该网站永久不可达 (原始错误: %q)",
-    "Website unreachable, the request timed out after %d seconds": "网站不可达, 请求已在 %d 秒后超时",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 24 - 19
internal/locale/translations/zh_TW.json

@@ -436,24 +436,29 @@
         "%d 年前",
         "%d 年前"
     ],
-    "This feed already exists (%s)": "Feed已存在 (%s)",
-    "Unable to fetch feed (Status Code = %d)": "無法獲取Feed (錯誤程式碼=%d)",
-    "Unable to open this link: %v": "無法開啟這一連結: %v",
-    "Unable to analyze this page: %v": "無法分析這一頁面: %v",
-    "Unable to execute request: %v": "無法執行這一請求: %v",
-    "Unable to parse OPML file: %q": "無法解析 OPML 檔案: %q",
-    "Unable to parse RSS feed: %q": "無法解析 RSS Feed: %q",
-    "Unable to parse Atom feed: %q": "無法解析 Atom Feed: %q",
-    "Unable to parse JSON feed: %q": "無法解析 JSON Feed: %q",
-    "Unable to parse RDF feed: %q": "無法解析 RDF Feed: %q",
-    "Unable to read data: %q": "無法讀取資料: %q",
-    "Unable to normalize encoding: %q": "無法正則化編碼: %q",
-    "Category not found for this user": "未找到該使用者的這一分類",
-    "This feed is empty": "該Feed是空的",
-    "This web page is empty": "該網頁是空的",
-    "Invalid SSL certificate (original error: %q)": "無效的 SSL 憑證 (錯誤: %q)",
-    "This website is unreachable (original error: %q)": "該網站永久無法訪問(原始錯誤: %q)",
-    "Website unreachable, the request timed out after %d seconds": "網站無法訪問, 請求已在 %d 秒後超時",
     "alert.too_many_feeds_refresh": "You have triggered too many feed refreshes. Please wait 30 minutes before trying again.",
-    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running."
+    "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.",
+    "error.http_response_too_large": "The HTTP response is too large. You could increase the HTTP response size limit in the global settings (requires a server restart).",
+    "error.http_body_read": "Unable to read the HTTP body.",
+    "error.http_empty_response_body": "The HTTP response body is empty.",
+    "error.http_empty_response": "The HTTP response is empty. Perhaps, this website is using a bot protection mechanism?",
+    "error.tls_error": "TLS error: %v. You could disable TLS verification in the feed settings if you would like.",
+    "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
+    "error.network_timeout": "This website is too slow and the request timed out: %v",
+    "error.http_client_error": "HTTP client error: %v.",
+    "error.http_not_authorized": "Access to this website is not authorized. It could be a bad username or password.",
+    "error.http_too_many_requests": "Miniflux generated too many requests to this website. Please, try again later or change the application configuration.",
+    "error.http_forbidden": "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?",
+    "error.http_resource_not_found": "The requested resource is not found. Please, verify the URL.",
+    "error.http_internal_server_error": "The website is not available at the moment due to a server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_bad_gateway": "The website is not available at the moment due to a bad gateway error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_service_unavailable": "The website is not available at the moment due to an internal server error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_gateway_timeout": "The website is not available at the moment due to a gateway timeout error. The problem is not on Miniflux side. Please, try again later.",
+    "error.http_unexpected_status_code": "The website is not available at the moment due to an unexpected HTTP status code: %d. The problem is not on Miniflux side. Please, try again later.",
+    "error.database_error": "Database error: %v.",
+    "error.category_not_found": "This category does not exist or does not belong to this user.",
+    "error.duplicated_feed": "This feed already exists.",
+    "error.unable_to_parse_feed": "Unable to parse this feed: %v.",
+    "error.feed_not_found": "This feed does not exist or does not belong to this user.",
+    "error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v."
 }

+ 2 - 10
internal/model/feed.go

@@ -9,7 +9,6 @@ import (
 	"time"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/http/client"
 )
 
 // List of supported schedulers.
@@ -79,20 +78,13 @@ func (f *Feed) String() string {
 	)
 }
 
-// WithClientResponse updates feed attributes from an HTTP request.
-func (f *Feed) WithClientResponse(response *client.Response) {
-	f.EtagHeader = response.ETag
-	f.LastModifiedHeader = response.LastModified
-	f.FeedURL = response.EffectiveURL
-}
-
 // WithCategoryID initializes the category attribute of the feed.
 func (f *Feed) WithCategoryID(categoryID int64) {
 	f.Category = &Category{ID: categoryID}
 }
 
-// WithError adds a new error message and increment the error counter.
-func (f *Feed) WithError(message string) {
+// WithTranslatedErrorMessage adds a new error message and increment the error counter.
+func (f *Feed) WithTranslatedErrorMessage(message string) {
 	f.ParsingErrorCount++
 	f.ParsingErrorMsg = message
 }

+ 1 - 21
internal/model/feed_test.go

@@ -10,28 +10,8 @@ import (
 	"time"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/http/client"
 )
 
-func TestFeedWithResponse(t *testing.T) {
-	response := &client.Response{ETag: "Some etag", LastModified: "Some date", EffectiveURL: "Some URL"}
-
-	feed := &Feed{}
-	feed.WithClientResponse(response)
-
-	if feed.EtagHeader != "Some etag" {
-		t.Fatal(`The ETag header should be set`)
-	}
-
-	if feed.LastModifiedHeader != "Some date" {
-		t.Fatal(`The LastModified header should be set`)
-	}
-
-	if feed.FeedURL != "Some URL" {
-		t.Fatal(`The Feed URL should be set`)
-	}
-}
-
 func TestFeedCategorySetter(t *testing.T) {
 	feed := &Feed{}
 	feed.WithCategoryID(int64(123))
@@ -47,7 +27,7 @@ func TestFeedCategorySetter(t *testing.T) {
 
 func TestFeedErrorCounter(t *testing.T) {
 	feed := &Feed{}
-	feed.WithError("Some Error")
+	feed.WithTranslatedErrorMessage("Some Error")
 
 	if feed.ParsingErrorMsg != "Some Error" {
 		t.Error(`The error message must be set`)

+ 4 - 6
internal/reader/atom/parser.go

@@ -6,9 +6,9 @@ package atom // import "miniflux.app/v2/internal/reader/atom"
 import (
 	"bytes"
 	"encoding/xml"
+	"fmt"
 	"io"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/model"
 	xml_decoder "miniflux.app/v2/internal/reader/xml"
 )
@@ -18,7 +18,7 @@ type atomFeed interface {
 }
 
 // Parse returns a normalized feed struct from a Atom feed.
-func Parse(baseURL string, r io.Reader) (*model.Feed, *errors.LocalizedError) {
+func Parse(baseURL string, r io.Reader) (*model.Feed, error) {
 	var buf bytes.Buffer
 	tee := io.TeeReader(r, &buf)
 
@@ -29,10 +29,8 @@ func Parse(baseURL string, r io.Reader) (*model.Feed, *errors.LocalizedError) {
 		rawFeed = new(atom10Feed)
 	}
 
-	decoder := xml_decoder.NewDecoder(&buf)
-	err := decoder.Decode(rawFeed)
-	if err != nil {
-		return nil, errors.NewLocalizedError("Unable to parse Atom feed: %q", err)
+	if err := xml_decoder.NewDecoder(&buf).Decode(rawFeed); err != nil {
+		return nil, fmt.Errorf("atom: unable to parse feed: %w", err)
 	}
 
 	return rawFeed.Transform(baseURL), nil

+ 0 - 54
internal/reader/browser/browser.go

@@ -1,54 +0,0 @@
-// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
-// SPDX-License-Identifier: Apache-2.0
-
-package browser // import "miniflux.app/v2/internal/reader/browser"
-
-import (
-	"miniflux.app/v2/internal/errors"
-	"miniflux.app/v2/internal/http/client"
-)
-
-var (
-	errRequestFailed    = "Unable to open this link: %v"
-	errServerFailure    = "Unable to fetch this resource (Status Code = %d)"
-	errEncoding         = "Unable to normalize encoding: %q"
-	errEmptyFeed        = "This feed is empty"
-	errResourceNotFound = "Resource not found (404), this feed doesn't exist anymore, check the feed URL"
-	errNotAuthorized    = "You are not authorized to access this resource (invalid username/password)"
-)
-
-// Exec executes a HTTP request and handles errors.
-func Exec(request *client.Client) (*client.Response, *errors.LocalizedError) {
-	response, err := request.Get()
-	if err != nil {
-		if e, ok := err.(*errors.LocalizedError); ok {
-			return nil, e
-		}
-		return nil, errors.NewLocalizedError(errRequestFailed, err)
-	}
-
-	if response.IsNotFound() {
-		return nil, errors.NewLocalizedError(errResourceNotFound)
-	}
-
-	if response.IsNotAuthorized() {
-		return nil, errors.NewLocalizedError(errNotAuthorized)
-	}
-
-	if response.HasServerFailure() {
-		return nil, errors.NewLocalizedError(errServerFailure, response.StatusCode)
-	}
-
-	if response.StatusCode != 304 {
-		// Content-Length = -1 when no Content-Length header is sent.
-		if response.ContentLength == 0 {
-			return nil, errors.NewLocalizedError(errEmptyFeed)
-		}
-
-		if err := response.EnsureUnicodeBody(); err != nil {
-			return nil, errors.NewLocalizedError(errEncoding, err)
-		}
-	}
-
-	return response, nil
-}

+ 168 - 0
internal/reader/fetcher/request_builder.go

@@ -0,0 +1,168 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
+
+import (
+	"crypto/tls"
+	"encoding/base64"
+	"log/slog"
+	"net"
+	"net/http"
+	"net/url"
+	"time"
+)
+
+const (
+	defaultHTTPClientTimeout     = 20
+	defaultHTTPClientMaxBodySize = 15 * 1024 * 1024
+)
+
+type RequestBuilder struct {
+	headers          http.Header
+	clientProxyURL   string
+	useClientProxy   bool
+	clientTimeout    int
+	withoutRedirects bool
+	ignoreTLSErrors  bool
+}
+
+func NewRequestBuilder() *RequestBuilder {
+	return &RequestBuilder{
+		headers:       make(http.Header),
+		clientTimeout: defaultHTTPClientTimeout,
+	}
+}
+
+func (r *RequestBuilder) WithHeader(key, value string) *RequestBuilder {
+	r.headers.Set(key, value)
+	return r
+}
+
+func (r *RequestBuilder) WithETag(etag string) *RequestBuilder {
+	if etag != "" {
+		r.headers.Set("If-None-Match", etag)
+	}
+	return r
+}
+
+func (r *RequestBuilder) WithLastModified(lastModified string) *RequestBuilder {
+	if lastModified != "" {
+		r.headers.Set("If-Modified-Since", lastModified)
+	}
+	return r
+}
+
+func (r *RequestBuilder) WithUserAgent(userAgent string) *RequestBuilder {
+	if userAgent != "" {
+		r.headers.Set("User-Agent", userAgent)
+	} else {
+		r.headers.Del("User-Agent")
+	}
+	return r
+}
+
+func (r *RequestBuilder) WithCookie(cookie string) *RequestBuilder {
+	if cookie != "" {
+		r.headers.Set("Cookie", cookie)
+	}
+	return r
+}
+
+func (r *RequestBuilder) WithUsernameAndPassword(username, password string) *RequestBuilder {
+	if username != "" && password != "" {
+		r.headers.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(username+":"+password)))
+	}
+	return r
+}
+
+func (r *RequestBuilder) WithProxy(proxyURL string) *RequestBuilder {
+	r.clientProxyURL = proxyURL
+	return r
+}
+
+func (r *RequestBuilder) UseProxy(value bool) *RequestBuilder {
+	r.useClientProxy = value
+	return r
+}
+
+func (r *RequestBuilder) WithTimeout(timeout int) *RequestBuilder {
+	r.clientTimeout = timeout
+	return r
+}
+
+func (r *RequestBuilder) WithoutRedirects() *RequestBuilder {
+	r.withoutRedirects = true
+	return r
+}
+
+func (r *RequestBuilder) IgnoreTLSErrors(value bool) *RequestBuilder {
+	r.ignoreTLSErrors = value
+	return r
+}
+
+func (r *RequestBuilder) ExecuteRequest(requestURL string) (*http.Response, error) {
+	transport := &http.Transport{
+		Proxy: http.ProxyFromEnvironment,
+		DialContext: (&net.Dialer{
+			// Default is 30s.
+			Timeout: 10 * time.Second,
+
+			// Default is 30s.
+			KeepAlive: 15 * time.Second,
+		}).DialContext,
+
+		// Default is 100.
+		MaxIdleConns: 50,
+
+		// Default is 90s.
+		IdleConnTimeout: 10 * time.Second,
+
+		TLSClientConfig: &tls.Config{
+			InsecureSkipVerify: r.ignoreTLSErrors,
+		},
+	}
+
+	if r.useClientProxy && r.clientProxyURL != "" {
+		if proxyURL, err := url.Parse(r.clientProxyURL); err != nil {
+			slog.Warn("Unable to parse proxy URL",
+				slog.String("proxy_url", r.clientProxyURL),
+				slog.Any("error", err),
+			)
+		} else {
+			transport.Proxy = http.ProxyURL(proxyURL)
+		}
+	}
+
+	client := &http.Client{
+		Timeout: time.Duration(r.clientTimeout) * time.Second,
+	}
+
+	if r.withoutRedirects {
+		client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
+			return http.ErrUseLastResponse
+		}
+	}
+
+	client.Transport = transport
+
+	req, err := http.NewRequest("GET", requestURL, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	req.Header = r.headers
+	req.Header.Set("Accept", "*/*")
+	req.Header.Set("Connection", "close")
+
+	slog.Debug("Making outgoing request", slog.Group("request",
+		slog.String("method", req.Method),
+		slog.String("url", req.URL.String()),
+		slog.Any("headers", req.Header),
+		slog.Bool("without_redirects", r.withoutRedirects),
+		slog.Bool("with_proxy", r.useClientProxy),
+		slog.String("proxy_url", r.clientProxyURL),
+	))
+
+	return client.Do(req)
+}

+ 147 - 0
internal/reader/fetcher/response_handler.go

@@ -0,0 +1,147 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
+
+import (
+	"crypto/x509"
+	"errors"
+	"fmt"
+	"io"
+	"net"
+	"net/http"
+
+	"miniflux.app/v2/internal/locale"
+)
+
+type ResponseHandler struct {
+	httpResponse *http.Response
+	clientErr    error
+}
+
+func NewResponseHandler(httpResponse *http.Response, clientErr error) *ResponseHandler {
+	return &ResponseHandler{httpResponse: httpResponse, clientErr: clientErr}
+}
+
+func (r *ResponseHandler) EffectiveURL() string {
+	return r.httpResponse.Request.URL.String()
+}
+
+func (r *ResponseHandler) ContentType() string {
+	return r.httpResponse.Header.Get("Content-Type")
+}
+
+func (r *ResponseHandler) LastModified() string {
+	// Ignore caching headers for feeds that do not want any cache.
+	if r.httpResponse.Header.Get("Expires") == "0" {
+		return ""
+	}
+	return r.httpResponse.Header.Get("Last-Modified")
+}
+
+func (r *ResponseHandler) ETag() string {
+	// Ignore caching headers for feeds that do not want any cache.
+	if r.httpResponse.Header.Get("Expires") == "0" {
+		return ""
+	}
+	return r.httpResponse.Header.Get("ETag")
+}
+
+func (r *ResponseHandler) IsModified(lastEtagValue, lastModifiedValue string) bool {
+	if r.httpResponse.StatusCode == http.StatusNotModified {
+		return false
+	}
+
+	if r.ETag() != "" && r.ETag() == lastEtagValue {
+		return false
+	}
+
+	if r.LastModified() != "" && r.LastModified() == lastModifiedValue {
+		return false
+	}
+
+	return true
+}
+
+func (r *ResponseHandler) Close() {
+	if r.httpResponse != nil && r.httpResponse.Body != nil && r.clientErr == nil {
+		r.httpResponse.Body.Close()
+	}
+}
+
+func (r *ResponseHandler) Body(maxBodySize int64) io.ReadCloser {
+	return http.MaxBytesReader(nil, r.httpResponse.Body, maxBodySize)
+}
+
+func (r *ResponseHandler) ReadBody(maxBodySize int64) ([]byte, *locale.LocalizedErrorWrapper) {
+	limitedReader := http.MaxBytesReader(nil, r.httpResponse.Body, maxBodySize)
+
+	buffer, err := io.ReadAll(limitedReader)
+	if err != nil && err != io.EOF {
+		if err == io.ErrUnexpectedEOF {
+			return nil, locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: response body too large: %w", err), "error.http_response_too_large")
+		}
+
+		return nil, locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: unable to read response body: %w", err), "error.http_body_read", err)
+	}
+
+	if len(buffer) == 0 {
+		return nil, locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: empty response body"), "error.http_empty_response_body")
+	}
+
+	return buffer, nil
+}
+
+func (r *ResponseHandler) LocalizedError() *locale.LocalizedErrorWrapper {
+	if r.clientErr != nil {
+		switch r.clientErr.(type) {
+		case x509.CertificateInvalidError, x509.UnknownAuthorityError, x509.HostnameError:
+			return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: %w", r.clientErr), "error.tls_error", r.clientErr.Error())
+		case *net.OpError:
+			return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: %w", r.clientErr), "error.network_operation", r.clientErr.Error())
+		case net.Error:
+			networkErr := r.clientErr.(net.Error)
+			if networkErr.Timeout() {
+				return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: %w", r.clientErr), "error.network_timeout", r.clientErr.Error())
+			}
+		}
+
+		if errors.Is(r.clientErr, io.EOF) {
+			return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: %w", r.clientErr), "error.http_empty_response")
+		}
+
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: %w", r.clientErr), "error.http_client_error", r.clientErr.Error())
+	}
+
+	switch r.httpResponse.StatusCode {
+	case http.StatusUnauthorized:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: access unauthorized (401 status code)"), "error.http_not_authorized")
+	case http.StatusForbidden:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: access forbidden (403 status code)"), "error.http_forbidden")
+	case http.StatusTooManyRequests:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: too many requests (429 status code)"), "error.http_too_many_requests")
+	case http.StatusNotFound, http.StatusGone:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: resource not found (%d status code)", r.httpResponse.StatusCode), "error.http_resource_not_found")
+	case http.StatusInternalServerError:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: remote server error (%d status code)", r.httpResponse.StatusCode), "error.http_internal_server_error")
+	case http.StatusBadGateway:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: bad gateway (%d status code)", r.httpResponse.StatusCode), "error.http_bad_gateway")
+	case http.StatusServiceUnavailable:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: service unavailable (%d status code)", r.httpResponse.StatusCode), "error.http_service_unavailable")
+	case http.StatusGatewayTimeout:
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: gateway timeout (%d status code)", r.httpResponse.StatusCode), "error.http_gateway_timeout")
+	}
+
+	if r.httpResponse.StatusCode >= 400 {
+		return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: unexpected status code (%d status code)", r.httpResponse.StatusCode), "error.http_unexpected_status_code", r.httpResponse.StatusCode)
+	}
+
+	if r.httpResponse.StatusCode != 304 {
+		// Content-Length = -1 when no Content-Length header is sent.
+		if r.httpResponse.ContentLength == 0 {
+			return locale.NewLocalizedErrorWrapper(fmt.Errorf("fetcher: empty response body"), "error.http_empty_response_body")
+		}
+	}
+
+	return nil
+}

+ 88 - 72
internal/reader/handler/handler.go

@@ -4,16 +4,15 @@
 package handler // import "miniflux.app/v2/internal/reader/handler"
 
 import (
+	"errors"
 	"log/slog"
 	"time"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/errors"
-	"miniflux.app/v2/internal/http/client"
 	"miniflux.app/v2/internal/integration"
 	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
-	"miniflux.app/v2/internal/reader/browser"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/reader/icon"
 	"miniflux.app/v2/internal/reader/parser"
 	"miniflux.app/v2/internal/reader/processor"
@@ -21,13 +20,13 @@ import (
 )
 
 var (
-	errDuplicate        = "This feed already exists (%s)"
-	errNotFound         = "Feed %d not found"
-	errCategoryNotFound = "Category not found for this user"
+	ErrCategoryNotFound = errors.New("fetcher: category not found")
+	ErrFeedNotFound     = errors.New("fetcher: feed not found")
+	ErrDuplicatedFeed   = errors.New("fetcher: duplicated feed")
 )
 
 // CreateFeed fetch, parse and store a new feed.
-func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model.FeedCreationRequest) (*model.Feed, error) {
+func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model.FeedCreationRequest) (*model.Feed, *locale.LocalizedErrorWrapper) {
 	slog.Debug("Begin feed creation process",
 		slog.Int64("user_id", userID),
 		slog.String("feed_url", feedCreationRequest.FeedURL),
@@ -35,35 +34,43 @@ func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model
 
 	user, storeErr := store.UserByID(userID)
 	if storeErr != nil {
-		return nil, storeErr
+		return nil, locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
 	}
 
 	if !store.CategoryIDExists(userID, feedCreationRequest.CategoryID) {
-		return nil, errors.NewLocalizedError(errCategoryNotFound)
+		return nil, locale.NewLocalizedErrorWrapper(ErrCategoryNotFound, "error.category_not_found")
 	}
 
-	request := client.NewClientWithConfig(feedCreationRequest.FeedURL, config.Opts)
-	request.WithCredentials(feedCreationRequest.Username, feedCreationRequest.Password)
-	request.WithUserAgent(feedCreationRequest.UserAgent)
-	request.WithCookie(feedCreationRequest.Cookie)
-	request.AllowSelfSignedCertificates = feedCreationRequest.AllowSelfSignedCertificates
-
-	if feedCreationRequest.FetchViaProxy {
-		request.WithProxy()
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithUsernameAndPassword(feedCreationRequest.Username, feedCreationRequest.Password)
+	requestBuilder.WithUserAgent(feedCreationRequest.UserAgent)
+	requestBuilder.WithCookie(feedCreationRequest.Cookie)
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+	requestBuilder.UseProxy(feedCreationRequest.FetchViaProxy)
+	requestBuilder.IgnoreTLSErrors(feedCreationRequest.AllowSelfSignedCertificates)
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(feedCreationRequest.FeedURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to fetch feed", slog.String("feed_url", feedCreationRequest.FeedURL), slog.Any("error", localizedError.Error()))
+		return nil, localizedError
 	}
 
-	response, requestErr := browser.Exec(request)
-	if requestErr != nil {
-		return nil, requestErr
+	responseBody, localizedError := responseHandler.ReadBody(config.Opts.HTTPClientMaxBodySize())
+	if localizedError != nil {
+		slog.Warn("Unable to fetch feed", slog.String("feed_url", feedCreationRequest.FeedURL), slog.Any("error", localizedError.Error()))
+		return nil, localizedError
 	}
 
-	if store.FeedURLExists(userID, response.EffectiveURL) {
-		return nil, errors.NewLocalizedError(errDuplicate, response.EffectiveURL)
+	if store.FeedURLExists(userID, responseHandler.EffectiveURL()) {
+		return nil, locale.NewLocalizedErrorWrapper(ErrDuplicatedFeed, "error.duplicated_feed")
 	}
 
-	subscription, parseErr := parser.ParseFeed(response.EffectiveURL, response.BodyAsString())
+	subscription, parseErr := parser.ParseFeed(responseHandler.EffectiveURL(), string(responseBody))
 	if parseErr != nil {
-		return nil, parseErr
+		return nil, locale.NewLocalizedErrorWrapper(parseErr, "error.unable_to_parse_feed", parseErr)
 	}
 
 	subscription.UserID = userID
@@ -81,14 +88,16 @@ func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model
 	subscription.BlocklistRules = feedCreationRequest.BlocklistRules
 	subscription.KeeplistRules = feedCreationRequest.KeeplistRules
 	subscription.UrlRewriteRules = feedCreationRequest.UrlRewriteRules
+	subscription.EtagHeader = responseHandler.ETag()
+	subscription.LastModifiedHeader = responseHandler.LastModified()
+	subscription.FeedURL = responseHandler.EffectiveURL()
 	subscription.WithCategoryID(feedCreationRequest.CategoryID)
-	subscription.WithClientResponse(response)
 	subscription.CheckedNow()
 
 	processor.ProcessFeedEntries(store, subscription, user, true)
 
 	if storeErr := store.CreateFeed(subscription); storeErr != nil {
-		return nil, storeErr
+		return nil, locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
 	}
 
 	slog.Debug("Created feed",
@@ -99,18 +108,16 @@ func CreateFeed(store *storage.Storage, userID int64, feedCreationRequest *model
 
 	checkFeedIcon(
 		store,
+		requestBuilder,
 		subscription.ID,
 		subscription.SiteURL,
 		subscription.IconURL,
-		feedCreationRequest.UserAgent,
-		feedCreationRequest.FetchViaProxy,
-		feedCreationRequest.AllowSelfSignedCertificates,
 	)
 	return subscription, nil
 }
 
 // RefreshFeed refreshes a feed.
-func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool) error {
+func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool) *locale.LocalizedErrorWrapper {
 	slog.Debug("Begin feed refresh process",
 		slog.Int64("user_id", userID),
 		slog.Int64("feed_id", feedID),
@@ -119,18 +126,16 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
 
 	user, storeErr := store.UserByID(userID)
 	if storeErr != nil {
-		return storeErr
+		return locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
 	}
 
-	printer := locale.NewPrinter(user.Language)
-
 	originalFeed, storeErr := store.FeedByID(userID, feedID)
 	if storeErr != nil {
-		return storeErr
+		return locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
 	}
 
 	if originalFeed == nil {
-		return errors.NewLocalizedError(errNotFound, feedID)
+		return locale.NewLocalizedErrorWrapper(ErrFeedNotFound, "error.feed_not_found")
 	}
 
 	weeklyEntryCount := 0
@@ -138,52 +143,62 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
 		var weeklyCountErr error
 		weeklyEntryCount, weeklyCountErr = store.WeeklyFeedEntryCount(userID, feedID)
 		if weeklyCountErr != nil {
-			return weeklyCountErr
+			return locale.NewLocalizedErrorWrapper(weeklyCountErr, "error.database_error", weeklyCountErr)
 		}
 	}
 
 	originalFeed.CheckedNow()
 	originalFeed.ScheduleNextCheck(weeklyEntryCount)
 
-	request := client.NewClientWithConfig(originalFeed.FeedURL, config.Opts)
-	request.WithCredentials(originalFeed.Username, originalFeed.Password)
-	request.WithUserAgent(originalFeed.UserAgent)
-	request.WithCookie(originalFeed.Cookie)
-	request.AllowSelfSignedCertificates = originalFeed.AllowSelfSignedCertificates
-
-	if !originalFeed.IgnoreHTTPCache {
-		request.WithCacheHeaders(originalFeed.EtagHeader, originalFeed.LastModifiedHeader)
-	}
-
-	if originalFeed.FetchViaProxy {
-		request.WithProxy()
-	}
-
-	response, requestErr := browser.Exec(request)
-	if requestErr != nil {
-		originalFeed.WithError(requestErr.Localize(printer))
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithUsernameAndPassword(originalFeed.Username, originalFeed.Password)
+	requestBuilder.WithUserAgent(originalFeed.UserAgent)
+	requestBuilder.WithCookie(originalFeed.Cookie)
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+	requestBuilder.UseProxy(originalFeed.FetchViaProxy)
+	requestBuilder.IgnoreTLSErrors(originalFeed.AllowSelfSignedCertificates)
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(originalFeed.FeedURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to fetch feed", slog.String("feed_url", originalFeed.FeedURL), slog.Any("error", localizedError.Error()))
+		originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language))
 		store.UpdateFeedError(originalFeed)
-		return requestErr
+		return localizedError
 	}
 
-	if store.AnotherFeedURLExists(userID, originalFeed.ID, response.EffectiveURL) {
-		storeErr := errors.NewLocalizedError(errDuplicate, response.EffectiveURL)
-		originalFeed.WithError(storeErr.Error())
+	if store.AnotherFeedURLExists(userID, originalFeed.ID, responseHandler.EffectiveURL()) {
+		localizedError := locale.NewLocalizedErrorWrapper(ErrDuplicatedFeed, "error.duplicated_feed")
+		originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language))
 		store.UpdateFeedError(originalFeed)
-		return storeErr
+		return localizedError
 	}
 
-	if originalFeed.IgnoreHTTPCache || response.IsModified(originalFeed.EtagHeader, originalFeed.LastModifiedHeader) {
+	if originalFeed.IgnoreHTTPCache || responseHandler.IsModified(originalFeed.EtagHeader, originalFeed.LastModifiedHeader) {
 		slog.Debug("Feed modified",
 			slog.Int64("user_id", userID),
 			slog.Int64("feed_id", feedID),
 		)
 
-		updatedFeed, parseErr := parser.ParseFeed(response.EffectiveURL, response.BodyAsString())
+		responseBody, localizedError := responseHandler.ReadBody(config.Opts.HTTPClientMaxBodySize())
+		if localizedError != nil {
+			slog.Warn("Unable to fetch feed", slog.String("feed_url", originalFeed.FeedURL), slog.Any("error", localizedError.Error()))
+			return localizedError
+		}
+
+		updatedFeed, parseErr := parser.ParseFeed(responseHandler.EffectiveURL(), string(responseBody))
 		if parseErr != nil {
-			originalFeed.WithError(parseErr.Localize(printer))
+			localizedError := locale.NewLocalizedErrorWrapper(parseErr, "error.unable_to_parse_feed")
+
+			if errors.Is(parseErr, parser.ErrFeedFormatNotDetected) {
+				localizedError = locale.NewLocalizedErrorWrapper(parseErr, "error.feed_format_not_detected", parseErr)
+			}
+
+			originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language))
 			store.UpdateFeedError(originalFeed)
-			return parseErr
+			return localizedError
 		}
 
 		// If the feed has a TTL defined, we use it to make sure we don't check it too often.
@@ -215,9 +230,10 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
 		updateExistingEntries := forceRefresh || !originalFeed.Crawler
 		newEntries, storeErr := store.RefreshFeedEntries(originalFeed.UserID, originalFeed.ID, originalFeed.Entries, updateExistingEntries)
 		if storeErr != nil {
-			originalFeed.WithError(storeErr.Error())
+			localizedError := locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
+			originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language))
 			store.UpdateFeedError(originalFeed)
-			return storeErr
+			return localizedError
 		}
 
 		userIntegrations, intErr := store.Integration(userID)
@@ -233,16 +249,15 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
 
 		// We update caching headers only if the feed has been modified,
 		// because some websites don't return the same headers when replying with a 304.
-		originalFeed.WithClientResponse(response)
+		originalFeed.EtagHeader = responseHandler.ETag()
+		originalFeed.LastModifiedHeader = responseHandler.LastModified()
 
 		checkFeedIcon(
 			store,
+			requestBuilder,
 			originalFeed.ID,
 			originalFeed.SiteURL,
 			updatedFeed.IconURL,
-			originalFeed.UserAgent,
-			originalFeed.FetchViaProxy,
-			originalFeed.AllowSelfSignedCertificates,
 		)
 	} else {
 		slog.Debug("Feed not modified",
@@ -254,17 +269,18 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool
 	originalFeed.ResetErrorCounter()
 
 	if storeErr := store.UpdateFeed(originalFeed); storeErr != nil {
-		originalFeed.WithError(storeErr.Error())
+		localizedError := locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr)
+		originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language))
 		store.UpdateFeedError(originalFeed)
-		return storeErr
+		return localizedError
 	}
 
 	return nil
 }
 
-func checkFeedIcon(store *storage.Storage, feedID int64, websiteURL, feedIconURL, userAgent string, fetchViaProxy, allowSelfSignedCertificates bool) {
+func checkFeedIcon(store *storage.Storage, requestBuilder *fetcher.RequestBuilder, feedID int64, websiteURL, feedIconURL string) {
 	if !store.HasIcon(feedID) {
-		iconFinder := icon.NewIconFinder(websiteURL, feedIconURL, userAgent, fetchViaProxy, allowSelfSignedCertificates)
+		iconFinder := icon.NewIconFinder(requestBuilder, websiteURL, feedIconURL)
 		if icon, err := iconFinder.FindIcon(); err != nil {
 			slog.Debug("Unable to find feed icon",
 				slog.Int64("feed_id", feedID),

+ 26 - 62
internal/reader/icon/finder.go

@@ -13,28 +13,24 @@ import (
 
 	"miniflux.app/v2/internal/config"
 	"miniflux.app/v2/internal/crypto"
-	"miniflux.app/v2/internal/http/client"
 	"miniflux.app/v2/internal/model"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/urllib"
 
 	"github.com/PuerkitoBio/goquery"
 )
 
 type IconFinder struct {
-	websiteURL                  string
-	feedIconURL                 string
-	userAgent                   string
-	fetchViaProxy               bool
-	allowSelfSignedCertificates bool
+	requestBuilder *fetcher.RequestBuilder
+	websiteURL     string
+	feedIconURL    string
 }
 
-func NewIconFinder(websiteURL, feedIconURL, userAgent string, fetchViaProxy, allowSelfSignedCertificates bool) *IconFinder {
+func NewIconFinder(requestBuilder *fetcher.RequestBuilder, websiteURL, feedIconURL string) *IconFinder {
 	return &IconFinder{
-		websiteURL:                  websiteURL,
-		feedIconURL:                 feedIconURL,
-		userAgent:                   userAgent,
-		fetchViaProxy:               fetchViaProxy,
-		allowSelfSignedCertificates: allowSelfSignedCertificates,
+		requestBuilder: requestBuilder,
+		websiteURL:     websiteURL,
+		feedIconURL:    feedIconURL,
 	}
 }
 
@@ -105,12 +101,16 @@ func (f *IconFinder) FetchIconsFromHTMLDocument() (*model.Icon, error) {
 		slog.String("website_url", f.websiteURL),
 	)
 
-	documentBody, err := f.FetchRootDocument()
-	if err != nil {
-		return nil, err
+	rootURL := urllib.RootURL(f.websiteURL)
+
+	responseHandler := fetcher.NewResponseHandler(f.requestBuilder.ExecuteRequest(rootURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		return nil, fmt.Errorf("icon: unable to download website index page: %w", localizedError.Error())
 	}
 
-	iconURLs, err := findIconURLsFromHTMLDocument(documentBody)
+	iconURLs, err := findIconURLsFromHTMLDocument(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()))
 	if err != nil {
 		return nil, err
 	}
@@ -151,64 +151,28 @@ func (f *IconFinder) FetchIconsFromHTMLDocument() (*model.Icon, error) {
 	return nil, nil
 }
 
-func (f *IconFinder) FetchRootDocument() (io.Reader, error) {
-	rootURL := urllib.RootURL(f.websiteURL)
-
-	clt := client.NewClientWithConfig(rootURL, config.Opts)
-	clt.WithUserAgent(f.userAgent)
-	clt.AllowSelfSignedCertificates = f.allowSelfSignedCertificates
-
-	if f.fetchViaProxy {
-		clt.WithProxy()
-	}
-
-	response, err := clt.Get()
-	if err != nil {
-		return nil, fmt.Errorf("icon: unable to download website index page: %v", err)
-	}
-
-	if response.HasServerFailure() {
-		return nil, fmt.Errorf("icon: unable to download website index page: status=%d", response.StatusCode)
-	}
-
-	return response.Body, nil
-}
-
 func (f *IconFinder) DownloadIcon(iconURL string) (*model.Icon, error) {
 	slog.Debug("Downloading icon",
 		slog.String("website_url", f.websiteURL),
 		slog.String("icon_url", iconURL),
 	)
 
-	clt := client.NewClientWithConfig(iconURL, config.Opts)
-	clt.WithUserAgent(f.userAgent)
-	clt.AllowSelfSignedCertificates = f.allowSelfSignedCertificates
-	if f.fetchViaProxy {
-		clt.WithProxy()
-	}
-
-	response, err := clt.Get()
-	if err != nil {
-		return nil, fmt.Errorf("icon: unable to download icon %s: %v", iconURL, err)
-	}
-
-	if response.HasServerFailure() {
-		return nil, fmt.Errorf("icon: unable to download icon %s: status=%d", iconURL, response.StatusCode)
-	}
+	responseHandler := fetcher.NewResponseHandler(f.requestBuilder.ExecuteRequest(iconURL))
+	defer responseHandler.Close()
 
-	body, err := io.ReadAll(response.Body)
-	if err != nil {
-		return nil, fmt.Errorf("icon: unable to read downloaded icon from %s: %v", iconURL, err)
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		return nil, fmt.Errorf("icon: unable to download website icon: %w", localizedError.Error())
 	}
 
-	if len(body) == 0 {
-		return nil, fmt.Errorf("icon: downloaded icon is empty, iconURL=%s", iconURL)
+	responseBody, localizedError := responseHandler.ReadBody(config.Opts.HTTPClientMaxBodySize())
+	if localizedError != nil {
+		return nil, fmt.Errorf("icon: unable to read response body: %w", localizedError.Error())
 	}
 
 	icon := &model.Icon{
-		Hash:     crypto.HashFromBytes(body),
-		MimeType: response.ContentType,
-		Content:  body,
+		Hash:     crypto.HashFromBytes(responseBody),
+		MimeType: responseHandler.ContentType(),
+		Content:  responseBody,
 	}
 
 	return icon, nil

+ 4 - 5
internal/reader/json/parser.go

@@ -5,18 +5,17 @@ package json // import "miniflux.app/v2/internal/reader/json"
 
 import (
 	"encoding/json"
+	"fmt"
 	"io"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/model"
 )
 
 // Parse returns a normalized feed struct from a JSON feed.
-func Parse(baseURL string, data io.Reader) (*model.Feed, *errors.LocalizedError) {
+func Parse(baseURL string, data io.Reader) (*model.Feed, error) {
 	feed := new(jsonFeed)
-	decoder := json.NewDecoder(data)
-	if err := decoder.Decode(&feed); err != nil {
-		return nil, errors.NewLocalizedError("Unable to parse JSON Feed: %q", err)
+	if err := json.NewDecoder(data).Decode(&feed); err != nil {
+		return nil, fmt.Errorf("json: unable to parse feed: %w", err)
 	}
 
 	return feed.Transform(baseURL), nil

+ 3 - 3
internal/reader/opml/parser.go

@@ -5,14 +5,14 @@ package opml // import "miniflux.app/v2/internal/reader/opml"
 
 import (
 	"encoding/xml"
+	"fmt"
 	"io"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/reader/encoding"
 )
 
 // Parse reads an OPML file and returns a SubcriptionList.
-func Parse(data io.Reader) (SubcriptionList, *errors.LocalizedError) {
+func Parse(data io.Reader) (SubcriptionList, error) {
 	opmlDocument := NewOPMLDocument()
 	decoder := xml.NewDecoder(data)
 	decoder.Entity = xml.HTMLEntity
@@ -21,7 +21,7 @@ func Parse(data io.Reader) (SubcriptionList, *errors.LocalizedError) {
 
 	err := decoder.Decode(opmlDocument)
 	if err != nil {
-		return nil, errors.NewLocalizedError("Unable to parse OPML file: %q", err)
+		return nil, fmt.Errorf("opml: unable to parse document: %w", err)
 	}
 
 	return getSubscriptionsFromOutlines(opmlDocument.Outlines, ""), nil

+ 5 - 3
internal/reader/parser/parser.go

@@ -4,9 +4,9 @@
 package parser // import "miniflux.app/v2/internal/reader/parser"
 
 import (
+	"errors"
 	"strings"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/reader/atom"
 	"miniflux.app/v2/internal/reader/json"
@@ -14,8 +14,10 @@ import (
 	"miniflux.app/v2/internal/reader/rss"
 )
 
+var ErrFeedFormatNotDetected = errors.New("parser: unable to detect feed format")
+
 // ParseFeed analyzes the input data and returns a normalized feed object.
-func ParseFeed(baseURL, data string) (*model.Feed, *errors.LocalizedError) {
+func ParseFeed(baseURL, data string) (*model.Feed, error) {
 	switch DetectFeedFormat(data) {
 	case FormatAtom:
 		return atom.Parse(baseURL, strings.NewReader(data))
@@ -26,6 +28,6 @@ func ParseFeed(baseURL, data string) (*model.Feed, *errors.LocalizedError) {
 	case FormatRDF:
 		return rdf.Parse(baseURL, strings.NewReader(data))
 	default:
-		return nil, errors.NewLocalizedError("Unsupported feed format")
+		return nil, ErrFeedFormatNotDetected
 	}
 }

+ 0 - 51
internal/reader/parser/parser_test.go

@@ -4,11 +4,7 @@
 package parser // import "miniflux.app/v2/internal/reader/parser"
 
 import (
-	"bytes"
-	"os"
 	"testing"
-
-	"miniflux.app/v2/internal/http/client"
 )
 
 func TestParseAtom(t *testing.T) {
@@ -301,50 +297,3 @@ func TestParseEmptyFeed(t *testing.T) {
 		t.Error("ParseFeed must returns an error")
 	}
 }
-
-func TestDifferentEncodingWithResponse(t *testing.T) {
-	var unicodeTestCases = []struct {
-		filename, contentType string
-		index                 int
-		title                 string
-	}{
-		// Arabic language encoded in UTF-8.
-		{"urdu_UTF8.xml", "text/xml; charset=utf-8", 0, "امریکی عسکری امداد کی بندش کی وجوہات: انڈیا سے جنگ، جوہری پروگرام اور اب دہشت گردوں کی پشت پناہی"},
-
-		// Windows-1251 encoding and not charset in HTTP header.
-		{"encoding_WINDOWS-1251.xml", "text/xml", 0, "Цитата #17703"},
-
-		// No encoding in XML, but defined in HTTP Content-Type header.
-		{"no_encoding_ISO-8859-1.xml", "application/xml; charset=ISO-8859-1", 2, "La criminalité liée surtout à... l'ennui ?"},
-
-		// ISO-8859-1 encoding defined in XML and HTTP header.
-		{"encoding_ISO-8859-1.xml", "application/rss+xml; charset=ISO-8859-1", 5, "Projekt Jedi: Microsoft will weiter mit US-Militär zusammenarbeiten"},
-
-		// UTF-8 encoding defined in RDF document and HTTP header.
-		{"rdf_UTF8.xml", "application/rss+xml; charset=utf-8", 1, "Mega-Deal: IBM übernimmt Red Hat"},
-
-		// UTF-8 encoding defined only in RDF document.
-		{"rdf_UTF8.xml", "application/rss+xml", 1, "Mega-Deal: IBM übernimmt Red Hat"},
-	}
-
-	for _, tc := range unicodeTestCases {
-		content, err := os.ReadFile("testdata/" + tc.filename)
-		if err != nil {
-			t.Fatalf(`Unable to read file %q: %v`, tc.filename, err)
-		}
-
-		r := &client.Response{Body: bytes.NewReader(content), ContentType: tc.contentType}
-		if encodingErr := r.EnsureUnicodeBody(); encodingErr != nil {
-			t.Fatalf(`Encoding error for %q: %v`, tc.filename, encodingErr)
-		}
-
-		feed, parseErr := ParseFeed("https://example.org/", r.BodyAsString())
-		if parseErr != nil {
-			t.Fatalf(`Parsing error for %q - %q: %v`, tc.filename, tc.contentType, parseErr)
-		}
-
-		if feed.Entries[tc.index].Title != tc.title {
-			t.Errorf(`Unexpected title, got %q instead of %q`, feed.Entries[tc.index].Title, tc.title)
-		}
-	}
-}

+ 56 - 34
internal/reader/processor/processor.go

@@ -12,10 +12,9 @@ import (
 	"time"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/http/client"
 	"miniflux.app/v2/internal/metric"
 	"miniflux.app/v2/internal/model"
-	"miniflux.app/v2/internal/reader/browser"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/reader/readingtime"
 	"miniflux.app/v2/internal/reader/rewrite"
 	"miniflux.app/v2/internal/reader/sanitizer"
@@ -52,7 +51,7 @@ func ProcessFeedEntries(store *storage.Storage, feed *model.Feed, user *model.Us
 			continue
 		}
 
-		url := getUrlFromEntry(feed, entry)
+		websiteURL := getUrlFromEntry(feed, entry)
 		entryIsNew := !store.EntryURLExists(feed.ID, entry.URL)
 		if feed.Crawler && (entryIsNew || forceRefresh) {
 			slog.Debug("Scraping entry",
@@ -64,13 +63,19 @@ func ProcessFeedEntries(store *storage.Storage, feed *model.Feed, user *model.Us
 			)
 
 			startTime := time.Now()
-			content, scraperErr := scraper.Fetch(
-				url,
+
+			requestBuilder := fetcher.NewRequestBuilder()
+			requestBuilder.WithUserAgent(feed.UserAgent)
+			requestBuilder.WithCookie(feed.Cookie)
+			requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+			requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+			requestBuilder.UseProxy(feed.FetchViaProxy)
+			requestBuilder.IgnoreTLSErrors(feed.AllowSelfSignedCertificates)
+
+			content, scraperErr := scraper.ScrapeWebsite(
+				requestBuilder,
+				websiteURL,
 				feed.ScraperRules,
-				feed.UserAgent,
-				feed.Cookie,
-				feed.AllowSelfSignedCertificates,
-				feed.FetchViaProxy,
 			)
 
 			if config.Opts.HasMetricsCollector() {
@@ -96,10 +101,10 @@ func ProcessFeedEntries(store *storage.Storage, feed *model.Feed, user *model.Us
 			}
 		}
 
-		rewrite.Rewriter(url, entry, feed.RewriteRules)
+		rewrite.Rewriter(websiteURL, entry, feed.RewriteRules)
 
 		// The sanitizer should always run at the end of the process to make sure unsafe HTML is filtered.
-		entry.Content = sanitizer.Sanitize(url, entry.Content)
+		entry.Content = sanitizer.Sanitize(websiteURL, entry.Content)
 
 		updateEntryReadingTime(store, feed, entry, entryIsNew, user)
 		filteredEntries = append(filteredEntries, entry)
@@ -146,15 +151,20 @@ func isAllowedEntry(feed *model.Feed, entry *model.Entry) bool {
 // ProcessEntryWebPage downloads the entry web page and apply rewrite rules.
 func ProcessEntryWebPage(feed *model.Feed, entry *model.Entry, user *model.User) error {
 	startTime := time.Now()
-	url := getUrlFromEntry(feed, entry)
-
-	content, scraperErr := scraper.Fetch(
-		url,
-		entry.Feed.ScraperRules,
-		entry.Feed.UserAgent,
-		entry.Feed.Cookie,
-		feed.AllowSelfSignedCertificates,
-		feed.FetchViaProxy,
+	websiteURL := getUrlFromEntry(feed, entry)
+
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithUserAgent(feed.UserAgent)
+	requestBuilder.WithCookie(feed.Cookie)
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+	requestBuilder.UseProxy(feed.FetchViaProxy)
+	requestBuilder.IgnoreTLSErrors(feed.AllowSelfSignedCertificates)
+
+	content, scraperErr := scraper.ScrapeWebsite(
+		requestBuilder,
+		websiteURL,
+		feed.ScraperRules,
 	)
 
 	if config.Opts.HasMetricsCollector() {
@@ -174,8 +184,8 @@ func ProcessEntryWebPage(feed *model.Feed, entry *model.Entry, user *model.User)
 		entry.ReadingTime = readingtime.EstimateReadingTime(entry.Content, user.DefaultReadingSpeed, user.CJKReadingSpeed)
 	}
 
-	rewrite.Rewriter(url, entry, entry.Feed.RewriteRules)
-	entry.Content = sanitizer.Sanitize(url, entry.Content)
+	rewrite.Rewriter(websiteURL, entry, entry.Feed.RewriteRules)
+	entry.Content = sanitizer.Sanitize(websiteURL, entry.Content)
 
 	return nil
 }
@@ -270,14 +280,20 @@ func shouldFetchOdyseeWatchTime(entry *model.Entry) bool {
 	return matches != nil
 }
 
-func fetchYouTubeWatchTime(url string) (int, error) {
-	clt := client.NewClientWithConfig(url, config.Opts)
-	response, browserErr := browser.Exec(clt)
-	if browserErr != nil {
-		return 0, browserErr
+func fetchYouTubeWatchTime(websiteURL string) (int, error) {
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(websiteURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to fetch YouTube page", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
+		return 0, localizedError.Error()
 	}
 
-	doc, docErr := goquery.NewDocumentFromReader(response.Body)
+	doc, docErr := goquery.NewDocumentFromReader(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()))
 	if docErr != nil {
 		return 0, docErr
 	}
@@ -295,14 +311,20 @@ func fetchYouTubeWatchTime(url string) (int, error) {
 	return int(dur.Minutes()), nil
 }
 
-func fetchOdyseeWatchTime(url string) (int, error) {
-	clt := client.NewClientWithConfig(url, config.Opts)
-	response, browserErr := browser.Exec(clt)
-	if browserErr != nil {
-		return 0, browserErr
+func fetchOdyseeWatchTime(websiteURL string) (int, error) {
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(websiteURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to fetch Odysee watch time", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
+		return 0, localizedError.Error()
 	}
 
-	doc, docErr := goquery.NewDocumentFromReader(response.Body)
+	doc, docErr := goquery.NewDocumentFromReader(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()))
 	if docErr != nil {
 		return 0, docErr
 	}

+ 4 - 6
internal/reader/rdf/parser.go

@@ -4,20 +4,18 @@
 package rdf // import "miniflux.app/v2/internal/reader/rdf"
 
 import (
+	"fmt"
 	"io"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/reader/xml"
 )
 
 // Parse returns a normalized feed struct from a RDF feed.
-func Parse(baseURL string, data io.Reader) (*model.Feed, *errors.LocalizedError) {
+func Parse(baseURL string, data io.Reader) (*model.Feed, error) {
 	feed := new(rdfFeed)
-	decoder := xml.NewDecoder(data)
-	err := decoder.Decode(feed)
-	if err != nil {
-		return nil, errors.NewLocalizedError("Unable to parse RDF feed: %q", err)
+	if err := xml.NewDecoder(data).Decode(feed); err != nil {
+		return nil, fmt.Errorf("rdf: unable to parse feed: %w", err)
 	}
 
 	return feed.Transform(baseURL), nil

+ 4 - 7
internal/reader/rss/parser.go

@@ -4,21 +4,18 @@
 package rss // import "miniflux.app/v2/internal/reader/rss"
 
 import (
+	"fmt"
 	"io"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/reader/xml"
 )
 
 // Parse returns a normalized feed struct from a RSS feed.
-func Parse(baseURL string, data io.Reader) (*model.Feed, *errors.LocalizedError) {
+func Parse(baseURL string, data io.Reader) (*model.Feed, error) {
 	feed := new(rssFeed)
-	decoder := xml.NewDecoder(data)
-	err := decoder.Decode(feed)
-	if err != nil {
-		return nil, errors.NewLocalizedError("Unable to parse RSS feed: %q", err)
+	if err := xml.NewDecoder(data).Decode(feed); err != nil {
+		return nil, fmt.Errorf("rss: unable to parse feed: %w", err)
 	}
-
 	return feed.Transform(baseURL), nil
 }

+ 16 - 29
internal/reader/scraper/scraper.go

@@ -4,67 +4,54 @@
 package scraper // import "miniflux.app/v2/internal/reader/scraper"
 
 import (
-	"errors"
 	"fmt"
 	"io"
 	"log/slog"
 	"strings"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/http/client"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/reader/readability"
 	"miniflux.app/v2/internal/urllib"
 
 	"github.com/PuerkitoBio/goquery"
 )
 
-// Fetch downloads a web page and returns relevant contents.
-func Fetch(websiteURL, rules, userAgent string, cookie string, allowSelfSignedCertificates, useProxy bool) (string, error) {
-	clt := client.NewClientWithConfig(websiteURL, config.Opts)
-	clt.WithUserAgent(userAgent)
-	clt.WithCookie(cookie)
-	if useProxy {
-		clt.WithProxy()
-	}
-	clt.AllowSelfSignedCertificates = allowSelfSignedCertificates
-
-	response, err := clt.Get()
-	if err != nil {
-		return "", err
-	}
+func ScrapeWebsite(requestBuilder *fetcher.RequestBuilder, websiteURL, rules string) (string, error) {
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(websiteURL))
+	defer responseHandler.Close()
 
-	if response.HasServerFailure() {
-		return "", errors.New("scraper: unable to download web page")
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to scrape website", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
+		return "", localizedError.Error()
 	}
 
-	if !isAllowedContentType(response.ContentType) {
-		return "", fmt.Errorf("scraper: this resource is not a HTML document (%s)", response.ContentType)
-	}
-
-	if err = response.EnsureUnicodeBody(); err != nil {
-		return "", err
+	if !isAllowedContentType(responseHandler.ContentType()) {
+		return "", fmt.Errorf("scraper: this resource is not a HTML document (%s)", responseHandler.ContentType())
 	}
 
 	// The entry URL could redirect somewhere else.
-	sameSite := urllib.Domain(websiteURL) == urllib.Domain(response.EffectiveURL)
-	websiteURL = response.EffectiveURL
+	sameSite := urllib.Domain(websiteURL) == urllib.Domain(responseHandler.EffectiveURL())
+	websiteURL = responseHandler.EffectiveURL()
 
 	if rules == "" {
 		rules = getPredefinedScraperRules(websiteURL)
 	}
 
 	var content string
+	var err error
+
 	if sameSite && rules != "" {
 		slog.Debug("Extracting content with custom rules",
 			"url", websiteURL,
 			"rules", rules,
 		)
-		content, err = scrapContent(response.Body, rules)
+		content, err = findContentUsingCustomRules(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()), rules)
 	} else {
 		slog.Debug("Extracting content with readability",
 			"url", websiteURL,
 		)
-		content, err = readability.ExtractContent(response.Body)
+		content, err = readability.ExtractContent(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()))
 	}
 
 	if err != nil {
@@ -74,7 +61,7 @@ func Fetch(websiteURL, rules, userAgent string, cookie string, allowSelfSignedCe
 	return content, nil
 }
 
-func scrapContent(page io.Reader, rules string) (string, error) {
+func findContentUsingCustomRules(page io.Reader, rules string) (string, error) {
 	document, err := goquery.NewDocumentFromReader(page)
 	if err != nil {
 		return "", err

+ 1 - 1
internal/reader/scraper/scraper_test.go

@@ -58,7 +58,7 @@ func TestSelectorRules(t *testing.T) {
 			t.Fatalf(`Unable to read file %q: %v`, filename, err)
 		}
 
-		actualResult, err := scrapContent(bytes.NewReader(html), rule)
+		actualResult, err := findContentUsingCustomRules(bytes.NewReader(html), rule)
 		if err != nil {
 			t.Fatalf(`Scraping error for %q - %q: %v`, filename, rule, err)
 		}

+ 93 - 66
internal/reader/subscription/finder.go

@@ -4,16 +4,16 @@
 package subscription // import "miniflux.app/v2/internal/reader/subscription"
 
 import (
+	"bytes"
 	"fmt"
 	"io"
+	"log/slog"
 	"regexp"
-	"strings"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/errors"
-	"miniflux.app/v2/internal/http/client"
 	"miniflux.app/v2/internal/integration/rssbridge"
-	"miniflux.app/v2/internal/reader/browser"
+	"miniflux.app/v2/internal/locale"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/reader/parser"
 	"miniflux.app/v2/internal/urllib"
 
@@ -21,70 +21,87 @@ import (
 )
 
 var (
-	errUnreadableDoc    = "Unable to analyze this page: %v"
 	youtubeChannelRegex = regexp.MustCompile(`youtube\.com/channel/(.*)`)
 	youtubeVideoRegex   = regexp.MustCompile(`youtube\.com/watch\?v=(.*)`)
 )
 
-// FindSubscriptions downloads and try to find one or more subscriptions from an URL.
-func FindSubscriptions(websiteURL, userAgent, cookie, username, password string, fetchViaProxy, allowSelfSignedCertificates bool, rssbridgeURL string) (Subscriptions, *errors.LocalizedError) {
-	if rssbridgeURL != "" {
-		bridges, err := rssbridge.DetectBridges(rssbridgeURL, websiteURL)
-		if err != nil {
-			return nil, errors.NewLocalizedError("RSS-Bridge: %v", err)
-		}
-		if len(bridges) > 0 {
-			var subscriptions Subscriptions
-			for _, bridge := range bridges {
-				subscriptions = append(subscriptions, &Subscription{
-					Title: bridge.BridgeMeta.Name,
-					URL:   bridge.URL,
-					Type:  "atom",
-				})
-			}
-			return subscriptions, nil
-		}
-	}
-
+func FindSubscriptions(websiteURL, userAgent, cookie, username, password string, fetchViaProxy, allowSelfSignedCertificates bool, rssbridgeURL string) (Subscriptions, *locale.LocalizedErrorWrapper) {
 	websiteURL = findYoutubeChannelFeed(websiteURL)
 	websiteURL = parseYoutubeVideoPage(websiteURL)
 
-	clt := client.NewClientWithConfig(websiteURL, config.Opts)
-	clt.WithCredentials(username, password)
-	clt.WithUserAgent(userAgent)
-	clt.WithCookie(cookie)
-	clt.AllowSelfSignedCertificates = allowSelfSignedCertificates
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithUsernameAndPassword(username, password)
+	requestBuilder.WithUserAgent(userAgent)
+	requestBuilder.WithCookie(cookie)
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+	requestBuilder.UseProxy(fetchViaProxy)
+	requestBuilder.IgnoreTLSErrors(allowSelfSignedCertificates)
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(websiteURL))
+	defer responseHandler.Close()
 
-	if fetchViaProxy {
-		clt.WithProxy()
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to find subscriptions", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
+		return nil, localizedError
 	}
 
-	response, err := browser.Exec(clt)
-	if err != nil {
-		return nil, err
+	responseBody, localizedError := responseHandler.ReadBody(config.Opts.HTTPClientMaxBodySize())
+	if localizedError != nil {
+		slog.Warn("Unable to find subscriptions", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
+		return nil, localizedError
 	}
 
-	body := response.BodyAsString()
-	if format := parser.DetectFeedFormat(body); format != parser.FormatUnknown {
+	if format := parser.DetectFeedFormat(string(responseBody)); format != parser.FormatUnknown {
 		var subscriptions Subscriptions
 		subscriptions = append(subscriptions, &Subscription{
-			Title: response.EffectiveURL,
-			URL:   response.EffectiveURL,
+			Title: responseHandler.EffectiveURL(),
+			URL:   responseHandler.EffectiveURL(),
 			Type:  format,
 		})
 
 		return subscriptions, nil
 	}
 
-	subscriptions, err := parseWebPage(response.EffectiveURL, strings.NewReader(body))
-	if err != nil || subscriptions != nil {
-		return subscriptions, err
+	subscriptions, localizedError := parseWebPage(responseHandler.EffectiveURL(), bytes.NewReader(responseBody))
+	if localizedError != nil || subscriptions != nil {
+		return subscriptions, localizedError
 	}
 
-	return tryWellKnownUrls(websiteURL, userAgent, cookie, username, password)
+	if rssbridgeURL != "" {
+		slog.Debug("Trying to detect feeds using RSS-Bridge",
+			slog.String("website_url", websiteURL),
+			slog.String("rssbridge_url", rssbridgeURL),
+		)
+
+		bridges, err := rssbridge.DetectBridges(rssbridgeURL, websiteURL)
+		if err != nil {
+			return nil, locale.NewLocalizedErrorWrapper(err, "error.unable_to_detect_rssbridge", err)
+		}
+
+		slog.Debug("RSS-Bridge results",
+			slog.String("website_url", websiteURL),
+			slog.String("rssbridge_url", rssbridgeURL),
+			slog.Int("nb_bridges", len(bridges)),
+		)
+
+		if len(bridges) > 0 {
+			var subscriptions Subscriptions
+			for _, bridge := range bridges {
+				subscriptions = append(subscriptions, &Subscription{
+					Title: bridge.BridgeMeta.Name,
+					URL:   bridge.URL,
+					Type:  "atom",
+				})
+			}
+			return subscriptions, nil
+		}
+	}
+
+	return tryWellKnownUrls(websiteURL, userAgent, cookie, username, password, fetchViaProxy, allowSelfSignedCertificates)
 }
 
-func parseWebPage(websiteURL string, data io.Reader) (Subscriptions, *errors.LocalizedError) {
+func parseWebPage(websiteURL string, data io.Reader) (Subscriptions, *locale.LocalizedErrorWrapper) {
 	var subscriptions Subscriptions
 	queries := map[string]string{
 		"link[type='application/rss+xml']":   "rss",
@@ -95,7 +112,7 @@ func parseWebPage(websiteURL string, data io.Reader) (Subscriptions, *errors.Loc
 
 	doc, err := goquery.NewDocumentFromReader(data)
 	if err != nil {
-		return nil, errors.NewLocalizedError(errUnreadableDoc, err)
+		return nil, locale.NewLocalizedErrorWrapper(err, "error.unable_to_parse_html_document", err)
 	}
 
 	for query, kind := range queries {
@@ -140,13 +157,19 @@ func parseYoutubeVideoPage(websiteURL string) string {
 		return websiteURL
 	}
 
-	clt := client.NewClientWithConfig(websiteURL, config.Opts)
-	response, browserErr := browser.Exec(clt)
-	if browserErr != nil {
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(websiteURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to find subscriptions", slog.String("website_url", websiteURL), slog.Any("error", localizedError.Error()))
 		return websiteURL
 	}
 
-	doc, docErr := goquery.NewDocumentFromReader(response.Body)
+	doc, docErr := goquery.NewDocumentFromReader(responseHandler.Body(config.Opts.HTTPClientMaxBodySize()))
 	if docErr != nil {
 		return websiteURL
 	}
@@ -158,7 +181,7 @@ func parseYoutubeVideoPage(websiteURL string) string {
 	return websiteURL
 }
 
-func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string) (Subscriptions, *errors.LocalizedError) {
+func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string, fetchViaProxy, allowSelfSignedCertificates bool) (Subscriptions, *locale.LocalizedErrorWrapper) {
 	var subscriptions Subscriptions
 	knownURLs := map[string]string{
 		"atom.xml": "atom",
@@ -173,6 +196,7 @@ func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string)
 		// Look for knownURLs in the root.
 		websiteURLRoot,
 	}
+
 	// Look for knownURLs in current subdirectory, such as 'example.com/blog/'.
 	websiteURL, _ = urllib.AbsoluteURL(websiteURL, "./")
 	if websiteURL != websiteURLRoot {
@@ -185,30 +209,33 @@ func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string)
 			if err != nil {
 				continue
 			}
-			clt := client.NewClientWithConfig(fullURL, config.Opts)
-			clt.WithCredentials(username, password)
-			clt.WithUserAgent(userAgent)
-			clt.WithCookie(cookie)
+
+			requestBuilder := fetcher.NewRequestBuilder()
+			requestBuilder.WithUsernameAndPassword(username, password)
+			requestBuilder.WithUserAgent(userAgent)
+			requestBuilder.WithCookie(cookie)
+			requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+			requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+			requestBuilder.UseProxy(fetchViaProxy)
+			requestBuilder.IgnoreTLSErrors(allowSelfSignedCertificates)
 
 			// Some websites redirects unknown URLs to the home page.
 			// As result, the list of known URLs is returned to the subscription list.
 			// We don't want the user to choose between invalid feed URLs.
-			clt.WithoutRedirects()
+			requestBuilder.WithoutRedirects()
 
-			response, err := clt.Get()
-			if err != nil {
+			responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(fullURL))
+			defer responseHandler.Close()
+
+			if localizedError := responseHandler.LocalizedError(); localizedError != nil {
 				continue
 			}
 
-			if response != nil && response.StatusCode == 200 {
-				subscription := new(Subscription)
-				subscription.Type = kind
-				subscription.Title = fullURL
-				subscription.URL = fullURL
-				if subscription.URL != "" {
-					subscriptions = append(subscriptions, subscription)
-				}
-			}
+			subscription := new(Subscription)
+			subscription.Type = kind
+			subscription.Title = fullURL
+			subscription.URL = fullURL
+			subscriptions = append(subscriptions, subscription)
 		}
 	}
 

+ 0 - 5
internal/template/engine.go

@@ -11,7 +11,6 @@ import (
 	"strings"
 	"time"
 
-	"miniflux.app/v2/internal/errors"
 	"miniflux.app/v2/internal/locale"
 
 	"github.com/gorilla/mux"
@@ -119,10 +118,6 @@ func (e *Engine) Render(name string, data map[string]interface{}) []byte {
 			switch k := key.(type) {
 			case string:
 				return printer.Printf(k, args...)
-			case errors.LocalizedError:
-				return k.Localize(printer)
-			case *errors.LocalizedError:
-				return k.Localize(printer)
 			case error:
 				return k.Error()
 			default:

+ 1 - 1
internal/template/templates/views/add_subscription.html

@@ -13,7 +13,7 @@
         <input type="hidden" name="csrf" value="{{ .csrf }}">
 
         {{ if .errorMessage }}
-            <div class="alert alert-error">{{ t .errorMessage }}</div>
+            <div class="alert alert-error">{{ .errorMessage }}</div>
         {{ end }}
 
         <label for="form-url">{{ t "page.add_feed.label.url" }}</label>

+ 1 - 1
internal/template/templates/views/create_api_key.html

@@ -10,7 +10,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <label for="form-description">{{ t "form.api_key.label.description" }}</label>

+ 1 - 1
internal/template/templates/views/create_category.html

@@ -14,7 +14,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <label for="form-title">{{ t "form.category.label.title" }}</label>

+ 1 - 1
internal/template/templates/views/create_user.html

@@ -10,7 +10,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <label for="form-username">{{ t "form.user.label.username" }}</label>

+ 1 - 1
internal/template/templates/views/edit_category.html

@@ -20,7 +20,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <label for="form-title">{{ t "form.category.label.title" }}</label>

+ 1 - 1
internal/template/templates/views/edit_feed.html

@@ -37,7 +37,7 @@
         <input type="hidden" name="csrf" value="{{ .csrf }}">
 
         {{ if .errorMessage }}
-            <div class="alert alert-error">{{ t .errorMessage }}</div>
+            <div class="alert alert-error">{{ .errorMessage }}</div>
         {{ end }}
 
         <fieldset>

+ 1 - 1
internal/template/templates/views/edit_user.html

@@ -10,7 +10,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <label for="form-username">{{ t "form.user.label.username" }}</label>

+ 1 - 1
internal/template/templates/views/import.html

@@ -7,7 +7,7 @@
 </section>
 
 {{ if .errorMessage }}
-    <div class="alert alert-error">{{ t .errorMessage }}</div>
+    <div class="alert alert-error">{{ .errorMessage }}</div>
 {{ end }}
 
 <form action="{{ route "uploadOPML" }}" method="post" enctype="multipart/form-data">

+ 1 - 1
internal/template/templates/views/integrations.html

@@ -10,7 +10,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <details {{ if .form.AppriseEnabled }}open{{ end }}>

+ 1 - 1
internal/template/templates/views/login.html

@@ -6,7 +6,7 @@
         <input type="hidden" name="csrf" value="{{ .csrf }}">
 
         {{ if .errorMessage }}
-            <div class="alert alert-error">{{ t .errorMessage }}</div>
+            <div class="alert alert-error">{{ .errorMessage }}</div>
         {{ end }}
 
         <label for="form-username">{{ t "form.user.label.username" }}</label>

+ 1 - 1
internal/template/templates/views/settings.html

@@ -10,7 +10,7 @@
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
     {{ if .errorMessage }}
-        <div class="alert alert-error">{{ t .errorMessage }}</div>
+        <div class="alert alert-error">{{ .errorMessage }}</div>
     {{ end }}
 
     <fieldset>

+ 4 - 3
internal/ui/api_key_save.go

@@ -9,6 +9,7 @@ import (
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/ui/form"
 	"miniflux.app/v2/internal/ui/session"
@@ -32,14 +33,14 @@ func (h *handler) saveAPIKey(w http.ResponseWriter, r *http.Request) {
 	view.Set("countUnread", h.store.CountUnreadEntries(user.ID))
 	view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
 
-	if err := apiKeyForm.Validate(); err != nil {
-		view.Set("errorMessage", err.Error())
+	if validationErr := apiKeyForm.Validate(); validationErr != nil {
+		view.Set("errorMessage", validationErr.Translate(user.Language))
 		html.OK(w, r, view.Render("create_api_key"))
 		return
 	}
 
 	if h.store.APIKeyExists(user.ID, apiKeyForm.Description) {
-		view.Set("errorMessage", "error.api_key_already_exists")
+		view.Set("errorMessage", locale.NewLocalizedError("error.api_key_already_exists").Translate(user.Language))
 		html.OK(w, r, view.Render("create_api_key"))
 		return
 	}

+ 1 - 1
internal/ui/category_save.go

@@ -36,7 +36,7 @@ func (h *handler) saveCategory(w http.ResponseWriter, r *http.Request) {
 	categoryRequest := &model.CategoryRequest{Title: categoryForm.Title}
 
 	if validationErr := validator.ValidateCategoryCreation(h.store, loggedUser.ID, categoryRequest); validationErr != nil {
-		view.Set("errorMessage", validationErr.TranslationKey)
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("create_category"))
 		return
 	}

+ 1 - 1
internal/ui/category_update.go

@@ -52,7 +52,7 @@ func (h *handler) updateCategory(w http.ResponseWriter, r *http.Request) {
 	}
 
 	if validationErr := validator.ValidateCategoryModification(h.store, loggedUser.ID, category.ID, categoryRequest); validationErr != nil {
-		view.Set("errorMessage", validationErr.TranslationKey)
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("create_category"))
 		return
 	}

+ 1 - 1
internal/ui/feed_update.go

@@ -66,7 +66,7 @@ func (h *handler) updateFeed(w http.ResponseWriter, r *http.Request) {
 	}
 
 	if validationErr := validator.ValidateFeedModification(h.store, loggedUser.ID, feedModificationRequest); validationErr != nil {
-		view.Set("errorMessage", validationErr.TranslationKey)
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("edit_feed"))
 		return
 	}

+ 3 - 3
internal/ui/form/api_key.go

@@ -6,7 +6,7 @@ package form // import "miniflux.app/v2/internal/ui/form"
 import (
 	"net/http"
 
-	"miniflux.app/v2/internal/errors"
+	"miniflux.app/v2/internal/locale"
 )
 
 // APIKeyForm represents the API Key form.
@@ -15,9 +15,9 @@ type APIKeyForm struct {
 }
 
 // Validate makes sure the form values are valid.
-func (a APIKeyForm) Validate() error {
+func (a APIKeyForm) Validate() *locale.LocalizedError {
 	if a.Description == "" {
-		return errors.NewLocalizedError("error.fields_mandatory")
+		return locale.NewLocalizedError("error.fields_mandatory")
 	}
 
 	return nil

+ 3 - 3
internal/ui/form/auth.go

@@ -7,7 +7,7 @@ import (
 	"net/http"
 	"strings"
 
-	"miniflux.app/v2/internal/errors"
+	"miniflux.app/v2/internal/locale"
 )
 
 // AuthForm represents the authentication form.
@@ -17,9 +17,9 @@ type AuthForm struct {
 }
 
 // Validate makes sure the form values are valid.
-func (a AuthForm) Validate() error {
+func (a AuthForm) Validate() *locale.LocalizedError {
 	if a.Username == "" || a.Password == "" {
-		return errors.NewLocalizedError("error.fields_mandatory")
+		return locale.NewLocalizedError("error.fields_mandatory")
 	}
 
 	return nil

+ 5 - 5
internal/ui/form/settings.go

@@ -7,7 +7,7 @@ import (
 	"net/http"
 	"strconv"
 
-	"miniflux.app/v2/internal/errors"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 )
 
@@ -64,13 +64,13 @@ func (s *SettingsForm) Merge(user *model.User) *model.User {
 }
 
 // Validate makes sure the form values are valid.
-func (s *SettingsForm) Validate() error {
+func (s *SettingsForm) Validate() *locale.LocalizedError {
 	if s.Username == "" || s.Theme == "" || s.Language == "" || s.Timezone == "" || s.EntryDirection == "" || s.DisplayMode == "" || s.DefaultHomePage == "" {
-		return errors.NewLocalizedError("error.settings_mandatory_fields")
+		return locale.NewLocalizedError("error.settings_mandatory_fields")
 	}
 
 	if s.CJKReadingSpeed <= 0 || s.DefaultReadingSpeed <= 0 {
-		return errors.NewLocalizedError("error.settings_reading_speed_is_positive")
+		return locale.NewLocalizedError("error.settings_reading_speed_is_positive")
 	}
 
 	if s.Confirmation == "" {
@@ -80,7 +80,7 @@ func (s *SettingsForm) Validate() error {
 		s.Password = ""
 	} else if s.Password != "" {
 		if s.Password != s.Confirmation {
-			return errors.NewLocalizedError("error.different_passwords")
+			return locale.NewLocalizedError("error.different_passwords")
 		}
 	}
 

+ 8 - 8
internal/ui/form/subscription.go

@@ -7,7 +7,7 @@ import (
 	"net/http"
 	"strconv"
 
-	"miniflux.app/v2/internal/errors"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/validator"
 )
 
@@ -29,26 +29,26 @@ type SubscriptionForm struct {
 	UrlRewriteRules             string
 }
 
-// Validate makes sure the form values are valid.
-func (s *SubscriptionForm) Validate() error {
+// Validate makes sure the form values locale.are valid.
+func (s *SubscriptionForm) Validate() *locale.LocalizedError {
 	if s.URL == "" || s.CategoryID == 0 {
-		return errors.NewLocalizedError("error.feed_mandatory_fields")
+		return locale.NewLocalizedError("error.feed_mandatory_fields")
 	}
 
 	if !validator.IsValidURL(s.URL) {
-		return errors.NewLocalizedError("error.invalid_feed_url")
+		return locale.NewLocalizedError("error.invalid_feed_url")
 	}
 
 	if !validator.IsValidRegex(s.BlocklistRules) {
-		return errors.NewLocalizedError("error.feed_invalid_blocklist_rule")
+		return locale.NewLocalizedError("error.feed_invalid_blocklist_rule")
 	}
 
 	if !validator.IsValidRegex(s.KeeplistRules) {
-		return errors.NewLocalizedError("error.feed_invalid_keeplist_rule")
+		return locale.NewLocalizedError("error.feed_invalid_keeplist_rule")
 	}
 
 	if !validator.IsValidRegex(s.UrlRewriteRules) {
-		return errors.NewLocalizedError("error.feed_invalid_urlrewrite_rule")
+		return locale.NewLocalizedError("error.feed_invalid_urlrewrite_rule")
 	}
 
 	return nil

+ 8 - 8
internal/ui/form/user.go

@@ -6,7 +6,7 @@ package form // import "miniflux.app/v2/internal/ui/form"
 import (
 	"net/http"
 
-	"miniflux.app/v2/internal/errors"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 )
 
@@ -19,31 +19,31 @@ type UserForm struct {
 }
 
 // ValidateCreation validates user creation.
-func (u UserForm) ValidateCreation() error {
+func (u UserForm) ValidateCreation() *locale.LocalizedError {
 	if u.Username == "" || u.Password == "" || u.Confirmation == "" {
-		return errors.NewLocalizedError("error.fields_mandatory")
+		return locale.NewLocalizedError("error.fields_mandatory")
 	}
 
 	if u.Password != u.Confirmation {
-		return errors.NewLocalizedError("error.different_passwords")
+		return locale.NewLocalizedError("error.different_passwords")
 	}
 
 	return nil
 }
 
 // ValidateModification validates user modification.
-func (u UserForm) ValidateModification() error {
+func (u UserForm) ValidateModification() *locale.LocalizedError {
 	if u.Username == "" {
-		return errors.NewLocalizedError("error.user_mandatory_fields")
+		return locale.NewLocalizedError("error.user_mandatory_fields")
 	}
 
 	if u.Password != "" {
 		if u.Password != u.Confirmation {
-			return errors.NewLocalizedError("error.different_passwords")
+			return locale.NewLocalizedError("error.different_passwords")
 		}
 
 		if len(u.Password) < 6 {
-			return errors.NewLocalizedError("error.password_min_length")
+			return locale.NewLocalizedError("error.password_min_length")
 		}
 	}
 

+ 5 - 3
internal/ui/login_check.go

@@ -12,6 +12,7 @@ import (
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/ui/form"
 	"miniflux.app/v2/internal/ui/session"
 	"miniflux.app/v2/internal/ui/view"
@@ -23,16 +24,17 @@ func (h *handler) checkLogin(w http.ResponseWriter, r *http.Request) {
 	authForm := form.NewAuthForm(r)
 
 	view := view.New(h.tpl, r, sess)
-	view.Set("errorMessage", "error.bad_credentials")
+	view.Set("errorMessage", locale.NewLocalizedError("error.bad_credentials").Translate(request.UserLanguage(r)))
 	view.Set("form", authForm)
 
-	if err := authForm.Validate(); err != nil {
+	if validationErr := authForm.Validate(); validationErr != nil {
+		translatedErrorMessage := validationErr.Translate(request.UserLanguage(r))
 		slog.Warn("Validation error during login check",
 			slog.Bool("authentication_failed", true),
 			slog.String("client_ip", clientIP),
 			slog.String("user_agent", r.UserAgent()),
 			slog.String("username", authForm.Username),
-			slog.Any("error", err),
+			slog.Any("error", translatedErrorMessage),
 		)
 		html.OK(w, r, view.Render("login"))
 		return

+ 18 - 10
internal/ui/opml_upload.go

@@ -6,12 +6,14 @@ package ui // import "miniflux.app/v2/internal/ui"
 import (
 	"log/slog"
 	"net/http"
+	"strings"
 
 	"miniflux.app/v2/internal/config"
-	"miniflux.app/v2/internal/http/client"
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
+	"miniflux.app/v2/internal/reader/fetcher"
 	"miniflux.app/v2/internal/reader/opml"
 	"miniflux.app/v2/internal/ui/session"
 	"miniflux.app/v2/internal/ui/view"
@@ -51,7 +53,7 @@ func (h *handler) uploadOPML(w http.ResponseWriter, r *http.Request) {
 	view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
 
 	if fileHeader.Size == 0 {
-		view.Set("errorMessage", "error.empty_file")
+		view.Set("errorMessage", locale.NewLocalizedError("error.empty_file").Translate(user.Language))
 		html.OK(w, r, view.Render("import"))
 		return
 	}
@@ -73,15 +75,15 @@ func (h *handler) fetchOPML(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	url := r.FormValue("url")
-	if url == "" {
+	opmlFileURL := strings.TrimSpace(r.FormValue("url"))
+	if opmlFileURL == "" {
 		html.Redirect(w, r, route.Path(h.router, "import"))
 		return
 	}
 
 	slog.Info("Fetching OPML file remotely",
 		slog.Int64("user_id", loggedUserID),
-		slog.String("opml_file_url", url),
+		slog.String("opml_file_url", opmlFileURL),
 	)
 
 	sess := session.New(h.store, request.SessionID(r))
@@ -91,15 +93,21 @@ func (h *handler) fetchOPML(w http.ResponseWriter, r *http.Request) {
 	view.Set("countUnread", h.store.CountUnreadEntries(user.ID))
 	view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
 
-	clt := client.NewClientWithConfig(url, config.Opts)
-	resp, err := clt.Get()
-	if err != nil {
-		view.Set("errorMessage", err)
+	requestBuilder := fetcher.NewRequestBuilder()
+	requestBuilder.WithTimeout(config.Opts.HTTPClientTimeout())
+	requestBuilder.WithProxy(config.Opts.HTTPClientProxy())
+
+	responseHandler := fetcher.NewResponseHandler(requestBuilder.ExecuteRequest(opmlFileURL))
+	defer responseHandler.Close()
+
+	if localizedError := responseHandler.LocalizedError(); localizedError != nil {
+		slog.Warn("Unable to fetch OPML file", slog.String("opml_file_url", opmlFileURL), slog.Any("error", localizedError.Error()))
+		view.Set("errorMessage", localizedError.Translate(user.Language))
 		html.OK(w, r, view.Render("import"))
 		return
 	}
 
-	if impErr := opml.NewHandler(h.store).Import(user.ID, resp.Body); impErr != nil {
+	if impErr := opml.NewHandler(h.store).Import(user.ID, responseHandler.Body(config.Opts.HTTPClientMaxBodySize())); impErr != nil {
 		view.Set("errorMessage", impErr)
 		html.OK(w, r, view.Render("import"))
 		return

+ 3 - 3
internal/ui/settings_update.go

@@ -44,8 +44,8 @@ func (h *handler) updateSettings(w http.ResponseWriter, r *http.Request) {
 	view.Set("countUnread", h.store.CountUnreadEntries(loggedUser.ID))
 	view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(loggedUser.ID))
 
-	if err := settingsForm.Validate(); err != nil {
-		view.Set("errorMessage", err.Error())
+	if validationErr := settingsForm.Validate(); validationErr != nil {
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("settings"))
 		return
 	}
@@ -66,7 +66,7 @@ func (h *handler) updateSettings(w http.ResponseWriter, r *http.Request) {
 	}
 
 	if validationErr := validator.ValidateUserModification(h.store, loggedUser.ID, userModificationRequest); validationErr != nil {
-		view.Set("errorMessage", validationErr.TranslationKey)
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("settings"))
 		return
 	}

+ 5 - 5
internal/ui/subscription_choose.go

@@ -41,14 +41,14 @@ func (h *handler) showChooseSubscriptionPage(w http.ResponseWriter, r *http.Requ
 	view.Set("defaultUserAgent", config.Opts.HTTPClientUserAgent())
 
 	subscriptionForm := form.NewSubscriptionForm(r)
-	if err := subscriptionForm.Validate(); err != nil {
+	if validationErr := subscriptionForm.Validate(); validationErr != nil {
 		view.Set("form", subscriptionForm)
-		view.Set("errorMessage", err.Error())
+		view.Set("errorMessage", validationErr.Translate(user.Language))
 		html.OK(w, r, view.Render("add_subscription"))
 		return
 	}
 
-	feed, err := feedHandler.CreateFeed(h.store, user.ID, &model.FeedCreationRequest{
+	feed, localizedError := feedHandler.CreateFeed(h.store, user.ID, &model.FeedCreationRequest{
 		CategoryID:                  subscriptionForm.CategoryID,
 		FeedURL:                     subscriptionForm.URL,
 		Crawler:                     subscriptionForm.Crawler,
@@ -64,9 +64,9 @@ func (h *handler) showChooseSubscriptionPage(w http.ResponseWriter, r *http.Requ
 		UrlRewriteRules:             subscriptionForm.UrlRewriteRules,
 		FetchViaProxy:               subscriptionForm.FetchViaProxy,
 	})
-	if err != nil {
+	if localizedError != nil {
 		view.Set("form", subscriptionForm)
-		view.Set("errorMessage", err)
+		view.Set("errorMessage", localizedError.Translate(user.Language))
 		html.OK(w, r, view.Render("add_subscription"))
 		return
 	}

+ 10 - 9
internal/ui/subscription_submit.go

@@ -10,6 +10,7 @@ import (
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 	feedHandler "miniflux.app/v2/internal/reader/handler"
 	"miniflux.app/v2/internal/reader/subscription"
@@ -43,9 +44,9 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 	v.Set("hasProxyConfigured", config.Opts.HasHTTPClientProxyConfigured())
 
 	subscriptionForm := form.NewSubscriptionForm(r)
-	if err := subscriptionForm.Validate(); err != nil {
+	if validationErr := subscriptionForm.Validate(); validationErr != nil {
 		v.Set("form", subscriptionForm)
-		v.Set("errorMessage", err.Error())
+		v.Set("errorMessage", validationErr.Translate(user.Language))
 		html.OK(w, r, v.Render("add_subscription"))
 		return
 	}
@@ -55,7 +56,7 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 		rssbridgeURL = intg.RSSBridgeURL
 	}
 
-	subscriptions, findErr := subscription.FindSubscriptions(
+	subscriptions, localizedError := subscription.FindSubscriptions(
 		subscriptionForm.URL,
 		subscriptionForm.UserAgent,
 		subscriptionForm.Cookie,
@@ -65,9 +66,9 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 		subscriptionForm.AllowSelfSignedCertificates,
 		rssbridgeURL,
 	)
-	if findErr != nil {
+	if localizedError != nil {
 		v.Set("form", subscriptionForm)
-		v.Set("errorMessage", findErr)
+		v.Set("errorMessage", localizedError.Translate(user.Language))
 		html.OK(w, r, v.Render("add_subscription"))
 		return
 	}
@@ -76,10 +77,10 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 	switch {
 	case n == 0:
 		v.Set("form", subscriptionForm)
-		v.Set("errorMessage", "error.subscription_not_found")
+		v.Set("errorMessage", locale.NewLocalizedError("error.subscription_not_found").Translate(user.Language))
 		html.OK(w, r, v.Render("add_subscription"))
 	case n == 1:
-		feed, err := feedHandler.CreateFeed(h.store, user.ID, &model.FeedCreationRequest{
+		feed, localizedError := feedHandler.CreateFeed(h.store, user.ID, &model.FeedCreationRequest{
 			CategoryID:                  subscriptionForm.CategoryID,
 			FeedURL:                     subscriptions[0].URL,
 			Crawler:                     subscriptionForm.Crawler,
@@ -95,9 +96,9 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 			UrlRewriteRules:             subscriptionForm.UrlRewriteRules,
 			FetchViaProxy:               subscriptionForm.FetchViaProxy,
 		})
-		if err != nil {
+		if localizedError != nil {
 			v.Set("form", subscriptionForm)
-			v.Set("errorMessage", err)
+			v.Set("errorMessage", localizedError.Translate(user.Language))
 			html.OK(w, r, v.Render("add_subscription"))
 			return
 		}

+ 5 - 4
internal/ui/user_save.go

@@ -9,6 +9,7 @@ import (
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/ui/form"
 	"miniflux.app/v2/internal/ui/session"
@@ -38,14 +39,14 @@ func (h *handler) saveUser(w http.ResponseWriter, r *http.Request) {
 	view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
 	view.Set("form", userForm)
 
-	if err := userForm.ValidateCreation(); err != nil {
-		view.Set("errorMessage", err.Error())
+	if validationErr := userForm.ValidateCreation(); validationErr != nil {
+		view.Set("errorMessage", validationErr.Translate(user.Language))
 		html.OK(w, r, view.Render("create_user"))
 		return
 	}
 
 	if h.store.UserExists(userForm.Username) {
-		view.Set("errorMessage", "error.user_already_exists")
+		view.Set("errorMessage", locale.NewLocalizedError("error.user_already_exists").Translate(user.Language))
 		html.OK(w, r, view.Render("create_user"))
 		return
 	}
@@ -57,7 +58,7 @@ func (h *handler) saveUser(w http.ResponseWriter, r *http.Request) {
 	}
 
 	if validationErr := validator.ValidateUserCreationWithPassword(h.store, userCreationRequest); validationErr != nil {
-		view.Set("errorMessage", validationErr.TranslationKey)
+		view.Set("errorMessage", validationErr.Translate(user.Language))
 		html.OK(w, r, view.Render("create_user"))
 		return
 	}

+ 4 - 3
internal/ui/user_update.go

@@ -9,6 +9,7 @@ import (
 	"miniflux.app/v2/internal/http/request"
 	"miniflux.app/v2/internal/http/response/html"
 	"miniflux.app/v2/internal/http/route"
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/ui/form"
 	"miniflux.app/v2/internal/ui/session"
 	"miniflux.app/v2/internal/ui/view"
@@ -49,14 +50,14 @@ func (h *handler) updateUser(w http.ResponseWriter, r *http.Request) {
 	view.Set("selected_user", selectedUser)
 	view.Set("form", userForm)
 
-	if err := userForm.ValidateModification(); err != nil {
-		view.Set("errorMessage", err.Error())
+	if validationErr := userForm.ValidateModification(); validationErr != nil {
+		view.Set("errorMessage", validationErr.Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("edit_user"))
 		return
 	}
 
 	if h.store.AnotherUserExists(selectedUser.ID, userForm.Username) {
-		view.Set("errorMessage", "error.user_already_exists")
+		view.Set("errorMessage", locale.NewLocalizedError("error.user_already_exists").Translate(loggedUser.Language))
 		html.OK(w, r, view.Render("edit_user"))
 		return
 	}

+ 7 - 6
internal/validator/category.go

@@ -4,31 +4,32 @@
 package validator // import "miniflux.app/v2/internal/validator"
 
 import (
+	"miniflux.app/v2/internal/locale"
 	"miniflux.app/v2/internal/model"
 	"miniflux.app/v2/internal/storage"
 )
 
 // ValidateCategoryCreation validates category creation.
-func ValidateCategoryCreation(store *storage.Storage, userID int64, request *model.CategoryRequest) *ValidationError {
+func ValidateCategoryCreation(store *storage.Storage, userID int64, request *model.CategoryRequest) *locale.LocalizedError {
 	if request.Title == "" {
-		return NewValidationError("error.title_required")
+		return locale.NewLocalizedError("error.title_required")
 	}
 
 	if store.CategoryTitleExists(userID, request.Title) {
-		return NewValidationError("error.category_already_exists")
+		return locale.NewLocalizedError("error.category_already_exists")
 	}
 
 	return nil
 }
 
 // ValidateCategoryModification validates category modification.
-func ValidateCategoryModification(store *storage.Storage, userID, categoryID int64, request *model.CategoryRequest) *ValidationError {
+func ValidateCategoryModification(store *storage.Storage, userID, categoryID int64, request *model.CategoryRequest) *locale.LocalizedError {
 	if request.Title == "" {
-		return NewValidationError("error.title_required")
+		return locale.NewLocalizedError("error.title_required")
 	}
 
 	if store.AnotherCategoryExists(userID, categoryID, request.Title) {
-		return NewValidationError("error.category_already_exists")
+		return locale.NewLocalizedError("error.category_already_exists")
 	}
 
 	return nil

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно