{"version":3,"sources":["node_modules/@angular/common/fesm2022/http.mjs","node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs"],"sourcesContent":["/**\n * @license Angular v19.1.3\n * (c) 2010-2024 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport * as i0 from '@angular/core';\nimport { ɵRuntimeError, Injectable, InjectionToken, inject, NgZone, runInInjectionContext, ɵPendingTasksInternal, PLATFORM_ID, ɵConsole, ɵformatRuntimeError, Inject, makeEnvironmentProviders, NgModule, TransferState, makeStateKey, ɵperformanceMarkFeature, APP_BOOTSTRAP_LISTENER, ApplicationRef, ɵtruncateMiddle } from '@angular/core';\nimport { of, Observable, from } from 'rxjs';\nimport { concatMap, filter, map, finalize, switchMap, tap } from 'rxjs/operators';\nimport * as i1 from '@angular/common';\nimport { isPlatformServer, DOCUMENT, ɵparseCookieValue } from '@angular/common';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nclass HttpHandler {}\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nclass HttpBackend {}\n\n/**\n * Represents the header configuration options for an HTTP request.\n * Instances are immutable. Modifying methods return a cloned\n * instance with the change. The original object is never changed.\n *\n * @publicApi\n */\nclass HttpHeaders {\n /**\n * Internal map of lowercase header names to values.\n */\n // TODO(issue/24571): remove '!'.\n headers;\n /**\n * Internal map of lowercased header names to the normalized\n * form of the name (the form seen first).\n */\n normalizedNames = /*#__PURE__*/new Map();\n /**\n * Complete the lazy initialization of this object (needed before reading).\n */\n lazyInit;\n /**\n * Queued updates to be materialized the next initialization.\n */\n lazyUpdate = null;\n /** Constructs a new HTTP header object with the given values.*/\n constructor(headers) {\n if (!headers) {\n this.headers = new Map();\n } else if (typeof headers === 'string') {\n this.lazyInit = () => {\n this.headers = new Map();\n headers.split('\\n').forEach(line => {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const value = line.slice(index + 1).trim();\n this.addHeaderEntry(name, value);\n }\n });\n };\n } else if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n this.headers = new Map();\n headers.forEach((value, name) => {\n this.addHeaderEntry(name, value);\n });\n } else {\n this.lazyInit = () => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n assertValidHeaders(headers);\n }\n this.headers = new Map();\n Object.entries(headers).forEach(([name, values]) => {\n this.setHeaderEntries(name, values);\n });\n };\n }\n }\n /**\n * Checks for existence of a given header.\n *\n * @param name The header name to check for existence.\n *\n * @returns True if the header exists, false otherwise.\n */\n has(name) {\n this.init();\n return this.headers.has(name.toLowerCase());\n }\n /**\n * Retrieves the first value of a given header.\n *\n * @param name The header name.\n *\n * @returns The value string if the header exists, null otherwise\n */\n get(name) {\n this.init();\n const values = this.headers.get(name.toLowerCase());\n return values && values.length > 0 ? values[0] : null;\n }\n /**\n * Retrieves the names of the headers.\n *\n * @returns A list of header names.\n */\n keys() {\n this.init();\n return Array.from(this.normalizedNames.values());\n }\n /**\n * Retrieves a list of values for a given header.\n *\n * @param name The header name from which to retrieve values.\n *\n * @returns A string of values if the header exists, null otherwise.\n */\n getAll(name) {\n this.init();\n return this.headers.get(name.toLowerCase()) || null;\n }\n /**\n * Appends a new value to the existing set of values for a header\n * and returns them in a clone of the original instance.\n *\n * @param name The header name for which to append the values.\n * @param value The value to append.\n *\n * @returns A clone of the HTTP headers object with the value appended to the given header.\n */\n append(name, value) {\n return this.clone({\n name,\n value,\n op: 'a'\n });\n }\n /**\n * Sets or modifies a value for a given header in a clone of the original instance.\n * If the header already exists, its value is replaced with the given value\n * in the returned object.\n *\n * @param name The header name.\n * @param value The value or values to set or override for the given header.\n *\n * @returns A clone of the HTTP headers object with the newly set header value.\n */\n set(name, value) {\n return this.clone({\n name,\n value,\n op: 's'\n });\n }\n /**\n * Deletes values for a given header in a clone of the original instance.\n *\n * @param name The header name.\n * @param value The value or values to delete for the given header.\n *\n * @returns A clone of the HTTP headers object with the given value deleted.\n */\n delete(name, value) {\n return this.clone({\n name,\n value,\n op: 'd'\n });\n }\n maybeSetNormalizedName(name, lcName) {\n if (!this.normalizedNames.has(lcName)) {\n this.normalizedNames.set(lcName, name);\n }\n }\n init() {\n if (!!this.lazyInit) {\n if (this.lazyInit instanceof HttpHeaders) {\n this.copyFrom(this.lazyInit);\n } else {\n this.lazyInit();\n }\n this.lazyInit = null;\n if (!!this.lazyUpdate) {\n this.lazyUpdate.forEach(update => this.applyUpdate(update));\n this.lazyUpdate = null;\n }\n }\n }\n copyFrom(other) {\n other.init();\n Array.from(other.headers.keys()).forEach(key => {\n this.headers.set(key, other.headers.get(key));\n this.normalizedNames.set(key, other.normalizedNames.get(key));\n });\n }\n clone(update) {\n const clone = new HttpHeaders();\n clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;\n clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n return clone;\n }\n applyUpdate(update) {\n const key = update.name.toLowerCase();\n switch (update.op) {\n case 'a':\n case 's':\n let value = update.value;\n if (typeof value === 'string') {\n value = [value];\n }\n if (value.length === 0) {\n return;\n }\n this.maybeSetNormalizedName(update.name, key);\n const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n base.push(...value);\n this.headers.set(key, base);\n break;\n case 'd':\n const toDelete = update.value;\n if (!toDelete) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n let existing = this.headers.get(key);\n if (!existing) {\n return;\n }\n existing = existing.filter(value => toDelete.indexOf(value) === -1);\n if (existing.length === 0) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n this.headers.set(key, existing);\n }\n }\n break;\n }\n }\n addHeaderEntry(name, value) {\n const key = name.toLowerCase();\n this.maybeSetNormalizedName(name, key);\n if (this.headers.has(key)) {\n this.headers.get(key).push(value);\n } else {\n this.headers.set(key, [value]);\n }\n }\n setHeaderEntries(name, values) {\n const headerValues = (Array.isArray(values) ? values : [values]).map(value => value.toString());\n const key = name.toLowerCase();\n this.headers.set(key, headerValues);\n this.maybeSetNormalizedName(name, key);\n }\n /**\n * @internal\n */\n forEach(fn) {\n this.init();\n Array.from(this.normalizedNames.keys()).forEach(key => fn(this.normalizedNames.get(key), this.headers.get(key)));\n }\n}\n/**\n * Verifies that the headers object has the right shape: the values\n * must be either strings, numbers or arrays. Throws an error if an invalid\n * header value is present.\n */\nfunction assertValidHeaders(headers) {\n for (const [key, value] of Object.entries(headers)) {\n if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {\n throw new Error(`Unexpected value of the \\`${key}\\` header provided. ` + `Expecting either a string, a number or an array, but got: \\`${value}\\`.`);\n }\n }\n}\n\n/**\n * Provides encoding and decoding of URL parameter and query-string values.\n *\n * Serializes and parses URL parameter keys and values to encode and decode them.\n * If you pass URL query parameters without encoding,\n * the query parameters can be misinterpreted at the receiving end.\n *\n *\n * @publicApi\n */\nclass HttpUrlEncodingCodec {\n /**\n * Encodes a key name for a URL parameter or query-string.\n * @param key The key name.\n * @returns The encoded key name.\n */\n encodeKey(key) {\n return standardEncoding(key);\n }\n /**\n * Encodes the value of a URL parameter or query-string.\n * @param value The value.\n * @returns The encoded value.\n */\n encodeValue(value) {\n return standardEncoding(value);\n }\n /**\n * Decodes an encoded URL parameter or query-string key.\n * @param key The encoded key name.\n * @returns The decoded key name.\n */\n decodeKey(key) {\n return decodeURIComponent(key);\n }\n /**\n * Decodes an encoded URL parameter or query-string value.\n * @param value The encoded value.\n * @returns The decoded value.\n */\n decodeValue(value) {\n return decodeURIComponent(value);\n }\n}\nfunction paramParser(rawParams, codec) {\n const map = new Map();\n if (rawParams.length > 0) {\n // The `window.location.search` can be used while creating an instance of the `HttpParams` class\n // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`\n // may start with the `?` char, so we strip it if it's present.\n const params = rawParams.replace(/^\\?/, '').split('&');\n params.forEach(param => {\n const eqIdx = param.indexOf('=');\n const [key, val] = eqIdx == -1 ? [codec.decodeKey(param), ''] : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n const list = map.get(key) || [];\n list.push(val);\n map.set(key, list);\n });\n }\n return map;\n}\n/**\n * Encode input string with standard encodeURIComponent and then un-encode specific characters.\n */\nconst STANDARD_ENCODING_REGEX = /%(\\d[a-f0-9])/gi;\nconst STANDARD_ENCODING_REPLACEMENTS = {\n '40': '@',\n '3A': ':',\n '24': '$',\n '2C': ',',\n '3B': ';',\n '3D': '=',\n '3F': '?',\n '2F': '/'\n};\nfunction standardEncoding(v) {\n return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);\n}\nfunction valueToString(value) {\n return `${value}`;\n}\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable; all mutation operations return a new instance.\n *\n * @publicApi\n */\nclass HttpParams {\n map;\n encoder;\n updates = null;\n cloneFrom = null;\n constructor(options = {}) {\n this.encoder = options.encoder || new HttpUrlEncodingCodec();\n if (options.fromString) {\n if (options.fromObject) {\n throw new ɵRuntimeError(2805 /* RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT */, ngDevMode && 'Cannot specify both fromString and fromObject.');\n }\n this.map = paramParser(options.fromString, this.encoder);\n } else if (!!options.fromObject) {\n this.map = new Map();\n Object.keys(options.fromObject).forEach(key => {\n const value = options.fromObject[key];\n // convert the values to strings\n const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];\n this.map.set(key, values);\n });\n } else {\n this.map = null;\n }\n }\n /**\n * Reports whether the body includes one or more values for a given parameter.\n * @param param The parameter name.\n * @returns True if the parameter has one or more values,\n * false if it has no value or is not present.\n */\n has(param) {\n this.init();\n return this.map.has(param);\n }\n /**\n * Retrieves the first value for a parameter.\n * @param param The parameter name.\n * @returns The first value of the given parameter,\n * or `null` if the parameter is not present.\n */\n get(param) {\n this.init();\n const res = this.map.get(param);\n return !!res ? res[0] : null;\n }\n /**\n * Retrieves all values for a parameter.\n * @param param The parameter name.\n * @returns All values in a string array,\n * or `null` if the parameter not present.\n */\n getAll(param) {\n this.init();\n return this.map.get(param) || null;\n }\n /**\n * Retrieves all the parameters for this body.\n * @returns The parameter names in a string array.\n */\n keys() {\n this.init();\n return Array.from(this.map.keys());\n }\n /**\n * Appends a new value to existing values for a parameter.\n * @param param The parameter name.\n * @param value The new value to add.\n * @return A new body with the appended value.\n */\n append(param, value) {\n return this.clone({\n param,\n value,\n op: 'a'\n });\n }\n /**\n * Constructs a new body with appended values for the given parameter name.\n * @param params parameters and values\n * @return A new body with the new value.\n */\n appendAll(params) {\n const updates = [];\n Object.keys(params).forEach(param => {\n const value = params[param];\n if (Array.isArray(value)) {\n value.forEach(_value => {\n updates.push({\n param,\n value: _value,\n op: 'a'\n });\n });\n } else {\n updates.push({\n param,\n value: value,\n op: 'a'\n });\n }\n });\n return this.clone(updates);\n }\n /**\n * Replaces the value for a parameter.\n * @param param The parameter name.\n * @param value The new value.\n * @return A new body with the new value.\n */\n set(param, value) {\n return this.clone({\n param,\n value,\n op: 's'\n });\n }\n /**\n * Removes a given value or all values from a parameter.\n * @param param The parameter name.\n * @param value The value to remove, if provided.\n * @return A new body with the given value removed, or with all values\n * removed if no value is specified.\n */\n delete(param, value) {\n return this.clone({\n param,\n value,\n op: 'd'\n });\n }\n /**\n * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are\n * separated by `&`s.\n */\n toString() {\n this.init();\n return this.keys().map(key => {\n const eKey = this.encoder.encodeKey(key);\n // `a: ['1']` produces `'a=1'`\n // `b: []` produces `''`\n // `c: ['1', '2']` produces `'c=1&c=2'`\n return this.map.get(key).map(value => eKey + '=' + this.encoder.encodeValue(value)).join('&');\n })\n // filter out empty values because `b: []` produces `''`\n // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't\n .filter(param => param !== '').join('&');\n }\n clone(update) {\n const clone = new HttpParams({\n encoder: this.encoder\n });\n clone.cloneFrom = this.cloneFrom || this;\n clone.updates = (this.updates || []).concat(update);\n return clone;\n }\n init() {\n if (this.map === null) {\n this.map = new Map();\n }\n if (this.cloneFrom !== null) {\n this.cloneFrom.init();\n this.cloneFrom.keys().forEach(key => this.map.set(key, this.cloneFrom.map.get(key)));\n this.updates.forEach(update => {\n switch (update.op) {\n case 'a':\n case 's':\n const base = (update.op === 'a' ? this.map.get(update.param) : undefined) || [];\n base.push(valueToString(update.value));\n this.map.set(update.param, base);\n break;\n case 'd':\n if (update.value !== undefined) {\n let base = this.map.get(update.param) || [];\n const idx = base.indexOf(valueToString(update.value));\n if (idx !== -1) {\n base.splice(idx, 1);\n }\n if (base.length > 0) {\n this.map.set(update.param, base);\n } else {\n this.map.delete(update.param);\n }\n } else {\n this.map.delete(update.param);\n break;\n }\n }\n });\n this.cloneFrom = this.updates = null;\n }\n }\n}\n\n/**\n * A token used to manipulate and access values stored in `HttpContext`.\n *\n * @publicApi\n */\nclass HttpContextToken {\n defaultValue;\n constructor(defaultValue) {\n this.defaultValue = defaultValue;\n }\n}\n/**\n * Http context stores arbitrary user defined values and ensures type safety without\n * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.\n *\n * This context is mutable and is shared between cloned requests unless explicitly specified.\n *\n * @usageNotes\n *\n * ### Usage Example\n *\n * ```ts\n * // inside cache.interceptors.ts\n * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);\n *\n * export class CacheInterceptor implements HttpInterceptor {\n *\n * intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {\n * if (req.context.get(IS_CACHE_ENABLED) === true) {\n * return ...;\n * }\n * return delegate.handle(req);\n * }\n * }\n *\n * // inside a service\n *\n * this.httpClient.get('/api/weather', {\n * context: new HttpContext().set(IS_CACHE_ENABLED, true)\n * }).subscribe(...);\n * ```\n *\n * @publicApi\n */\nclass HttpContext {\n map = /*#__PURE__*/new Map();\n /**\n * Store a value in the context. If a value is already present it will be overwritten.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n * @param value The value to store.\n *\n * @returns A reference to itself for easy chaining.\n */\n set(token, value) {\n this.map.set(token, value);\n return this;\n }\n /**\n * Retrieve the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns The stored value or default if one is defined.\n */\n get(token) {\n if (!this.map.has(token)) {\n this.map.set(token, token.defaultValue());\n }\n return this.map.get(token);\n }\n /**\n * Delete the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns A reference to itself for easy chaining.\n */\n delete(token) {\n this.map.delete(token);\n return this;\n }\n /**\n * Checks for existence of a given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns True if the token exists, false otherwise.\n */\n has(token) {\n return this.map.has(token);\n }\n /**\n * @returns a list of tokens currently stored in the context.\n */\n keys() {\n return this.map.keys();\n }\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method) {\n switch (method) {\n case 'DELETE':\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n case 'JSONP':\n return false;\n default:\n return true;\n }\n}\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value) {\n return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value) {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n/**\n * Safely assert whether the given value is a URLSearchParams instance.\n *\n * In some execution environments URLSearchParams is not defined.\n */\nfunction isUrlSearchParams(value) {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n/**\n * `Content-Type` is an HTTP header used to indicate the media type\n * (also known as MIME type) of the resource being sent to the client\n * or received from the server.\n */\nconst CONTENT_TYPE_HEADER = 'Content-Type';\n/**\n * `X-Request-URL` is a custom HTTP header used in older browser versions,\n * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,\n * to include the full URL of the request in cross-origin requests.\n */\nconst X_REQUEST_URL_HEADER = 'X-Request-URL';\n/**\n * `text/plain` is a content type used to indicate that the content being\n * sent is plain text with no special formatting or structured data\n * like HTML, XML, or JSON.\n */\nconst TEXT_CONTENT_TYPE = 'text/plain';\n/**\n * `application/json` is a content type used to indicate that the content\n * being sent is in the JSON format.\n */\nconst JSON_CONTENT_TYPE = 'application/json';\n/**\n * `application/json, text/plain, *\\/*` is a content negotiation string often seen in the\n * Accept header of HTTP requests. It indicates the types of content the client is willing\n * to accept from the server, with a preference for `application/json` and `text/plain`,\n * but also accepting any other type (*\\/*).\n */\nconst ACCEPT_HEADER = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nclass HttpRequest {\n url;\n /**\n * The request body, or `null` if one isn't set.\n *\n * Bodies are not enforced to be immutable, as they can include a reference to any\n * user-defined data type. However, interceptors should take care to preserve\n * idempotence by treating them as such.\n */\n body = null;\n /**\n * Outgoing headers for this request.\n */\n // TODO(issue/24571): remove '!'.\n headers;\n /**\n * Shared and mutable context that can be used by interceptors\n */\n context;\n /**\n * Whether this request should be made in a way that exposes progress events.\n *\n * Progress events are expensive (change detection runs on each event) and so\n * they should only be requested if the consumer intends to monitor them.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n reportProgress = false;\n /**\n * Whether this request should be sent with outgoing credentials (cookies).\n */\n withCredentials = false;\n /**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\n responseType = 'json';\n /**\n * The outgoing HTTP request method.\n */\n method;\n /**\n * Outgoing URL parameters.\n *\n * To pass a string representation of HTTP parameters in the URL-query-string format,\n * the `HttpParamsOptions`' `fromString` may be used. For example:\n *\n * ```ts\n * new HttpParams({fromString: 'angular=awesome'})\n * ```\n */\n // TODO(issue/24571): remove '!'.\n params;\n /**\n * The outgoing URL with all URL parameters set.\n */\n urlWithParams;\n /**\n * The HttpTransferCache option for the request\n */\n transferCache;\n constructor(method, url, third, fourth) {\n this.url = url;\n this.method = method.toUpperCase();\n // Next, need to figure out which argument holds the HttpRequestInit\n // options, if any.\n let options;\n // Check whether a body argument is expected. The only valid way to omit\n // the body argument is to use a known no-body method like GET.\n if (mightHaveBody(this.method) || !!fourth) {\n // Body is the third argument, options are the fourth.\n this.body = third !== undefined ? third : null;\n options = fourth;\n } else {\n // No body required, options are the third argument. The body stays null.\n options = third;\n }\n // If options have been passed, interpret them.\n if (options) {\n // Normalize reportProgress and withCredentials.\n this.reportProgress = !!options.reportProgress;\n this.withCredentials = !!options.withCredentials;\n // Override default response type of 'json' if one is provided.\n if (!!options.responseType) {\n this.responseType = options.responseType;\n }\n // Override headers if they're provided.\n if (!!options.headers) {\n this.headers = options.headers;\n }\n if (!!options.context) {\n this.context = options.context;\n }\n if (!!options.params) {\n this.params = options.params;\n }\n // We do want to assign transferCache even if it's falsy (false is valid value)\n this.transferCache = options.transferCache;\n }\n // If no headers have been passed in, construct a new HttpHeaders instance.\n this.headers ??= new HttpHeaders();\n // If no context have been passed in, construct a new HttpContext instance.\n this.context ??= new HttpContext();\n // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n if (!this.params) {\n this.params = new HttpParams();\n this.urlWithParams = url;\n } else {\n // Encode the parameters to a string in preparation for inclusion in the URL.\n const params = this.params.toString();\n if (params.length === 0) {\n // No parameters, the visible URL is just the URL given at creation time.\n this.urlWithParams = url;\n } else {\n // Does the URL already have query parameters? Look for '?'.\n const qIdx = url.indexOf('?');\n // There are 3 cases to handle:\n // 1) No existing parameters -> append '?' followed by params.\n // 2) '?' exists and is followed by existing query string ->\n // append '&' followed by params.\n // 3) '?' exists at the end of the url -> append params directly.\n // This basically amounts to determining the character, if any, with\n // which to join the URL and parameters.\n const sep = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';\n this.urlWithParams = url + sep + params;\n }\n }\n }\n /**\n * Transform the free-form body into a serialized format suitable for\n * transmission to the server.\n */\n serializeBody() {\n // If no body is present, no need to serialize it.\n if (this.body === null) {\n return null;\n }\n // Check whether the body is already in a serialized form. If so,\n // it can just be returned directly.\n if (typeof this.body === 'string' || isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) || isUrlSearchParams(this.body)) {\n return this.body;\n }\n // Check whether the body is an instance of HttpUrlEncodedParams.\n if (this.body instanceof HttpParams) {\n return this.body.toString();\n }\n // Check whether the body is an object or array, and serialize with JSON if so.\n if (typeof this.body === 'object' || typeof this.body === 'boolean' || Array.isArray(this.body)) {\n return JSON.stringify(this.body);\n }\n // Fall back on toString() for everything else.\n return this.body.toString();\n }\n /**\n * Examine the body and attempt to infer an appropriate MIME type\n * for it.\n *\n * If no such type can be inferred, this method will return `null`.\n */\n detectContentTypeHeader() {\n // An empty body has no content type.\n if (this.body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (isFormData(this.body)) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (isBlob(this.body)) {\n return this.body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (isArrayBuffer(this.body)) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof this.body === 'string') {\n return TEXT_CONTENT_TYPE;\n }\n // `HttpUrlEncodedParams` has its own content-type.\n if (this.body instanceof HttpParams) {\n return 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n // Arrays, objects, boolean and numbers will be encoded as JSON.\n if (typeof this.body === 'object' || typeof this.body === 'number' || typeof this.body === 'boolean') {\n return JSON_CONTENT_TYPE;\n }\n // No type could be inferred.\n return null;\n }\n clone(update = {}) {\n // For method, url, and responseType, take the current value unless\n // it is overridden in the update hash.\n const method = update.method || this.method;\n const url = update.url || this.url;\n const responseType = update.responseType || this.responseType;\n // Carefully handle the transferCache to differentiate between\n // `false` and `undefined` in the update args.\n const transferCache = update.transferCache ?? this.transferCache;\n // The body is somewhat special - a `null` value in update.body means\n // whatever current body is present is being overridden with an empty\n // body, whereas an `undefined` value in update.body implies no\n // override.\n const body = update.body !== undefined ? update.body : this.body;\n // Carefully handle the boolean options to differentiate between\n // `false` and `undefined` in the update args.\n const withCredentials = update.withCredentials ?? this.withCredentials;\n const reportProgress = update.reportProgress ?? this.reportProgress;\n // Headers and params may be appended to if `setHeaders` or\n // `setParams` are used.\n let headers = update.headers || this.headers;\n let params = update.params || this.params;\n // Pass on context if needed\n const context = update.context ?? this.context;\n // Check whether the caller has asked to add headers.\n if (update.setHeaders !== undefined) {\n // Set every requested header.\n headers = Object.keys(update.setHeaders).reduce((headers, name) => headers.set(name, update.setHeaders[name]), headers);\n }\n // Check whether the caller has asked to set params.\n if (update.setParams) {\n // Set every requested param.\n params = Object.keys(update.setParams).reduce((params, param) => params.set(param, update.setParams[param]), params);\n }\n // Finally, construct the new HttpRequest using the pieces from above.\n return new HttpRequest(method, url, body, {\n params,\n headers,\n context,\n reportProgress,\n responseType,\n withCredentials,\n transferCache\n });\n }\n}\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nvar HttpEventType = /*#__PURE__*/function (HttpEventType) {\n /**\n * The request was sent out over the wire.\n */\n HttpEventType[HttpEventType[\"Sent\"] = 0] = \"Sent\";\n /**\n * An upload progress event was received.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n HttpEventType[HttpEventType[\"UploadProgress\"] = 1] = \"UploadProgress\";\n /**\n * The response status code and headers were received.\n */\n HttpEventType[HttpEventType[\"ResponseHeader\"] = 2] = \"ResponseHeader\";\n /**\n * A download progress event was received.\n */\n HttpEventType[HttpEventType[\"DownloadProgress\"] = 3] = \"DownloadProgress\";\n /**\n * The full response including the body was received.\n */\n HttpEventType[HttpEventType[\"Response\"] = 4] = \"Response\";\n /**\n * A custom event from an interceptor or a backend.\n */\n HttpEventType[HttpEventType[\"User\"] = 5] = \"User\";\n return HttpEventType;\n}(HttpEventType || {});\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nclass HttpResponseBase {\n /**\n * All response headers.\n */\n headers;\n /**\n * Response status code.\n */\n status;\n /**\n * Textual description of response status code, defaults to OK.\n *\n * Do not depend on this.\n */\n statusText;\n /**\n * URL of the resource retrieved, or null if not available.\n */\n url;\n /**\n * Whether the status code falls in the 2xx range.\n */\n ok;\n /**\n * Type of the response, narrowed to either the full response or the header.\n */\n // TODO(issue/24571): remove '!'.\n type;\n /**\n * Super-constructor for all responses.\n *\n * The single parameter accepted is an initialization hash. Any properties\n * of the response passed there will override the default values.\n */\n constructor(init, defaultStatus = 200, defaultStatusText = 'OK') {\n // If the hash has values passed, use them to initialize the response.\n // Otherwise use the default values.\n this.headers = init.headers || new HttpHeaders();\n this.status = init.status !== undefined ? init.status : defaultStatus;\n this.statusText = init.statusText || defaultStatusText;\n this.url = init.url || null;\n // Cache the ok value to avoid defining a getter.\n this.ok = this.status >= 200 && this.status < 300;\n }\n}\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nclass HttpHeaderResponse extends HttpResponseBase {\n /**\n * Create a new `HttpHeaderResponse` with the given parameters.\n */\n constructor(init = {}) {\n super(init);\n }\n type = HttpEventType.ResponseHeader;\n /**\n * Copy this `HttpHeaderResponse`, overriding its contents with the\n * given parameter hash.\n */\n clone(update = {}) {\n // Perform a straightforward initialization of the new HttpHeaderResponse,\n // overriding the current parameters with new ones if given.\n return new HttpHeaderResponse({\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined\n });\n }\n}\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nclass HttpResponse extends HttpResponseBase {\n /**\n * The response body, or `null` if one was not returned.\n */\n body;\n /**\n * Construct a new `HttpResponse`.\n */\n constructor(init = {}) {\n super(init);\n this.body = init.body !== undefined ? init.body : null;\n }\n type = HttpEventType.Response;\n clone(update = {}) {\n return new HttpResponse({\n body: update.body !== undefined ? update.body : this.body,\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined\n });\n }\n}\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nclass HttpErrorResponse extends HttpResponseBase {\n name = 'HttpErrorResponse';\n message;\n error;\n /**\n * Errors are never okay, even when the status code is in the 2xx success range.\n */\n ok = false;\n constructor(init) {\n // Initialize with a default status of 0 / Unknown Error.\n super(init, 0, 'Unknown Error');\n // If the response was successful, then this was a parse error. Otherwise, it was\n // a protocol-level failure of some sort. Either the request failed in transit\n // or the server returned an unsuccessful status code.\n if (this.status >= 200 && this.status < 300) {\n this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n } else {\n this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;\n }\n this.error = init.error || null;\n }\n}\n/**\n * We use these constant to prevent pulling the whole HttpStatusCode enum\n * Those are the only ones referenced directly by the framework\n */\nconst HTTP_STATUS_CODE_OK = 200;\nconst HTTP_STATUS_CODE_NO_CONTENT = 204;\n/**\n * Http status codes.\n * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n * @publicApi\n */\nvar HttpStatusCode = /*#__PURE__*/function (HttpStatusCode) {\n HttpStatusCode[HttpStatusCode[\"Continue\"] = 100] = \"Continue\";\n HttpStatusCode[HttpStatusCode[\"SwitchingProtocols\"] = 101] = \"SwitchingProtocols\";\n HttpStatusCode[HttpStatusCode[\"Processing\"] = 102] = \"Processing\";\n HttpStatusCode[HttpStatusCode[\"EarlyHints\"] = 103] = \"EarlyHints\";\n HttpStatusCode[HttpStatusCode[\"Ok\"] = 200] = \"Ok\";\n HttpStatusCode[HttpStatusCode[\"Created\"] = 201] = \"Created\";\n HttpStatusCode[HttpStatusCode[\"Accepted\"] = 202] = \"Accepted\";\n HttpStatusCode[HttpStatusCode[\"NonAuthoritativeInformation\"] = 203] = \"NonAuthoritativeInformation\";\n HttpStatusCode[HttpStatusCode[\"NoContent\"] = 204] = \"NoContent\";\n HttpStatusCode[HttpStatusCode[\"ResetContent\"] = 205] = \"ResetContent\";\n HttpStatusCode[HttpStatusCode[\"PartialContent\"] = 206] = \"PartialContent\";\n HttpStatusCode[HttpStatusCode[\"MultiStatus\"] = 207] = \"MultiStatus\";\n HttpStatusCode[HttpStatusCode[\"AlreadyReported\"] = 208] = \"AlreadyReported\";\n HttpStatusCode[HttpStatusCode[\"ImUsed\"] = 226] = \"ImUsed\";\n HttpStatusCode[HttpStatusCode[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpStatusCode[HttpStatusCode[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpStatusCode[HttpStatusCode[\"Found\"] = 302] = \"Found\";\n HttpStatusCode[HttpStatusCode[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpStatusCode[HttpStatusCode[\"NotModified\"] = 304] = \"NotModified\";\n HttpStatusCode[HttpStatusCode[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpStatusCode[HttpStatusCode[\"Unused\"] = 306] = \"Unused\";\n HttpStatusCode[HttpStatusCode[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpStatusCode[HttpStatusCode[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpStatusCode[HttpStatusCode[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpStatusCode[HttpStatusCode[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpStatusCode[HttpStatusCode[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpStatusCode[HttpStatusCode[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpStatusCode[HttpStatusCode[\"NotFound\"] = 404] = \"NotFound\";\n HttpStatusCode[HttpStatusCode[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpStatusCode[HttpStatusCode[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpStatusCode[HttpStatusCode[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpStatusCode[HttpStatusCode[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpStatusCode[HttpStatusCode[\"Conflict\"] = 409] = \"Conflict\";\n HttpStatusCode[HttpStatusCode[\"Gone\"] = 410] = \"Gone\";\n HttpStatusCode[HttpStatusCode[\"LengthRequired\"] = 411] = \"LengthRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionFailed\"] = 412] = \"PreconditionFailed\";\n HttpStatusCode[HttpStatusCode[\"PayloadTooLarge\"] = 413] = \"PayloadTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UriTooLong\"] = 414] = \"UriTooLong\";\n HttpStatusCode[HttpStatusCode[\"UnsupportedMediaType\"] = 415] = \"UnsupportedMediaType\";\n HttpStatusCode[HttpStatusCode[\"RangeNotSatisfiable\"] = 416] = \"RangeNotSatisfiable\";\n HttpStatusCode[HttpStatusCode[\"ExpectationFailed\"] = 417] = \"ExpectationFailed\";\n HttpStatusCode[HttpStatusCode[\"ImATeapot\"] = 418] = \"ImATeapot\";\n HttpStatusCode[HttpStatusCode[\"MisdirectedRequest\"] = 421] = \"MisdirectedRequest\";\n HttpStatusCode[HttpStatusCode[\"UnprocessableEntity\"] = 422] = \"UnprocessableEntity\";\n HttpStatusCode[HttpStatusCode[\"Locked\"] = 423] = \"Locked\";\n HttpStatusCode[HttpStatusCode[\"FailedDependency\"] = 424] = \"FailedDependency\";\n HttpStatusCode[HttpStatusCode[\"TooEarly\"] = 425] = \"TooEarly\";\n HttpStatusCode[HttpStatusCode[\"UpgradeRequired\"] = 426] = \"UpgradeRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionRequired\"] = 428] = \"PreconditionRequired\";\n HttpStatusCode[HttpStatusCode[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpStatusCode[HttpStatusCode[\"RequestHeaderFieldsTooLarge\"] = 431] = \"RequestHeaderFieldsTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UnavailableForLegalReasons\"] = 451] = \"UnavailableForLegalReasons\";\n HttpStatusCode[HttpStatusCode[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpStatusCode[HttpStatusCode[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpStatusCode[HttpStatusCode[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpStatusCode[HttpStatusCode[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpStatusCode[HttpStatusCode[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n HttpStatusCode[HttpStatusCode[\"HttpVersionNotSupported\"] = 505] = \"HttpVersionNotSupported\";\n HttpStatusCode[HttpStatusCode[\"VariantAlsoNegotiates\"] = 506] = \"VariantAlsoNegotiates\";\n HttpStatusCode[HttpStatusCode[\"InsufficientStorage\"] = 507] = \"InsufficientStorage\";\n HttpStatusCode[HttpStatusCode[\"LoopDetected\"] = 508] = \"LoopDetected\";\n HttpStatusCode[HttpStatusCode[\"NotExtended\"] = 510] = \"NotExtended\";\n HttpStatusCode[HttpStatusCode[\"NetworkAuthenticationRequired\"] = 511] = \"NetworkAuthenticationRequired\";\n return HttpStatusCode;\n}(HttpStatusCode || {});\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n */\nfunction addBody(options, body) {\n return {\n body,\n headers: options.headers,\n context: options.context,\n observe: options.observe,\n params: options.params,\n reportProgress: options.reportProgress,\n responseType: options.responseType,\n withCredentials: options.withCredentials,\n transferCache: options.transferCache\n };\n}\n/**\n * Performs HTTP requests.\n * This service is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n\n * TODO(adev): review\n * @usageNotes\n *\n * ### HTTP Request Example\n *\n * ```ts\n * // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n * const params = new HttpParams({fromString: 'name=term'});\n * return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n *\n * Alternatively, the parameter string can be used without invoking HttpParams\n * by directly joining to the URL.\n * ```ts\n * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});\n * ```\n *\n *\n * ### JSONP Example\n * ```ts\n * requestJsonp(url, callback = 'callback') {\n * return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n * ### PATCH Example\n * ```ts\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`; // PATCH api/heroes/42\n * return this.httpClient.patch(url, {name: heroName}, httpOptions)\n * .pipe(catchError(this.handleError('patchHero')));\n * }\n * ```\n *\n * @see [HTTP Guide](guide/http)\n * @see [HTTP Request](api/common/http/HttpRequest)\n *\n * @publicApi\n */\nlet HttpClient = /*#__PURE__*/(() => {\n class HttpClient {\n handler;\n constructor(handler) {\n this.handler = handler;\n }\n /**\n * Constructs an observable for a generic HTTP request that, when subscribed,\n * fires the request through the chain of registered interceptors and on to the\n * server.\n *\n * You can pass an `HttpRequest` directly as the only parameter. In this case,\n * the call returns an observable of the raw `HttpEvent` stream.\n *\n * Alternatively you can pass an HTTP method as the first parameter,\n * a URL string as the second, and an options hash containing the request body as the third.\n * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n * type of returned observable.\n * * The `responseType` value determines how a successful response body is parsed.\n * * If `responseType` is the default `json`, you can pass a type interface for the resulting\n * object as a type parameter to the call.\n *\n * The `observe` value determines the return type, according to what you are interested in\n * observing.\n * * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n * progress events by default.\n * * An `observe` value of response returns an observable of `HttpResponse<T>`,\n * where the `T` parameter depends on the `responseType` and any optionally provided type\n * parameter.\n * * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n *\n */\n request(first, url, options = {}) {\n let req;\n // First, check whether the primary argument is an instance of `HttpRequest`.\n if (first instanceof HttpRequest) {\n // It is. The other arguments must be undefined (per the signatures) and can be\n // ignored.\n req = first;\n } else {\n // It's a string, so it represents a URL. Construct a request based on it,\n // and incorporate the remaining arguments (assuming `GET` unless a method is\n // provided.\n // Figure out the headers.\n let headers = undefined;\n if (options.headers instanceof HttpHeaders) {\n headers = options.headers;\n } else {\n headers = new HttpHeaders(options.headers);\n }\n // Sort out parameters.\n let params = undefined;\n if (!!options.params) {\n if (options.params instanceof HttpParams) {\n params = options.params;\n } else {\n params = new HttpParams({\n fromObject: options.params\n });\n }\n }\n // Construct the request.\n req = new HttpRequest(first, url, options.body !== undefined ? options.body : null, {\n headers,\n context: options.context,\n params,\n reportProgress: options.reportProgress,\n // By default, JSON is assumed to be returned for all calls.\n responseType: options.responseType || 'json',\n withCredentials: options.withCredentials,\n transferCache: options.transferCache\n });\n }\n // Start with an Observable.of() the initial request, and run the handler (which\n // includes all interceptors) inside a concatMap(). This way, the handler runs\n // inside an Observable chain, which causes interceptors to be re-run on every\n // subscription (this also makes retries re-run the handler, including interceptors).\n const events$ = of(req).pipe(concatMap(req => this.handler.handle(req)));\n // If coming via the API signature which accepts a previously constructed HttpRequest,\n // the only option is to get the event stream. Otherwise, return the event stream if\n // that is what was requested.\n if (first instanceof HttpRequest || options.observe === 'events') {\n return events$;\n }\n // The requested stream contains either the full response or the body. In either\n // case, the first step is to filter the event stream to extract a stream of\n // responses(s).\n const res$ = events$.pipe(filter(event => event instanceof HttpResponse));\n // Decide which stream to return.\n switch (options.observe || 'body') {\n case 'body':\n // The requested stream is the body. Map the response stream to the response\n // body. This could be done more simply, but a misbehaving interceptor might\n // transform the response body into a different format and ignore the requested\n // responseType. Guard against this by validating that the response is of the\n // requested type.\n switch (req.responseType) {\n case 'arraybuffer':\n return res$.pipe(map(res => {\n // Validate that the body is an ArrayBuffer.\n if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n throw new Error('Response is not an ArrayBuffer.');\n }\n return res.body;\n }));\n case 'blob':\n return res$.pipe(map(res => {\n // Validate that the body is a Blob.\n if (res.body !== null && !(res.body instanceof Blob)) {\n throw new Error('Response is not a Blob.');\n }\n return res.body;\n }));\n case 'text':\n return res$.pipe(map(res => {\n // Validate that the body is a string.\n if (res.body !== null && typeof res.body !== 'string') {\n throw new Error('Response is not a string.');\n }\n return res.body;\n }));\n case 'json':\n default:\n // No validation needed for JSON responses, as they can be of any type.\n return res$.pipe(map(res => res.body));\n }\n case 'response':\n // The response stream was requested directly, so return it.\n return res$;\n default:\n // Guard against new future observe types being added.\n throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);\n }\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `DELETE` request to execute on the server. See the individual overloads for\n * details on the return type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n */\n delete(url, options = {}) {\n return this.request('DELETE', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `GET` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n get(url, options = {}) {\n return this.request('GET', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `HEAD` request to execute on the server. The `HEAD` method returns\n * meta information about the resource without transferring the\n * resource itself. See the individual overloads for\n * details on the return type.\n */\n head(url, options = {}) {\n return this.request('HEAD', url, options);\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes a request with the special method\n * `JSONP` to be dispatched via the interceptor pipeline.\n * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n * API endpoints that don't support newer,\n * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n * application making the request.\n * The endpoint API must support JSONP callback for JSONP requests to work.\n * The resource API returns the JSON response wrapped in a callback function.\n * You can pass the callback function name as one of the query parameters.\n * Note that JSONP requests can only be used with `GET` requests.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n */\n jsonp(url, callbackParam) {\n return this.request('JSONP', url, {\n params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n observe: 'body',\n responseType: 'json'\n });\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes the configured\n * `OPTIONS` request to execute on the server. This method allows the client\n * to determine the supported HTTP methods and other capabilities of an endpoint,\n * without implying a resource action. See the individual overloads for\n * details on the return type.\n */\n options(url, options = {}) {\n return this.request('OPTIONS', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PATCH` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n patch(url, body, options = {}) {\n return this.request('PATCH', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `POST` request to execute on the server. The server responds with the location of\n * the replaced resource. See the individual overloads for\n * details on the return type.\n */\n post(url, body, options = {}) {\n return this.request('POST', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n * with a new set of values.\n * See the individual overloads for details on the return type.\n */\n put(url, body, options = {}) {\n return this.request('PUT', url, addBody(options, body));\n }\n static ɵfac = function HttpClient_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClient)(i0.ɵɵinject(HttpHandler));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpClient,\n factory: HttpClient.ɵfac\n });\n }\n return HttpClient;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSSI_PREFIX$1 = /^\\)\\]\\}',?\\n/;\n/**\n * Determine an appropriate URL for the response, by checking either\n * response url or the X-Request-URL header.\n */\nfunction getResponseUrl$1(response) {\n if (response.url) {\n return response.url;\n }\n // stored as lowercase in the map\n const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();\n return response.headers.get(xRequestUrl);\n}\n/**\n * An internal injection token to reference `FetchBackend` implementation\n * in a tree-shakable way.\n */\nconst FETCH_BACKEND = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '');\n/**\n * Uses `fetch` to send requests to a backend server.\n *\n * This `FetchBackend` requires the support of the\n * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all\n * supported browsers and on Node.js v18 or later.\n *\n * @see {@link HttpHandler}\n *\n * @publicApi\n */\nlet FetchBackend = /*#__PURE__*/(() => {\n class FetchBackend {\n // We use an arrow function to always reference the current global implementation of `fetch`.\n // This is helpful for cases when the global `fetch` implementation is modified by external code,\n // see https://github.com/angular/angular/issues/57527.\n fetchImpl = inject(FetchFactory, {\n optional: true\n })?.fetch ?? ((...args) => globalThis.fetch(...args));\n ngZone = inject(NgZone);\n handle(request) {\n return new Observable(observer => {\n const aborter = new AbortController();\n this.doRequest(request, aborter.signal, observer).then(noop, error => observer.error(new HttpErrorResponse({\n error\n })));\n return () => aborter.abort();\n });\n }\n async doRequest(request, signal, observer) {\n const init = this.createRequestInit(request);\n let response;\n try {\n // Run fetch outside of Angular zone.\n // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if\n // the response should eventually timeout which causes extra CD cycles every 500ms\n const fetchPromise = this.ngZone.runOutsideAngular(() => this.fetchImpl(request.urlWithParams, {\n signal,\n ...init\n }));\n // Make sure Zone.js doesn't trigger false-positive unhandled promise\n // error in case the Promise is rejected synchronously. See function\n // description for additional information.\n silenceSuperfluousUnhandledPromiseRejection(fetchPromise);\n // Send the `Sent` event before awaiting the response.\n observer.next({\n type: HttpEventType.Sent\n });\n response = await fetchPromise;\n } catch (error) {\n observer.error(new HttpErrorResponse({\n error,\n status: error.status ?? 0,\n statusText: error.statusText,\n url: request.urlWithParams,\n headers: error.headers\n }));\n return;\n }\n const headers = new HttpHeaders(response.headers);\n const statusText = response.statusText;\n const url = getResponseUrl$1(response) ?? request.urlWithParams;\n let status = response.status;\n let body = null;\n if (request.reportProgress) {\n observer.next(new HttpHeaderResponse({\n headers,\n status,\n statusText,\n url\n }));\n }\n if (response.body) {\n // Read Progress\n const contentLength = response.headers.get('content-length');\n const chunks = [];\n const reader = response.body.getReader();\n let receivedLength = 0;\n let decoder;\n let partialText;\n // We have to check whether the Zone is defined in the global scope because this may be called\n // when the zone is nooped.\n const reqZone = typeof Zone !== 'undefined' && Zone.current;\n // Perform response processing outside of Angular zone to\n // ensure no excessive change detection runs are executed\n // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD\n await this.ngZone.runOutsideAngular(async () => {\n while (true) {\n const {\n done,\n value\n } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n receivedLength += value.length;\n if (request.reportProgress) {\n partialText = request.responseType === 'text' ? (partialText ?? '') + (decoder ??= new TextDecoder()).decode(value, {\n stream: true\n }) : undefined;\n const reportProgress = () => observer.next({\n type: HttpEventType.DownloadProgress,\n total: contentLength ? +contentLength : undefined,\n loaded: receivedLength,\n partialText\n });\n reqZone ? reqZone.run(reportProgress) : reportProgress();\n }\n }\n });\n // Combine all chunks.\n const chunksAll = this.concatChunks(chunks, receivedLength);\n try {\n const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';\n body = this.parseBody(request, chunksAll, contentType);\n } catch (error) {\n // Body loading or parsing failed\n observer.error(new HttpErrorResponse({\n error,\n headers: new HttpHeaders(response.headers),\n status: response.status,\n statusText: response.statusText,\n url: getResponseUrl$1(response) ?? request.urlWithParams\n }));\n return;\n }\n }\n // Same behavior as the XhrBackend\n if (status === 0) {\n status = body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n const ok = status >= 200 && status < 300;\n if (ok) {\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n } else {\n observer.error(new HttpErrorResponse({\n error: body,\n headers,\n status,\n statusText,\n url\n }));\n }\n }\n parseBody(request, binContent, contentType) {\n switch (request.responseType) {\n case 'json':\n // stripping the XSSI when present\n const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, '');\n return text === '' ? null : JSON.parse(text);\n case 'text':\n return new TextDecoder().decode(binContent);\n case 'blob':\n return new Blob([binContent], {\n type: contentType\n });\n case 'arraybuffer':\n return binContent.buffer;\n }\n }\n createRequestInit(req) {\n // We could share some of this logic with the XhrBackend\n const headers = {};\n const credentials = req.withCredentials ? 'include' : undefined;\n // Setting all the requested headers.\n req.headers.forEach((name, values) => headers[name] = values.join(','));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has('Accept')) {\n headers['Accept'] = ACCEPT_HEADER;\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n headers[CONTENT_TYPE_HEADER] = detectedType;\n }\n }\n return {\n body: req.serializeBody(),\n method: req.method,\n headers,\n credentials\n };\n }\n concatChunks(chunks, totalLength) {\n const chunksAll = new Uint8Array(totalLength);\n let position = 0;\n for (const chunk of chunks) {\n chunksAll.set(chunk, position);\n position += chunk.length;\n }\n return chunksAll;\n }\n static ɵfac = function FetchBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || FetchBackend)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FetchBackend,\n factory: FetchBackend.ɵfac\n });\n }\n return FetchBackend;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Abstract class to provide a mocked implementation of `fetch()`\n */\nclass FetchFactory {}\nfunction noop() {}\n/**\n * Zone.js treats a rejected promise that has not yet been awaited\n * as an unhandled error. This function adds a noop `.then` to make\n * sure that Zone.js doesn't throw an error if the Promise is rejected\n * synchronously.\n */\nfunction silenceSuperfluousUnhandledPromiseRejection(promise) {\n promise.then(noop, noop);\n}\nfunction interceptorChainEndFn(req, finalHandlerFn) {\n return finalHandlerFn(req);\n}\n/**\n * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the\n * `ChainedInterceptorFn` interface.\n */\nfunction adaptLegacyInterceptorToChain(chainTailFn, interceptor) {\n return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {\n handle: downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)\n });\n}\n/**\n * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given\n * injector.\n */\nfunction chainedInterceptorFn(chainTailFn, interceptorFn, injector) {\n return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)));\n}\n/**\n * A multi-provider token that represents the array of registered\n * `HttpInterceptor` objects.\n *\n * @publicApi\n */\nconst HTTP_INTERCEPTORS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTORS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s.\n */\nconst HTTP_INTERCEPTOR_FNS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s that are only set in root.\n */\nconst HTTP_ROOT_INTERCEPTOR_FNS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '');\n// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.\n// Should the whole interceptor chain contribute to stability or just the backend request #55075?\n// Should HttpClient contribute to stability automatically at all?\nconst REQUESTS_CONTRIBUTE_TO_STABILITY = /*#__PURE__*/new InjectionToken(ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '', {\n providedIn: 'root',\n factory: () => true\n});\n/**\n * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy\n * class-based interceptors and runs the request through it.\n */\nfunction legacyInterceptorFnFactory() {\n let chain = null;\n return (req, handler) => {\n if (chain === null) {\n const interceptors = inject(HTTP_INTERCEPTORS, {\n optional: true\n }) ?? [];\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);\n }\n const pendingTasks = inject(ɵPendingTasksInternal);\n const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n if (contributeToStability) {\n const taskId = pendingTasks.add();\n return chain(req, handler).pipe(finalize(() => pendingTasks.remove(taskId)));\n } else {\n return chain(req, handler);\n }\n };\n}\nlet fetchBackendWarningDisplayed = false;\n/** Internal function to reset the flag in tests */\nfunction resetFetchBackendWarningFlag() {\n fetchBackendWarningDisplayed = false;\n}\nlet HttpInterceptorHandler = /*#__PURE__*/(() => {\n class HttpInterceptorHandler extends HttpHandler {\n backend;\n injector;\n chain = null;\n pendingTasks = inject(ɵPendingTasksInternal);\n contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n constructor(backend, injector) {\n super();\n this.backend = backend;\n this.injector = injector;\n // We strongly recommend using fetch backend for HTTP calls when SSR is used\n // for an application. The logic below checks if that's the case and produces\n // a warning otherwise.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {\n const isServer = isPlatformServer(injector.get(PLATFORM_ID));\n // This flag is necessary because provideHttpClientTesting() overrides the backend\n // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,\n // no HTTP calls are actually performed during the test, so producing a warning would be\n // misleading.\n const isTestingBackend = this.backend.isTestingBackend;\n if (isServer && !(this.backend instanceof FetchBackend) && !isTestingBackend) {\n fetchBackendWarningDisplayed = true;\n injector.get(ɵConsole).warn(ɵformatRuntimeError(2801 /* RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR */, 'Angular detected that `HttpClient` is not configured ' + \"to use `fetch` APIs. It's strongly recommended to \" + 'enable `fetch` for applications that use Server-Side Rendering ' + 'for better performance and compatibility. ' + 'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' + 'call at the root of the application.'));\n }\n }\n }\n handle(initialRequest) {\n if (this.chain === null) {\n const dedupedInterceptorFns = Array.from(new Set([...this.injector.get(HTTP_INTERCEPTOR_FNS), ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, [])]));\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);\n }\n if (this.contributeToStability) {\n const taskId = this.pendingTasks.add();\n return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest)).pipe(finalize(() => this.pendingTasks.remove(taskId)));\n } else {\n return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest));\n }\n }\n static ɵfac = function HttpInterceptorHandler_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpInterceptorHandler)(i0.ɵɵinject(HttpBackend), i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpInterceptorHandler,\n factory: HttpInterceptorHandler.ɵfac\n });\n }\n return HttpInterceptorHandler;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId = 0;\n/**\n * When a pending <script> is unsubscribed we'll move it to this document, so it won't be\n * executed.\n */\nlet foreignDocument;\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nconst JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nconst JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nconst JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n// Error text given when a request is passed to the JsonpClientBackend that has\n// headers set\nconst JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nclass JsonpCallbackContext {}\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nfunction jsonpCallbackContext() {\n if (typeof window === 'object') {\n return window;\n }\n return {};\n}\n/**\n * Processes an `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n * @see {@link HttpHandler}\n * @see {@link HttpXhrBackend}\n *\n * @publicApi\n */\nlet JsonpClientBackend = /*#__PURE__*/(() => {\n class JsonpClientBackend {\n callbackMap;\n document;\n /**\n * A resolved promise that can be used to schedule microtasks in the event handlers.\n */\n resolvedPromise = Promise.resolve();\n constructor(callbackMap, document) {\n this.callbackMap = callbackMap;\n this.document = document;\n }\n /**\n * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n */\n nextCallback() {\n return `ng_jsonp_callback_${nextRequestId++}`;\n }\n /**\n * Processes a JSONP request and returns an event stream of the results.\n * @param req The request object.\n * @returns An observable of the response events.\n *\n */\n handle(req) {\n // Firstly, check both the method and response type. If either doesn't match\n // then the request was improperly routed here and cannot be handled.\n if (req.method !== 'JSONP') {\n throw new Error(JSONP_ERR_WRONG_METHOD);\n } else if (req.responseType !== 'json') {\n throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);\n }\n // Check the request headers. JSONP doesn't support headers and\n // cannot set any that were supplied.\n if (req.headers.keys().length > 0) {\n throw new Error(JSONP_ERR_HEADERS_NOT_SUPPORTED);\n }\n // Everything else happens inside the Observable boundary.\n return new Observable(observer => {\n // The first step to make a request is to generate the callback name, and replace the\n // callback placeholder in the URL with the name. Care has to be taken here to ensure\n // a trailing &, if matched, gets inserted back into the URL in the correct place.\n const callback = this.nextCallback();\n const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n // Construct the <script> tag and point it at the URL.\n const node = this.document.createElement('script');\n node.src = url;\n // A JSONP request requires waiting for multiple callbacks. These variables\n // are closed over and track state across those callbacks.\n // The response object, if one has been received, or null otherwise.\n let body = null;\n // Whether the response callback has been called.\n let finished = false;\n // Set the response callback in this.callbackMap (which will be the window\n // object in the browser. The script being loaded via the <script> tag will\n // eventually call this callback.\n this.callbackMap[callback] = data => {\n // Data has been received from the JSONP script. Firstly, delete this callback.\n delete this.callbackMap[callback];\n // Set state to indicate data was received.\n body = data;\n finished = true;\n };\n // cleanup() is a utility closure that removes the <script> from the page and\n // the response callback from the window. This logic is used in both the\n // success, error, and cancellation paths, so it's extracted out for convenience.\n const cleanup = () => {\n node.removeEventListener('load', onLoad);\n node.removeEventListener('error', onError);\n // Remove the <script> tag if it's still on the page.\n node.remove();\n // Remove the response callback from the callbackMap (window object in the\n // browser).\n delete this.callbackMap[callback];\n };\n // onLoad() is the success callback which runs after the response callback\n // if the JSONP script loads successfully. The event itself is unimportant.\n // If something went wrong, onLoad() may run without the response callback\n // having been invoked.\n const onLoad = event => {\n // We wrap it in an extra Promise, to ensure the microtask\n // is scheduled after the loaded endpoint has executed any potential microtask itself,\n // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496\n this.resolvedPromise.then(() => {\n // Cleanup the page.\n cleanup();\n // Check whether the response callback has run.\n if (!finished) {\n // It hasn't, something went wrong with the request. Return an error via\n // the Observable error path. All JSONP errors have status 0.\n observer.error(new HttpErrorResponse({\n url,\n status: 0,\n statusText: 'JSONP Error',\n error: new Error(JSONP_ERR_NO_CALLBACK)\n }));\n return;\n }\n // Success. body either contains the response body or null if none was\n // returned.\n observer.next(new HttpResponse({\n body,\n status: HTTP_STATUS_CODE_OK,\n statusText: 'OK',\n url\n }));\n // Complete the stream, the response is over.\n observer.complete();\n });\n };\n // onError() is the error callback, which runs if the script returned generates\n // a Javascript error. It emits the error via the Observable error channel as\n // a HttpErrorResponse.\n const onError = error => {\n cleanup();\n // Wrap the error in a HttpErrorResponse.\n observer.error(new HttpErrorResponse({\n error,\n status: 0,\n statusText: 'JSONP Error',\n url\n }));\n };\n // Subscribe to both the success (load) and error events on the <script> tag,\n // and add it to the page.\n node.addEventListener('load', onLoad);\n node.addEventListener('error', onError);\n this.document.body.appendChild(node);\n // The request has now been successfully sent.\n observer.next({\n type: HttpEventType.Sent\n });\n // Cancellation handler.\n return () => {\n if (!finished) {\n this.removeListeners(node);\n }\n // And finally, clean up the page.\n cleanup();\n };\n });\n }\n removeListeners(script) {\n // Issue #34818\n // Changing <script>'s ownerDocument will prevent it from execution.\n // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block\n foreignDocument ??= this.document.implementation.createHTMLDocument();\n foreignDocument.adoptNode(script);\n }\n static ɵfac = function JsonpClientBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JsonpClientBackend)(i0.ɵɵinject(JsonpCallbackContext), i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JsonpClientBackend,\n factory: JsonpClientBackend.ɵfac\n });\n }\n return JsonpClientBackend;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.\n */\nfunction jsonpInterceptorFn(req, next) {\n if (req.method === 'JSONP') {\n return inject(JsonpClientBackend).handle(req);\n }\n // Fall through for normal HTTP requests.\n return next(req);\n}\n/**\n * Identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @see {@link HttpInterceptor}\n *\n * @publicApi\n */\nlet JsonpInterceptor = /*#__PURE__*/(() => {\n class JsonpInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n /**\n * Identifies and handles a given JSONP request.\n * @param initialRequest The outgoing request object to handle.\n * @param next The next interceptor in the chain, or the backend\n * if no interceptors remain in the chain.\n * @returns An observable of the event stream.\n */\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n }\n static ɵfac = function JsonpInterceptor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JsonpInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JsonpInterceptor,\n factory: JsonpInterceptor.ɵfac\n });\n }\n return JsonpInterceptor;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\nconst X_REQUEST_URL_REGEXP = /*#__PURE__*/RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr) {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader(X_REQUEST_URL_HEADER);\n }\n return null;\n}\n/**\n * Uses `XMLHttpRequest` to send requests to a backend server.\n * @see {@link HttpHandler}\n * @see {@link JsonpClientBackend}\n *\n * @publicApi\n */\nlet HttpXhrBackend = /*#__PURE__*/(() => {\n class HttpXhrBackend {\n xhrFactory;\n constructor(xhrFactory) {\n this.xhrFactory = xhrFactory;\n }\n /**\n * Processes a request and returns a stream of response events.\n * @param req The request object.\n * @returns An observable of the response events.\n */\n handle(req) {\n // Quick check to give a better error message when a user attempts to use\n // HttpClient.jsonp() without installing the HttpClientJsonpModule\n if (req.method === 'JSONP') {\n throw new ɵRuntimeError(-2800 /* RuntimeErrorCode.MISSING_JSONP_MODULE */, (typeof ngDevMode === 'undefined' || ngDevMode) && `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \\`withJsonpSupport()\\` call (if \\`provideHttpClient()\\` is used) or import the \\`HttpClientJsonpModule\\` in the root NgModule.`);\n }\n // Check whether this factory has a special function to load an XHR implementation\n // for various non-browser environments. We currently limit it to only `ServerXhr`\n // class, which needs to load an XHR implementation.\n const xhrFactory = this.xhrFactory;\n const source = xhrFactory.ɵloadImpl ? from(xhrFactory.ɵloadImpl()) : of(null);\n return source.pipe(switchMap(() => {\n // Everything happens on Observable subscription.\n return new Observable(observer => {\n // Start by setting up the XHR object with request method, URL, and withCredentials\n // flag.\n const xhr = xhrFactory.build();\n xhr.open(req.method, req.urlWithParams);\n if (req.withCredentials) {\n xhr.withCredentials = true;\n }\n // Add all the requested headers.\n req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has('Accept')) {\n xhr.setRequestHeader('Accept', ACCEPT_HEADER);\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);\n }\n }\n // Set the responseType if one was requested.\n if (req.responseType) {\n const responseType = req.responseType.toLowerCase();\n // JSON responses need to be processed as text. This is because if the server\n // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n // xhr.response will be null, and xhr.responseText cannot be accessed to\n // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n // is parsed by first requesting text and then applying JSON.parse.\n xhr.responseType = responseType !== 'json' ? responseType : 'text';\n }\n // Serialize the request body if one is present. If not, this will be set to null.\n const reqBody = req.serializeBody();\n // If progress events are enabled, response headers will be delivered\n // in two events - the HttpHeaderResponse event and the full HttpResponse\n // event. However, since response headers don't change in between these\n // two events, it doesn't make sense to parse them twice. So headerResponse\n // caches the data extracted from the response whenever it's first parsed,\n // to ensure parsing isn't duplicated.\n let headerResponse = null;\n // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n // state, and memoizes it into headerResponse.\n const partialFromXhr = () => {\n if (headerResponse !== null) {\n return headerResponse;\n }\n const statusText = xhr.statusText || 'OK';\n // Parse headers from XMLHttpRequest - this step is lazy.\n const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n // Read the response URL from the XMLHttpResponse instance and fall back on the\n // request URL.\n const url = getResponseUrl(xhr) || req.url;\n // Construct the HttpHeaderResponse and memoize it.\n headerResponse = new HttpHeaderResponse({\n headers,\n status: xhr.status,\n statusText,\n url\n });\n return headerResponse;\n };\n // Next, a few closures are defined for the various events which XMLHttpRequest can\n // emit. This allows them to be unregistered as event listeners later.\n // First up is the load event, which represents a response being fully available.\n const onLoad = () => {\n // Read response state from the memoized partial data.\n let {\n headers,\n status,\n statusText,\n url\n } = partialFromXhr();\n // The body will be read out if present.\n let body = null;\n if (status !== HTTP_STATUS_CODE_NO_CONTENT) {\n // Use XMLHttpRequest.response if set, responseText otherwise.\n body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n }\n // Normalize another potential bug (this one comes from CORS).\n if (status === 0) {\n status = !!body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n let ok = status >= 200 && status < 300;\n // Check whether the body needs to be parsed as JSON (in many cases the browser\n // will have done that already).\n if (req.responseType === 'json' && typeof body === 'string') {\n // Save the original body, before attempting XSSI prefix stripping.\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n // Attempt the parse. If it fails, a parse error should be delivered to the\n // user.\n body = body !== '' ? JSON.parse(body) : null;\n } catch (error) {\n // Since the JSON.parse failed, it's reasonable to assume this might not have\n // been a JSON response. Restore the original body (including any XSSI prefix)\n // to deliver a better error response.\n body = originalBody;\n // If this was an error request to begin with, leave it as a string, it\n // probably just isn't JSON. Otherwise, deliver the parsing error to the user.\n if (ok) {\n // Even though the response status was 2xx, this is still an error.\n ok = false;\n // The parse error contains the text of the body that failed to parse.\n body = {\n error,\n text: body\n };\n }\n }\n }\n if (ok) {\n // A successful response is delivered on the event stream.\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url: url || undefined\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n } else {\n // An unsuccessful request is delivered on the error channel.\n observer.error(new HttpErrorResponse({\n // The error in this case is the response body (error from the server).\n error: body,\n headers,\n status,\n statusText,\n url: url || undefined\n }));\n }\n };\n // The onError callback is called when something goes wrong at the network level.\n // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n // transmitted on the error channel.\n const onError = error => {\n const {\n url\n } = partialFromXhr();\n const res = new HttpErrorResponse({\n error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url: url || undefined\n });\n observer.error(res);\n };\n // The sentHeaders flag tracks whether the HttpResponseHeaders event\n // has been sent on the stream. This is necessary to track if progress\n // is enabled since the event will be sent on only the first download\n // progress event.\n let sentHeaders = false;\n // The download progress event handler, which is only registered if\n // progress events are enabled.\n const onDownProgress = event => {\n // Send the HttpResponseHeaders event if it hasn't been sent already.\n if (!sentHeaders) {\n observer.next(partialFromXhr());\n sentHeaders = true;\n }\n // Start building the download progress event to deliver on the response\n // event stream.\n let progressEvent = {\n type: HttpEventType.DownloadProgress,\n loaded: event.loaded\n };\n // Set the total number of bytes in the event if it's available.\n if (event.lengthComputable) {\n progressEvent.total = event.total;\n }\n // If the request was for text content and a partial response is\n // available on XMLHttpRequest, include it in the progress event\n // to allow for streaming reads.\n if (req.responseType === 'text' && !!xhr.responseText) {\n progressEvent.partialText = xhr.responseText;\n }\n // Finally, fire the event.\n observer.next(progressEvent);\n };\n // The upload progress event handler, which is only registered if\n // progress events are enabled.\n const onUpProgress = event => {\n // Upload progress events are simpler. Begin building the progress\n // event.\n let progress = {\n type: HttpEventType.UploadProgress,\n loaded: event.loaded\n };\n // If the total number of bytes being uploaded is available, include\n // it.\n if (event.lengthComputable) {\n progress.total = event.total;\n }\n // Send the event.\n observer.next(progress);\n };\n // By default, register for load and error events.\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('timeout', onError);\n xhr.addEventListener('abort', onError);\n // Progress events are only enabled if requested.\n if (req.reportProgress) {\n // Download progress is always enabled if requested.\n xhr.addEventListener('progress', onDownProgress);\n // Upload progress depends on whether there is a body to upload.\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n // Fire the request, and notify the event stream that it was fired.\n xhr.send(reqBody);\n observer.next({\n type: HttpEventType.Sent\n });\n // This is the return from the Observable function, which is the\n // request cancellation handler.\n return () => {\n // On a cancellation, remove all registered event listeners.\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('abort', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onError);\n if (req.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n // Finally, abort the in-flight request.\n if (xhr.readyState !== xhr.DONE) {\n xhr.abort();\n }\n };\n });\n }));\n }\n static ɵfac = function HttpXhrBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXhrBackend)(i0.ɵɵinject(i1.XhrFactory));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXhrBackend,\n factory: HttpXhrBackend.ɵfac\n });\n }\n return HttpXhrBackend;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst XSRF_ENABLED = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_ENABLED' : '');\nconst XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';\nconst XSRF_COOKIE_NAME = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_COOKIE_NAME\n});\nconst XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';\nconst XSRF_HEADER_NAME = /*#__PURE__*/new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_HEADER_NAME\n});\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nclass HttpXsrfTokenExtractor {}\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\nlet HttpXsrfCookieExtractor = /*#__PURE__*/(() => {\n class HttpXsrfCookieExtractor {\n doc;\n platform;\n cookieName;\n lastCookieString = '';\n lastToken = null;\n /**\n * @internal for testing\n */\n parseCount = 0;\n constructor(doc, platform, cookieName) {\n this.doc = doc;\n this.platform = platform;\n this.cookieName = cookieName;\n }\n getToken() {\n if (this.platform === 'server') {\n return null;\n }\n const cookieString = this.doc.cookie || '';\n if (cookieString !== this.lastCookieString) {\n this.parseCount++;\n this.lastToken = ɵparseCookieValue(cookieString, this.cookieName);\n this.lastCookieString = cookieString;\n }\n return this.lastToken;\n }\n static ɵfac = function HttpXsrfCookieExtractor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXsrfCookieExtractor)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(PLATFORM_ID), i0.ɵɵinject(XSRF_COOKIE_NAME));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXsrfCookieExtractor,\n factory: HttpXsrfCookieExtractor.ɵfac\n });\n }\n return HttpXsrfCookieExtractor;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction xsrfInterceptorFn(req, next) {\n const lcUrl = req.url.toLowerCase();\n // Skip both non-mutating requests and absolute URLs.\n // Non-mutating requests don't require a token, and absolute URLs require special handling\n // anyway as the cookie set\n // on our origin is not the same as the token expected by another origin.\n if (!inject(XSRF_ENABLED) || req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') || lcUrl.startsWith('https://')) {\n return next(req);\n }\n const token = inject(HttpXsrfTokenExtractor).getToken();\n const headerName = inject(XSRF_HEADER_NAME);\n // Be careful not to overwrite an existing header of the same name.\n if (token != null && !req.headers.has(headerName)) {\n req = req.clone({\n headers: req.headers.set(headerName, token)\n });\n }\n return next(req);\n}\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\nlet HttpXsrfInterceptor = /*#__PURE__*/(() => {\n class HttpXsrfInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n }\n static ɵfac = function HttpXsrfInterceptor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXsrfInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXsrfInterceptor,\n factory: HttpXsrfInterceptor.ɵfac\n });\n }\n return HttpXsrfInterceptor;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Identifies a particular kind of `HttpFeature`.\n *\n * @publicApi\n */\nvar HttpFeatureKind = /*#__PURE__*/function (HttpFeatureKind) {\n HttpFeatureKind[HttpFeatureKind[\"Interceptors\"] = 0] = \"Interceptors\";\n HttpFeatureKind[HttpFeatureKind[\"LegacyInterceptors\"] = 1] = \"LegacyInterceptors\";\n HttpFeatureKind[HttpFeatureKind[\"CustomXsrfConfiguration\"] = 2] = \"CustomXsrfConfiguration\";\n HttpFeatureKind[HttpFeatureKind[\"NoXsrfProtection\"] = 3] = \"NoXsrfProtection\";\n HttpFeatureKind[HttpFeatureKind[\"JsonpSupport\"] = 4] = \"JsonpSupport\";\n HttpFeatureKind[HttpFeatureKind[\"RequestsMadeViaParent\"] = 5] = \"RequestsMadeViaParent\";\n HttpFeatureKind[HttpFeatureKind[\"Fetch\"] = 6] = \"Fetch\";\n return HttpFeatureKind;\n}(HttpFeatureKind || {});\nfunction makeHttpFeature(kind, providers) {\n return {\n ɵkind: kind,\n ɵproviders: providers\n };\n}\n/**\n * Configures Angular's `HttpClient` service to be available for injection.\n *\n * By default, `HttpClient` will be configured for injection with its default options for XSRF\n * protection of outgoing requests. Additional configuration options can be provided by passing\n * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the\n * `withInterceptors(...)` feature.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * It's strongly recommended to enable\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use\n * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add\n * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:\n *\n * ```ts\n * provideHttpClient(withFetch());\n * ```\n *\n * </div>\n *\n * @see {@link withInterceptors}\n * @see {@link withInterceptorsFromDi}\n * @see {@link withXsrfConfiguration}\n * @see {@link withNoXsrfProtection}\n * @see {@link withJsonpSupport}\n * @see {@link withRequestsMadeViaParent}\n * @see {@link withFetch}\n */\nfunction provideHttpClient(...features) {\n if (ngDevMode) {\n const featureKinds = new Set(features.map(f => f.ɵkind));\n if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) && featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {\n throw new Error(ngDevMode ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.` : '');\n }\n }\n const providers = [HttpClient, HttpXhrBackend, HttpInterceptorHandler, {\n provide: HttpHandler,\n useExisting: HttpInterceptorHandler\n }, {\n provide: HttpBackend,\n useFactory: () => {\n return inject(FETCH_BACKEND, {\n optional: true\n }) ?? inject(HttpXhrBackend);\n }\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: xsrfInterceptorFn,\n multi: true\n }, {\n provide: XSRF_ENABLED,\n useValue: true\n }, {\n provide: HttpXsrfTokenExtractor,\n useClass: HttpXsrfCookieExtractor\n }];\n for (const feature of features) {\n providers.push(...feature.ɵproviders);\n }\n return makeEnvironmentProviders(providers);\n}\n/**\n * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`\n * instance.\n *\n * @see {@link HttpInterceptorFn}\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withInterceptors(interceptorFns) {\n return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map(interceptorFn => {\n return {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: interceptorFn,\n multi: true\n };\n }));\n}\nconst LEGACY_INTERCEPTOR_FN = /*#__PURE__*/new InjectionToken(ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '');\n/**\n * Includes class-based interceptors configured using a multi-provider in the current injector into\n * the configured `HttpClient` instance.\n *\n * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided\n * interceptors may be phased out in a later release.\n *\n * @see {@link HttpInterceptor}\n * @see {@link HTTP_INTERCEPTORS}\n * @see {@link provideHttpClient}\n */\nfunction withInterceptorsFromDi() {\n // Note: the legacy interceptor function is provided here via an intermediate token\n // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are\n // included multiple times, all of the multi-provider entries will have the same instance of the\n // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy\n // interceptors will not run multiple times.\n return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [{\n provide: LEGACY_INTERCEPTOR_FN,\n useFactory: legacyInterceptorFnFactory\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useExisting: LEGACY_INTERCEPTOR_FN,\n multi: true\n }]);\n}\n/**\n * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withNoXsrfProtection` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withXsrfConfiguration({\n cookieName,\n headerName\n}) {\n const providers = [];\n if (cookieName !== undefined) {\n providers.push({\n provide: XSRF_COOKIE_NAME,\n useValue: cookieName\n });\n }\n if (headerName !== undefined) {\n providers.push({\n provide: XSRF_HEADER_NAME,\n useValue: headerName\n });\n }\n return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);\n}\n/**\n * Disables XSRF protection in the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withXsrfConfiguration` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withNoXsrfProtection() {\n return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [{\n provide: XSRF_ENABLED,\n useValue: false\n }]);\n}\n/**\n * Add JSONP support to the configuration of the current `HttpClient` instance.\n *\n * @see {@link provideHttpClient}\n */\nfunction withJsonpSupport() {\n return makeHttpFeature(HttpFeatureKind.JsonpSupport, [JsonpClientBackend, {\n provide: JsonpCallbackContext,\n useFactory: jsonpCallbackContext\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: jsonpInterceptorFn,\n multi: true\n }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests via the parent injector's\n * `HttpClient` instead of directly.\n *\n * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent\n * instance. For example, even if `HttpClient` is configured in the parent injector with\n * one or more interceptors, they will not intercept requests made via this instance.\n *\n * With this option enabled, once the request has passed through the current injector's\n * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of\n * dispatched directly, and interceptors in the parent configuration will be applied to the request.\n *\n * If there are several `HttpClient` instances in the injector hierarchy, it's possible for\n * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to\n * \"bubble up\" until either reaching the root level or an `HttpClient` which was not configured with\n * this option.\n *\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withRequestsMadeViaParent() {\n return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [{\n provide: HttpBackend,\n useFactory: () => {\n const handlerFromParent = inject(HttpHandler, {\n skipSelf: true,\n optional: true\n });\n if (ngDevMode && handlerFromParent === null) {\n throw new Error('withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient');\n }\n return handlerFromParent;\n }\n }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests using the fetch API.\n *\n * Note: The Fetch API doesn't support progress report on uploads.\n *\n * @publicApi\n */\nfunction withFetch() {\n return makeHttpFeature(HttpFeatureKind.Fetch, [FetchBackend, {\n provide: FETCH_BACKEND,\n useExisting: FetchBackend\n }, {\n provide: HttpBackend,\n useExisting: FetchBackend\n }]);\n}\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as\n * providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.\n */\nlet HttpClientXsrfModule = /*#__PURE__*/(() => {\n class HttpClientXsrfModule {\n /**\n * Disable the default XSRF protection.\n */\n static disable() {\n return {\n ngModule: HttpClientXsrfModule,\n providers: [withNoXsrfProtection().ɵproviders]\n };\n }\n /**\n * Configure XSRF protection.\n * @param options An object that can specify either or both\n * cookie name or header name.\n * - Cookie name default is `XSRF-TOKEN`.\n * - Header name default is `X-XSRF-TOKEN`.\n *\n */\n static withOptions(options = {}) {\n return {\n ngModule: HttpClientXsrfModule,\n providers: withXsrfConfiguration(options).ɵproviders\n };\n }\n static ɵfac = function HttpClientXsrfModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientXsrfModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientXsrfModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [HttpXsrfInterceptor, {\n provide: HTTP_INTERCEPTORS,\n useExisting: HttpXsrfInterceptor,\n multi: true\n }, {\n provide: HttpXsrfTokenExtractor,\n useClass: HttpXsrfCookieExtractor\n }, withXsrfConfiguration({\n cookieName: XSRF_DEFAULT_COOKIE_NAME,\n headerName: XSRF_DEFAULT_HEADER_NAME\n }).ɵproviders, {\n provide: XSRF_ENABLED,\n useValue: true\n }]\n });\n }\n return HttpClientXsrfModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead\n */\nlet HttpClientModule = /*#__PURE__*/(() => {\n class HttpClientModule {\n static ɵfac = function HttpClientModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [provideHttpClient(withInterceptorsFromDi())]\n });\n }\n return HttpClientModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * @publicApi\n * @deprecated `withJsonpSupport()` as providers instead\n */\nlet HttpClientJsonpModule = /*#__PURE__*/(() => {\n class HttpClientJsonpModule {\n static ɵfac = function HttpClientJsonpModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientJsonpModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientJsonpModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [withJsonpSupport().ɵproviders]\n });\n }\n return HttpClientJsonpModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and\n * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping\n * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same\n * ones and reuse the data cached on the server during hydration on the client.\n *\n * **Important note**: the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in\n * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an\n * error if it detects that the token is defined while running on the client.\n *\n * @usageNotes\n *\n * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and\n * via `https://external-domain.com` on the client, you can use the following configuration:\n * ```ts\n * // in app.server.config.ts\n * {\n * provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,\n * useValue: {\n * 'http://internal-domain.com:8080': 'https://external-domain.com'\n * }\n * }\n * ```\n *\n * @publicApi\n */\nconst HTTP_TRANSFER_CACHE_ORIGIN_MAP = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '');\n/**\n * Keys within cached response data structure.\n */\nconst BODY = 'b';\nconst HEADERS = 'h';\nconst STATUS = 's';\nconst STATUS_TEXT = 'st';\nconst REQ_URL = 'u';\nconst RESPONSE_TYPE = 'rt';\nconst CACHE_OPTIONS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '');\n/**\n * A list of allowed HTTP methods to cache.\n */\nconst ALLOWED_METHODS = ['GET', 'HEAD'];\nfunction transferCacheInterceptorFn(req, next) {\n const {\n isCacheActive,\n ...globalOptions\n } = inject(CACHE_OPTIONS);\n const {\n transferCache: requestOptions,\n method: requestMethod\n } = req;\n // In the following situations we do not want to cache the request\n if (!isCacheActive || requestOptions === false ||\n // POST requests are allowed either globally or at request level\n requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions || requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod) ||\n // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey\n !globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req) || globalOptions.filter?.(req) === false) {\n return next(req);\n }\n const transferState = inject(TransferState);\n const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {\n optional: true\n });\n if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {\n throw new ɵRuntimeError(2803 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT */, ngDevMode && 'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' + 'present in the client side code. Please ensure that this token is only provided in the ' + 'server code of the application.');\n }\n const requestUrl = typeof ngServerMode !== 'undefined' && ngServerMode && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url;\n const storeKey = makeCacheKey(req, requestUrl);\n const response = transferState.get(storeKey, null);\n let headersToInclude = globalOptions.includeHeaders;\n if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {\n // Request-specific config takes precedence over the global config.\n headersToInclude = requestOptions.includeHeaders;\n }\n if (response) {\n const {\n [BODY]: undecodedBody,\n [RESPONSE_TYPE]: responseType,\n [HEADERS]: httpHeaders,\n [STATUS]: status,\n [STATUS_TEXT]: statusText,\n [REQ_URL]: url\n } = response;\n // Request found in cache. Respond using it.\n let body = undecodedBody;\n switch (responseType) {\n case 'arraybuffer':\n body = new TextEncoder().encode(undecodedBody).buffer;\n break;\n case 'blob':\n body = new Blob([undecodedBody]);\n break;\n }\n // We want to warn users accessing a header provided from the cache\n // That HttpTransferCache alters the headers\n // The warning will be logged a single time by HttpHeaders instance\n let headers = new HttpHeaders(httpHeaders);\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Append extra logic in dev mode to produce a warning when a header\n // that was not transferred to the client is accessed in the code via `get`\n // and `has` calls.\n headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);\n }\n return of(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url\n }));\n }\n // Request not found in cache. Make the request and cache it if on the server.\n return next(req).pipe(tap(event => {\n if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) {\n transferState.set(storeKey, {\n [BODY]: event.body,\n [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),\n [STATUS]: event.status,\n [STATUS_TEXT]: event.statusText,\n [REQ_URL]: requestUrl,\n [RESPONSE_TYPE]: req.responseType\n });\n }\n }));\n}\n/** @returns true when the requests contains autorization related headers. */\nfunction hasAuthHeaders(req) {\n return req.headers.has('authorization') || req.headers.has('proxy-authorization');\n}\nfunction getFilteredHeaders(headers, includeHeaders) {\n if (!includeHeaders) {\n return {};\n }\n const headersMap = {};\n for (const key of includeHeaders) {\n const values = headers.getAll(key);\n if (values !== null) {\n headersMap[key] = values;\n }\n }\n return headersMap;\n}\nfunction sortAndConcatParams(params) {\n return [...params.keys()].sort().map(k => `${k}=${params.getAll(k)}`).join('&');\n}\nfunction makeCacheKey(request, mappedRequestUrl) {\n // make the params encoded same as a url so it's easy to identify\n const {\n params,\n method,\n responseType\n } = request;\n const encodedParams = sortAndConcatParams(params);\n let serializedBody = request.serializeBody();\n if (serializedBody instanceof URLSearchParams) {\n serializedBody = sortAndConcatParams(serializedBody);\n } else if (typeof serializedBody !== 'string') {\n serializedBody = '';\n }\n const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join('|');\n const hash = generateHash(key);\n return makeStateKey(hash);\n}\n/**\n * A method that returns a hash representation of a string using a variant of DJB2 hash\n * algorithm.\n *\n * This is the same hashing logic that is used to generate component ids.\n */\nfunction generateHash(value) {\n let hash = 0;\n for (const char of value) {\n hash = Math.imul(31, hash) + char.charCodeAt(0) << 0;\n }\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n return hash.toString();\n}\n/**\n * Returns the DI providers needed to enable HTTP transfer cache.\n *\n * By default, when using server rendering, requests are performed twice: once on the server and\n * other one on the browser.\n *\n * When these providers are added, requests performed on the server are cached and reused during the\n * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing\n * load time.\n *\n */\nfunction withHttpTransferCache(cacheOptions) {\n return [{\n provide: CACHE_OPTIONS,\n useFactory: () => {\n ɵperformanceMarkFeature('NgHttpTransferCache');\n return {\n isCacheActive: true,\n ...cacheOptions\n };\n }\n }, {\n provide: HTTP_ROOT_INTERCEPTOR_FNS,\n useValue: transferCacheInterceptorFn,\n multi: true,\n deps: [TransferState, CACHE_OPTIONS]\n }, {\n provide: APP_BOOTSTRAP_LISTENER,\n multi: true,\n useFactory: () => {\n const appRef = inject(ApplicationRef);\n const cacheState = inject(CACHE_OPTIONS);\n return () => {\n appRef.whenStable().then(() => {\n cacheState.isCacheActive = false;\n });\n };\n }\n }];\n}\n/**\n * This function will add a proxy to an HttpHeader to intercept calls to get/has\n * and log a warning if the header entry requested has been removed\n */\nfunction appendMissingHeadersDetection(url, headers, headersToInclude) {\n const warningProduced = new Set();\n return new Proxy(headers, {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n const methods = new Set(['get', 'has', 'getAll']);\n if (typeof value !== 'function' || !methods.has(prop)) {\n return value;\n }\n return headerName => {\n // We log when the key has been removed and a warning hasn't been produced for the header\n const key = (prop + ':' + headerName).toLowerCase(); // e.g. `get:cache-control`\n if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {\n warningProduced.add(key);\n const truncatedUrl = ɵtruncateMiddle(url);\n // TODO: create Error guide for this warning\n console.warn(ɵformatRuntimeError(2802 /* RuntimeErrorCode.HEADERS_ALTERED_BY_TRANSFER_CACHE */, `Angular detected that the \\`${headerName}\\` header is accessed, but the value of the header ` + `was not transferred from the server to the client by the HttpTransferCache. ` + `To include the value of the \\`${headerName}\\` header for the \\`${truncatedUrl}\\` request, ` + `use the \\`includeHeaders\\` list. The \\`includeHeaders\\` can be defined either ` + `on a request level by adding the \\`transferCache\\` parameter, or on an application ` + `level by adding the \\`httpCacheTransfer.includeHeaders\\` argument to the ` + `\\`provideClientHydration()\\` call. `));\n }\n // invoking the original method\n return value.apply(target, [headerName]);\n };\n }\n });\n}\nfunction mapRequestOriginUrl(url, originMap) {\n const origin = new URL(url, 'resolve://').origin;\n const mappedOrigin = originMap[origin];\n if (!mappedOrigin) {\n return url;\n }\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n verifyMappedOrigin(mappedOrigin);\n }\n return url.replace(origin, mappedOrigin);\n}\nfunction verifyMappedOrigin(url) {\n if (new URL(url, 'resolve://').pathname !== '/') {\n throw new ɵRuntimeError(2804 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_CONTAINS_PATH */, 'Angular detected a URL with a path segment in the value provided for the ' + `\\`HTTP_TRANSFER_CACHE_ORIGIN_MAP\\` token: ${url}. The map should only contain origins ` + 'without any other segments.');\n }\n}\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { FetchBackend, HTTP_INTERCEPTORS, HTTP_TRANSFER_CACHE_ORIGIN_MAP, HttpBackend, HttpClient, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration, HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS, HttpInterceptorHandler as ɵHttpInterceptingHandler, HttpInterceptorHandler as ɵHttpInterceptorHandler, REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY, withHttpTransferCache as ɵwithHttpTransferCache };\n","/**\n * @license Angular v19.1.3\n * (c) 2010-2024 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { ɵDomAdapter, ɵsetRootDomAdapter, ɵparseCookieValue, ɵgetDOM, isPlatformServer, DOCUMENT, ɵPLATFORM_BROWSER_ID, XhrFactory, CommonModule } from '@angular/common';\nexport { ɵgetDOM } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, ɵTracingService, RendererStyleFlags2, ɵinternalCreateApplication, ErrorHandler, ɵsetDocument, PLATFORM_INITIALIZER, createPlatformFactory, platformCore, ɵTESTABILITY_GETTER, ɵTESTABILITY, Testability, NgZone, TestabilityRegistry, ɵINJECTOR_SCOPE, RendererFactory2, inject, ApplicationModule, NgModule, ApplicationRef, ɵConsole, Injector, forwardRef, ɵXSS_SECURITY_URL, SecurityContext, ɵallowSanitizationBypassAndThrow, ɵunwrapSafeValue, ɵ_sanitizeUrl, ɵ_sanitizeHtml, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustUrl, ɵbypassSanitizationTrustResourceUrl, ɵwithI18nSupport, ɵwithEventReplay, ɵwithIncrementalHydration, ENVIRONMENT_INITIALIZER, ɵZONELESS_ENABLED, ɵformatRuntimeError, makeEnvironmentProviders, ɵwithDomHydration, Version } from '@angular/core';\nimport { ɵwithHttpTransferCache } from '@angular/common/http';\n\n/**\n * Provides DOM operations in any browser environment.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nclass GenericBrowserDomAdapter extends ɵDomAdapter {\n supportsDOMEvents = true;\n}\n\n/**\n * A `DomAdapter` powered by full browser DOM APIs.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nclass BrowserDomAdapter extends GenericBrowserDomAdapter {\n static makeCurrent() {\n ɵsetRootDomAdapter(new BrowserDomAdapter());\n }\n onAndCancel(el, evt, listener, options) {\n el.addEventListener(evt, listener, options);\n return () => {\n el.removeEventListener(evt, listener, options);\n };\n }\n dispatchEvent(el, evt) {\n el.dispatchEvent(evt);\n }\n remove(node) {\n node.remove();\n }\n createElement(tagName, doc) {\n doc = doc || this.getDefaultDocument();\n return doc.createElement(tagName);\n }\n createHtmlDocument() {\n return document.implementation.createHTMLDocument('fakeTitle');\n }\n getDefaultDocument() {\n return document;\n }\n isElementNode(node) {\n return node.nodeType === Node.ELEMENT_NODE;\n }\n isShadowRoot(node) {\n return node instanceof DocumentFragment;\n }\n /** @deprecated No longer being used in Ivy code. To be removed in version 14. */\n getGlobalEventTarget(doc, target) {\n if (target === 'window') {\n return window;\n }\n if (target === 'document') {\n return doc;\n }\n if (target === 'body') {\n return doc.body;\n }\n return null;\n }\n getBaseHref(doc) {\n const href = getBaseElementHref();\n return href == null ? null : relativePath(href);\n }\n resetBaseElement() {\n baseElement = null;\n }\n getUserAgent() {\n return window.navigator.userAgent;\n }\n getCookie(name) {\n return ɵparseCookieValue(document.cookie, name);\n }\n}\nlet baseElement = null;\nfunction getBaseElementHref() {\n baseElement = baseElement || document.querySelector('base');\n return baseElement ? baseElement.getAttribute('href') : null;\n}\nfunction relativePath(url) {\n // The base URL doesn't really matter, we just need it so relative paths have something\n // to resolve against. In the browser `HTMLBaseElement.href` is always absolute.\n return new URL(url, document.baseURI).pathname;\n}\nclass BrowserGetTestability {\n addToWindow(registry) {\n ɵglobal['getAngularTestability'] = (elem, findInAncestors = true) => {\n const testability = registry.findTestabilityInTree(elem, findInAncestors);\n if (testability == null) {\n throw new ɵRuntimeError(5103 /* RuntimeErrorCode.TESTABILITY_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'Could not find testability for element.');\n }\n return testability;\n };\n ɵglobal['getAllAngularTestabilities'] = () => registry.getAllTestabilities();\n ɵglobal['getAllAngularRootElements'] = () => registry.getAllRootElements();\n const whenAllStable = callback => {\n const testabilities = ɵglobal['getAllAngularTestabilities']();\n let count = testabilities.length;\n const decrement = function () {\n count--;\n if (count == 0) {\n callback();\n }\n };\n testabilities.forEach(testability => {\n testability.whenStable(decrement);\n });\n };\n if (!ɵglobal['frameworkStabilizers']) {\n ɵglobal['frameworkStabilizers'] = [];\n }\n ɵglobal['frameworkStabilizers'].push(whenAllStable);\n }\n findTestabilityInTree(registry, elem, findInAncestors) {\n if (elem == null) {\n return null;\n }\n const t = registry.getTestability(elem);\n if (t != null) {\n return t;\n } else if (!findInAncestors) {\n return null;\n }\n if (ɵgetDOM().isShadowRoot(elem)) {\n return this.findTestabilityInTree(registry, elem.host, true);\n }\n return this.findTestabilityInTree(registry, elem.parentElement, true);\n }\n}\n\n/**\n * A factory for `HttpXhrBackend` that uses the `XMLHttpRequest` browser API.\n */\nlet BrowserXhr = /*#__PURE__*/(() => {\n class BrowserXhr {\n build() {\n return new XMLHttpRequest();\n }\n static ɵfac = function BrowserXhr_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || BrowserXhr)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: BrowserXhr,\n factory: BrowserXhr.ɵfac\n });\n }\n return BrowserXhr;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The injection token for plugins of the `EventManager` service.\n *\n * @publicApi\n */\nconst EVENT_MANAGER_PLUGINS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'EventManagerPlugins' : '');\n/**\n * An injectable service that provides event management for Angular\n * through a browser plug-in.\n *\n * @publicApi\n */\nlet EventManager = /*#__PURE__*/(() => {\n class EventManager {\n _zone;\n _plugins;\n _eventNameToPlugin = new Map();\n /**\n * Initializes an instance of the event-manager service.\n */\n constructor(plugins, _zone) {\n this._zone = _zone;\n plugins.forEach(plugin => {\n plugin.manager = this;\n });\n this._plugins = plugins.slice().reverse();\n }\n /**\n * Registers a handler for a specific element and event.\n *\n * @param element The HTML element to receive event notifications.\n * @param eventName The name of the event to listen for.\n * @param handler A function to call when the notification occurs. Receives the\n * event object as an argument.\n * @param options Options that configure how the event listener is bound.\n * @returns A callback function that can be used to remove the handler.\n */\n addEventListener(element, eventName, handler, options) {\n const plugin = this._findPluginFor(eventName);\n return plugin.addEventListener(element, eventName, handler, options);\n }\n /**\n * Retrieves the compilation zone in which event listeners are registered.\n */\n getZone() {\n return this._zone;\n }\n /** @internal */\n _findPluginFor(eventName) {\n let plugin = this._eventNameToPlugin.get(eventName);\n if (plugin) {\n return plugin;\n }\n const plugins = this._plugins;\n plugin = plugins.find(plugin => plugin.supports(eventName));\n if (!plugin) {\n throw new ɵRuntimeError(5101 /* RuntimeErrorCode.NO_PLUGIN_FOR_EVENT */, (typeof ngDevMode === 'undefined' || ngDevMode) && `No event manager plugin found for event ${eventName}`);\n }\n this._eventNameToPlugin.set(eventName, plugin);\n return plugin;\n }\n static ɵfac = function EventManager_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || EventManager)(i0.ɵɵinject(EVENT_MANAGER_PLUGINS), i0.ɵɵinject(i0.NgZone));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: EventManager,\n factory: EventManager.ɵfac\n });\n }\n return EventManager;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * The plugin definition for the `EventManager` class\n *\n * It can be used as a base class to create custom manager plugins, i.e. you can create your own\n * class that extends the `EventManagerPlugin` one.\n *\n * @publicApi\n */\nclass EventManagerPlugin {\n _doc;\n // TODO: remove (has some usage in G3)\n constructor(_doc) {\n this._doc = _doc;\n }\n // Using non-null assertion because it's set by EventManager's constructor\n manager;\n}\n\n/** The style elements attribute name used to set value of `APP_ID` token. */\nconst APP_ID_ATTRIBUTE_NAME = 'ng-app-id';\n/**\n * Removes all provided elements from the document.\n * @param elements An array of HTML Elements.\n */\nfunction removeElements(elements) {\n for (const element of elements) {\n element.remove();\n }\n}\n/**\n * Creates a `style` element with the provided inline style content.\n * @param style A string of the inline style content.\n * @param doc A DOM Document to use to create the element.\n * @returns An HTMLStyleElement instance.\n */\nfunction createStyleElement(style, doc) {\n const styleElement = doc.createElement('style');\n styleElement.textContent = style;\n return styleElement;\n}\n/**\n * Searches a DOM document's head element for style elements with a matching application\n * identifier attribute (`ng-app-id`) to the provide identifier and adds usage records for each.\n * @param doc An HTML DOM document instance.\n * @param appId A string containing an Angular application identifer.\n * @param inline A Map object for tracking inline (defined via `styles` in component decorator) style usage.\n * @param external A Map object for tracking external (defined via `styleUrls` in component decorator) style usage.\n */\nfunction addServerStyles(doc, appId, inline, external) {\n const elements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}=\"${appId}\"],link[${APP_ID_ATTRIBUTE_NAME}=\"${appId}\"]`);\n if (elements) {\n for (const styleElement of elements) {\n styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);\n if (styleElement instanceof HTMLLinkElement) {\n // Only use filename from href\n // The href is build time generated with a unique value to prevent duplicates.\n external.set(styleElement.href.slice(styleElement.href.lastIndexOf('/') + 1), {\n usage: 0,\n elements: [styleElement]\n });\n } else if (styleElement.textContent) {\n inline.set(styleElement.textContent, {\n usage: 0,\n elements: [styleElement]\n });\n }\n }\n }\n}\n/**\n * Creates a `link` element for the provided external style URL.\n * @param url A string of the URL for the stylesheet.\n * @param doc A DOM Document to use to create the element.\n * @returns An HTMLLinkElement instance.\n */\nfunction createLinkElement(url, doc) {\n const linkElement = doc.createElement('link');\n linkElement.setAttribute('rel', 'stylesheet');\n linkElement.setAttribute('href', url);\n return linkElement;\n}\nlet SharedStylesHost = /*#__PURE__*/(() => {\n class SharedStylesHost {\n doc;\n appId;\n nonce;\n /**\n * Provides usage information for active inline style content and associated HTML <style> elements.\n * Embedded styles typically originate from the `styles` metadata of a rendered component.\n */\n inline = new Map();\n /**\n * Provides usage information for active external style URLs and the associated HTML <link> elements.\n * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.\n */\n external = new Map();\n /**\n * Set of host DOM nodes that will have styles attached.\n */\n hosts = new Set();\n /**\n * Whether the application code is currently executing on a server.\n */\n isServer;\n constructor(doc, appId, nonce, platformId = {}) {\n this.doc = doc;\n this.appId = appId;\n this.nonce = nonce;\n this.isServer = isPlatformServer(platformId);\n addServerStyles(doc, appId, this.inline, this.external);\n this.hosts.add(doc.head);\n }\n /**\n * Adds embedded styles to the DOM via HTML `style` elements.\n * @param styles An array of style content strings.\n */\n addStyles(styles, urls) {\n for (const value of styles) {\n this.addUsage(value, this.inline, createStyleElement);\n }\n urls?.forEach(value => this.addUsage(value, this.external, createLinkElement));\n }\n /**\n * Removes embedded styles from the DOM that were added as HTML `style` elements.\n * @param styles An array of style content strings.\n */\n removeStyles(styles, urls) {\n for (const value of styles) {\n this.removeUsage(value, this.inline);\n }\n urls?.forEach(value => this.removeUsage(value, this.external));\n }\n addUsage(value, usages, creator) {\n // Attempt to get any current usage of the value\n const record = usages.get(value);\n // If existing, just increment the usage count\n if (record) {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && record.usage === 0) {\n // A usage count of zero indicates a preexisting server generated style.\n // This attribute is solely used for debugging purposes of SSR style reuse.\n record.elements.forEach(element => element.setAttribute('ng-style-reused', ''));\n }\n record.usage++;\n } else {\n // Otherwise, create an entry to track the elements and add element for each host\n usages.set(value, {\n usage: 1,\n elements: [...this.hosts].map(host => this.addElement(host, creator(value, this.doc)))\n });\n }\n }\n removeUsage(value, usages) {\n // Attempt to get any current usage of the value\n const record = usages.get(value);\n // If there is a record, reduce the usage count and if no longer used,\n // remove from DOM and delete usage record.\n if (record) {\n record.usage--;\n if (record.usage <= 0) {\n removeElements(record.elements);\n usages.delete(value);\n }\n }\n }\n ngOnDestroy() {\n for (const [, {\n elements\n }] of [...this.inline, ...this.external]) {\n removeElements(elements);\n }\n this.hosts.clear();\n }\n /**\n * Adds a host node to the set of style hosts and adds all existing style usage to\n * the newly added host node.\n *\n * This is currently only used for Shadow DOM encapsulation mode.\n */\n addHost(hostNode) {\n this.hosts.add(hostNode);\n // Add existing styles to new host\n for (const [style, {\n elements\n }] of this.inline) {\n elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));\n }\n for (const [url, {\n elements\n }] of this.external) {\n elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));\n }\n }\n removeHost(hostNode) {\n this.hosts.delete(hostNode);\n }\n addElement(host, element) {\n // Add a nonce if present\n if (this.nonce) {\n element.setAttribute('nonce', this.nonce);\n }\n // Add application identifier when on the server to support client-side reuse\n if (this.isServer) {\n element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);\n }\n // Insert the element into the DOM with the host node as parent\n return host.appendChild(element);\n }\n static ɵfac = function SharedStylesHost_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || SharedStylesHost)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(APP_ID), i0.ɵɵinject(CSP_NONCE, 8), i0.ɵɵinject(PLATFORM_ID));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: SharedStylesHost,\n factory: SharedStylesHost.ɵfac\n });\n }\n return SharedStylesHost;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst NAMESPACE_URIS = {\n 'svg': 'http://www.w3.org/2000/svg',\n 'xhtml': 'http://www.w3.org/1999/xhtml',\n 'xlink': 'http://www.w3.org/1999/xlink',\n 'xml': 'http://www.w3.org/XML/1998/namespace',\n 'xmlns': 'http://www.w3.org/2000/xmlns/',\n 'math': 'http://www.w3.org/1998/Math/MathML'\n};\nconst COMPONENT_REGEX = /%COMP%/g;\nconst COMPONENT_VARIABLE = '%COMP%';\nconst HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;\nconst CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;\n/**\n * The default value for the `REMOVE_STYLES_ON_COMPONENT_DESTROY` DI token.\n */\nconst REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;\n/**\n * A DI token that indicates whether styles\n * of destroyed components should be removed from DOM.\n *\n * By default, the value is set to `true`.\n * @publicApi\n */\nconst REMOVE_STYLES_ON_COMPONENT_DESTROY = /*#__PURE__*/new InjectionToken(ngDevMode ? 'RemoveStylesOnCompDestroy' : '', {\n providedIn: 'root',\n factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT\n});\nfunction shimContentAttribute(componentShortId) {\n return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);\n}\nfunction shimHostAttribute(componentShortId) {\n return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);\n}\nfunction shimStylesContent(compId, styles) {\n return styles.map(s => s.replace(COMPONENT_REGEX, compId));\n}\nlet DomRendererFactory2 = /*#__PURE__*/(() => {\n class DomRendererFactory2 {\n eventManager;\n sharedStylesHost;\n appId;\n removeStylesOnCompDestroy;\n doc;\n platformId;\n ngZone;\n nonce;\n tracingService;\n rendererByCompId = new Map();\n defaultRenderer;\n platformIsServer;\n constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null, tracingService = null) {\n this.eventManager = eventManager;\n this.sharedStylesHost = sharedStylesHost;\n this.appId = appId;\n this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;\n this.doc = doc;\n this.platformId = platformId;\n this.ngZone = ngZone;\n this.nonce = nonce;\n this.tracingService = tracingService;\n this.platformIsServer = isPlatformServer(platformId);\n this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer, this.tracingService);\n }\n createRenderer(element, type) {\n if (!element || !type) {\n return this.defaultRenderer;\n }\n if (this.platformIsServer && type.encapsulation === ViewEncapsulation.ShadowDom) {\n // Domino does not support shadow DOM.\n type = {\n ...type,\n encapsulation: ViewEncapsulation.Emulated\n };\n }\n const renderer = this.getOrCreateRenderer(element, type);\n // Renderers have different logic due to different encapsulation behaviours.\n // Ex: for emulated, an attribute is added to the element.\n if (renderer instanceof EmulatedEncapsulationDomRenderer2) {\n renderer.applyToHost(element);\n } else if (renderer instanceof NoneEncapsulationDomRenderer) {\n renderer.applyStyles();\n }\n return renderer;\n }\n getOrCreateRenderer(element, type) {\n const rendererByCompId = this.rendererByCompId;\n let renderer = rendererByCompId.get(type.id);\n if (!renderer) {\n const doc = this.doc;\n const ngZone = this.ngZone;\n const eventManager = this.eventManager;\n const sharedStylesHost = this.sharedStylesHost;\n const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;\n const platformIsServer = this.platformIsServer;\n switch (type.encapsulation) {\n case ViewEncapsulation.Emulated:\n renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, this.tracingService);\n break;\n case ViewEncapsulation.ShadowDom:\n return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer, this.tracingService);\n default:\n renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, this.tracingService);\n break;\n }\n rendererByCompId.set(type.id, renderer);\n }\n return renderer;\n }\n ngOnDestroy() {\n this.rendererByCompId.clear();\n }\n /**\n * Used during HMR to clear any cached data about a component.\n * @param componentId ID of the component that is being replaced.\n */\n componentReplaced(componentId) {\n this.rendererByCompId.delete(componentId);\n }\n static ɵfac = function DomRendererFactory2_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || DomRendererFactory2)(i0.ɵɵinject(EventManager), i0.ɵɵinject(SharedStylesHost), i0.ɵɵinject(APP_ID), i0.ɵɵinject(REMOVE_STYLES_ON_COMPONENT_DESTROY), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(PLATFORM_ID), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(CSP_NONCE), i0.ɵɵinject(ɵTracingService, 8));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: DomRendererFactory2,\n factory: DomRendererFactory2.ɵfac\n });\n }\n return DomRendererFactory2;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass DefaultDomRenderer2 {\n eventManager;\n doc;\n ngZone;\n platformIsServer;\n tracingService;\n data = /*#__PURE__*/Object.create(null);\n /**\n * By default this renderer throws when encountering synthetic properties\n * This can be disabled for example by the AsyncAnimationRendererFactory\n */\n throwOnSyntheticProps = true;\n constructor(eventManager, doc, ngZone, platformIsServer, tracingService) {\n this.eventManager = eventManager;\n this.doc = doc;\n this.ngZone = ngZone;\n this.platformIsServer = platformIsServer;\n this.tracingService = tracingService;\n }\n destroy() {}\n destroyNode = null;\n createElement(name, namespace) {\n if (namespace) {\n // TODO: `|| namespace` was added in\n // https://github.com/angular/angular/commit/2b9cc8503d48173492c29f5a271b61126104fbdb to\n // support how Ivy passed around the namespace URI rather than short name at the time. It did\n // not, however extend the support to other parts of the system (setAttribute, setAttribute,\n // and the ServerRenderer). We should decide what exactly the semantics for dealing with\n // namespaces should be and make it consistent.\n // Related issues:\n // https://github.com/angular/angular/issues/44028\n // https://github.com/angular/angular/issues/44883\n return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);\n }\n return this.doc.createElement(name);\n }\n createComment(value) {\n return this.doc.createComment(value);\n }\n createText(value) {\n return this.doc.createTextNode(value);\n }\n appendChild(parent, newChild) {\n const targetParent = isTemplateNode(parent) ? parent.content : parent;\n targetParent.appendChild(newChild);\n }\n insertBefore(parent, newChild, refChild) {\n if (parent) {\n const targetParent = isTemplateNode(parent) ? parent.content : parent;\n targetParent.insertBefore(newChild, refChild);\n }\n }\n removeChild(_parent, oldChild) {\n oldChild.remove();\n }\n selectRootElement(selectorOrNode, preserveContent) {\n let el = typeof selectorOrNode === 'string' ? this.doc.querySelector(selectorOrNode) : selectorOrNode;\n if (!el) {\n throw new ɵRuntimeError(-5104 /* RuntimeErrorCode.ROOT_NODE_NOT_FOUND */, (typeof ngDevMode === 'undefined' || ngDevMode) && `The selector \"${selectorOrNode}\" did not match any elements`);\n }\n if (!preserveContent) {\n el.textContent = '';\n }\n return el;\n }\n parentNode(node) {\n return node.parentNode;\n }\n nextSibling(node) {\n return node.nextSibling;\n }\n setAttribute(el, name, value, namespace) {\n if (namespace) {\n name = namespace + ':' + name;\n const namespaceUri = NAMESPACE_URIS[namespace];\n if (namespaceUri) {\n el.setAttributeNS(namespaceUri, name, value);\n } else {\n el.setAttribute(name, value);\n }\n } else {\n el.setAttribute(name, value);\n }\n }\n removeAttribute(el, name, namespace) {\n if (namespace) {\n const namespaceUri = NAMESPACE_URIS[namespace];\n if (namespaceUri) {\n el.removeAttributeNS(namespaceUri, name);\n } else {\n el.removeAttribute(`${namespace}:${name}`);\n }\n } else {\n el.removeAttribute(name);\n }\n }\n addClass(el, name) {\n el.classList.add(name);\n }\n removeClass(el, name) {\n el.classList.remove(name);\n }\n setStyle(el, style, value, flags) {\n if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {\n el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? 'important' : '');\n } else {\n el.style[style] = value;\n }\n }\n removeStyle(el, style, flags) {\n if (flags & RendererStyleFlags2.DashCase) {\n // removeProperty has no effect when used on camelCased properties.\n el.style.removeProperty(style);\n } else {\n el.style[style] = '';\n }\n }\n setProperty(el, name, value) {\n if (el == null) {\n return;\n }\n (typeof ngDevMode === 'undefined' || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, 'property');\n el[name] = value;\n }\n setValue(node, value) {\n node.nodeValue = value;\n }\n listen(target, event, callback, options) {\n (typeof ngDevMode === 'undefined' || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, 'listener');\n if (typeof target === 'string') {\n target = ɵgetDOM().getGlobalEventTarget(this.doc, target);\n if (!target) {\n throw new Error(`Unsupported event target ${target} for event ${event}`);\n }\n }\n let wrappedCallback = this.decoratePreventDefault(callback);\n if (this.tracingService !== null && this.tracingService.wrapEventListener) {\n wrappedCallback = this.tracingService.wrapEventListener(target, event, wrappedCallback);\n }\n return this.eventManager.addEventListener(target, event, wrappedCallback, options);\n }\n decoratePreventDefault(eventHandler) {\n // `DebugNode.triggerEventHandler` needs to know if the listener was created with\n // decoratePreventDefault or is a listener added outside the Angular context so it can handle\n // the two differently. In the first case, the special '__ngUnwrap__' token is passed to the\n // unwrap the listener (see below).\n return event => {\n // Ivy uses '__ngUnwrap__' as a special token that allows us to unwrap the function\n // so that it can be invoked programmatically by `DebugNode.triggerEventHandler`. The\n // debug_node can inspect the listener toString contents for the existence of this special\n // token. Because the token is a string literal, it is ensured to not be modified by compiled\n // code.\n if (event === '__ngUnwrap__') {\n return eventHandler;\n }\n // Run the event handler inside the ngZone because event handlers are not patched\n // by Zone on the server. This is required only for tests.\n const allowDefaultBehavior = this.platformIsServer ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);\n if (allowDefaultBehavior === false) {\n event.preventDefault();\n }\n return undefined;\n };\n }\n}\nconst AT_CHARCODE = /*#__PURE__*/(() => '@'.charCodeAt(0))();\nfunction checkNoSyntheticProp(name, nameKind) {\n if (name.charCodeAt(0) === AT_CHARCODE) {\n throw new ɵRuntimeError(5105 /* RuntimeErrorCode.UNEXPECTED_SYNTHETIC_PROPERTY */, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:\n - Make sure \\`provideAnimationsAsync()\\`, \\`provideAnimations()\\` or \\`provideNoopAnimations()\\` call was added to a list of providers used to bootstrap an application.\n - There is a corresponding animation configuration named \\`${name}\\` defined in the \\`animations\\` field of the \\`@Component\\` decorator (see https://angular.dev/api/core/Component#animations).`);\n }\n}\nfunction isTemplateNode(node) {\n return node.tagName === 'TEMPLATE' && node.content !== undefined;\n}\nclass ShadowDomRenderer extends DefaultDomRenderer2 {\n sharedStylesHost;\n hostEl;\n shadowRoot;\n constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer, tracingService) {\n super(eventManager, doc, ngZone, platformIsServer, tracingService);\n this.sharedStylesHost = sharedStylesHost;\n this.hostEl = hostEl;\n this.shadowRoot = hostEl.attachShadow({\n mode: 'open'\n });\n this.sharedStylesHost.addHost(this.shadowRoot);\n const styles = shimStylesContent(component.id, component.styles);\n for (const style of styles) {\n const styleEl = document.createElement('style');\n if (nonce) {\n styleEl.setAttribute('nonce', nonce);\n }\n styleEl.textContent = style;\n this.shadowRoot.appendChild(styleEl);\n }\n // Apply any external component styles to the shadow root for the component's element.\n // The ShadowDOM renderer uses an alternative execution path for component styles that\n // does not use the SharedStylesHost that other encapsulation modes leverage. Much like\n // the manual addition of embedded styles directly above, any external stylesheets\n // must be manually added here to ensure ShadowDOM components are correctly styled.\n // TODO: Consider reworking the DOM Renderers to consolidate style handling.\n const styleUrls = component.getExternalStyles?.();\n if (styleUrls) {\n for (const styleUrl of styleUrls) {\n const linkEl = createLinkElement(styleUrl, doc);\n if (nonce) {\n linkEl.setAttribute('nonce', nonce);\n }\n this.shadowRoot.appendChild(linkEl);\n }\n }\n }\n nodeOrShadowRoot(node) {\n return node === this.hostEl ? this.shadowRoot : node;\n }\n appendChild(parent, newChild) {\n return super.appendChild(this.nodeOrShadowRoot(parent), newChild);\n }\n insertBefore(parent, newChild, refChild) {\n return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);\n }\n removeChild(_parent, oldChild) {\n return super.removeChild(null, oldChild);\n }\n parentNode(node) {\n return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));\n }\n destroy() {\n this.sharedStylesHost.removeHost(this.shadowRoot);\n }\n}\nclass NoneEncapsulationDomRenderer extends DefaultDomRenderer2 {\n sharedStylesHost;\n removeStylesOnCompDestroy;\n styles;\n styleUrls;\n constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId) {\n super(eventManager, doc, ngZone, platformIsServer, tracingService);\n this.sharedStylesHost = sharedStylesHost;\n this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;\n this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles;\n this.styleUrls = component.getExternalStyles?.(compId);\n }\n applyStyles() {\n this.sharedStylesHost.addStyles(this.styles, this.styleUrls);\n }\n destroy() {\n if (!this.removeStylesOnCompDestroy) {\n return;\n }\n this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);\n }\n}\nclass EmulatedEncapsulationDomRenderer2 extends NoneEncapsulationDomRenderer {\n contentAttr;\n hostAttr;\n constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService) {\n const compId = appId + '-' + component.id;\n super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId);\n this.contentAttr = shimContentAttribute(compId);\n this.hostAttr = shimHostAttribute(compId);\n }\n applyToHost(element) {\n this.applyStyles();\n this.setAttribute(element, this.hostAttr, '');\n }\n createElement(parent, name) {\n const el = super.createElement(parent, name);\n super.setAttribute(el, this.contentAttr, '');\n return el;\n }\n}\nlet DomEventsPlugin = /*#__PURE__*/(() => {\n class DomEventsPlugin extends EventManagerPlugin {\n constructor(doc) {\n super(doc);\n }\n // This plugin should come last in the list of plugins, because it accepts all\n // events.\n supports(eventName) {\n return true;\n }\n addEventListener(element, eventName, handler, options) {\n element.addEventListener(eventName, handler, options);\n return () => this.removeEventListener(element, eventName, handler, options);\n }\n removeEventListener(target, eventName, callback, options) {\n return target.removeEventListener(eventName, callback, options);\n }\n static ɵfac = function DomEventsPlugin_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || DomEventsPlugin)(i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: DomEventsPlugin,\n factory: DomEventsPlugin.ɵfac\n });\n }\n return DomEventsPlugin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Defines supported modifiers for key events.\n */\nconst MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];\n// The following values are here for cross-browser compatibility and to match the W3C standard\n// cf https://www.w3.org/TR/DOM-Level-3-Events-key/\nconst _keyMap = {\n '\\b': 'Backspace',\n '\\t': 'Tab',\n '\\x7F': 'Delete',\n '\\x1B': 'Escape',\n 'Del': 'Delete',\n 'Esc': 'Escape',\n 'Left': 'ArrowLeft',\n 'Right': 'ArrowRight',\n 'Up': 'ArrowUp',\n 'Down': 'ArrowDown',\n 'Menu': 'ContextMenu',\n 'Scroll': 'ScrollLock',\n 'Win': 'OS'\n};\n/**\n * Retrieves modifiers from key-event objects.\n */\nconst MODIFIER_KEY_GETTERS = {\n 'alt': event => event.altKey,\n 'control': event => event.ctrlKey,\n 'meta': event => event.metaKey,\n 'shift': event => event.shiftKey\n};\n/**\n * A browser plug-in that provides support for handling of key events in Angular.\n */\nlet KeyEventsPlugin = /*#__PURE__*/(() => {\n class KeyEventsPlugin extends EventManagerPlugin {\n /**\n * Initializes an instance of the browser plug-in.\n * @param doc The document in which key events will be detected.\n */\n constructor(doc) {\n super(doc);\n }\n /**\n * Reports whether a named key event is supported.\n * @param eventName The event name to query.\n * @return True if the named key event is supported.\n */\n supports(eventName) {\n return KeyEventsPlugin.parseEventName(eventName) != null;\n }\n /**\n * Registers a handler for a specific element and key event.\n * @param element The HTML element to receive event notifications.\n * @param eventName The name of the key event to listen for.\n * @param handler A function to call when the notification occurs. Receives the\n * event object as an argument.\n * @returns The key event that was registered.\n */\n addEventListener(element, eventName, handler, options) {\n const parsedEvent = KeyEventsPlugin.parseEventName(eventName);\n const outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());\n return this.manager.getZone().runOutsideAngular(() => {\n return ɵgetDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler, options);\n });\n }\n /**\n * Parses the user provided full keyboard event definition and normalizes it for\n * later internal use. It ensures the string is all lowercase, converts special\n * characters to a standard spelling, and orders all the values consistently.\n *\n * @param eventName The name of the key event to listen for.\n * @returns an object with the full, normalized string, and the dom event name\n * or null in the case when the event doesn't match a keyboard event.\n */\n static parseEventName(eventName) {\n const parts = eventName.toLowerCase().split('.');\n const domEventName = parts.shift();\n if (parts.length === 0 || !(domEventName === 'keydown' || domEventName === 'keyup')) {\n return null;\n }\n const key = KeyEventsPlugin._normalizeKey(parts.pop());\n let fullKey = '';\n let codeIX = parts.indexOf('code');\n if (codeIX > -1) {\n parts.splice(codeIX, 1);\n fullKey = 'code.';\n }\n MODIFIER_KEYS.forEach(modifierName => {\n const index = parts.indexOf(modifierName);\n if (index > -1) {\n parts.splice(index, 1);\n fullKey += modifierName + '.';\n }\n });\n fullKey += key;\n if (parts.length != 0 || key.length === 0) {\n // returning null instead of throwing to let another plugin process the event\n return null;\n }\n // NOTE: Please don't rewrite this as so, as it will break JSCompiler property renaming.\n // The code must remain in the `result['domEventName']` form.\n // return {domEventName, fullKey};\n const result = {};\n result['domEventName'] = domEventName;\n result['fullKey'] = fullKey;\n return result;\n }\n /**\n * Determines whether the actual keys pressed match the configured key code string.\n * The `fullKeyCode` event is normalized in the `parseEventName` method when the\n * event is attached to the DOM during the `addEventListener` call. This is unseen\n * by the end user and is normalized for internal consistency and parsing.\n *\n * @param event The keyboard event.\n * @param fullKeyCode The normalized user defined expected key event string\n * @returns boolean.\n */\n static matchEventFullKeyCode(event, fullKeyCode) {\n let keycode = _keyMap[event.key] || event.key;\n let key = '';\n if (fullKeyCode.indexOf('code.') > -1) {\n keycode = event.code;\n key = 'code.';\n }\n // the keycode could be unidentified so we have to check here\n if (keycode == null || !keycode) return false;\n keycode = keycode.toLowerCase();\n if (keycode === ' ') {\n keycode = 'space'; // for readability\n } else if (keycode === '.') {\n keycode = 'dot'; // because '.' is used as a separator in event names\n }\n MODIFIER_KEYS.forEach(modifierName => {\n if (modifierName !== keycode) {\n const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];\n if (modifierGetter(event)) {\n key += modifierName + '.';\n }\n }\n });\n key += keycode;\n return key === fullKeyCode;\n }\n /**\n * Configures a handler callback for a key event.\n * @param fullKey The event name that combines all simultaneous keystrokes.\n * @param handler The function that responds to the key event.\n * @param zone The zone in which the event occurred.\n * @returns A callback function.\n */\n static eventCallback(fullKey, handler, zone) {\n return event => {\n if (KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {\n zone.runGuarded(() => handler(event));\n }\n };\n }\n /** @internal */\n static _normalizeKey(keyName) {\n return keyName === 'esc' ? 'escape' : keyName;\n }\n static ɵfac = function KeyEventsPlugin_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || KeyEventsPlugin)(i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: KeyEventsPlugin,\n factory: KeyEventsPlugin.ɵfac\n });\n }\n return KeyEventsPlugin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Bootstraps an instance of an Angular application and renders a standalone component as the\n * application's root component. More information about standalone components can be found in [this\n * guide](guide/components/importing).\n *\n * @usageNotes\n * The root component passed into this function *must* be a standalone one (should have the\n * `standalone: true` flag in the `@Component` decorator config).\n *\n * ```angular-ts\n * @Component({\n * standalone: true,\n * template: 'Hello world!'\n * })\n * class RootComponent {}\n *\n * const appRef: ApplicationRef = await bootstrapApplication(RootComponent);\n * ```\n *\n * You can add the list of providers that should be available in the application injector by\n * specifying the `providers` field in an object passed as the second argument:\n *\n * ```ts\n * await bootstrapApplication(RootComponent, {\n * providers: [\n * {provide: BACKEND_URL, useValue: 'https://yourdomain.com/api'}\n * ]\n * });\n * ```\n *\n * The `importProvidersFrom` helper method can be used to collect all providers from any\n * existing NgModule (and transitively from all NgModules that it imports):\n *\n * ```ts\n * await bootstrapApplication(RootComponent, {\n * providers: [\n * importProvidersFrom(SomeNgModule)\n * ]\n * });\n * ```\n *\n * Note: the `bootstrapApplication` method doesn't include [Testability](api/core/Testability) by\n * default. You can add [Testability](api/core/Testability) by getting the list of necessary\n * providers using `provideProtractorTestingSupport()` function and adding them into the `providers`\n * array, for example:\n *\n * ```ts\n * import {provideProtractorTestingSupport} from '@angular/platform-browser';\n *\n * await bootstrapApplication(RootComponent, {providers: [provideProtractorTestingSupport()]});\n * ```\n *\n * @param rootComponent A reference to a standalone component that should be rendered.\n * @param options Extra configuration for the bootstrap operation, see `ApplicationConfig` for\n * additional info.\n * @returns A promise that returns an `ApplicationRef` instance once resolved.\n *\n * @publicApi\n */\nfunction bootstrapApplication(rootComponent, options) {\n return ɵinternalCreateApplication({\n rootComponent,\n ...createProvidersConfig(options)\n });\n}\n/**\n * Create an instance of an Angular application without bootstrapping any components. This is useful\n * for the situation where one wants to decouple application environment creation (a platform and\n * associated injectors) from rendering components on a screen. Components can be subsequently\n * bootstrapped on the returned `ApplicationRef`.\n *\n * @param options Extra configuration for the application environment, see `ApplicationConfig` for\n * additional info.\n * @returns A promise that returns an `ApplicationRef` instance once resolved.\n *\n * @publicApi\n */\nfunction createApplication(options) {\n return ɵinternalCreateApplication(createProvidersConfig(options));\n}\nfunction createProvidersConfig(options) {\n return {\n appProviders: [...BROWSER_MODULE_PROVIDERS, ...(options?.providers ?? [])],\n platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS\n };\n}\n/**\n * Returns a set of providers required to setup [Testability](api/core/Testability) for an\n * application bootstrapped using the `bootstrapApplication` function. The set of providers is\n * needed to support testing an application with Protractor (which relies on the Testability APIs\n * to be present).\n *\n * @returns An array of providers required to setup Testability for an application and make it\n * available for testing using Protractor.\n *\n * @publicApi\n */\nfunction provideProtractorTestingSupport() {\n // Return a copy to prevent changes to the original array in case any in-place\n // alterations are performed to the `provideProtractorTestingSupport` call results in app\n // code.\n return [...TESTABILITY_PROVIDERS];\n}\nfunction initDomAdapter() {\n BrowserDomAdapter.makeCurrent();\n}\nfunction errorHandler() {\n return new ErrorHandler();\n}\nfunction _document() {\n // Tell ivy about the global document\n ɵsetDocument(document);\n return document;\n}\nconst INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{\n provide: PLATFORM_ID,\n useValue: ɵPLATFORM_BROWSER_ID\n}, {\n provide: PLATFORM_INITIALIZER,\n useValue: initDomAdapter,\n multi: true\n}, {\n provide: DOCUMENT,\n useFactory: _document,\n deps: []\n}];\n/**\n * A factory function that returns a `PlatformRef` instance associated with browser service\n * providers.\n *\n * @publicApi\n */\nconst platformBrowser = /*#__PURE__*/createPlatformFactory(platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);\n/**\n * Internal marker to signal whether providers from the `BrowserModule` are already present in DI.\n * This is needed to avoid loading `BrowserModule` providers twice. We can't rely on the\n * `BrowserModule` presence itself, since the standalone-based bootstrap just imports\n * `BrowserModule` providers without referencing the module itself.\n */\nconst BROWSER_MODULE_PROVIDERS_MARKER = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'BrowserModule Providers Marker' : '');\nconst TESTABILITY_PROVIDERS = [{\n provide: ɵTESTABILITY_GETTER,\n useClass: BrowserGetTestability,\n deps: []\n}, {\n provide: ɵTESTABILITY,\n useClass: Testability,\n deps: [NgZone, TestabilityRegistry, ɵTESTABILITY_GETTER]\n}, {\n provide: Testability,\n // Also provide as `Testability` for backwards-compatibility.\n useClass: Testability,\n deps: [NgZone, TestabilityRegistry, ɵTESTABILITY_GETTER]\n}];\nconst BROWSER_MODULE_PROVIDERS = [{\n provide: ɵINJECTOR_SCOPE,\n useValue: 'root'\n}, {\n provide: ErrorHandler,\n useFactory: errorHandler,\n deps: []\n}, {\n provide: EVENT_MANAGER_PLUGINS,\n useClass: DomEventsPlugin,\n multi: true,\n deps: [DOCUMENT, NgZone, PLATFORM_ID]\n}, {\n provide: EVENT_MANAGER_PLUGINS,\n useClass: KeyEventsPlugin,\n multi: true,\n deps: [DOCUMENT]\n}, DomRendererFactory2, SharedStylesHost, EventManager, {\n provide: RendererFactory2,\n useExisting: DomRendererFactory2\n}, {\n provide: XhrFactory,\n useClass: BrowserXhr,\n deps: []\n}, typeof ngDevMode === 'undefined' || ngDevMode ? {\n provide: BROWSER_MODULE_PROVIDERS_MARKER,\n useValue: true\n} : []];\n/**\n * Exports required infrastructure for all Angular apps.\n * Included by default in all Angular apps created with the CLI\n * `new` command.\n * Re-exports `CommonModule` and `ApplicationModule`, making their\n * exports and providers available to all apps.\n *\n * @publicApi\n */\nlet BrowserModule = /*#__PURE__*/(() => {\n class BrowserModule {\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {\n optional: true,\n skipSelf: true\n });\n if (providersAlreadyPresent) {\n throw new ɵRuntimeError(5100 /* RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED */, `Providers from the \\`BrowserModule\\` have already been loaded. If you need access ` + `to common directives such as NgIf and NgFor, import the \\`CommonModule\\` instead.`);\n }\n }\n }\n static ɵfac = function BrowserModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || BrowserModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: BrowserModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],\n imports: [CommonModule, ApplicationModule]\n });\n }\n return BrowserModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * A service for managing HTML `<meta>` tags.\n *\n * Properties of the `MetaDefinition` object match the attributes of the\n * HTML `<meta>` tag. These tags define document metadata that is important for\n * things like configuring a Content Security Policy, defining browser compatibility\n * and security settings, setting HTTP Headers, defining rich content for social sharing,\n * and Search Engine Optimization (SEO).\n *\n * To identify specific `<meta>` tags in a document, use an attribute selection\n * string in the format `\"tag_attribute='value string'\"`.\n * For example, an `attrSelector` value of `\"name='description'\"` matches a tag\n * whose `name` attribute has the value `\"description\"`.\n * Selectors are used with the `querySelector()` Document method,\n * in the format `meta[{attrSelector}]`.\n *\n * @see [HTML meta tag](https://developer.mozilla.org/docs/Web/HTML/Element/meta)\n * @see [Document.querySelector()](https://developer.mozilla.org/docs/Web/API/Document/querySelector)\n *\n *\n * @publicApi\n */\nlet Meta = /*#__PURE__*/(() => {\n class Meta {\n _doc;\n _dom;\n constructor(_doc) {\n this._doc = _doc;\n this._dom = ɵgetDOM();\n }\n /**\n * Retrieves or creates a specific `<meta>` tag element in the current HTML document.\n * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n * values in the provided tag definition, and verifies that all other attribute values are equal.\n * If an existing element is found, it is returned and is not modified in any way.\n * @param tag The definition of a `<meta>` element to match or create.\n * @param forceCreation True to create a new element without checking whether one already exists.\n * @returns The existing element with the same attributes and values if found,\n * the new element if no match is found, or `null` if the tag parameter is not defined.\n */\n addTag(tag, forceCreation = false) {\n if (!tag) return null;\n return this._getOrCreateElement(tag, forceCreation);\n }\n /**\n * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.\n * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n * values in the provided tag definition, and verifies that all other attribute values are equal.\n * @param tags An array of tag definitions to match or create.\n * @param forceCreation True to create new elements without checking whether they already exist.\n * @returns The matching elements if found, or the new elements.\n */\n addTags(tags, forceCreation = false) {\n if (!tags) return [];\n return tags.reduce((result, tag) => {\n if (tag) {\n result.push(this._getOrCreateElement(tag, forceCreation));\n }\n return result;\n }, []);\n }\n /**\n * Retrieves a `<meta>` tag element in the current HTML document.\n * @param attrSelector The tag attribute and value to match against, in the format\n * `\"tag_attribute='value string'\"`.\n * @returns The matching element, if any.\n */\n getTag(attrSelector) {\n if (!attrSelector) return null;\n return this._doc.querySelector(`meta[${attrSelector}]`) || null;\n }\n /**\n * Retrieves a set of `<meta>` tag elements in the current HTML document.\n * @param attrSelector The tag attribute and value to match against, in the format\n * `\"tag_attribute='value string'\"`.\n * @returns The matching elements, if any.\n */\n getTags(attrSelector) {\n if (!attrSelector) return [];\n const list /*NodeList*/ = this._doc.querySelectorAll(`meta[${attrSelector}]`);\n return list ? [].slice.call(list) : [];\n }\n /**\n * Modifies an existing `<meta>` tag element in the current HTML document.\n * @param tag The tag description with which to replace the existing tag content.\n * @param selector A tag attribute and value to match against, to identify\n * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n * If not supplied, matches a tag with the same `name` or `property` attribute value as the\n * replacement tag.\n * @return The modified element.\n */\n updateTag(tag, selector) {\n if (!tag) return null;\n selector = selector || this._parseSelector(tag);\n const meta = this.getTag(selector);\n if (meta) {\n return this._setMetaElementAttributes(tag, meta);\n }\n return this._getOrCreateElement(tag, true);\n }\n /**\n * Removes an existing `<meta>` tag element from the current HTML document.\n * @param attrSelector A tag attribute and value to match against, to identify\n * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n */\n removeTag(attrSelector) {\n this.removeTagElement(this.getTag(attrSelector));\n }\n /**\n * Removes an existing `<meta>` tag element from the current HTML document.\n * @param meta The tag definition to match against to identify an existing tag.\n */\n removeTagElement(meta) {\n if (meta) {\n this._dom.remove(meta);\n }\n }\n _getOrCreateElement(meta, forceCreation = false) {\n if (!forceCreation) {\n const selector = this._parseSelector(meta);\n // It's allowed to have multiple elements with the same name so it's not enough to\n // just check that element with the same name already present on the page. We also need to\n // check if element has tag attributes\n const elem = this.getTags(selector).filter(elem => this._containsAttributes(meta, elem))[0];\n if (elem !== undefined) return elem;\n }\n const element = this._dom.createElement('meta');\n this._setMetaElementAttributes(meta, element);\n const head = this._doc.getElementsByTagName('head')[0];\n head.appendChild(element);\n return element;\n }\n _setMetaElementAttributes(tag, el) {\n Object.keys(tag).forEach(prop => el.setAttribute(this._getMetaKeyMap(prop), tag[prop]));\n return el;\n }\n _parseSelector(tag) {\n const attr = tag.name ? 'name' : 'property';\n return `${attr}=\"${tag[attr]}\"`;\n }\n _containsAttributes(tag, elem) {\n return Object.keys(tag).every(key => elem.getAttribute(this._getMetaKeyMap(key)) === tag[key]);\n }\n _getMetaKeyMap(prop) {\n return META_KEYS_MAP[prop] || prop;\n }\n static ɵfac = function Meta_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || Meta)(i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: Meta,\n factory: Meta.ɵfac,\n providedIn: 'root'\n });\n }\n return Meta;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Mapping for MetaDefinition properties with their correct meta attribute names\n */\nconst META_KEYS_MAP = {\n httpEquiv: 'http-equiv'\n};\n\n/**\n * A service that can be used to get and set the title of a current HTML document.\n *\n * Since an Angular application can't be bootstrapped on the entire HTML document (`<html>` tag)\n * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements\n * (representing the `<title>` tag). Instead, this service can be used to set and get the current\n * title value.\n *\n * @publicApi\n */\nlet Title = /*#__PURE__*/(() => {\n class Title {\n _doc;\n constructor(_doc) {\n this._doc = _doc;\n }\n /**\n * Get the title of the current HTML document.\n */\n getTitle() {\n return this._doc.title;\n }\n /**\n * Set the title of the current HTML document.\n * @param newTitle\n */\n setTitle(newTitle) {\n this._doc.title = newTitle || '';\n }\n static ɵfac = function Title_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || Title)(i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: Title,\n factory: Title.ɵfac,\n providedIn: 'root'\n });\n }\n return Title;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Exports the value under a given `name` in the global property `ng`. For example `ng.probe` if\n * `name` is `'probe'`.\n * @param name Name under which it will be exported. Keep in mind this will be a property of the\n * global `ng` object.\n * @param value The value to export.\n */\nfunction exportNgVar(name, value) {\n if (typeof COMPILED === 'undefined' || !COMPILED) {\n // Note: we can't export `ng` when using closure enhanced optimization as:\n // - closure declares globals itself for minified names, which sometimes clobber our `ng` global\n // - we can't declare a closure extern as the namespace `ng` is already used within Google\n // for typings for angularJS (via `goog.provide('ng....')`).\n const ng = ɵglobal['ng'] = ɵglobal['ng'] || {};\n ng[name] = value;\n }\n}\nclass ChangeDetectionPerfRecord {\n msPerTick;\n numTicks;\n constructor(msPerTick, numTicks) {\n this.msPerTick = msPerTick;\n this.numTicks = numTicks;\n }\n}\n/**\n * Entry point for all Angular profiling-related debug tools. This object\n * corresponds to the `ng.profiler` in the dev console.\n */\nclass AngularProfiler {\n appRef;\n constructor(ref) {\n this.appRef = ref.injector.get(ApplicationRef);\n }\n // tslint:disable:no-console\n /**\n * Exercises change detection in a loop and then prints the average amount of\n * time in milliseconds how long a single round of change detection takes for\n * the current state of the UI. It runs a minimum of 5 rounds for a minimum\n * of 500 milliseconds.\n *\n * Optionally, a user may pass a `config` parameter containing a map of\n * options. Supported options are:\n *\n * `record` (boolean) - causes the profiler to record a CPU profile while\n * it exercises the change detector. Example:\n *\n * ```ts\n * ng.profiler.timeChangeDetection({record: true})\n * ```\n */\n timeChangeDetection(config) {\n const record = config && config['record'];\n const profileName = 'Change Detection';\n // Profiler is not available in Android browsers without dev tools opened\n if (record && 'profile' in console && typeof console.profile === 'function') {\n console.profile(profileName);\n }\n const start = performance.now();\n let numTicks = 0;\n while (numTicks < 5 || performance.now() - start < 500) {\n this.appRef.tick();\n numTicks++;\n }\n const end = performance.now();\n if (record && 'profileEnd' in console && typeof console.profileEnd === 'function') {\n console.profileEnd(profileName);\n }\n const msPerTick = (end - start) / numTicks;\n console.log(`ran ${numTicks} change detection cycles`);\n console.log(`${msPerTick.toFixed(2)} ms per check`);\n return new ChangeDetectionPerfRecord(msPerTick, numTicks);\n }\n}\nconst PROFILER_GLOBAL_NAME = 'profiler';\n/**\n * Enabled Angular debug tools that are accessible via your browser's\n * developer console.\n *\n * Usage:\n *\n * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)\n * 1. Type `ng.` (usually the console will show auto-complete suggestion)\n * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`\n * then hit Enter.\n *\n * @publicApi\n */\nfunction enableDebugTools(ref) {\n exportNgVar(PROFILER_GLOBAL_NAME, new AngularProfiler(ref));\n return ref;\n}\n/**\n * Disables Angular tools.\n *\n * @publicApi\n */\nfunction disableDebugTools() {\n exportNgVar(PROFILER_GLOBAL_NAME, null);\n}\n\n/**\n * Predicates for use with {@link DebugElement}'s query functions.\n *\n * @publicApi\n */\nclass By {\n /**\n * Match all nodes.\n *\n * @usageNotes\n * ### Example\n *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}\n */\n static all() {\n return () => true;\n }\n /**\n * Match elements by the given CSS selector.\n *\n * @usageNotes\n * ### Example\n *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}\n */\n static css(selector) {\n return debugElement => {\n return debugElement.nativeElement != null ? elementMatches(debugElement.nativeElement, selector) : false;\n };\n }\n /**\n * Match nodes that have the given directive present.\n *\n * @usageNotes\n * ### Example\n *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}\n */\n static directive(type) {\n return debugNode => debugNode.providerTokens.indexOf(type) !== -1;\n }\n}\nfunction elementMatches(n, selector) {\n if (ɵgetDOM().isElementNode(n)) {\n return n.matches && n.matches(selector) || n.msMatchesSelector && n.msMatchesSelector(selector) || n.webkitMatchesSelector && n.webkitMatchesSelector(selector);\n }\n return false;\n}\n\n/**\n * Supported HammerJS recognizer event names.\n */\nconst EVENT_NAMES = {\n // pan\n 'pan': true,\n 'panstart': true,\n 'panmove': true,\n 'panend': true,\n 'pancancel': true,\n 'panleft': true,\n 'panright': true,\n 'panup': true,\n 'pandown': true,\n // pinch\n 'pinch': true,\n 'pinchstart': true,\n 'pinchmove': true,\n 'pinchend': true,\n 'pinchcancel': true,\n 'pinchin': true,\n 'pinchout': true,\n // press\n 'press': true,\n 'pressup': true,\n // rotate\n 'rotate': true,\n 'rotatestart': true,\n 'rotatemove': true,\n 'rotateend': true,\n 'rotatecancel': true,\n // swipe\n 'swipe': true,\n 'swipeleft': true,\n 'swiperight': true,\n 'swipeup': true,\n 'swipedown': true,\n // tap\n 'tap': true,\n 'doubletap': true\n};\n/**\n * DI token for providing [HammerJS](https://hammerjs.github.io/) support to Angular.\n * @see {@link HammerGestureConfig}\n *\n * @ngModule HammerModule\n * @publicApi\n */\nconst HAMMER_GESTURE_CONFIG = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerGestureConfig' : '');\n/**\n * Injection token used to provide a HammerLoader to Angular.\n *\n * @see {@link HammerLoader}\n *\n * @publicApi\n */\nconst HAMMER_LOADER = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerLoader' : '');\n/**\n * An injectable [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n * for gesture recognition. Configures specific event recognition.\n * @publicApi\n */\nlet HammerGestureConfig = /*#__PURE__*/(() => {\n class HammerGestureConfig {\n /**\n * A set of supported event names for gestures to be used in Angular.\n * Angular supports all built-in recognizers, as listed in\n * [HammerJS documentation](https://hammerjs.github.io/).\n */\n events = [];\n /**\n * Maps gesture event names to a set of configuration options\n * that specify overrides to the default values for specific properties.\n *\n * The key is a supported event name to be configured,\n * and the options object contains a set of properties, with override values\n * to be applied to the named recognizer event.\n * For example, to disable recognition of the rotate event, specify\n * `{\"rotate\": {\"enable\": false}}`.\n *\n * Properties that are not present take the HammerJS default values.\n * For information about which properties are supported for which events,\n * and their allowed and default values, see\n * [HammerJS documentation](https://hammerjs.github.io/).\n *\n */\n overrides = {};\n /**\n * Properties whose default values can be overridden for a given event.\n * Different sets of properties apply to different events.\n * For information about which properties are supported for which events,\n * and their allowed and default values, see\n * [HammerJS documentation](https://hammerjs.github.io/).\n */\n options;\n /**\n * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n * and attaches it to a given HTML element.\n * @param element The element that will recognize gestures.\n * @returns A HammerJS event-manager object.\n */\n buildHammer(element) {\n const mc = new Hammer(element, this.options);\n mc.get('pinch').set({\n enable: true\n });\n mc.get('rotate').set({\n enable: true\n });\n for (const eventName in this.overrides) {\n mc.get(eventName).set(this.overrides[eventName]);\n }\n return mc;\n }\n static ɵfac = function HammerGestureConfig_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HammerGestureConfig)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HammerGestureConfig,\n factory: HammerGestureConfig.ɵfac\n });\n }\n return HammerGestureConfig;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Event plugin that adds Hammer support to an application.\n *\n * @ngModule HammerModule\n */\nlet HammerGesturesPlugin = /*#__PURE__*/(() => {\n class HammerGesturesPlugin extends EventManagerPlugin {\n _config;\n _injector;\n loader;\n _loaderPromise = null;\n constructor(doc, _config, _injector, loader) {\n super(doc);\n this._config = _config;\n this._injector = _injector;\n this.loader = loader;\n }\n supports(eventName) {\n if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {\n return false;\n }\n if (!window.Hammer && !this.loader) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Get a `Console` through an injector to tree-shake the\n // class when it is unused in production.\n const _console = this._injector.get(ɵConsole);\n _console.warn(`The \"${eventName}\" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`);\n }\n return false;\n }\n return true;\n }\n addEventListener(element, eventName, handler) {\n const zone = this.manager.getZone();\n eventName = eventName.toLowerCase();\n // If Hammer is not present but a loader is specified, we defer adding the event listener\n // until Hammer is loaded.\n if (!window.Hammer && this.loader) {\n this._loaderPromise = this._loaderPromise || zone.runOutsideAngular(() => this.loader());\n // This `addEventListener` method returns a function to remove the added listener.\n // Until Hammer is loaded, the returned function needs to *cancel* the registration rather\n // than remove anything.\n let cancelRegistration = false;\n let deregister = () => {\n cancelRegistration = true;\n };\n zone.runOutsideAngular(() => this._loaderPromise.then(() => {\n // If Hammer isn't actually loaded when the custom loader resolves, give up.\n if (!window.Hammer) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const _console = this._injector.get(ɵConsole);\n _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`);\n }\n deregister = () => {};\n return;\n }\n if (!cancelRegistration) {\n // Now that Hammer is loaded and the listener is being loaded for real,\n // the deregistration function changes from canceling registration to\n // removal.\n deregister = this.addEventListener(element, eventName, handler);\n }\n }).catch(() => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const _console = this._injector.get(ɵConsole);\n _console.warn(`The \"${eventName}\" event cannot be bound because the custom ` + `Hammer.JS loader failed.`);\n }\n deregister = () => {};\n }));\n // Return a function that *executes* `deregister` (and not `deregister` itself) so that we\n // can change the behavior of `deregister` once the listener is added. Using a closure in\n // this way allows us to avoid any additional data structures to track listener removal.\n return () => {\n deregister();\n };\n }\n return zone.runOutsideAngular(() => {\n // Creating the manager bind events, must be done outside of angular\n const mc = this._config.buildHammer(element);\n const callback = function (eventObj) {\n zone.runGuarded(function () {\n handler(eventObj);\n });\n };\n mc.on(eventName, callback);\n return () => {\n mc.off(eventName, callback);\n // destroy mc to prevent memory leak\n if (typeof mc.destroy === 'function') {\n mc.destroy();\n }\n };\n });\n }\n isCustomEvent(eventName) {\n return this._config.events.indexOf(eventName) > -1;\n }\n static ɵfac = function HammerGesturesPlugin_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HammerGesturesPlugin)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(HAMMER_GESTURE_CONFIG), i0.ɵɵinject(i0.Injector), i0.ɵɵinject(HAMMER_LOADER, 8));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HammerGesturesPlugin,\n factory: HammerGesturesPlugin.ɵfac\n });\n }\n return HammerGesturesPlugin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Adds support for HammerJS.\n *\n * Import this module at the root of your application so that Angular can work with\n * HammerJS to detect gesture events.\n *\n * Note that applications still need to include the HammerJS script itself. This module\n * simply sets up the coordination layer between HammerJS and Angular's `EventManager`.\n *\n * @publicApi\n */\nlet HammerModule = /*#__PURE__*/(() => {\n class HammerModule {\n static ɵfac = function HammerModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HammerModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HammerModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [{\n provide: EVENT_MANAGER_PLUGINS,\n useClass: HammerGesturesPlugin,\n multi: true,\n deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]\n }, {\n provide: HAMMER_GESTURE_CONFIG,\n useClass: HammerGestureConfig,\n deps: []\n }]\n });\n }\n return HammerModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * DomSanitizer helps preventing Cross Site Scripting Security bugs (XSS) by sanitizing\n * values to be safe to use in the different DOM contexts.\n *\n * For example, when binding a URL in an `<a [href]=\"someValue\">` hyperlink, `someValue` will be\n * sanitized so that an attacker cannot inject e.g. a `javascript:` URL that would execute code on\n * the website.\n *\n * In specific situations, it might be necessary to disable sanitization, for example if the\n * application genuinely needs to produce a `javascript:` style link with a dynamic value in it.\n * Users can bypass security by constructing a value with one of the `bypassSecurityTrust...`\n * methods, and then binding to that value from the template.\n *\n * These situations should be very rare, and extraordinary care must be taken to avoid creating a\n * Cross Site Scripting (XSS) security bug!\n *\n * When using `bypassSecurityTrust...`, make sure to call the method as early as possible and as\n * close as possible to the source of the value, to make it easy to verify no security bug is\n * created by its use.\n *\n * It is not required (and not recommended) to bypass security if the value is safe, e.g. a URL that\n * does not start with a suspicious protocol, or an HTML snippet that does not contain dangerous\n * code. The sanitizer leaves safe values intact.\n *\n * @security Calling any of the `bypassSecurityTrust...` APIs disables Angular's built-in\n * sanitization for the value passed in. Carefully check and audit all values and code paths going\n * into this call. Make sure any user data is appropriately escaped for this security context.\n * For more detail, see the [Security Guide](https://g.co/ng/security).\n *\n * @publicApi\n */\nlet DomSanitizer = /*#__PURE__*/(() => {\n class DomSanitizer {\n static ɵfac = function DomSanitizer_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || DomSanitizer)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: DomSanitizer,\n factory: function DomSanitizer_Factory(__ngFactoryType__) {\n let __ngConditionalFactory__ = null;\n if (__ngFactoryType__) {\n __ngConditionalFactory__ = new (__ngFactoryType__ || DomSanitizer)();\n } else {\n __ngConditionalFactory__ = i0.ɵɵinject(DomSanitizerImpl);\n }\n return __ngConditionalFactory__;\n },\n providedIn: 'root'\n });\n }\n return DomSanitizer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet DomSanitizerImpl = /*#__PURE__*/(() => {\n class DomSanitizerImpl extends DomSanitizer {\n _doc;\n constructor(_doc) {\n super();\n this._doc = _doc;\n }\n sanitize(ctx, value) {\n if (value == null) return null;\n switch (ctx) {\n case SecurityContext.NONE:\n return value;\n case SecurityContext.HTML:\n if (ɵallowSanitizationBypassAndThrow(value, \"HTML\" /* BypassType.Html */)) {\n return ɵunwrapSafeValue(value);\n }\n return ɵ_sanitizeHtml(this._doc, String(value)).toString();\n case SecurityContext.STYLE:\n if (ɵallowSanitizationBypassAndThrow(value, \"Style\" /* BypassType.Style */)) {\n return ɵunwrapSafeValue(value);\n }\n return value;\n case SecurityContext.SCRIPT:\n if (ɵallowSanitizationBypassAndThrow(value, \"Script\" /* BypassType.Script */)) {\n return ɵunwrapSafeValue(value);\n }\n throw new ɵRuntimeError(5200 /* RuntimeErrorCode.SANITIZATION_UNSAFE_SCRIPT */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'unsafe value used in a script context');\n case SecurityContext.URL:\n if (ɵallowSanitizationBypassAndThrow(value, \"URL\" /* BypassType.Url */)) {\n return ɵunwrapSafeValue(value);\n }\n return ɵ_sanitizeUrl(String(value));\n case SecurityContext.RESOURCE_URL:\n if (ɵallowSanitizationBypassAndThrow(value, \"ResourceURL\" /* BypassType.ResourceUrl */)) {\n return ɵunwrapSafeValue(value);\n }\n throw new ɵRuntimeError(5201 /* RuntimeErrorCode.SANITIZATION_UNSAFE_RESOURCE_URL */, (typeof ngDevMode === 'undefined' || ngDevMode) && `unsafe value used in a resource URL context (see ${ɵXSS_SECURITY_URL})`);\n default:\n throw new ɵRuntimeError(5202 /* RuntimeErrorCode.SANITIZATION_UNEXPECTED_CTX */, (typeof ngDevMode === 'undefined' || ngDevMode) && `Unexpected SecurityContext ${ctx} (see ${ɵXSS_SECURITY_URL})`);\n }\n }\n bypassSecurityTrustHtml(value) {\n return ɵbypassSanitizationTrustHtml(value);\n }\n bypassSecurityTrustStyle(value) {\n return ɵbypassSanitizationTrustStyle(value);\n }\n bypassSecurityTrustScript(value) {\n return ɵbypassSanitizationTrustScript(value);\n }\n bypassSecurityTrustUrl(value) {\n return ɵbypassSanitizationTrustUrl(value);\n }\n bypassSecurityTrustResourceUrl(value) {\n return ɵbypassSanitizationTrustResourceUrl(value);\n }\n static ɵfac = function DomSanitizerImpl_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || DomSanitizerImpl)(i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: DomSanitizerImpl,\n factory: DomSanitizerImpl.ɵfac,\n providedIn: 'root'\n });\n }\n return DomSanitizerImpl;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The list of features as an enum to uniquely type each `HydrationFeature`.\n * @see {@link HydrationFeature}\n *\n * @publicApi\n */\nvar HydrationFeatureKind = /*#__PURE__*/function (HydrationFeatureKind) {\n HydrationFeatureKind[HydrationFeatureKind[\"NoHttpTransferCache\"] = 0] = \"NoHttpTransferCache\";\n HydrationFeatureKind[HydrationFeatureKind[\"HttpTransferCacheOptions\"] = 1] = \"HttpTransferCacheOptions\";\n HydrationFeatureKind[HydrationFeatureKind[\"I18nSupport\"] = 2] = \"I18nSupport\";\n HydrationFeatureKind[HydrationFeatureKind[\"EventReplay\"] = 3] = \"EventReplay\";\n HydrationFeatureKind[HydrationFeatureKind[\"IncrementalHydration\"] = 4] = \"IncrementalHydration\";\n return HydrationFeatureKind;\n}(HydrationFeatureKind || {});\n/**\n * Helper function to create an object that represents a Hydration feature.\n */\nfunction hydrationFeature(ɵkind, ɵproviders = [], ɵoptions = {}) {\n return {\n ɵkind,\n ɵproviders\n };\n}\n/**\n * Disables HTTP transfer cache. Effectively causes HTTP requests to be performed twice: once on the\n * server and other one on the browser.\n *\n * @publicApi\n */\nfunction withNoHttpTransferCache() {\n // This feature has no providers and acts as a flag that turns off\n // HTTP transfer cache (which otherwise is turned on by default).\n return hydrationFeature(HydrationFeatureKind.NoHttpTransferCache);\n}\n/**\n * The function accepts an object, which allows to configure cache parameters,\n * such as which headers should be included (no headers are included by default),\n * whether POST requests should be cached or a callback function to determine if a\n * particular request should be cached.\n *\n * @publicApi\n */\nfunction withHttpTransferCacheOptions(options) {\n // This feature has no providers and acts as a flag to pass options to the HTTP transfer cache.\n return hydrationFeature(HydrationFeatureKind.HttpTransferCacheOptions, ɵwithHttpTransferCache(options));\n}\n/**\n * Enables support for hydrating i18n blocks.\n *\n * @developerPreview\n * @publicApi\n */\nfunction withI18nSupport() {\n return hydrationFeature(HydrationFeatureKind.I18nSupport, ɵwithI18nSupport());\n}\n/**\n * Enables support for replaying user events (e.g. `click`s) that happened on a page\n * before hydration logic has completed. Once an application is hydrated, all captured\n * events are replayed and relevant event listeners are executed.\n *\n * @usageNotes\n *\n * Basic example of how you can enable event replay in your application when\n * `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideClientHydration(withEventReplay())]\n * });\n * ```\n * @publicApi\n * @see {@link provideClientHydration}\n */\nfunction withEventReplay() {\n return hydrationFeature(HydrationFeatureKind.EventReplay, ɵwithEventReplay());\n}\n/**\n * Enables support for incremental hydration using the `hydrate` trigger syntax.\n *\n * @usageNotes\n *\n * Basic example of how you can enable incremental hydration in your application when\n * the `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideClientHydration(withIncrementalHydration())]\n * });\n * ```\n * @experimental\n * @publicApi\n * @see {@link provideClientHydration}\n */\nfunction withIncrementalHydration() {\n return hydrationFeature(HydrationFeatureKind.IncrementalHydration, ɵwithIncrementalHydration());\n}\n/**\n * Returns an `ENVIRONMENT_INITIALIZER` token setup with a function\n * that verifies whether compatible ZoneJS was used in an application\n * and logs a warning in a console if it's not the case.\n */\nfunction provideZoneJsCompatibilityDetector() {\n return [{\n provide: ENVIRONMENT_INITIALIZER,\n useValue: () => {\n const ngZone = inject(NgZone);\n const isZoneless = inject(ɵZONELESS_ENABLED);\n // Checking `ngZone instanceof NgZone` would be insufficient here,\n // because custom implementations might use NgZone as a base class.\n if (!isZoneless && ngZone.constructor !== NgZone) {\n const console = inject(ɵConsole);\n const message = ɵformatRuntimeError(-5000 /* RuntimeErrorCode.UNSUPPORTED_ZONEJS_INSTANCE */, 'Angular detected that hydration was enabled for an application ' + 'that uses a custom or a noop Zone.js implementation. ' + 'This is not yet a fully supported configuration.');\n console.warn(message);\n }\n },\n multi: true\n }];\n}\n/**\n * Sets up providers necessary to enable hydration functionality for the application.\n *\n * By default, the function enables the recommended set of features for the optimal\n * performance for most of the applications. It includes the following features:\n *\n * * Reconciling DOM hydration. Learn more about it [here](guide/hydration).\n * * [`HttpClient`](api/common/http/HttpClient) response caching while running on the server and\n * transferring this cache to the client to avoid extra HTTP requests. Learn more about data caching\n * [here](guide/ssr#caching-data-when-using-httpclient).\n *\n * These functions allow you to disable some of the default features or enable new ones:\n *\n * * {@link withNoHttpTransferCache} to disable HTTP transfer cache\n * * {@link withHttpTransferCacheOptions} to configure some HTTP transfer cache options\n * * {@link withI18nSupport} to enable hydration support for i18n blocks\n * * {@link withEventReplay} to enable support for replaying user events\n *\n * @usageNotes\n *\n * Basic example of how you can enable hydration in your application when\n * `bootstrapApplication` function is used:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideClientHydration()]\n * });\n * ```\n *\n * Alternatively if you are using NgModules, you would add `provideClientHydration`\n * to your root app module's provider list.\n * ```ts\n * @NgModule({\n * declarations: [RootCmp],\n * bootstrap: [RootCmp],\n * providers: [provideClientHydration()],\n * })\n * export class AppModule {}\n * ```\n *\n * @see {@link withNoHttpTransferCache}\n * @see {@link withHttpTransferCacheOptions}\n * @see {@link withI18nSupport}\n * @see {@link withEventReplay}\n *\n * @param features Optional features to configure additional router behaviors.\n * @returns A set of providers to enable hydration.\n *\n * @publicApi\n */\nfunction provideClientHydration(...features) {\n const providers = [];\n const featuresKind = new Set();\n const hasHttpTransferCacheOptions = featuresKind.has(HydrationFeatureKind.HttpTransferCacheOptions);\n for (const {\n ɵproviders,\n ɵkind\n } of features) {\n featuresKind.add(ɵkind);\n if (ɵproviders.length) {\n providers.push(ɵproviders);\n }\n }\n if (typeof ngDevMode !== 'undefined' && ngDevMode && featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) && hasHttpTransferCacheOptions) {\n // TODO: Make this a runtime error\n throw new Error('Configuration error: found both withHttpTransferCacheOptions() and withNoHttpTransferCache() in the same call to provideClientHydration(), which is a contradiction.');\n }\n return makeEnvironmentProviders([typeof ngDevMode !== 'undefined' && ngDevMode ? provideZoneJsCompatibilityDetector() : [], ɵwithDomHydration(), featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) || hasHttpTransferCacheOptions ? [] : ɵwithHttpTransferCache({}), providers]);\n}\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the platform-browser package.\n */\n/**\n * @publicApi\n */\nconst VERSION = /*#__PURE__*/new Version('19.1.3');\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\n// This file only reexports content of the `src` folder. Keep it that way.\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BrowserModule, By, DomSanitizer, EVENT_MANAGER_PLUGINS, EventManager, EventManagerPlugin, HAMMER_GESTURE_CONFIG, HAMMER_LOADER, HammerGestureConfig, HammerModule, HydrationFeatureKind, Meta, REMOVE_STYLES_ON_COMPONENT_DESTROY, Title, VERSION, bootstrapApplication, createApplication, disableDebugTools, enableDebugTools, platformBrowser, provideClientHydration, provideProtractorTestingSupport, withEventReplay, withHttpTransferCacheOptions, withI18nSupport, withIncrementalHydration, withNoHttpTransferCache, BrowserDomAdapter as ɵBrowserDomAdapter, BrowserGetTestability as ɵBrowserGetTestability, DomEventsPlugin as ɵDomEventsPlugin, DomRendererFactory2 as ɵDomRendererFactory2, DomSanitizerImpl as ɵDomSanitizerImpl, HammerGesturesPlugin as ɵHammerGesturesPlugin, INTERNAL_BROWSER_PLATFORM_PROVIDERS as ɵINTERNAL_BROWSER_PLATFORM_PROVIDERS, KeyEventsPlugin as ɵKeyEventsPlugin, SharedStylesHost as ɵSharedStylesHost, initDomAdapter as ɵinitDomAdapter };\n"],"mappings":"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","names":["paramParser","rawParams","codec","map","param","eqIdx","key","val","list","standardEncoding","v","STANDARD_ENCODING_REGEX","s","t","STANDARD_ENCODING_REPLACEMENTS","valueToString","value","mightHaveBody","method","isArrayBuffer","isBlob","isFormData","isUrlSearchParams","addBody","options","body","interceptorChainEndFn","req","finalHandlerFn","adaptLegacyInterceptorToChain","chainTailFn","interceptor","initialRequest","downstreamRequest","chainedInterceptorFn","interceptorFn","injector","runInInjectionContext","legacyInterceptorFnFactory","chain","handler","inject","HTTP_INTERCEPTORS","pendingTasks","PendingTasksInternal","REQUESTS_CONTRIBUTE_TO_STABILITY","taskId","finalize","getResponseUrl","xhr","X_REQUEST_URL_REGEXP","X_REQUEST_URL_HEADER","xsrfInterceptorFn","next","lcUrl","XSRF_ENABLED","token","HttpXsrfTokenExtractor","headerName","XSRF_HEADER_NAME","makeHttpFeature","kind","providers","provideHttpClient","features","HttpClient","HttpXhrBackend","HttpInterceptorHandler","HttpHandler","HttpBackend","FETCH_BACKEND","HTTP_INTERCEPTOR_FNS","HttpXsrfCookieExtractor","feature","makeEnvironmentProviders","withInterceptorsFromDi","HttpFeatureKind","LEGACY_INTERCEPTOR_FN","withXsrfConfiguration","cookieName","XSRF_COOKIE_NAME","HttpHeaders","HttpUrlEncodingCodec","HttpParams","HttpContext","CONTENT_TYPE_HEADER","TEXT_CONTENT_TYPE","JSON_CONTENT_TYPE","ACCEPT_HEADER","HttpRequest","HttpEventType","HttpResponseBase","HttpHeaderResponse","HttpResponse","HttpErrorResponse","HTTP_STATUS_CODE_OK","HTTP_STATUS_CODE_NO_CONTENT","HttpStatusCode","HTTP_ROOT_INTERCEPTOR_FNS","XSSI_PREFIX","XSRF_DEFAULT_COOKIE_NAME","XSRF_DEFAULT_HEADER_NAME","init_http","__esmMin","init_core","init_esm","init_operators","init_common","_HttpHeaders","headers","line","index","name","values","lcName","update","other","clone","base","toDelete","existing","headerValues","fn","_HttpParams","RuntimeError","res","params","updates","_value","eKey","idx","_HttpRequest","url","third","fourth","qIdx","sep","responseType","transferCache","withCredentials","reportProgress","context","init","defaultStatus","defaultStatusText","_HttpHeaderResponse","_HttpResponse","first","events$","of","concatMap","res$","filter","event","callbackParam","__ngFactoryType__","ɵɵinject","ɵɵdefineInjectable","InjectionToken","backend","dedupedInterceptorFns","nextSequencedFn","EnvironmentInjector","xhrFactory","from","switchMap","Observable","observer","detectedType","reqBody","headerResponse","partialFromXhr","statusText","onLoad","status","ok","originalBody","error","onError","sentHeaders","onDownProgress","progressEvent","onUpProgress","progress","XhrFactory","doc","platform","cookieString","parseCookieValue","DOCUMENT","PLATFORM_ID","getBaseElementHref","baseElement","relativePath","url","removeElements","elements","element","createStyleElement","style","doc","styleElement","addServerStyles","appId","inline","external","APP_ID_ATTRIBUTE_NAME","createLinkElement","linkElement","shimContentAttribute","componentShortId","CONTENT_ATTR","COMPONENT_REGEX","shimHostAttribute","HOST_ATTR","shimStylesContent","compId","styles","s","isTemplateNode","node","initDomAdapter","BrowserDomAdapter","errorHandler","ErrorHandler","_document","setDocument","GenericBrowserDomAdapter","BrowserGetTestability","BrowserXhr","EVENT_MANAGER_PLUGINS","EventManager","EventManagerPlugin","SharedStylesHost","NAMESPACE_URIS","COMPONENT_VARIABLE","REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT","REMOVE_STYLES_ON_COMPONENT_DESTROY","DomRendererFactory2","DefaultDomRenderer2","ShadowDomRenderer","NoneEncapsulationDomRenderer","EmulatedEncapsulationDomRenderer2","DomEventsPlugin","MODIFIER_KEYS","_keyMap","MODIFIER_KEY_GETTERS","KeyEventsPlugin","INTERNAL_BROWSER_PLATFORM_PROVIDERS","platformBrowser","TESTABILITY_PROVIDERS","BROWSER_MODULE_PROVIDERS","BrowserModule","Title","DomSanitizer","DomSanitizerImpl","init_platform_browser","__esmMin","init_common","init_core","DomAdapter","_BrowserDomAdapter","setRootDomAdapter","el","evt","listener","options","tagName","target","href","name","parseCookieValue","registry","_global","elem","findInAncestors","testability","RuntimeError","whenAllStable","callback","testabilities","count","decrement","t","getDOM","__ngFactoryType__","ɵɵdefineInjectable","InjectionToken","plugins","_zone","plugin","eventName","handler","ɵɵinject","NgZone","_doc","nonce","platformId","isPlatformServer","urls","value","usages","creator","record","host","hostNode","DOCUMENT","APP_ID","CSP_NONCE","PLATFORM_ID","eventManager","sharedStylesHost","removeStylesOnCompDestroy","ngZone","tracingService","type","ViewEncapsulation","__spreadProps","__spreadValues","renderer","rendererByCompId","platformIsServer","componentId","TracingService","namespace","parent","newChild","refChild","_parent","oldChild","selectorOrNode","preserveContent","namespaceUri","flags","RendererStyleFlags2","event","wrappedCallback","eventHandler","hostEl","component","styleEl","styleUrls","styleUrl","linkEl","parsedEvent","outsideHandler","parts","domEventName","key","fullKey","codeIX","modifierName","index","result","fullKeyCode","keycode","modifierGetter","zone","keyName","PLATFORM_BROWSER_ID","PLATFORM_INITIALIZER","createPlatformFactory","platformCore","TESTABILITY_GETTER","TESTABILITY","Testability","TestabilityRegistry","INJECTOR_SCOPE","RendererFactory2","XhrFactory","ɵɵdefineNgModule","ɵɵdefineInjector","CommonModule","ApplicationModule","newTitle","__ngConditionalFactory__","ctx","SecurityContext","allowSanitizationBypassAndThrow","unwrapSafeValue","_sanitizeHtml","_sanitizeUrl","bypassSanitizationTrustHtml","bypassSanitizationTrustStyle","bypassSanitizationTrustScript","bypassSanitizationTrustUrl","bypassSanitizationTrustResourceUrl"],"x_google_ignoreList":[0,1]}