{"version":3,"sources":["node_modules/@angular/forms/fesm2022/forms.mjs","node_modules/@angular/cdk/fesm2022/overlay-module-BUj0D19H.mjs","node_modules/@angular/material/fesm2022/index-SYVYjXwK.mjs","node_modules/@angular/material/fesm2022/ripple-loader-Ce3DAhPW.mjs","node_modules/@angular/material/fesm2022/icon-button-D1J0zeqv.mjs","node_modules/@angular/material/fesm2022/button.mjs","node_modules/@angular/cdk/fesm2022/layout.mjs","node_modules/@angular/material/fesm2022/snack-bar.mjs","src/app/core/services/tools.service.ts"],"sourcesContent":["/**\n * @license Angular v19.2.20\n * (c) 2010-2025 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Directive, forwardRef, Optional, Inject, ɵisPromise as _isPromise, ɵisSubscribable as _isSubscribable, ɵRuntimeError as _RuntimeError, Self, untracked, computed, signal, EventEmitter, Input, Host, SkipSelf, booleanAttribute, ChangeDetectorRef, Output, inject, Injectable, NgModule, Version } from '@angular/core';\nimport { ɵgetDOM as _getDOM } from '@angular/common';\nimport { from, forkJoin, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * Base class for all ControlValueAccessor classes defined in Forms package.\n * Contains common logic and utility functions.\n *\n * Note: this is an *internal-only* class and should not be extended or used directly in\n * applications code.\n */\nlet BaseControlValueAccessor = /*#__PURE__*/(() => {\n  class BaseControlValueAccessor {\n    _renderer;\n    _elementRef;\n    /**\n     * The registered callback function called when a change or input event occurs on the input\n     * element.\n     * @docs-private\n     */\n    onChange = _ => {};\n    /**\n     * The registered callback function called when a blur event occurs on the input element.\n     * @docs-private\n     */\n    onTouched = () => {};\n    constructor(_renderer, _elementRef) {\n      this._renderer = _renderer;\n      this._elementRef = _elementRef;\n    }\n    /**\n     * Helper method that sets a property on a target element using the current Renderer\n     * implementation.\n     * @docs-private\n     */\n    setProperty(key, value) {\n      this._renderer.setProperty(this._elementRef.nativeElement, key, value);\n    }\n    /**\n     * Registers a function called when the control is touched.\n     * @docs-private\n     */\n    registerOnTouched(fn) {\n      this.onTouched = fn;\n    }\n    /**\n     * Registers a function called when the control value changes.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this.onChange = fn;\n    }\n    /**\n     * Sets the \"disabled\" property on the range input element.\n     * @docs-private\n     */\n    setDisabledState(isDisabled) {\n      this.setProperty('disabled', isDisabled);\n    }\n    static ɵfac = function BaseControlValueAccessor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BaseControlValueAccessor)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: BaseControlValueAccessor\n    });\n  }\n  return BaseControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Base class for all built-in ControlValueAccessor classes (except DefaultValueAccessor, which is\n * used in case no other CVAs can be found). We use this class to distinguish between default CVA,\n * built-in CVAs and custom CVAs, so that Forms logic can recognize built-in CVAs and treat custom\n * ones with higher priority (when both built-in and custom CVAs are present).\n *\n * Note: this is an *internal-only* class and should not be extended or used directly in\n * applications code.\n */\nlet BuiltInControlValueAccessor = /*#__PURE__*/(() => {\n  class BuiltInControlValueAccessor extends BaseControlValueAccessor {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵBuiltInControlValueAccessor_BaseFactory;\n      return function BuiltInControlValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵBuiltInControlValueAccessor_BaseFactory || (ɵBuiltInControlValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(BuiltInControlValueAccessor)))(__ngFactoryType__ || BuiltInControlValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: BuiltInControlValueAccessor,\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return BuiltInControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Used to provide a `ControlValueAccessor` for form controls.\n *\n * See `DefaultValueAccessor` for how to implement one.\n *\n * @publicApi\n */\nconst NG_VALUE_ACCESSOR = /*#__PURE__*/new InjectionToken(ngDevMode ? 'NgValueAccessor' : '');\nconst CHECKBOX_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => CheckboxControlValueAccessor),\n  multi: true\n};\n/**\n * @description\n * A `ControlValueAccessor` for writing a value and listening to changes on a checkbox input\n * element.\n *\n * @usageNotes\n *\n * ### Using a checkbox with a reactive form.\n *\n * The following example shows how to use a checkbox with a reactive form.\n *\n * ```ts\n * const rememberLoginControl = new FormControl();\n * ```\n *\n * ```html\n * <input type=\"checkbox\" [formControl]=\"rememberLoginControl\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet CheckboxControlValueAccessor = /*#__PURE__*/(() => {\n  class CheckboxControlValueAccessor extends BuiltInControlValueAccessor {\n    /**\n     * Sets the \"checked\" property on the input element.\n     * @docs-private\n     */\n    writeValue(value) {\n      this.setProperty('checked', value);\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵCheckboxControlValueAccessor_BaseFactory;\n      return function CheckboxControlValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵCheckboxControlValueAccessor_BaseFactory || (ɵCheckboxControlValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(CheckboxControlValueAccessor)))(__ngFactoryType__ || CheckboxControlValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CheckboxControlValueAccessor,\n      selectors: [[\"input\", \"type\", \"checkbox\", \"formControlName\", \"\"], [\"input\", \"type\", \"checkbox\", \"formControl\", \"\"], [\"input\", \"type\", \"checkbox\", \"ngModel\", \"\"]],\n      hostBindings: function CheckboxControlValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"change\", function CheckboxControlValueAccessor_change_HostBindingHandler($event) {\n            return ctx.onChange($event.target.checked);\n          })(\"blur\", function CheckboxControlValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([CHECKBOX_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CheckboxControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst DEFAULT_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => DefaultValueAccessor),\n  multi: true\n};\n/**\n * We must check whether the agent is Android because composition events\n * behave differently between iOS and Android.\n */\nfunction _isAndroid() {\n  const userAgent = _getDOM() ? _getDOM().getUserAgent() : '';\n  return /android (\\d+)/.test(userAgent.toLowerCase());\n}\n/**\n * @description\n * Provide this token to control if form directives buffer IME input until\n * the \"compositionend\" event occurs.\n * @publicApi\n */\nconst COMPOSITION_BUFFER_MODE = /*#__PURE__*/new InjectionToken(ngDevMode ? 'CompositionEventMode' : '');\n/**\n * The default `ControlValueAccessor` for writing a value and listening to changes on input\n * elements. The accessor is used by the `FormControlDirective`, `FormControlName`, and\n * `NgModel` directives.\n *\n *\n * @usageNotes\n *\n * ### Using the default value accessor\n *\n * The following example shows how to use an input element that activates the default value accessor\n * (in this case, a text field).\n *\n * ```ts\n * const firstNameControl = new FormControl();\n * ```\n *\n * ```html\n * <input type=\"text\" [formControl]=\"firstNameControl\">\n * ```\n *\n * This value accessor is used by default for `<input type=\"text\">` and `<textarea>` elements, but\n * you could also use it for custom components that have similar behavior and do not require special\n * processing. In order to attach the default value accessor to a custom element, add the\n * `ngDefaultControl` attribute as shown below.\n *\n * ```html\n * <custom-input-component ngDefaultControl [(ngModel)]=\"value\"></custom-input-component>\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet DefaultValueAccessor = /*#__PURE__*/(() => {\n  class DefaultValueAccessor extends BaseControlValueAccessor {\n    _compositionMode;\n    /** Whether the user is creating a composition string (IME events). */\n    _composing = false;\n    constructor(renderer, elementRef, _compositionMode) {\n      super(renderer, elementRef);\n      this._compositionMode = _compositionMode;\n      if (this._compositionMode == null) {\n        this._compositionMode = !_isAndroid();\n      }\n    }\n    /**\n     * Sets the \"value\" property on the input element.\n     * @docs-private\n     */\n    writeValue(value) {\n      const normalizedValue = value == null ? '' : value;\n      this.setProperty('value', normalizedValue);\n    }\n    /** @internal */\n    _handleInput(value) {\n      if (!this._compositionMode || this._compositionMode && !this._composing) {\n        this.onChange(value);\n      }\n    }\n    /** @internal */\n    _compositionStart() {\n      this._composing = true;\n    }\n    /** @internal */\n    _compositionEnd(value) {\n      this._composing = false;\n      this._compositionMode && this.onChange(value);\n    }\n    static ɵfac = function DefaultValueAccessor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || DefaultValueAccessor)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(COMPOSITION_BUFFER_MODE, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: DefaultValueAccessor,\n      selectors: [[\"input\", \"formControlName\", \"\", 3, \"type\", \"checkbox\"], [\"textarea\", \"formControlName\", \"\"], [\"input\", \"formControl\", \"\", 3, \"type\", \"checkbox\"], [\"textarea\", \"formControl\", \"\"], [\"input\", \"ngModel\", \"\", 3, \"type\", \"checkbox\"], [\"textarea\", \"ngModel\", \"\"], [\"\", \"ngDefaultControl\", \"\"]],\n      hostBindings: function DefaultValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"input\", function DefaultValueAccessor_input_HostBindingHandler($event) {\n            return ctx._handleInput($event.target.value);\n          })(\"blur\", function DefaultValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          })(\"compositionstart\", function DefaultValueAccessor_compositionstart_HostBindingHandler() {\n            return ctx._compositionStart();\n          })(\"compositionend\", function DefaultValueAccessor_compositionend_HostBindingHandler($event) {\n            return ctx._compositionEnd($event.target.value);\n          });\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([DEFAULT_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return DefaultValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction isEmptyInputValue(value) {\n  return value == null || lengthOrSize(value) === 0;\n}\n/**\n * Extract the length property in case it's an array or a string.\n * Extract the size property in case it's a set.\n * Return null else.\n * @param value Either an array, set or undefined.\n */\nfunction lengthOrSize(value) {\n  // non-strict comparison is intentional, to check for both `null` and `undefined` values\n  if (value == null) {\n    return null;\n  } else if (Array.isArray(value) || typeof value === 'string') {\n    return value.length;\n  } else if (value instanceof Set) {\n    return value.size;\n  }\n  return null;\n}\n/**\n * @description\n * An `InjectionToken` for registering additional synchronous validators used with\n * `AbstractControl`s.\n *\n * @see {@link NG_ASYNC_VALIDATORS}\n *\n * @usageNotes\n *\n * ### Providing a custom validator\n *\n * The following example registers a custom validator directive. Adding the validator to the\n * existing collection of validators requires the `multi: true` option.\n *\n * ```ts\n * @Directive({\n *   selector: '[customValidator]',\n *   providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}]\n * })\n * class CustomValidatorDirective implements Validator {\n *   validate(control: AbstractControl): ValidationErrors | null {\n *     return { 'custom': true };\n *   }\n * }\n * ```\n *\n * @publicApi\n */\nconst NG_VALIDATORS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'NgValidators' : '');\n/**\n * @description\n * An `InjectionToken` for registering additional asynchronous validators used with\n * `AbstractControl`s.\n *\n * @see {@link NG_VALIDATORS}\n *\n * @usageNotes\n *\n * ### Provide a custom async validator directive\n *\n * The following example implements the `AsyncValidator` interface to create an\n * async validator directive with a custom error key.\n *\n * ```ts\n * @Directive({\n *   selector: '[customAsyncValidator]',\n *   providers: [{provide: NG_ASYNC_VALIDATORS, useExisting: CustomAsyncValidatorDirective, multi:\n * true}]\n * })\n * class CustomAsyncValidatorDirective implements AsyncValidator {\n *   validate(control: AbstractControl): Promise<ValidationErrors|null> {\n *     return Promise.resolve({'custom': true});\n *   }\n * }\n * ```\n *\n * @publicApi\n */\nconst NG_ASYNC_VALIDATORS = /*#__PURE__*/new InjectionToken(ngDevMode ? 'NgAsyncValidators' : '');\n/**\n * A regular expression that matches valid e-mail addresses.\n *\n * At a high level, this regexp matches e-mail addresses of the format `local-part@tld`, where:\n * - `local-part` consists of one or more of the allowed characters (alphanumeric and some\n *   punctuation symbols).\n * - `local-part` cannot begin or end with a period (`.`).\n * - `local-part` cannot be longer than 64 characters.\n * - `tld` consists of one or more `labels` separated by periods (`.`). For example `localhost` or\n *   `foo.com`.\n * - A `label` consists of one or more of the allowed characters (alphanumeric, dashes (`-`) and\n *   periods (`.`)).\n * - A `label` cannot begin or end with a dash (`-`) or a period (`.`).\n * - A `label` cannot be longer than 63 characters.\n * - The whole address cannot be longer than 254 characters.\n *\n * ## Implementation background\n *\n * This regexp was ported over from AngularJS (see there for git history):\n * https://github.com/angular/angular.js/blob/c133ef836/src/ng/directive/input.js#L27\n * It is based on the\n * [WHATWG version](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) with\n * some enhancements to incorporate more RFC rules (such as rules related to domain names and the\n * lengths of different parts of the address). The main differences from the WHATWG version are:\n *   - Disallow `local-part` to begin or end with a period (`.`).\n *   - Disallow `local-part` length to exceed 64 characters.\n *   - Disallow total address length to exceed 254 characters.\n *\n * See [this commit](https://github.com/angular/angular.js/commit/f3f5cf72e) for more details.\n */\nconst EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/**\n * @description\n * Provides a set of built-in validators that can be used by form controls.\n *\n * A validator is a function that processes a `FormControl` or collection of\n * controls and returns an error map or null. A null map means that validation has passed.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @publicApi\n */\nclass Validators {\n  /**\n   * @description\n   * Validator that requires the control's value to be greater than or equal to the provided number.\n   *\n   * @usageNotes\n   *\n   * ### Validate against a minimum of 3\n   *\n   * ```ts\n   * const control = new FormControl(2, Validators.min(3));\n   *\n   * console.log(control.errors); // {min: {min: 3, actual: 2}}\n   * ```\n   *\n   * @returns A validator function that returns an error map with the\n   * `min` property if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static min(min) {\n    return minValidator(min);\n  }\n  /**\n   * @description\n   * Validator that requires the control's value to be less than or equal to the provided number.\n   *\n   * @usageNotes\n   *\n   * ### Validate against a maximum of 15\n   *\n   * ```ts\n   * const control = new FormControl(16, Validators.max(15));\n   *\n   * console.log(control.errors); // {max: {max: 15, actual: 16}}\n   * ```\n   *\n   * @returns A validator function that returns an error map with the\n   * `max` property if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static max(max) {\n    return maxValidator(max);\n  }\n  /**\n   * @description\n   * Validator that requires the control have a non-empty value.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field is non-empty\n   *\n   * ```ts\n   * const control = new FormControl('', Validators.required);\n   *\n   * console.log(control.errors); // {required: true}\n   * ```\n   *\n   * @returns An error map with the `required` property\n   * if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static required(control) {\n    return requiredValidator(control);\n  }\n  /**\n   * @description\n   * Validator that requires the control's value be true. This validator is commonly\n   * used for required checkboxes.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field value is true\n   *\n   * ```ts\n   * const control = new FormControl('some value', Validators.requiredTrue);\n   *\n   * console.log(control.errors); // {required: true}\n   * ```\n   *\n   * @returns An error map that contains the `required` property\n   * set to `true` if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static requiredTrue(control) {\n    return requiredTrueValidator(control);\n  }\n  /**\n   * @description\n   * Validator that requires the control's value pass an email validation test.\n   *\n   * Tests the value using a [regular\n   * expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions)\n   * pattern suitable for common use cases. The pattern is based on the definition of a valid email\n   * address in the [WHATWG HTML\n   * specification](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) with\n   * some enhancements to incorporate more RFC rules (such as rules related to domain names and the\n   * lengths of different parts of the address).\n   *\n   * The differences from the WHATWG version include:\n   * - Disallow `local-part` (the part before the `@` symbol) to begin or end with a period (`.`).\n   * - Disallow `local-part` to be longer than 64 characters.\n   * - Disallow the whole address to be longer than 254 characters.\n   *\n   * If this pattern does not satisfy your business needs, you can use `Validators.pattern()` to\n   * validate the value against a different pattern.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field matches a valid email pattern\n   *\n   * ```ts\n   * const control = new FormControl('bad@', Validators.email);\n   *\n   * console.log(control.errors); // {email: true}\n   * ```\n   *\n   * @returns An error map with the `email` property\n   * if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static email(control) {\n    return emailValidator(control);\n  }\n  /**\n   * @description\n   * Validator that requires the number of items in the control's value to be greater than or equal\n   * to the provided minimum length. This validator is also provided by default if you use\n   * the HTML5 `minlength` attribute. Note that the `minLength` validator is intended to be used\n   * only for types that have a numeric `length` or `size` property, such as strings, arrays or\n   * sets. The `minLength` validator logic is also not invoked for values when their `length` or\n   * `size` property is 0 (for example in case of an empty string or an empty array), to support\n   * optional controls. You can use the standard `required` validator if empty values should not be\n   * considered valid.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field has a minimum of 3 characters\n   *\n   * ```ts\n   * const control = new FormControl('ng', Validators.minLength(3));\n   *\n   * console.log(control.errors); // {minlength: {requiredLength: 3, actualLength: 2}}\n   * ```\n   *\n   * ```html\n   * <input minlength=\"5\">\n   * ```\n   *\n   * @returns A validator function that returns an error map with the\n   * `minlength` property if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static minLength(minLength) {\n    return minLengthValidator(minLength);\n  }\n  /**\n   * @description\n   * Validator that requires the number of items in the control's value to be less than or equal\n   * to the provided maximum length. This validator is also provided by default if you use\n   * the HTML5 `maxlength` attribute. Note that the `maxLength` validator is intended to be used\n   * only for types that have a numeric `length` or `size` property, such as strings, arrays or\n   * sets.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field has maximum of 5 characters\n   *\n   * ```ts\n   * const control = new FormControl('Angular', Validators.maxLength(5));\n   *\n   * console.log(control.errors); // {maxlength: {requiredLength: 5, actualLength: 7}}\n   * ```\n   *\n   * ```html\n   * <input maxlength=\"5\">\n   * ```\n   *\n   * @returns A validator function that returns an error map with the\n   * `maxlength` property if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static maxLength(maxLength) {\n    return maxLengthValidator(maxLength);\n  }\n  /**\n   * @description\n   * Validator that requires the control's value to match a regex pattern. This validator is also\n   * provided by default if you use the HTML5 `pattern` attribute.\n   *\n   * @usageNotes\n   *\n   * ### Validate that the field only contains letters or spaces\n   *\n   * ```ts\n   * const control = new FormControl('1', Validators.pattern('[a-zA-Z ]*'));\n   *\n   * console.log(control.errors); // {pattern: {requiredPattern: '^[a-zA-Z ]*$', actualValue: '1'}}\n   * ```\n   *\n   * ```html\n   * <input pattern=\"[a-zA-Z ]*\">\n   * ```\n   *\n   * ### Pattern matching with the global or sticky flag\n   *\n   * `RegExp` objects created with the `g` or `y` flags that are passed into `Validators.pattern`\n   * can produce different results on the same input when validations are run consecutively. This is\n   * due to how the behavior of `RegExp.prototype.test` is\n   * specified in [ECMA-262](https://tc39.es/ecma262/#sec-regexpbuiltinexec)\n   * (`RegExp` preserves the index of the last match when the global or sticky flag is used).\n   * Due to this behavior, it is recommended that when using\n   * `Validators.pattern` you **do not** pass in a `RegExp` object with either the global or sticky\n   * flag enabled.\n   *\n   * ```ts\n   * // Not recommended (since the `g` flag is used)\n   * const controlOne = new FormControl('1', Validators.pattern(/foo/g));\n   *\n   * // Good\n   * const controlTwo = new FormControl('1', Validators.pattern(/foo/));\n   * ```\n   *\n   * @param pattern A regular expression to be used as is to test the values, or a string.\n   * If a string is passed, the `^` character is prepended and the `$` character is\n   * appended to the provided string (if not already present), and the resulting regular\n   * expression is used to test the values.\n   *\n   * @returns A validator function that returns an error map with the\n   * `pattern` property if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static pattern(pattern) {\n    return patternValidator(pattern);\n  }\n  /**\n   * @description\n   * Validator that performs no operation.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static nullValidator(control) {\n    return nullValidator();\n  }\n  static compose(validators) {\n    return compose(validators);\n  }\n  /**\n   * @description\n   * Compose multiple async validators into a single function that returns the union\n   * of the individual error objects for the provided control.\n   *\n   * @returns A validator function that returns an error map with the\n   * merged error objects of the async validators if the validation check fails, otherwise `null`.\n   *\n   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}\n   *\n   */\n  static composeAsync(validators) {\n    return composeAsync(validators);\n  }\n}\n/**\n * Validator that requires the control's value to be greater than or equal to the provided number.\n * See `Validators.min` for additional information.\n */\nfunction minValidator(min) {\n  return control => {\n    if (control.value == null || min == null) {\n      return null; // don't validate empty values to allow optional controls\n    }\n    const value = parseFloat(control.value);\n    // Controls with NaN values after parsing should be treated as not having a\n    // minimum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-min\n    return !isNaN(value) && value < min ? {\n      'min': {\n        'min': min,\n        'actual': control.value\n      }\n    } : null;\n  };\n}\n/**\n * Validator that requires the control's value to be less than or equal to the provided number.\n * See `Validators.max` for additional information.\n */\nfunction maxValidator(max) {\n  return control => {\n    if (control.value == null || max == null) {\n      return null; // don't validate empty values to allow optional controls\n    }\n    const value = parseFloat(control.value);\n    // Controls with NaN values after parsing should be treated as not having a\n    // maximum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-max\n    return !isNaN(value) && value > max ? {\n      'max': {\n        'max': max,\n        'actual': control.value\n      }\n    } : null;\n  };\n}\n/**\n * Validator that requires the control have a non-empty value.\n * See `Validators.required` for additional information.\n */\nfunction requiredValidator(control) {\n  return isEmptyInputValue(control.value) ? {\n    'required': true\n  } : null;\n}\n/**\n * Validator that requires the control's value be true. This validator is commonly\n * used for required checkboxes.\n * See `Validators.requiredTrue` for additional information.\n */\nfunction requiredTrueValidator(control) {\n  return control.value === true ? null : {\n    'required': true\n  };\n}\n/**\n * Validator that requires the control's value pass an email validation test.\n * See `Validators.email` for additional information.\n */\nfunction emailValidator(control) {\n  if (isEmptyInputValue(control.value)) {\n    return null; // don't validate empty values to allow optional controls\n  }\n  return EMAIL_REGEXP.test(control.value) ? null : {\n    'email': true\n  };\n}\n/**\n * Validator that requires the number of items in the control's value to be greater than or equal\n * to the provided minimum length. See `Validators.minLength` for additional information.\n *\n * The minLengthValidator respects every length property in an object, regardless of whether it's an array.\n * For example, the object {id: 1, length: 0, width: 0} should be validated.\n */\nfunction minLengthValidator(minLength) {\n  return control => {\n    const length = control.value?.length ?? lengthOrSize(control.value);\n    if (length === null || length === 0) {\n      // don't validate empty values to allow optional controls\n      // don't validate values without `length` or `size` property\n      return null;\n    }\n    return length < minLength ? {\n      'minlength': {\n        'requiredLength': minLength,\n        'actualLength': length\n      }\n    } : null;\n  };\n}\n/**\n * Validator that requires the number of items in the control's value to be less than or equal\n * to the provided maximum length. See `Validators.maxLength` for additional information.\n *\n * The maxLengthValidator respects every length property in an object, regardless of whether it's an array.\n * For example, the object {id: 1, length: 0, width: 0} should be validated.\n */\nfunction maxLengthValidator(maxLength) {\n  return control => {\n    const length = control.value?.length ?? lengthOrSize(control.value);\n    if (length !== null && length > maxLength) {\n      return {\n        'maxlength': {\n          'requiredLength': maxLength,\n          'actualLength': length\n        }\n      };\n    }\n    return null;\n  };\n}\n/**\n * Validator that requires the control's value to match a regex pattern.\n * See `Validators.pattern` for additional information.\n */\nfunction patternValidator(pattern) {\n  if (!pattern) return nullValidator;\n  let regex;\n  let regexStr;\n  if (typeof pattern === 'string') {\n    regexStr = '';\n    if (pattern.charAt(0) !== '^') regexStr += '^';\n    regexStr += pattern;\n    if (pattern.charAt(pattern.length - 1) !== '$') regexStr += '$';\n    regex = new RegExp(regexStr);\n  } else {\n    regexStr = pattern.toString();\n    regex = pattern;\n  }\n  return control => {\n    if (isEmptyInputValue(control.value)) {\n      return null; // don't validate empty values to allow optional controls\n    }\n    const value = control.value;\n    return regex.test(value) ? null : {\n      'pattern': {\n        'requiredPattern': regexStr,\n        'actualValue': value\n      }\n    };\n  };\n}\n/**\n * Function that has `ValidatorFn` shape, but performs no operation.\n */\nfunction nullValidator(control) {\n  return null;\n}\nfunction isPresent(o) {\n  return o != null;\n}\nfunction toObservable(value) {\n  const obs = _isPromise(value) ? from(value) : value;\n  if ((typeof ngDevMode === 'undefined' || ngDevMode) && !_isSubscribable(obs)) {\n    let errorMessage = `Expected async validator to return Promise or Observable.`;\n    // A synchronous validator will return object or null.\n    if (typeof value === 'object') {\n      errorMessage += ' Are you using a synchronous validator where an async validator is expected?';\n    }\n    throw new _RuntimeError(-1101 /* RuntimeErrorCode.WRONG_VALIDATOR_RETURN_TYPE */, errorMessage);\n  }\n  return obs;\n}\nfunction mergeErrors(arrayOfErrors) {\n  let res = {};\n  arrayOfErrors.forEach(errors => {\n    res = errors != null ? {\n      ...res,\n      ...errors\n    } : res;\n  });\n  return Object.keys(res).length === 0 ? null : res;\n}\nfunction executeValidators(control, validators) {\n  return validators.map(validator => validator(control));\n}\nfunction isValidatorFn(validator) {\n  return !validator.validate;\n}\n/**\n * Given the list of validators that may contain both functions as well as classes, return the list\n * of validator functions (convert validator classes into validator functions). This is needed to\n * have consistent structure in validators list before composing them.\n *\n * @param validators The set of validators that may contain validators both in plain function form\n *     as well as represented as a validator class.\n */\nfunction normalizeValidators(validators) {\n  return validators.map(validator => {\n    return isValidatorFn(validator) ? validator : c => validator.validate(c);\n  });\n}\n/**\n * Merges synchronous validators into a single validator function.\n * See `Validators.compose` for additional information.\n */\nfunction compose(validators) {\n  if (!validators) return null;\n  const presentValidators = validators.filter(isPresent);\n  if (presentValidators.length == 0) return null;\n  return function (control) {\n    return mergeErrors(executeValidators(control, presentValidators));\n  };\n}\n/**\n * Accepts a list of validators of different possible shapes (`Validator` and `ValidatorFn`),\n * normalizes the list (converts everything to `ValidatorFn`) and merges them into a single\n * validator function.\n */\nfunction composeValidators(validators) {\n  return validators != null ? compose(normalizeValidators(validators)) : null;\n}\n/**\n * Merges asynchronous validators into a single validator function.\n * See `Validators.composeAsync` for additional information.\n */\nfunction composeAsync(validators) {\n  if (!validators) return null;\n  const presentValidators = validators.filter(isPresent);\n  if (presentValidators.length == 0) return null;\n  return function (control) {\n    const observables = executeValidators(control, presentValidators).map(toObservable);\n    return forkJoin(observables).pipe(map(mergeErrors));\n  };\n}\n/**\n * Accepts a list of async validators of different possible shapes (`AsyncValidator` and\n * `AsyncValidatorFn`), normalizes the list (converts everything to `AsyncValidatorFn`) and merges\n * them into a single validator function.\n */\nfunction composeAsyncValidators(validators) {\n  return validators != null ? composeAsync(normalizeValidators(validators)) : null;\n}\n/**\n * Merges raw control validators with a given directive validator and returns the combined list of\n * validators as an array.\n */\nfunction mergeValidators(controlValidators, dirValidator) {\n  if (controlValidators === null) return [dirValidator];\n  return Array.isArray(controlValidators) ? [...controlValidators, dirValidator] : [controlValidators, dirValidator];\n}\n/**\n * Retrieves the list of raw synchronous validators attached to a given control.\n */\nfunction getControlValidators(control) {\n  return control._rawValidators;\n}\n/**\n * Retrieves the list of raw asynchronous validators attached to a given control.\n */\nfunction getControlAsyncValidators(control) {\n  return control._rawAsyncValidators;\n}\n/**\n * Accepts a singleton validator, an array, or null, and returns an array type with the provided\n * validators.\n *\n * @param validators A validator, validators, or null.\n * @returns A validators array.\n */\nfunction makeValidatorsArray(validators) {\n  if (!validators) return [];\n  return Array.isArray(validators) ? validators : [validators];\n}\n/**\n * Determines whether a validator or validators array has a given validator.\n *\n * @param validators The validator or validators to compare against.\n * @param validator The validator to check.\n * @returns Whether the validator is present.\n */\nfunction hasValidator(validators, validator) {\n  return Array.isArray(validators) ? validators.includes(validator) : validators === validator;\n}\n/**\n * Combines two arrays of validators into one. If duplicates are provided, only one will be added.\n *\n * @param validators The new validators.\n * @param currentValidators The base array of current validators.\n * @returns An array of validators.\n */\nfunction addValidators(validators, currentValidators) {\n  const current = makeValidatorsArray(currentValidators);\n  const validatorsToAdd = makeValidatorsArray(validators);\n  validatorsToAdd.forEach(v => {\n    // Note: if there are duplicate entries in the new validators array,\n    // only the first one would be added to the current list of validators.\n    // Duplicate ones would be ignored since `hasValidator` would detect\n    // the presence of a validator function and we update the current list in place.\n    if (!hasValidator(current, v)) {\n      current.push(v);\n    }\n  });\n  return current;\n}\nfunction removeValidators(validators, currentValidators) {\n  return makeValidatorsArray(currentValidators).filter(v => !hasValidator(validators, v));\n}\n\n/**\n * @description\n * Base class for control directives.\n *\n * This class is only used internally in the `ReactiveFormsModule` and the `FormsModule`.\n *\n * @publicApi\n */\nclass AbstractControlDirective {\n  /**\n   * @description\n   * Reports the value of the control if it is present, otherwise null.\n   */\n  get value() {\n    return this.control ? this.control.value : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is valid. A control is considered valid if no\n   * validation errors exist with the current value.\n   * If the control is not present, null is returned.\n   */\n  get valid() {\n    return this.control ? this.control.valid : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is invalid, meaning that an error exists in the input value.\n   * If the control is not present, null is returned.\n   */\n  get invalid() {\n    return this.control ? this.control.invalid : null;\n  }\n  /**\n   * @description\n   * Reports whether a control is pending, meaning that async validation is occurring and\n   * errors are not yet available for the input value. If the control is not present, null is\n   * returned.\n   */\n  get pending() {\n    return this.control ? this.control.pending : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is disabled, meaning that the control is disabled\n   * in the UI and is exempt from validation checks and excluded from aggregate\n   * values of ancestor controls. If the control is not present, null is returned.\n   */\n  get disabled() {\n    return this.control ? this.control.disabled : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is enabled, meaning that the control is included in ancestor\n   * calculations of validity or value. If the control is not present, null is returned.\n   */\n  get enabled() {\n    return this.control ? this.control.enabled : null;\n  }\n  /**\n   * @description\n   * Reports the control's validation errors. If the control is not present, null is returned.\n   */\n  get errors() {\n    return this.control ? this.control.errors : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is pristine, meaning that the user has not yet changed\n   * the value in the UI. If the control is not present, null is returned.\n   */\n  get pristine() {\n    return this.control ? this.control.pristine : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is dirty, meaning that the user has changed\n   * the value in the UI. If the control is not present, null is returned.\n   */\n  get dirty() {\n    return this.control ? this.control.dirty : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is touched, meaning that the user has triggered\n   * a `blur` event on it. If the control is not present, null is returned.\n   */\n  get touched() {\n    return this.control ? this.control.touched : null;\n  }\n  /**\n   * @description\n   * Reports the validation status of the control. Possible values include:\n   * 'VALID', 'INVALID', 'DISABLED', and 'PENDING'.\n   * If the control is not present, null is returned.\n   */\n  get status() {\n    return this.control ? this.control.status : null;\n  }\n  /**\n   * @description\n   * Reports whether the control is untouched, meaning that the user has not yet triggered\n   * a `blur` event on it. If the control is not present, null is returned.\n   */\n  get untouched() {\n    return this.control ? this.control.untouched : null;\n  }\n  /**\n   * @description\n   * Returns a multicasting observable that emits a validation status whenever it is\n   * calculated for the control. If the control is not present, null is returned.\n   */\n  get statusChanges() {\n    return this.control ? this.control.statusChanges : null;\n  }\n  /**\n   * @description\n   * Returns a multicasting observable of value changes for the control that emits every time the\n   * value of the control changes in the UI or programmatically.\n   * If the control is not present, null is returned.\n   */\n  get valueChanges() {\n    return this.control ? this.control.valueChanges : null;\n  }\n  /**\n   * @description\n   * Returns an array that represents the path from the top-level form to this control.\n   * Each index is the string name of the control on that level.\n   */\n  get path() {\n    return null;\n  }\n  /**\n   * Contains the result of merging synchronous validators into a single validator function\n   * (combined using `Validators.compose`).\n   */\n  _composedValidatorFn;\n  /**\n   * Contains the result of merging asynchronous validators into a single validator function\n   * (combined using `Validators.composeAsync`).\n   */\n  _composedAsyncValidatorFn;\n  /**\n   * Set of synchronous validators as they were provided while calling `setValidators` function.\n   * @internal\n   */\n  _rawValidators = [];\n  /**\n   * Set of asynchronous validators as they were provided while calling `setAsyncValidators`\n   * function.\n   * @internal\n   */\n  _rawAsyncValidators = [];\n  /**\n   * Sets synchronous validators for this directive.\n   * @internal\n   */\n  _setValidators(validators) {\n    this._rawValidators = validators || [];\n    this._composedValidatorFn = composeValidators(this._rawValidators);\n  }\n  /**\n   * Sets asynchronous validators for this directive.\n   * @internal\n   */\n  _setAsyncValidators(validators) {\n    this._rawAsyncValidators = validators || [];\n    this._composedAsyncValidatorFn = composeAsyncValidators(this._rawAsyncValidators);\n  }\n  /**\n   * @description\n   * Synchronous validator function composed of all the synchronous validators registered with this\n   * directive.\n   */\n  get validator() {\n    return this._composedValidatorFn || null;\n  }\n  /**\n   * @description\n   * Asynchronous validator function composed of all the asynchronous validators registered with\n   * this directive.\n   */\n  get asyncValidator() {\n    return this._composedAsyncValidatorFn || null;\n  }\n  /*\n   * The set of callbacks to be invoked when directive instance is being destroyed.\n   */\n  _onDestroyCallbacks = [];\n  /**\n   * Internal function to register callbacks that should be invoked\n   * when directive instance is being destroyed.\n   * @internal\n   */\n  _registerOnDestroy(fn) {\n    this._onDestroyCallbacks.push(fn);\n  }\n  /**\n   * Internal function to invoke all registered \"on destroy\" callbacks.\n   * Note: calling this function also clears the list of callbacks.\n   * @internal\n   */\n  _invokeOnDestroyCallbacks() {\n    this._onDestroyCallbacks.forEach(fn => fn());\n    this._onDestroyCallbacks = [];\n  }\n  /**\n   * @description\n   * Resets the control with the provided value if the control is present.\n   */\n  reset(value = undefined) {\n    if (this.control) this.control.reset(value);\n  }\n  /**\n   * @description\n   * Reports whether the control with the given path has the error specified.\n   *\n   * @param errorCode The code of the error to check\n   * @param path A list of control names that designates how to move from the current control\n   * to the control that should be queried for errors.\n   *\n   * @usageNotes\n   * For example, for the following `FormGroup`:\n   *\n   * ```ts\n   * form = new FormGroup({\n   *   address: new FormGroup({ street: new FormControl() })\n   * });\n   * ```\n   *\n   * The path to the 'street' control from the root form would be 'address' -> 'street'.\n   *\n   * It can be provided to this method in one of two formats:\n   *\n   * 1. An array of string control names, e.g. `['address', 'street']`\n   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`\n   *\n   * If no path is given, this method checks for the error on the current control.\n   *\n   * @returns whether the given error is present in the control at the given path.\n   *\n   * If the control is not present, false is returned.\n   */\n  hasError(errorCode, path) {\n    return this.control ? this.control.hasError(errorCode, path) : false;\n  }\n  /**\n   * @description\n   * Reports error data for the control with the given path.\n   *\n   * @param errorCode The code of the error to check\n   * @param path A list of control names that designates how to move from the current control\n   * to the control that should be queried for errors.\n   *\n   * @usageNotes\n   * For example, for the following `FormGroup`:\n   *\n   * ```ts\n   * form = new FormGroup({\n   *   address: new FormGroup({ street: new FormControl() })\n   * });\n   * ```\n   *\n   * The path to the 'street' control from the root form would be 'address' -> 'street'.\n   *\n   * It can be provided to this method in one of two formats:\n   *\n   * 1. An array of string control names, e.g. `['address', 'street']`\n   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`\n   *\n   * @returns error data for that particular error. If the control or error is not present,\n   * null is returned.\n   */\n  getError(errorCode, path) {\n    return this.control ? this.control.getError(errorCode, path) : null;\n  }\n}\n\n/**\n * @description\n * A base class for directives that contain multiple registered instances of `NgControl`.\n * Only used by the forms module.\n *\n * @publicApi\n */\nclass ControlContainer extends AbstractControlDirective {\n  /**\n   * @description\n   * The name for the control\n   */\n  name;\n  /**\n   * @description\n   * The top-level form directive for the control.\n   */\n  get formDirective() {\n    return null;\n  }\n  /**\n   * @description\n   * The path to this group.\n   */\n  get path() {\n    return null;\n  }\n}\n\n/**\n * @description\n * A base class that all `FormControl`-based directives extend. It binds a `FormControl`\n * object to a DOM element.\n *\n * @publicApi\n */\nclass NgControl extends AbstractControlDirective {\n  /**\n   * @description\n   * The parent form for the control.\n   *\n   * @internal\n   */\n  _parent = null;\n  /**\n   * @description\n   * The name for the control\n   */\n  name = null;\n  /**\n   * @description\n   * The value accessor for the control\n   */\n  valueAccessor = null;\n}\n\n// DO NOT REFACTOR!\n// Each status is represented by a separate function to make sure that\n// advanced Closure Compiler optimizations related to property renaming\n// can work correctly.\nclass AbstractControlStatus {\n  _cd;\n  constructor(cd) {\n    this._cd = cd;\n  }\n  get isTouched() {\n    // track the touched signal\n    this._cd?.control?._touched?.();\n    return !!this._cd?.control?.touched;\n  }\n  get isUntouched() {\n    return !!this._cd?.control?.untouched;\n  }\n  get isPristine() {\n    // track the pristine signal\n    this._cd?.control?._pristine?.();\n    return !!this._cd?.control?.pristine;\n  }\n  get isDirty() {\n    // pristine signal already tracked above\n    return !!this._cd?.control?.dirty;\n  }\n  get isValid() {\n    // track the status signal\n    this._cd?.control?._status?.();\n    return !!this._cd?.control?.valid;\n  }\n  get isInvalid() {\n    // status signal already tracked above\n    return !!this._cd?.control?.invalid;\n  }\n  get isPending() {\n    // status signal already tracked above\n    return !!this._cd?.control?.pending;\n  }\n  get isSubmitted() {\n    // track the submitted signal\n    this._cd?._submitted?.();\n    // We check for the `submitted` field from `NgForm` and `FormGroupDirective` classes, but\n    // we avoid instanceof checks to prevent non-tree-shakable references to those types.\n    return !!this._cd?.submitted;\n  }\n}\nconst ngControlStatusHost = {\n  '[class.ng-untouched]': 'isUntouched',\n  '[class.ng-touched]': 'isTouched',\n  '[class.ng-pristine]': 'isPristine',\n  '[class.ng-dirty]': 'isDirty',\n  '[class.ng-valid]': 'isValid',\n  '[class.ng-invalid]': 'isInvalid',\n  '[class.ng-pending]': 'isPending'\n};\nconst ngGroupStatusHost = {\n  ...ngControlStatusHost,\n  '[class.ng-submitted]': 'isSubmitted'\n};\n/**\n * @description\n * Directive automatically applied to Angular form controls that sets CSS classes\n * based on control status.\n *\n * @usageNotes\n *\n * ### CSS classes applied\n *\n * The following classes are applied as the properties become true:\n *\n * * ng-valid\n * * ng-invalid\n * * ng-pending\n * * ng-pristine\n * * ng-dirty\n * * ng-untouched\n * * ng-touched\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgControlStatus = /*#__PURE__*/(() => {\n  class NgControlStatus extends AbstractControlStatus {\n    constructor(cd) {\n      super(cd);\n    }\n    static ɵfac = function NgControlStatus_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgControlStatus)(i0.ɵɵdirectiveInject(NgControl, 2));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgControlStatus,\n      selectors: [[\"\", \"formControlName\", \"\"], [\"\", \"ngModel\", \"\"], [\"\", \"formControl\", \"\"]],\n      hostVars: 14,\n      hostBindings: function NgControlStatus_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"ng-untouched\", ctx.isUntouched)(\"ng-touched\", ctx.isTouched)(\"ng-pristine\", ctx.isPristine)(\"ng-dirty\", ctx.isDirty)(\"ng-valid\", ctx.isValid)(\"ng-invalid\", ctx.isInvalid)(\"ng-pending\", ctx.isPending);\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return NgControlStatus;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Directive automatically applied to Angular form groups that sets CSS classes\n * based on control status (valid/invalid/dirty/etc). On groups, this includes the additional\n * class ng-submitted.\n *\n * @see {@link NgControlStatus}\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgControlStatusGroup = /*#__PURE__*/(() => {\n  class NgControlStatusGroup extends AbstractControlStatus {\n    constructor(cd) {\n      super(cd);\n    }\n    static ɵfac = function NgControlStatusGroup_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgControlStatusGroup)(i0.ɵɵdirectiveInject(ControlContainer, 10));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgControlStatusGroup,\n      selectors: [[\"\", \"formGroupName\", \"\"], [\"\", \"formArrayName\", \"\"], [\"\", \"ngModelGroup\", \"\"], [\"\", \"formGroup\", \"\"], [\"form\", 3, \"ngNoForm\", \"\"], [\"\", \"ngForm\", \"\"]],\n      hostVars: 16,\n      hostBindings: function NgControlStatusGroup_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"ng-untouched\", ctx.isUntouched)(\"ng-touched\", ctx.isTouched)(\"ng-pristine\", ctx.isPristine)(\"ng-dirty\", ctx.isDirty)(\"ng-valid\", ctx.isValid)(\"ng-invalid\", ctx.isInvalid)(\"ng-pending\", ctx.isPending)(\"ng-submitted\", ctx.isSubmitted);\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return NgControlStatusGroup;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst formControlNameExample = `\n  <div [formGroup]=\"myGroup\">\n    <input formControlName=\"firstName\">\n  </div>\n\n  In your class:\n\n  this.myGroup = new FormGroup({\n      firstName: new FormControl()\n  });`;\nconst formGroupNameExample = `\n  <div [formGroup]=\"myGroup\">\n      <div formGroupName=\"person\">\n        <input formControlName=\"firstName\">\n      </div>\n  </div>\n\n  In your class:\n\n  this.myGroup = new FormGroup({\n      person: new FormGroup({ firstName: new FormControl() })\n  });`;\nconst formArrayNameExample = `\n  <div [formGroup]=\"myGroup\">\n    <div formArrayName=\"cities\">\n      <div *ngFor=\"let city of cityArray.controls; index as i\">\n        <input [formControlName]=\"i\">\n      </div>\n    </div>\n  </div>\n\n  In your class:\n\n  this.cityArray = new FormArray([new FormControl('SF')]);\n  this.myGroup = new FormGroup({\n    cities: this.cityArray\n  });`;\nconst ngModelGroupExample = `\n  <form>\n      <div ngModelGroup=\"person\">\n        <input [(ngModel)]=\"person.name\" name=\"firstName\">\n      </div>\n  </form>`;\nconst ngModelWithFormGroupExample = `\n  <div [formGroup]=\"myGroup\">\n      <input formControlName=\"firstName\">\n      <input [(ngModel)]=\"showMoreControls\" [ngModelOptions]=\"{standalone: true}\">\n  </div>\n`;\nfunction controlParentException(nameOrIndex) {\n  return new _RuntimeError(1050 /* RuntimeErrorCode.FORM_CONTROL_NAME_MISSING_PARENT */, `formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n      directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      ${describeFormControl(nameOrIndex)}\n\n    Example:\n\n    ${formControlNameExample}`);\n}\nfunction describeFormControl(nameOrIndex) {\n  if (nameOrIndex == null || nameOrIndex === '') {\n    return '';\n  }\n  const valueType = typeof nameOrIndex === 'string' ? 'name' : 'index';\n  return `Affected Form Control ${valueType}: \"${nameOrIndex}\"`;\n}\nfunction ngModelGroupException() {\n  return new _RuntimeError(1051 /* RuntimeErrorCode.FORM_CONTROL_NAME_INSIDE_MODEL_GROUP */, `formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n      that also have a \"form\" prefix: formGroupName, formArrayName, or formGroup.\n\n      Option 1:  Update the parent to be formGroupName (reactive form strategy)\n\n      ${formGroupNameExample}\n\n      Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n      ${ngModelGroupExample}`);\n}\nfunction missingFormException() {\n  return new _RuntimeError(1052 /* RuntimeErrorCode.FORM_GROUP_MISSING_INSTANCE */, `formGroup expects a FormGroup instance. Please pass one in.\n\n      Example:\n\n      ${formControlNameExample}`);\n}\nfunction groupParentException() {\n  return new _RuntimeError(1053 /* RuntimeErrorCode.FORM_GROUP_NAME_MISSING_PARENT */, `formGroupName must be used with a parent formGroup directive.  You'll want to add a formGroup\n    directive and pass it an existing FormGroup instance (you can create one in your class).\n\n    Example:\n\n    ${formGroupNameExample}`);\n}\nfunction arrayParentException() {\n  return new _RuntimeError(1054 /* RuntimeErrorCode.FORM_ARRAY_NAME_MISSING_PARENT */, `formArrayName must be used with a parent formGroup directive.  You'll want to add a formGroup\n      directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      Example:\n\n      ${formArrayNameExample}`);\n}\nconst disabledAttrWarning = `\n  It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n  when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n  you. We recommend using this approach to avoid 'changed after checked' errors.\n\n  Example:\n  // Specify the \\`disabled\\` property at control creation time:\n  form = new FormGroup({\n    first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n    last: new FormControl('Drew', Validators.required)\n  });\n\n  // Controls can also be enabled/disabled after creation:\n  form.get('first')?.enable();\n  form.get('last')?.disable();\n`;\nconst asyncValidatorsDroppedWithOptsWarning = `\n  It looks like you're constructing using a FormControl with both an options argument and an\n  async validators argument. Mixing these arguments will cause your async validators to be dropped.\n  You should either put all your validators in the options object, or in separate validators\n  arguments. For example:\n\n  // Using validators arguments\n  fc = new FormControl(42, Validators.required, myAsyncValidator);\n\n  // Using AbstractControlOptions\n  fc = new FormControl(42, {validators: Validators.required, asyncValidators: myAV});\n\n  // Do NOT mix them: async validators will be dropped!\n  fc = new FormControl(42, {validators: Validators.required}, /* Oops! */ myAsyncValidator);\n`;\nfunction ngModelWarning(directiveName) {\n  return `\n  It looks like you're using ngModel on the same form field as ${directiveName}.\n  Support for using the ngModel input property and ngModelChange event with\n  reactive form directives has been deprecated in Angular v6 and will be removed\n  in a future version of Angular.\n\n  For more information on this, see our API docs here:\n  https://angular.io/api/forms/${directiveName === 'formControl' ? 'FormControlDirective' : 'FormControlName'}#use-with-ngmodel\n  `;\n}\nfunction describeKey(isFormGroup, key) {\n  return isFormGroup ? `with name: '${key}'` : `at index: ${key}`;\n}\nfunction noControlsError(isFormGroup) {\n  return `\n    There are no form controls registered with this ${isFormGroup ? 'group' : 'array'} yet. If you're using ngModel,\n    you may want to check next tick (e.g. use setTimeout).\n  `;\n}\nfunction missingControlError(isFormGroup, key) {\n  return `Cannot find form control ${describeKey(isFormGroup, key)}`;\n}\nfunction missingControlValueError(isFormGroup, key) {\n  return `Must supply a value for form control ${describeKey(isFormGroup, key)}`;\n}\n\n/**\n * Reports that a control is valid, meaning that no errors exist in the input value.\n *\n * @see {@link status}\n */\nconst VALID = 'VALID';\n/**\n * Reports that a control is invalid, meaning that an error exists in the input value.\n *\n * @see {@link status}\n */\nconst INVALID = 'INVALID';\n/**\n * Reports that a control is pending, meaning that async validation is occurring and\n * errors are not yet available for the input value.\n *\n * @see {@link markAsPending}\n * @see {@link status}\n */\nconst PENDING = 'PENDING';\n/**\n * Reports that a control is disabled, meaning that the control is exempt from ancestor\n * calculations of validity or value.\n *\n * @see {@link markAsDisabled}\n * @see {@link status}\n */\nconst DISABLED = 'DISABLED';\n/**\n * Base class for every event sent by `AbstractControl.events()`\n *\n * @publicApi\n */\nclass ControlEvent {}\n/**\n * Event fired when the value of a control changes.\n *\n * @publicApi\n */\nclass ValueChangeEvent extends ControlEvent {\n  value;\n  source;\n  constructor(value, source) {\n    super();\n    this.value = value;\n    this.source = source;\n  }\n}\n/**\n * Event fired when the control's pristine state changes (pristine <=> dirty).\n *\n * @publicApi */\nclass PristineChangeEvent extends ControlEvent {\n  pristine;\n  source;\n  constructor(pristine, source) {\n    super();\n    this.pristine = pristine;\n    this.source = source;\n  }\n}\n/**\n * Event fired when the control's touched status changes (touched <=> untouched).\n *\n * @publicApi\n */\nclass TouchedChangeEvent extends ControlEvent {\n  touched;\n  source;\n  constructor(touched, source) {\n    super();\n    this.touched = touched;\n    this.source = source;\n  }\n}\n/**\n * Event fired when the control's status changes.\n *\n * @publicApi\n */\nclass StatusChangeEvent extends ControlEvent {\n  status;\n  source;\n  constructor(status, source) {\n    super();\n    this.status = status;\n    this.source = source;\n  }\n}\n/**\n * Event fired when a form is submitted\n *\n * @publicApi\n */\nclass FormSubmittedEvent extends ControlEvent {\n  source;\n  constructor(source) {\n    super();\n    this.source = source;\n  }\n}\n/**\n * Event fired when a form is reset.\n *\n * @publicApi\n */\nclass FormResetEvent extends ControlEvent {\n  source;\n  constructor(source) {\n    super();\n    this.source = source;\n  }\n}\n/**\n * Gets validators from either an options object or given validators.\n */\nfunction pickValidators(validatorOrOpts) {\n  return (isOptionsObj(validatorOrOpts) ? validatorOrOpts.validators : validatorOrOpts) || null;\n}\n/**\n * Creates validator function by combining provided validators.\n */\nfunction coerceToValidator(validator) {\n  return Array.isArray(validator) ? composeValidators(validator) : validator || null;\n}\n/**\n * Gets async validators from either an options object or given validators.\n */\nfunction pickAsyncValidators(asyncValidator, validatorOrOpts) {\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    if (isOptionsObj(validatorOrOpts) && asyncValidator) {\n      console.warn(asyncValidatorsDroppedWithOptsWarning);\n    }\n  }\n  return (isOptionsObj(validatorOrOpts) ? validatorOrOpts.asyncValidators : asyncValidator) || null;\n}\n/**\n * Creates async validator function by combining provided async validators.\n */\nfunction coerceToAsyncValidator(asyncValidator) {\n  return Array.isArray(asyncValidator) ? composeAsyncValidators(asyncValidator) : asyncValidator || null;\n}\nfunction isOptionsObj(validatorOrOpts) {\n  return validatorOrOpts != null && !Array.isArray(validatorOrOpts) && typeof validatorOrOpts === 'object';\n}\nfunction assertControlPresent(parent, isGroup, key) {\n  const controls = parent.controls;\n  const collection = isGroup ? Object.keys(controls) : controls;\n  if (!collection.length) {\n    throw new _RuntimeError(1000 /* RuntimeErrorCode.NO_CONTROLS */, typeof ngDevMode === 'undefined' || ngDevMode ? noControlsError(isGroup) : '');\n  }\n  if (!controls[key]) {\n    throw new _RuntimeError(1001 /* RuntimeErrorCode.MISSING_CONTROL */, typeof ngDevMode === 'undefined' || ngDevMode ? missingControlError(isGroup, key) : '');\n  }\n}\nfunction assertAllValuesPresent(control, isGroup, value) {\n  control._forEachChild((_, key) => {\n    if (value[key] === undefined) {\n      throw new _RuntimeError(1002 /* RuntimeErrorCode.MISSING_CONTROL_VALUE */, typeof ngDevMode === 'undefined' || ngDevMode ? missingControlValueError(isGroup, key) : '');\n    }\n  });\n}\n/**\n * This is the base class for `FormControl`, `FormGroup`, and `FormArray`.\n *\n * It provides some of the shared behavior that all controls and groups of controls have, like\n * running validators, calculating status, and resetting state. It also defines the properties\n * that are shared between all sub-classes, like `value`, `valid`, and `dirty`. It shouldn't be\n * instantiated directly.\n *\n * The first type parameter TValue represents the value type of the control (`control.value`).\n * The optional type parameter TRawValue  represents the raw value type (`control.getRawValue()`).\n *\n * @see [Forms Guide](guide/forms)\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n * @see [Dynamic Forms Guide](guide/forms/dynamic-forms)\n *\n * @publicApi\n */\nclass AbstractControl {\n  /** @internal */\n  _pendingDirty = false;\n  /**\n   * Indicates that a control has its own pending asynchronous validation in progress.\n   * It also stores if the control should emit events when the validation status changes.\n   *\n   * @internal\n   */\n  _hasOwnPendingAsyncValidator = null;\n  /** @internal */\n  _pendingTouched = false;\n  /** @internal */\n  _onCollectionChange = () => {};\n  /** @internal */\n  _updateOn;\n  _parent = null;\n  _asyncValidationSubscription;\n  /**\n   * Contains the result of merging synchronous validators into a single validator function\n   * (combined using `Validators.compose`).\n   *\n   * @internal\n   */\n  _composedValidatorFn;\n  /**\n   * Contains the result of merging asynchronous validators into a single validator function\n   * (combined using `Validators.composeAsync`).\n   *\n   * @internal\n   */\n  _composedAsyncValidatorFn;\n  /**\n   * Synchronous validators as they were provided:\n   *  - in `AbstractControl` constructor\n   *  - as an argument while calling `setValidators` function\n   *  - while calling the setter on the `validator` field (e.g. `control.validator = validatorFn`)\n   *\n   * @internal\n   */\n  _rawValidators;\n  /**\n   * Asynchronous validators as they were provided:\n   *  - in `AbstractControl` constructor\n   *  - as an argument while calling `setAsyncValidators` function\n   *  - while calling the setter on the `asyncValidator` field (e.g. `control.asyncValidator =\n   * asyncValidatorFn`)\n   *\n   * @internal\n   */\n  _rawAsyncValidators;\n  /**\n   * The current value of the control.\n   *\n   * * For a `FormControl`, the current value.\n   * * For an enabled `FormGroup`, the values of enabled controls as an object\n   * with a key-value pair for each member of the group.\n   * * For a disabled `FormGroup`, the values of all controls as an object\n   * with a key-value pair for each member of the group.\n   * * For a `FormArray`, the values of enabled controls as an array.\n   *\n   */\n  value;\n  /**\n   * Initialize the AbstractControl instance.\n   *\n   * @param validators The function or array of functions that is used to determine the validity of\n   *     this control synchronously.\n   * @param asyncValidators The function or array of functions that is used to determine validity of\n   *     this control asynchronously.\n   */\n  constructor(validators, asyncValidators) {\n    this._assignValidators(validators);\n    this._assignAsyncValidators(asyncValidators);\n  }\n  /**\n   * Returns the function that is used to determine the validity of this control synchronously.\n   * If multiple validators have been added, this will be a single composed function.\n   * See `Validators.compose()` for additional information.\n   */\n  get validator() {\n    return this._composedValidatorFn;\n  }\n  set validator(validatorFn) {\n    this._rawValidators = this._composedValidatorFn = validatorFn;\n  }\n  /**\n   * Returns the function that is used to determine the validity of this control asynchronously.\n   * If multiple validators have been added, this will be a single composed function.\n   * See `Validators.compose()` for additional information.\n   */\n  get asyncValidator() {\n    return this._composedAsyncValidatorFn;\n  }\n  set asyncValidator(asyncValidatorFn) {\n    this._rawAsyncValidators = this._composedAsyncValidatorFn = asyncValidatorFn;\n  }\n  /**\n   * The parent control.\n   */\n  get parent() {\n    return this._parent;\n  }\n  /**\n   * The validation status of the control.\n   *\n   * @see {@link FormControlStatus}\n   *\n   * These status values are mutually exclusive, so a control cannot be\n   * both valid AND invalid or invalid AND disabled.\n   */\n  get status() {\n    return untracked(this.statusReactive);\n  }\n  set status(v) {\n    untracked(() => this.statusReactive.set(v));\n  }\n  /** @internal */\n  _status = /*#__PURE__*/computed(() => this.statusReactive());\n  statusReactive = /*#__PURE__*/signal(undefined);\n  /**\n   * A control is `valid` when its `status` is `VALID`.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   * @returns True if the control has passed all of its validation tests,\n   * false otherwise.\n   */\n  get valid() {\n    return this.status === VALID;\n  }\n  /**\n   * A control is `invalid` when its `status` is `INVALID`.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   * @returns True if this control has failed one or more of its validation checks,\n   * false otherwise.\n   */\n  get invalid() {\n    return this.status === INVALID;\n  }\n  /**\n   * A control is `pending` when its `status` is `PENDING`.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   * @returns True if this control is in the process of conducting a validation check,\n   * false otherwise.\n   */\n  get pending() {\n    return this.status == PENDING;\n  }\n  /**\n   * A control is `disabled` when its `status` is `DISABLED`.\n   *\n   * Disabled controls are exempt from validation checks and\n   * are not included in the aggregate value of their ancestor\n   * controls.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   * @returns True if the control is disabled, false otherwise.\n   */\n  get disabled() {\n    return this.status === DISABLED;\n  }\n  /**\n   * A control is `enabled` as long as its `status` is not `DISABLED`.\n   *\n   * @returns True if the control has any status other than 'DISABLED',\n   * false if the status is 'DISABLED'.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   */\n  get enabled() {\n    return this.status !== DISABLED;\n  }\n  /**\n   * An object containing any errors generated by failing validation,\n   * or null if there are no errors.\n   */\n  errors;\n  /**\n   * A control is `pristine` if the user has not yet changed\n   * the value in the UI.\n   *\n   * @returns True if the user has not yet changed the value in the UI; compare `dirty`.\n   * Programmatic changes to a control's value do not mark it dirty.\n   */\n  get pristine() {\n    return untracked(this.pristineReactive);\n  }\n  set pristine(v) {\n    untracked(() => this.pristineReactive.set(v));\n  }\n  /** @internal */\n  _pristine = /*#__PURE__*/computed(() => this.pristineReactive());\n  pristineReactive = /*#__PURE__*/signal(true);\n  /**\n   * A control is `dirty` if the user has changed the value\n   * in the UI.\n   *\n   * @returns True if the user has changed the value of this control in the UI; compare `pristine`.\n   * Programmatic changes to a control's value do not mark it dirty.\n   */\n  get dirty() {\n    return !this.pristine;\n  }\n  /**\n   * True if the control is marked as `touched`.\n   *\n   * A control is marked `touched` once the user has triggered\n   * a `blur` event on it.\n   */\n  get touched() {\n    return untracked(this.touchedReactive);\n  }\n  set touched(v) {\n    untracked(() => this.touchedReactive.set(v));\n  }\n  /** @internal */\n  _touched = /*#__PURE__*/computed(() => this.touchedReactive());\n  touchedReactive = /*#__PURE__*/signal(false);\n  /**\n   * True if the control has not been marked as touched\n   *\n   * A control is `untouched` if the user has not yet triggered\n   * a `blur` event on it.\n   */\n  get untouched() {\n    return !this.touched;\n  }\n  /**\n   * Exposed as observable, see below.\n   *\n   * @internal\n   */\n  _events = /*#__PURE__*/new Subject();\n  /**\n   * A multicasting observable that emits an event every time the state of the control changes.\n   * It emits for value, status, pristine or touched changes.\n   *\n   * **Note**: On value change, the emit happens right after a value of this control is updated. The\n   * value of a parent control (for example if this FormControl is a part of a FormGroup) is updated\n   * later, so accessing a value of a parent control (using the `value` property) from the callback\n   * of this event might result in getting a value that has not been updated yet. Subscribe to the\n   * `events` of the parent control instead.\n   * For other event types, the events are emitted after the parent control has been updated.\n   *\n   */\n  events = /*#__PURE__*/this._events.asObservable();\n  /**\n   * A multicasting observable that emits an event every time the value of the control changes, in\n   * the UI or programmatically. It also emits an event each time you call enable() or disable()\n   * without passing along {emitEvent: false} as a function argument.\n   *\n   * **Note**: the emit happens right after a value of this control is updated. The value of a\n   * parent control (for example if this FormControl is a part of a FormGroup) is updated later, so\n   * accessing a value of a parent control (using the `value` property) from the callback of this\n   * event might result in getting a value that has not been updated yet. Subscribe to the\n   * `valueChanges` event of the parent control instead.\n   */\n  valueChanges;\n  /**\n   * A multicasting observable that emits an event every time the validation `status` of the control\n   * recalculates.\n   *\n   * @see {@link FormControlStatus}\n   * @see {@link AbstractControl.status}\n   */\n  statusChanges;\n  /**\n   * Reports the update strategy of the `AbstractControl` (meaning\n   * the event on which the control updates itself).\n   * Possible values: `'change'` | `'blur'` | `'submit'`\n   * Default value: `'change'`\n   */\n  get updateOn() {\n    return this._updateOn ? this._updateOn : this.parent ? this.parent.updateOn : 'change';\n  }\n  /**\n   * Sets the synchronous validators that are active on this control.  Calling\n   * this overwrites any existing synchronous validators.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * If you want to add a new validator without affecting existing ones, consider\n   * using `addValidators()` method instead.\n   */\n  setValidators(validators) {\n    this._assignValidators(validators);\n  }\n  /**\n   * Sets the asynchronous validators that are active on this control. Calling this\n   * overwrites any existing asynchronous validators.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * If you want to add a new validator without affecting existing ones, consider\n   * using `addAsyncValidators()` method instead.\n   */\n  setAsyncValidators(validators) {\n    this._assignAsyncValidators(validators);\n  }\n  /**\n   * Add a synchronous validator or validators to this control, without affecting other validators.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * Adding a validator that already exists will have no effect. If duplicate validator functions\n   * are present in the `validators` array, only the first instance would be added to a form\n   * control.\n   *\n   * @param validators The new validator function or functions to add to this control.\n   */\n  addValidators(validators) {\n    this.setValidators(addValidators(validators, this._rawValidators));\n  }\n  /**\n   * Add an asynchronous validator or validators to this control, without affecting other\n   * validators.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * Adding a validator that already exists will have no effect.\n   *\n   * @param validators The new asynchronous validator function or functions to add to this control.\n   */\n  addAsyncValidators(validators) {\n    this.setAsyncValidators(addValidators(validators, this._rawAsyncValidators));\n  }\n  /**\n   * Remove a synchronous validator from this control, without affecting other validators.\n   * Validators are compared by function reference; you must pass a reference to the exact same\n   * validator function as the one that was originally set. If a provided validator is not found,\n   * it is ignored.\n   *\n   * @usageNotes\n   *\n   * ### Reference to a ValidatorFn\n   *\n   * ```\n   * // Reference to the RequiredValidator\n   * const ctrl = new FormControl<string | null>('', Validators.required);\n   * ctrl.removeValidators(Validators.required);\n   *\n   * // Reference to anonymous function inside MinValidator\n   * const minValidator = Validators.min(3);\n   * const ctrl = new FormControl<string | null>('', minValidator);\n   * expect(ctrl.hasValidator(minValidator)).toEqual(true)\n   * expect(ctrl.hasValidator(Validators.min(3))).toEqual(false)\n   *\n   * ctrl.removeValidators(minValidator);\n   * ```\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * @param validators The validator or validators to remove.\n   */\n  removeValidators(validators) {\n    this.setValidators(removeValidators(validators, this._rawValidators));\n  }\n  /**\n   * Remove an asynchronous validator from this control, without affecting other validators.\n   * Validators are compared by function reference; you must pass a reference to the exact same\n   * validator function as the one that was originally set. If a provided validator is not found, it\n   * is ignored.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   * @param validators The asynchronous validator or validators to remove.\n   */\n  removeAsyncValidators(validators) {\n    this.setAsyncValidators(removeValidators(validators, this._rawAsyncValidators));\n  }\n  /**\n   * Check whether a synchronous validator function is present on this control. The provided\n   * validator must be a reference to the exact same function that was provided.\n   *\n   * @usageNotes\n   *\n   * ### Reference to a ValidatorFn\n   *\n   * ```\n   * // Reference to the RequiredValidator\n   * const ctrl = new FormControl<number | null>(0, Validators.required);\n   * expect(ctrl.hasValidator(Validators.required)).toEqual(true)\n   *\n   * // Reference to anonymous function inside MinValidator\n   * const minValidator = Validators.min(3);\n   * const ctrl = new FormControl<number | null>(0, minValidator);\n   * expect(ctrl.hasValidator(minValidator)).toEqual(true)\n   * expect(ctrl.hasValidator(Validators.min(3))).toEqual(false)\n   * ```\n   *\n   * @param validator The validator to check for presence. Compared by function reference.\n   * @returns Whether the provided validator was found on this control.\n   */\n  hasValidator(validator) {\n    return hasValidator(this._rawValidators, validator);\n  }\n  /**\n   * Check whether an asynchronous validator function is present on this control. The provided\n   * validator must be a reference to the exact same function that was provided.\n   *\n   * @param validator The asynchronous validator to check for presence. Compared by function\n   *     reference.\n   * @returns Whether the provided asynchronous validator was found on this control.\n   */\n  hasAsyncValidator(validator) {\n    return hasValidator(this._rawAsyncValidators, validator);\n  }\n  /**\n   * Empties out the synchronous validator list.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   */\n  clearValidators() {\n    this.validator = null;\n  }\n  /**\n   * Empties out the async validator list.\n   *\n   * When you add or remove a validator at run time, you must call\n   * `updateValueAndValidity()` for the new validation to take effect.\n   *\n   */\n  clearAsyncValidators() {\n    this.asyncValidator = null;\n  }\n  markAsTouched(opts = {}) {\n    const changed = this.touched === false;\n    this.touched = true;\n    const sourceControl = opts.sourceControl ?? this;\n    if (this._parent && !opts.onlySelf) {\n      this._parent.markAsTouched({\n        ...opts,\n        sourceControl\n      });\n    }\n    if (changed && opts.emitEvent !== false) {\n      this._events.next(new TouchedChangeEvent(true, sourceControl));\n    }\n  }\n  /**\n   * Marks the control and all its descendant controls as `touched`.\n   * @see {@link markAsTouched()}\n   *\n   * @param opts Configuration options that determine how the control propagates changes\n   * and emits events after marking is applied.\n   * * `emitEvent`: When true or not supplied (the default), the `events`\n   * observable emits a `TouchedChangeEvent` with the `touched` property being `true`.\n   * When false, no events are emitted.\n   */\n  markAllAsTouched(opts = {}) {\n    this.markAsTouched({\n      onlySelf: true,\n      emitEvent: opts.emitEvent,\n      sourceControl: this\n    });\n    this._forEachChild(control => control.markAllAsTouched(opts));\n  }\n  markAsUntouched(opts = {}) {\n    const changed = this.touched === true;\n    this.touched = false;\n    this._pendingTouched = false;\n    const sourceControl = opts.sourceControl ?? this;\n    this._forEachChild(control => {\n      control.markAsUntouched({\n        onlySelf: true,\n        emitEvent: opts.emitEvent,\n        sourceControl\n      });\n    });\n    if (this._parent && !opts.onlySelf) {\n      this._parent._updateTouched(opts, sourceControl);\n    }\n    if (changed && opts.emitEvent !== false) {\n      this._events.next(new TouchedChangeEvent(false, sourceControl));\n    }\n  }\n  markAsDirty(opts = {}) {\n    const changed = this.pristine === true;\n    this.pristine = false;\n    const sourceControl = opts.sourceControl ?? this;\n    if (this._parent && !opts.onlySelf) {\n      this._parent.markAsDirty({\n        ...opts,\n        sourceControl\n      });\n    }\n    if (changed && opts.emitEvent !== false) {\n      this._events.next(new PristineChangeEvent(false, sourceControl));\n    }\n  }\n  markAsPristine(opts = {}) {\n    const changed = this.pristine === false;\n    this.pristine = true;\n    this._pendingDirty = false;\n    const sourceControl = opts.sourceControl ?? this;\n    this._forEachChild(control => {\n      /** We don't propagate the source control downwards */\n      control.markAsPristine({\n        onlySelf: true,\n        emitEvent: opts.emitEvent\n      });\n    });\n    if (this._parent && !opts.onlySelf) {\n      this._parent._updatePristine(opts, sourceControl);\n    }\n    if (changed && opts.emitEvent !== false) {\n      this._events.next(new PristineChangeEvent(true, sourceControl));\n    }\n  }\n  markAsPending(opts = {}) {\n    this.status = PENDING;\n    const sourceControl = opts.sourceControl ?? this;\n    if (opts.emitEvent !== false) {\n      this._events.next(new StatusChangeEvent(this.status, sourceControl));\n      this.statusChanges.emit(this.status);\n    }\n    if (this._parent && !opts.onlySelf) {\n      this._parent.markAsPending({\n        ...opts,\n        sourceControl\n      });\n    }\n  }\n  disable(opts = {}) {\n    // If parent has been marked artificially dirty we don't want to re-calculate the\n    // parent's dirtiness based on the children.\n    const skipPristineCheck = this._parentMarkedDirty(opts.onlySelf);\n    this.status = DISABLED;\n    this.errors = null;\n    this._forEachChild(control => {\n      /** We don't propagate the source control downwards */\n      control.disable({\n        ...opts,\n        onlySelf: true\n      });\n    });\n    this._updateValue();\n    const sourceControl = opts.sourceControl ?? this;\n    if (opts.emitEvent !== false) {\n      this._events.next(new ValueChangeEvent(this.value, sourceControl));\n      this._events.next(new StatusChangeEvent(this.status, sourceControl));\n      this.valueChanges.emit(this.value);\n      this.statusChanges.emit(this.status);\n    }\n    this._updateAncestors({\n      ...opts,\n      skipPristineCheck\n    }, this);\n    this._onDisabledChange.forEach(changeFn => changeFn(true));\n  }\n  /**\n   * Enables the control. This means the control is included in validation checks and\n   * the aggregate value of its parent. Its status recalculates based on its value and\n   * its validators.\n   *\n   * By default, if the control has children, all children are enabled.\n   *\n   * @see {@link AbstractControl.status}\n   *\n   * @param opts Configure options that control how the control propagates changes and\n   * emits events when marked as untouched\n   * * `onlySelf`: When true, mark only this control. When false or not supplied,\n   * marks all direct ancestors. Default is false.\n   * * `emitEvent`: When true or not supplied (the default), the `statusChanges`,\n   * `valueChanges` and `events`\n   * observables emit events with the latest status and value when the control is enabled.\n   * When false, no events are emitted.\n   */\n  enable(opts = {}) {\n    // If parent has been marked artificially dirty we don't want to re-calculate the\n    // parent's dirtiness based on the children.\n    const skipPristineCheck = this._parentMarkedDirty(opts.onlySelf);\n    this.status = VALID;\n    this._forEachChild(control => {\n      control.enable({\n        ...opts,\n        onlySelf: true\n      });\n    });\n    this.updateValueAndValidity({\n      onlySelf: true,\n      emitEvent: opts.emitEvent\n    });\n    this._updateAncestors({\n      ...opts,\n      skipPristineCheck\n    }, this);\n    this._onDisabledChange.forEach(changeFn => changeFn(false));\n  }\n  _updateAncestors(opts, sourceControl) {\n    if (this._parent && !opts.onlySelf) {\n      this._parent.updateValueAndValidity(opts);\n      if (!opts.skipPristineCheck) {\n        this._parent._updatePristine({}, sourceControl);\n      }\n      this._parent._updateTouched({}, sourceControl);\n    }\n  }\n  /**\n   * Sets the parent of the control\n   *\n   * @param parent The new parent.\n   */\n  setParent(parent) {\n    this._parent = parent;\n  }\n  /**\n   * The raw value of this control. For most control implementations, the raw value will include\n   * disabled children.\n   */\n  getRawValue() {\n    return this.value;\n  }\n  updateValueAndValidity(opts = {}) {\n    this._setInitialStatus();\n    this._updateValue();\n    if (this.enabled) {\n      const shouldHaveEmitted = this._cancelExistingSubscription();\n      this.errors = this._runValidator();\n      this.status = this._calculateStatus();\n      if (this.status === VALID || this.status === PENDING) {\n        // If the canceled subscription should have emitted\n        // we make sure the async validator emits the status change on completion\n        this._runAsyncValidator(shouldHaveEmitted, opts.emitEvent);\n      }\n    }\n    const sourceControl = opts.sourceControl ?? this;\n    if (opts.emitEvent !== false) {\n      this._events.next(new ValueChangeEvent(this.value, sourceControl));\n      this._events.next(new StatusChangeEvent(this.status, sourceControl));\n      this.valueChanges.emit(this.value);\n      this.statusChanges.emit(this.status);\n    }\n    if (this._parent && !opts.onlySelf) {\n      this._parent.updateValueAndValidity({\n        ...opts,\n        sourceControl\n      });\n    }\n  }\n  /** @internal */\n  _updateTreeValidity(opts = {\n    emitEvent: true\n  }) {\n    this._forEachChild(ctrl => ctrl._updateTreeValidity(opts));\n    this.updateValueAndValidity({\n      onlySelf: true,\n      emitEvent: opts.emitEvent\n    });\n  }\n  _setInitialStatus() {\n    this.status = this._allControlsDisabled() ? DISABLED : VALID;\n  }\n  _runValidator() {\n    return this.validator ? this.validator(this) : null;\n  }\n  _runAsyncValidator(shouldHaveEmitted, emitEvent) {\n    if (this.asyncValidator) {\n      this.status = PENDING;\n      this._hasOwnPendingAsyncValidator = {\n        emitEvent: emitEvent !== false\n      };\n      const obs = toObservable(this.asyncValidator(this));\n      this._asyncValidationSubscription = obs.subscribe(errors => {\n        this._hasOwnPendingAsyncValidator = null;\n        // This will trigger the recalculation of the validation status, which depends on\n        // the state of the asynchronous validation (whether it is in progress or not). So, it is\n        // necessary that we have updated the `_hasOwnPendingAsyncValidator` boolean flag first.\n        this.setErrors(errors, {\n          emitEvent,\n          shouldHaveEmitted\n        });\n      });\n    }\n  }\n  _cancelExistingSubscription() {\n    if (this._asyncValidationSubscription) {\n      this._asyncValidationSubscription.unsubscribe();\n      // we're cancelling the validator subscribtion, we keep if it should have emitted\n      // because we want to emit eventually if it was required at least once.\n      const shouldHaveEmitted = this._hasOwnPendingAsyncValidator?.emitEvent ?? false;\n      this._hasOwnPendingAsyncValidator = null;\n      return shouldHaveEmitted;\n    }\n    return false;\n  }\n  setErrors(errors, opts = {}) {\n    this.errors = errors;\n    this._updateControlsErrors(opts.emitEvent !== false, this, opts.shouldHaveEmitted);\n  }\n  /**\n   * Retrieves a child control given the control's name or path.\n   *\n   * @param path A dot-delimited string or array of string/number values that define the path to the\n   * control. If a string is provided, passing it as a string literal will result in improved type\n   * information. Likewise, if an array is provided, passing it `as const` will cause improved type\n   * information to be available.\n   *\n   * @usageNotes\n   * ### Retrieve a nested control\n   *\n   * For example, to get a `name` control nested within a `person` sub-group:\n   *\n   * * `this.form.get('person.name');`\n   *\n   * -OR-\n   *\n   * * `this.form.get(['person', 'name'] as const);` // `as const` gives improved typings\n   *\n   * ### Retrieve a control in a FormArray\n   *\n   * When accessing an element inside a FormArray, you can use an element index.\n   * For example, to get a `price` control from the first element in an `items` array you can use:\n   *\n   * * `this.form.get('items.0.price');`\n   *\n   * -OR-\n   *\n   * * `this.form.get(['items', 0, 'price']);`\n   */\n  get(path) {\n    let currPath = path;\n    if (currPath == null) return null;\n    if (!Array.isArray(currPath)) currPath = currPath.split('.');\n    if (currPath.length === 0) return null;\n    return currPath.reduce((control, name) => control && control._find(name), this);\n  }\n  /**\n   * @description\n   * Reports error data for the control with the given path.\n   *\n   * @param errorCode The code of the error to check\n   * @param path A list of control names that designates how to move from the current control\n   * to the control that should be queried for errors.\n   *\n   * @usageNotes\n   * For example, for the following `FormGroup`:\n   *\n   * ```ts\n   * form = new FormGroup({\n   *   address: new FormGroup({ street: new FormControl() })\n   * });\n   * ```\n   *\n   * The path to the 'street' control from the root form would be 'address' -> 'street'.\n   *\n   * It can be provided to this method in one of two formats:\n   *\n   * 1. An array of string control names, e.g. `['address', 'street']`\n   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`\n   *\n   * @returns error data for that particular error. If the control or error is not present,\n   * null is returned.\n   */\n  getError(errorCode, path) {\n    const control = path ? this.get(path) : this;\n    return control && control.errors ? control.errors[errorCode] : null;\n  }\n  /**\n   * @description\n   * Reports whether the control with the given path has the error specified.\n   *\n   * @param errorCode The code of the error to check\n   * @param path A list of control names that designates how to move from the current control\n   * to the control that should be queried for errors.\n   *\n   * @usageNotes\n   * For example, for the following `FormGroup`:\n   *\n   * ```ts\n   * form = new FormGroup({\n   *   address: new FormGroup({ street: new FormControl() })\n   * });\n   * ```\n   *\n   * The path to the 'street' control from the root form would be 'address' -> 'street'.\n   *\n   * It can be provided to this method in one of two formats:\n   *\n   * 1. An array of string control names, e.g. `['address', 'street']`\n   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`\n   *\n   * If no path is given, this method checks for the error on the current control.\n   *\n   * @returns whether the given error is present in the control at the given path.\n   *\n   * If the control is not present, false is returned.\n   */\n  hasError(errorCode, path) {\n    return !!this.getError(errorCode, path);\n  }\n  /**\n   * Retrieves the top-level ancestor of this control.\n   */\n  get root() {\n    let x = this;\n    while (x._parent) {\n      x = x._parent;\n    }\n    return x;\n  }\n  /** @internal */\n  _updateControlsErrors(emitEvent, changedControl, shouldHaveEmitted) {\n    this.status = this._calculateStatus();\n    if (emitEvent) {\n      this.statusChanges.emit(this.status);\n    }\n    // The Events Observable expose a slight different bevahior than the statusChanges obs\n    // An async validator will still emit a StatusChangeEvent is a previously cancelled\n    // async validator has emitEvent set to true\n    if (emitEvent || shouldHaveEmitted) {\n      this._events.next(new StatusChangeEvent(this.status, changedControl));\n    }\n    if (this._parent) {\n      this._parent._updateControlsErrors(emitEvent, changedControl, shouldHaveEmitted);\n    }\n  }\n  /** @internal */\n  _initObservables() {\n    // TODO: this should be piped from events() but is breaking in G3\n    this.valueChanges = new EventEmitter();\n    this.statusChanges = new EventEmitter();\n  }\n  _calculateStatus() {\n    if (this._allControlsDisabled()) return DISABLED;\n    if (this.errors) return INVALID;\n    if (this._hasOwnPendingAsyncValidator || this._anyControlsHaveStatus(PENDING)) return PENDING;\n    if (this._anyControlsHaveStatus(INVALID)) return INVALID;\n    return VALID;\n  }\n  /** @internal */\n  _anyControlsHaveStatus(status) {\n    return this._anyControls(control => control.status === status);\n  }\n  /** @internal */\n  _anyControlsDirty() {\n    return this._anyControls(control => control.dirty);\n  }\n  /** @internal */\n  _anyControlsTouched() {\n    return this._anyControls(control => control.touched);\n  }\n  /** @internal */\n  _updatePristine(opts, changedControl) {\n    const newPristine = !this._anyControlsDirty();\n    const changed = this.pristine !== newPristine;\n    this.pristine = newPristine;\n    if (this._parent && !opts.onlySelf) {\n      this._parent._updatePristine(opts, changedControl);\n    }\n    if (changed) {\n      this._events.next(new PristineChangeEvent(this.pristine, changedControl));\n    }\n  }\n  /** @internal */\n  _updateTouched(opts = {}, changedControl) {\n    this.touched = this._anyControlsTouched();\n    this._events.next(new TouchedChangeEvent(this.touched, changedControl));\n    if (this._parent && !opts.onlySelf) {\n      this._parent._updateTouched(opts, changedControl);\n    }\n  }\n  /** @internal */\n  _onDisabledChange = [];\n  /** @internal */\n  _registerOnCollectionChange(fn) {\n    this._onCollectionChange = fn;\n  }\n  /** @internal */\n  _setUpdateStrategy(opts) {\n    if (isOptionsObj(opts) && opts.updateOn != null) {\n      this._updateOn = opts.updateOn;\n    }\n  }\n  /**\n   * Check to see if parent has been marked artificially dirty.\n   *\n   * @internal\n   */\n  _parentMarkedDirty(onlySelf) {\n    const parentDirty = this._parent && this._parent.dirty;\n    return !onlySelf && !!parentDirty && !this._parent._anyControlsDirty();\n  }\n  /** @internal */\n  _find(name) {\n    return null;\n  }\n  /**\n   * Internal implementation of the `setValidators` method. Needs to be separated out into a\n   * different method, because it is called in the constructor and it can break cases where\n   * a control is extended.\n   */\n  _assignValidators(validators) {\n    this._rawValidators = Array.isArray(validators) ? validators.slice() : validators;\n    this._composedValidatorFn = coerceToValidator(this._rawValidators);\n  }\n  /**\n   * Internal implementation of the `setAsyncValidators` method. Needs to be separated out into a\n   * different method, because it is called in the constructor and it can break cases where\n   * a control is extended.\n   */\n  _assignAsyncValidators(validators) {\n    this._rawAsyncValidators = Array.isArray(validators) ? validators.slice() : validators;\n    this._composedAsyncValidatorFn = coerceToAsyncValidator(this._rawAsyncValidators);\n  }\n}\n\n/**\n * Tracks the value and validity state of a group of `FormControl` instances.\n *\n * A `FormGroup` aggregates the values of each child `FormControl` into one object,\n * with each control name as the key.  It calculates its status by reducing the status values\n * of its children. For example, if one of the controls in a group is invalid, the entire\n * group becomes invalid.\n *\n * `FormGroup` is one of the four fundamental building blocks used to define forms in Angular,\n * along with `FormControl`, `FormArray`, and `FormRecord`.\n *\n * When instantiating a `FormGroup`, pass in a collection of child controls as the first\n * argument. The key for each child registers the name for the control.\n *\n * `FormGroup` is intended for use cases where the keys are known ahead of time.\n * If you need to dynamically add and remove controls, use {@link FormRecord} instead.\n *\n * `FormGroup` accepts an optional type parameter `TControl`, which is an object type with inner\n * control types as values.\n *\n * @usageNotes\n *\n * ### Create a form group with 2 controls\n *\n * ```ts\n * const form = new FormGroup({\n *   first: new FormControl('Nancy', Validators.minLength(2)),\n *   last: new FormControl('Drew'),\n * });\n *\n * console.log(form.value);   // {first: 'Nancy', last; 'Drew'}\n * console.log(form.status);  // 'VALID'\n * ```\n *\n * ### The type argument, and optional controls\n *\n * `FormGroup` accepts one generic argument, which is an object containing its inner controls.\n * This type will usually be inferred automatically, but you can always specify it explicitly if you\n * wish.\n *\n * If you have controls that are optional (i.e. they can be removed, you can use the `?` in the\n * type):\n *\n * ```ts\n * const form = new FormGroup<{\n *   first: FormControl<string|null>,\n *   middle?: FormControl<string|null>, // Middle name is optional.\n *   last: FormControl<string|null>,\n * }>({\n *   first: new FormControl('Nancy'),\n *   last: new FormControl('Drew'),\n * });\n * ```\n *\n * ### Create a form group with a group-level validator\n *\n * You include group-level validators as the second arg, or group-level async\n * validators as the third arg. These come in handy when you want to perform validation\n * that considers the value of more than one child control.\n *\n * ```ts\n * const form = new FormGroup({\n *   password: new FormControl('', Validators.minLength(2)),\n *   passwordConfirm: new FormControl('', Validators.minLength(2)),\n * }, passwordMatchValidator);\n *\n *\n * function passwordMatchValidator(g: FormGroup) {\n *    return g.get('password').value === g.get('passwordConfirm').value\n *       ? null : {'mismatch': true};\n * }\n * ```\n *\n * Like `FormControl` instances, you choose to pass in\n * validators and async validators as part of an options object.\n *\n * ```ts\n * const form = new FormGroup({\n *   password: new FormControl('')\n *   passwordConfirm: new FormControl('')\n * }, { validators: passwordMatchValidator, asyncValidators: otherValidator });\n * ```\n *\n * ### Set the updateOn property for all controls in a form group\n *\n * The options object is used to set a default value for each child\n * control's `updateOn` property. If you set `updateOn` to `'blur'` at the\n * group level, all child controls default to 'blur', unless the child\n * has explicitly specified a different `updateOn` value.\n *\n * ```ts\n * const c = new FormGroup({\n *   one: new FormControl()\n * }, { updateOn: 'blur' });\n * ```\n *\n * ### Using a FormGroup with optional controls\n *\n * It is possible to have optional controls in a FormGroup. An optional control can be removed later\n * using `removeControl`, and can be omitted when calling `reset`. Optional controls must be\n * declared optional in the group's type.\n *\n * ```ts\n * const c = new FormGroup<{one?: FormControl<string>}>({\n *   one: new FormControl('')\n * });\n * ```\n *\n * Notice that `c.value.one` has type `string|null|undefined`. This is because calling `c.reset({})`\n * without providing the optional key `one` will cause it to become `null`.\n *\n * @publicApi\n */\nclass FormGroup extends AbstractControl {\n  /**\n   * Creates a new `FormGroup` instance.\n   *\n   * @param controls A collection of child controls. The key for each child is the name\n   * under which it is registered.\n   *\n   * @param validatorOrOpts A synchronous validator function, or an array of\n   * such functions, or an `AbstractControlOptions` object that contains validation functions\n   * and a validation trigger.\n   *\n   * @param asyncValidator A single async validator or array of async validator functions\n   *\n   */\n  constructor(controls, validatorOrOpts, asyncValidator) {\n    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));\n    (typeof ngDevMode === 'undefined' || ngDevMode) && validateFormGroupControls(controls);\n    this.controls = controls;\n    this._initObservables();\n    this._setUpdateStrategy(validatorOrOpts);\n    this._setUpControls();\n    this.updateValueAndValidity({\n      onlySelf: true,\n      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to\n      // `VALID` or `INVALID`. The status should be broadcasted via the `statusChanges` observable,\n      // so we set `emitEvent` to `true` to allow that during the control creation process.\n      emitEvent: !!this.asyncValidator\n    });\n  }\n  controls;\n  registerControl(name, control) {\n    if (this.controls[name]) return this.controls[name];\n    this.controls[name] = control;\n    control.setParent(this);\n    control._registerOnCollectionChange(this._onCollectionChange);\n    return control;\n  }\n  addControl(name, control, options = {}) {\n    this.registerControl(name, control);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n    this._onCollectionChange();\n  }\n  /**\n   * Remove a control from this group. In a strongly-typed group, required controls cannot be\n   * removed.\n   *\n   * This method also updates the value and validity of the control.\n   *\n   * @param name The control name to remove from the collection\n   * @param options Specifies whether this FormGroup instance should emit events after a\n   *     control is removed.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control is\n   * removed. When false, no events are emitted.\n   */\n  removeControl(name, options = {}) {\n    if (this.controls[name]) this.controls[name]._registerOnCollectionChange(() => {});\n    delete this.controls[name];\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n    this._onCollectionChange();\n  }\n  setControl(name, control, options = {}) {\n    if (this.controls[name]) this.controls[name]._registerOnCollectionChange(() => {});\n    delete this.controls[name];\n    if (control) this.registerControl(name, control);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n    this._onCollectionChange();\n  }\n  contains(controlName) {\n    return this.controls.hasOwnProperty(controlName) && this.controls[controlName].enabled;\n  }\n  /**\n   * Sets the value of the `FormGroup`. It accepts an object that matches\n   * the structure of the group, with control names as keys.\n   *\n   * @usageNotes\n   * ### Set the complete value for the form group\n   *\n   * ```ts\n   * const form = new FormGroup({\n   *   first: new FormControl(),\n   *   last: new FormControl()\n   * });\n   *\n   * console.log(form.value);   // {first: null, last: null}\n   *\n   * form.setValue({first: 'Nancy', last: 'Drew'});\n   * console.log(form.value);   // {first: 'Nancy', last: 'Drew'}\n   * ```\n   *\n   * @throws When strict checks fail, such as setting the value of a control\n   * that doesn't exist or if you exclude a value of a control that does exist.\n   *\n   * @param value The new value for the control that matches the structure of the group.\n   * @param options Configuration options that determine how the control propagates changes\n   * and emits events after the value changes.\n   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity\n   * updateValueAndValidity} method.\n   *\n   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default is\n   * false.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges`\n   * observables emit events with the latest status and value when the control value is updated.\n   * When false, no events are emitted.\n   */\n  setValue(value, options = {}) {\n    assertAllValuesPresent(this, true, value);\n    Object.keys(value).forEach(name => {\n      assertControlPresent(this, true, name);\n      this.controls[name].setValue(value[name], {\n        onlySelf: true,\n        emitEvent: options.emitEvent\n      });\n    });\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * Patches the value of the `FormGroup`. It accepts an object with control\n   * names as keys, and does its best to match the values to the correct controls\n   * in the group.\n   *\n   * It accepts both super-sets and sub-sets of the group without throwing an error.\n   *\n   * @usageNotes\n   * ### Patch the value for a form group\n   *\n   * ```ts\n   * const form = new FormGroup({\n   *    first: new FormControl(),\n   *    last: new FormControl()\n   * });\n   * console.log(form.value);   // {first: null, last: null}\n   *\n   * form.patchValue({first: 'Nancy'});\n   * console.log(form.value);   // {first: 'Nancy', last: null}\n   * ```\n   *\n   * @param value The object that matches the structure of the group.\n   * @param options Configuration options that determine how the control propagates changes and\n   * emits events after the value is patched.\n   * * `onlySelf`: When true, each change only affects this control and not its parent. Default is\n   * true.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control value\n   * is updated. When false, no events are emitted. The configuration options are passed to\n   * the {@link AbstractControl#updateValueAndValidity updateValueAndValidity} method.\n   */\n  patchValue(value, options = {}) {\n    // Even though the `value` argument type doesn't allow `null` and `undefined` values, the\n    // `patchValue` can be called recursively and inner data structures might have these values, so\n    // we just ignore such cases when a field containing FormGroup instance receives `null` or\n    // `undefined` as a value.\n    if (value == null /* both `null` and `undefined` */) return;\n    Object.keys(value).forEach(name => {\n      // The compiler cannot see through the uninstantiated conditional type of `this.controls`, so\n      // `as any` is required.\n      const control = this.controls[name];\n      if (control) {\n        control.patchValue(/* Guaranteed to be present, due to the outer forEach. */value[name], {\n          onlySelf: true,\n          emitEvent: options.emitEvent\n        });\n      }\n    });\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * Resets the `FormGroup`, marks all descendants `pristine` and `untouched` and sets\n   * the value of all descendants to their default values, or null if no defaults were provided.\n   *\n   * You reset to a specific form state by passing in a map of states\n   * that matches the structure of your form, with control names as keys. The state\n   * is a standalone value or a form state object with both a value and a disabled\n   * status.\n   *\n   * @param value Resets the control with an initial value,\n   * or an object that defines the initial value and disabled state.\n   *\n   * @param options Configuration options that determine how the control propagates changes\n   * and emits events when the group is reset.\n   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default is\n   * false.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges`\n   * observables emit events with the latest status and value when the control is reset.\n   * When false, no events are emitted.\n   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity\n   * updateValueAndValidity} method.\n   *\n   * @usageNotes\n   *\n   * ### Reset the form group values\n   *\n   * ```ts\n   * const form = new FormGroup({\n   *   first: new FormControl('first name'),\n   *   last: new FormControl('last name')\n   * });\n   *\n   * console.log(form.value);  // {first: 'first name', last: 'last name'}\n   *\n   * form.reset({ first: 'name', last: 'last name' });\n   *\n   * console.log(form.value);  // {first: 'name', last: 'last name'}\n   * ```\n   *\n   * ### Reset the form group values and disabled status\n   *\n   * ```ts\n   * const form = new FormGroup({\n   *   first: new FormControl('first name'),\n   *   last: new FormControl('last name')\n   * });\n   *\n   * form.reset({\n   *   first: {value: 'name', disabled: true},\n   *   last: 'last'\n   * });\n   *\n   * console.log(form.value);  // {last: 'last'}\n   * console.log(form.get('first').status);  // 'DISABLED'\n   * ```\n   */\n  reset(value = {}, options = {}) {\n    this._forEachChild((control, name) => {\n      control.reset(value ? value[name] : null, {\n        onlySelf: true,\n        emitEvent: options.emitEvent\n      });\n    });\n    this._updatePristine(options, this);\n    this._updateTouched(options, this);\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * The aggregate value of the `FormGroup`, including any disabled controls.\n   *\n   * Retrieves all values regardless of disabled status.\n   */\n  getRawValue() {\n    return this._reduceChildren({}, (acc, control, name) => {\n      acc[name] = control.getRawValue();\n      return acc;\n    });\n  }\n  /** @internal */\n  _syncPendingControls() {\n    let subtreeUpdated = this._reduceChildren(false, (updated, child) => {\n      return child._syncPendingControls() ? true : updated;\n    });\n    if (subtreeUpdated) this.updateValueAndValidity({\n      onlySelf: true\n    });\n    return subtreeUpdated;\n  }\n  /** @internal */\n  _forEachChild(cb) {\n    Object.keys(this.controls).forEach(key => {\n      // The list of controls can change (for ex. controls might be removed) while the loop\n      // is running (as a result of invoking Forms API in `valueChanges` subscription), so we\n      // have to null check before invoking the callback.\n      const control = this.controls[key];\n      control && cb(control, key);\n    });\n  }\n  /** @internal */\n  _setUpControls() {\n    this._forEachChild(control => {\n      control.setParent(this);\n      control._registerOnCollectionChange(this._onCollectionChange);\n    });\n  }\n  /** @internal */\n  _updateValue() {\n    this.value = this._reduceValue();\n  }\n  /** @internal */\n  _anyControls(condition) {\n    for (const [controlName, control] of Object.entries(this.controls)) {\n      if (this.contains(controlName) && condition(control)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  /** @internal */\n  _reduceValue() {\n    let acc = {};\n    return this._reduceChildren(acc, (acc, control, name) => {\n      if (control.enabled || this.disabled) {\n        acc[name] = control.value;\n      }\n      return acc;\n    });\n  }\n  /** @internal */\n  _reduceChildren(initValue, fn) {\n    let res = initValue;\n    this._forEachChild((control, name) => {\n      res = fn(res, control, name);\n    });\n    return res;\n  }\n  /** @internal */\n  _allControlsDisabled() {\n    for (const controlName of Object.keys(this.controls)) {\n      if (this.controls[controlName].enabled) {\n        return false;\n      }\n    }\n    return Object.keys(this.controls).length > 0 || this.disabled;\n  }\n  /** @internal */\n  _find(name) {\n    return this.controls.hasOwnProperty(name) ? this.controls[name] : null;\n  }\n}\n/**\n * Will validate that none of the controls has a key with a dot\n * Throws other wise\n */\nfunction validateFormGroupControls(controls) {\n  const invalidKeys = Object.keys(controls).filter(key => key.includes('.'));\n  if (invalidKeys.length > 0) {\n    // TODO: make this an error once there are no more uses in G3\n    console.warn(`FormGroup keys cannot include \\`.\\`, please replace the keys for: ${invalidKeys.join(',')}.`);\n  }\n}\nconst UntypedFormGroup = FormGroup;\n/**\n * @description\n * Asserts that the given control is an instance of `FormGroup`\n *\n * @publicApi\n */\nconst isFormGroup = control => control instanceof FormGroup;\n/**\n * Tracks the value and validity state of a collection of `FormControl` instances, each of which has\n * the same value type.\n *\n * `FormRecord` is very similar to {@link FormGroup}, except it can be used with a dynamic keys,\n * with controls added and removed as needed.\n *\n * `FormRecord` accepts one generic argument, which describes the type of the controls it contains.\n *\n * @usageNotes\n *\n * ```ts\n * let numbers = new FormRecord({bill: new FormControl('415-123-456')});\n * numbers.addControl('bob', new FormControl('415-234-567'));\n * numbers.removeControl('bill');\n * ```\n *\n * @publicApi\n */\nclass FormRecord extends FormGroup {}\n/**\n * @description\n * Asserts that the given control is an instance of `FormRecord`\n *\n * @publicApi\n */\nconst isFormRecord = control => control instanceof FormRecord;\n\n/**\n * Token to provide to allow SetDisabledState to always be called when a CVA is added, regardless of\n * whether the control is disabled or enabled.\n *\n * @see {@link FormsModule#withconfig}\n */\nconst CALL_SET_DISABLED_STATE = /*#__PURE__*/new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'CallSetDisabledState' : '', {\n  providedIn: 'root',\n  factory: () => setDisabledStateDefault\n});\n/**\n * Whether to use the fixed setDisabledState behavior by default.\n */\nconst setDisabledStateDefault = 'always';\nfunction controlPath(name, parent) {\n  return [...parent.path, name];\n}\n/**\n * Links a Form control and a Form directive by setting up callbacks (such as `onChange`) on both\n * instances. This function is typically invoked when form directive is being initialized.\n *\n * @param control Form control instance that should be linked.\n * @param dir Directive that should be linked with a given control.\n */\nfunction setUpControl(control, dir, callSetDisabledState = setDisabledStateDefault) {\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    if (!control) _throwError(dir, 'Cannot find control with');\n    if (!dir.valueAccessor) _throwMissingValueAccessorError(dir);\n  }\n  setUpValidators(control, dir);\n  dir.valueAccessor.writeValue(control.value);\n  // The legacy behavior only calls the CVA's `setDisabledState` if the control is disabled.\n  // If the `callSetDisabledState` option is set to `always`, then this bug is fixed and\n  // the method is always called.\n  if (control.disabled || callSetDisabledState === 'always') {\n    dir.valueAccessor.setDisabledState?.(control.disabled);\n  }\n  setUpViewChangePipeline(control, dir);\n  setUpModelChangePipeline(control, dir);\n  setUpBlurPipeline(control, dir);\n  setUpDisabledChangeHandler(control, dir);\n}\n/**\n * Reverts configuration performed by the `setUpControl` control function.\n * Effectively disconnects form control with a given form directive.\n * This function is typically invoked when corresponding form directive is being destroyed.\n *\n * @param control Form control which should be cleaned up.\n * @param dir Directive that should be disconnected from a given control.\n * @param validateControlPresenceOnChange Flag that indicates whether onChange handler should\n *     contain asserts to verify that it's not called once directive is destroyed. We need this flag\n *     to avoid potentially breaking changes caused by better control cleanup introduced in #39235.\n */\nfunction cleanUpControl(control, dir, validateControlPresenceOnChange = true) {\n  const noop = () => {\n    if (validateControlPresenceOnChange && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      _noControlError(dir);\n    }\n  };\n  // The `valueAccessor` field is typically defined on FromControl and FormControlName directive\n  // instances and there is a logic in `selectValueAccessor` function that throws if it's not the\n  // case. We still check the presence of `valueAccessor` before invoking its methods to make sure\n  // that cleanup works correctly if app code or tests are setup to ignore the error thrown from\n  // `selectValueAccessor`. See https://github.com/angular/angular/issues/40521.\n  if (dir.valueAccessor) {\n    dir.valueAccessor.registerOnChange(noop);\n    dir.valueAccessor.registerOnTouched(noop);\n  }\n  cleanUpValidators(control, dir);\n  if (control) {\n    dir._invokeOnDestroyCallbacks();\n    control._registerOnCollectionChange(() => {});\n  }\n}\nfunction registerOnValidatorChange(validators, onChange) {\n  validators.forEach(validator => {\n    if (validator.registerOnValidatorChange) validator.registerOnValidatorChange(onChange);\n  });\n}\n/**\n * Sets up disabled change handler function on a given form control if ControlValueAccessor\n * associated with a given directive instance supports the `setDisabledState` call.\n *\n * @param control Form control where disabled change handler should be setup.\n * @param dir Corresponding directive instance associated with this control.\n */\nfunction setUpDisabledChangeHandler(control, dir) {\n  if (dir.valueAccessor.setDisabledState) {\n    const onDisabledChange = isDisabled => {\n      dir.valueAccessor.setDisabledState(isDisabled);\n    };\n    control.registerOnDisabledChange(onDisabledChange);\n    // Register a callback function to cleanup disabled change handler\n    // from a control instance when a directive is destroyed.\n    dir._registerOnDestroy(() => {\n      control._unregisterOnDisabledChange(onDisabledChange);\n    });\n  }\n}\n/**\n * Sets up sync and async directive validators on provided form control.\n * This function merges validators from the directive into the validators of the control.\n *\n * @param control Form control where directive validators should be setup.\n * @param dir Directive instance that contains validators to be setup.\n */\nfunction setUpValidators(control, dir) {\n  const validators = getControlValidators(control);\n  if (dir.validator !== null) {\n    control.setValidators(mergeValidators(validators, dir.validator));\n  } else if (typeof validators === 'function') {\n    // If sync validators are represented by a single validator function, we force the\n    // `Validators.compose` call to happen by executing the `setValidators` function with\n    // an array that contains that function. We need this to avoid possible discrepancies in\n    // validators behavior, so sync validators are always processed by the `Validators.compose`.\n    // Note: we should consider moving this logic inside the `setValidators` function itself, so we\n    // have consistent behavior on AbstractControl API level. The same applies to the async\n    // validators logic below.\n    control.setValidators([validators]);\n  }\n  const asyncValidators = getControlAsyncValidators(control);\n  if (dir.asyncValidator !== null) {\n    control.setAsyncValidators(mergeValidators(asyncValidators, dir.asyncValidator));\n  } else if (typeof asyncValidators === 'function') {\n    control.setAsyncValidators([asyncValidators]);\n  }\n  // Re-run validation when validator binding changes, e.g. minlength=3 -> minlength=4\n  const onValidatorChange = () => control.updateValueAndValidity();\n  registerOnValidatorChange(dir._rawValidators, onValidatorChange);\n  registerOnValidatorChange(dir._rawAsyncValidators, onValidatorChange);\n}\n/**\n * Cleans up sync and async directive validators on provided form control.\n * This function reverts the setup performed by the `setUpValidators` function, i.e.\n * removes directive-specific validators from a given control instance.\n *\n * @param control Form control from where directive validators should be removed.\n * @param dir Directive instance that contains validators to be removed.\n * @returns true if a control was updated as a result of this action.\n */\nfunction cleanUpValidators(control, dir) {\n  let isControlUpdated = false;\n  if (control !== null) {\n    if (dir.validator !== null) {\n      const validators = getControlValidators(control);\n      if (Array.isArray(validators) && validators.length > 0) {\n        // Filter out directive validator function.\n        const updatedValidators = validators.filter(validator => validator !== dir.validator);\n        if (updatedValidators.length !== validators.length) {\n          isControlUpdated = true;\n          control.setValidators(updatedValidators);\n        }\n      }\n    }\n    if (dir.asyncValidator !== null) {\n      const asyncValidators = getControlAsyncValidators(control);\n      if (Array.isArray(asyncValidators) && asyncValidators.length > 0) {\n        // Filter out directive async validator function.\n        const updatedAsyncValidators = asyncValidators.filter(asyncValidator => asyncValidator !== dir.asyncValidator);\n        if (updatedAsyncValidators.length !== asyncValidators.length) {\n          isControlUpdated = true;\n          control.setAsyncValidators(updatedAsyncValidators);\n        }\n      }\n    }\n  }\n  // Clear onValidatorChange callbacks by providing a noop function.\n  const noop = () => {};\n  registerOnValidatorChange(dir._rawValidators, noop);\n  registerOnValidatorChange(dir._rawAsyncValidators, noop);\n  return isControlUpdated;\n}\nfunction setUpViewChangePipeline(control, dir) {\n  dir.valueAccessor.registerOnChange(newValue => {\n    control._pendingValue = newValue;\n    control._pendingChange = true;\n    control._pendingDirty = true;\n    if (control.updateOn === 'change') updateControl(control, dir);\n  });\n}\nfunction setUpBlurPipeline(control, dir) {\n  dir.valueAccessor.registerOnTouched(() => {\n    control._pendingTouched = true;\n    if (control.updateOn === 'blur' && control._pendingChange) updateControl(control, dir);\n    if (control.updateOn !== 'submit') control.markAsTouched();\n  });\n}\nfunction updateControl(control, dir) {\n  if (control._pendingDirty) control.markAsDirty();\n  control.setValue(control._pendingValue, {\n    emitModelToViewChange: false\n  });\n  dir.viewToModelUpdate(control._pendingValue);\n  control._pendingChange = false;\n}\nfunction setUpModelChangePipeline(control, dir) {\n  const onChange = (newValue, emitModelEvent) => {\n    // control -> view\n    dir.valueAccessor.writeValue(newValue);\n    // control -> ngModel\n    if (emitModelEvent) dir.viewToModelUpdate(newValue);\n  };\n  control.registerOnChange(onChange);\n  // Register a callback function to cleanup onChange handler\n  // from a control instance when a directive is destroyed.\n  dir._registerOnDestroy(() => {\n    control._unregisterOnChange(onChange);\n  });\n}\n/**\n * Links a FormGroup or FormArray instance and corresponding Form directive by setting up validators\n * present in the view.\n *\n * @param control FormGroup or FormArray instance that should be linked.\n * @param dir Directive that provides view validators.\n */\nfunction setUpFormContainer(control, dir) {\n  if (control == null && (typeof ngDevMode === 'undefined' || ngDevMode)) _throwError(dir, 'Cannot find control with');\n  setUpValidators(control, dir);\n}\n/**\n * Reverts the setup performed by the `setUpFormContainer` function.\n *\n * @param control FormGroup or FormArray instance that should be cleaned up.\n * @param dir Directive that provided view validators.\n * @returns true if a control was updated as a result of this action.\n */\nfunction cleanUpFormContainer(control, dir) {\n  return cleanUpValidators(control, dir);\n}\nfunction _noControlError(dir) {\n  return _throwError(dir, 'There is no FormControl instance attached to form control element with');\n}\nfunction _throwError(dir, message) {\n  const messageEnd = _describeControlLocation(dir);\n  throw new Error(`${message} ${messageEnd}`);\n}\nfunction _describeControlLocation(dir) {\n  const path = dir.path;\n  if (path && path.length > 1) return `path: '${path.join(' -> ')}'`;\n  if (path?.[0]) return `name: '${path}'`;\n  return 'unspecified name attribute';\n}\nfunction _throwMissingValueAccessorError(dir) {\n  const loc = _describeControlLocation(dir);\n  throw new _RuntimeError(-1203 /* RuntimeErrorCode.NG_MISSING_VALUE_ACCESSOR */, `No value accessor for form control ${loc}.`);\n}\nfunction _throwInvalidValueAccessorError(dir) {\n  const loc = _describeControlLocation(dir);\n  throw new _RuntimeError(1200 /* RuntimeErrorCode.NG_VALUE_ACCESSOR_NOT_PROVIDED */, `Value accessor was not provided as an array for form control with ${loc}. ` + `Check that the \\`NG_VALUE_ACCESSOR\\` token is configured as a \\`multi: true\\` provider.`);\n}\nfunction isPropertyUpdated(changes, viewModel) {\n  if (!changes.hasOwnProperty('model')) return false;\n  const change = changes['model'];\n  if (change.isFirstChange()) return true;\n  return !Object.is(viewModel, change.currentValue);\n}\nfunction isBuiltInAccessor(valueAccessor) {\n  // Check if a given value accessor is an instance of a class that directly extends\n  // `BuiltInControlValueAccessor` one.\n  return Object.getPrototypeOf(valueAccessor.constructor) === BuiltInControlValueAccessor;\n}\nfunction syncPendingControls(form, directives) {\n  form._syncPendingControls();\n  directives.forEach(dir => {\n    const control = dir.control;\n    if (control.updateOn === 'submit' && control._pendingChange) {\n      dir.viewToModelUpdate(control._pendingValue);\n      control._pendingChange = false;\n    }\n  });\n}\n// TODO: vsavkin remove it once https://github.com/angular/angular/issues/3011 is implemented\nfunction selectValueAccessor(dir, valueAccessors) {\n  if (!valueAccessors) return null;\n  if (!Array.isArray(valueAccessors) && (typeof ngDevMode === 'undefined' || ngDevMode)) _throwInvalidValueAccessorError(dir);\n  let defaultAccessor = undefined;\n  let builtinAccessor = undefined;\n  let customAccessor = undefined;\n  valueAccessors.forEach(v => {\n    if (v.constructor === DefaultValueAccessor) {\n      defaultAccessor = v;\n    } else if (isBuiltInAccessor(v)) {\n      if (builtinAccessor && (typeof ngDevMode === 'undefined' || ngDevMode)) _throwError(dir, 'More than one built-in value accessor matches form control with');\n      builtinAccessor = v;\n    } else {\n      if (customAccessor && (typeof ngDevMode === 'undefined' || ngDevMode)) _throwError(dir, 'More than one custom value accessor matches form control with');\n      customAccessor = v;\n    }\n  });\n  if (customAccessor) return customAccessor;\n  if (builtinAccessor) return builtinAccessor;\n  if (defaultAccessor) return defaultAccessor;\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    _throwError(dir, 'No valid value accessor for form control with');\n  }\n  return null;\n}\nfunction removeListItem$1(list, el) {\n  const index = list.indexOf(el);\n  if (index > -1) list.splice(index, 1);\n}\n// TODO(kara): remove after deprecation period\nfunction _ngModelWarning(name, type, instance, warningConfig) {\n  if (warningConfig === 'never') return;\n  if ((warningConfig === null || warningConfig === 'once') && !type._ngModelWarningSentOnce || warningConfig === 'always' && !instance._ngModelWarningSent) {\n    console.warn(ngModelWarning(name));\n    type._ngModelWarningSentOnce = true;\n    instance._ngModelWarningSent = true;\n  }\n}\nconst formDirectiveProvider$1 = {\n  provide: ControlContainer,\n  useExisting: /*#__PURE__*/forwardRef(() => NgForm)\n};\nconst resolvedPromise$1 = /*#__PURE__*/(() => Promise.resolve())();\n/**\n * @description\n * Creates a top-level `FormGroup` instance and binds it to a form\n * to track aggregate form value and validation status.\n *\n * As soon as you import the `FormsModule`, this directive becomes active by default on\n * all `<form>` tags.  You don't need to add a special selector.\n *\n * You optionally export the directive into a local template variable using `ngForm` as the key\n * (ex: `#myForm=\"ngForm\"`). This is optional, but useful.  Many properties from the underlying\n * `FormGroup` instance are duplicated on the directive itself, so a reference to it\n * gives you access to the aggregate value and validity status of the form, as well as\n * user interaction properties like `dirty` and `touched`.\n *\n * To register child controls with the form, use `NgModel` with a `name`\n * attribute. You may use `NgModelGroup` to create sub-groups within the form.\n *\n * If necessary, listen to the directive's `ngSubmit` event to be notified when the user has\n * triggered a form submission. The `ngSubmit` event emits the original form\n * submission event.\n *\n * In template driven forms, all `<form>` tags are automatically tagged as `NgForm`.\n * To import the `FormsModule` but skip its usage in some forms,\n * for example, to use native HTML5 validation, add the `ngNoForm` and the `<form>`\n * tags won't create an `NgForm` directive. In reactive forms, using `ngNoForm` is\n * unnecessary because the `<form>` tags are inert. In that case, you would\n * refrain from using the `formGroup` directive.\n *\n * @usageNotes\n *\n * ### Listening for form submission\n *\n * The following example shows how to capture the form values from the \"ngSubmit\" event.\n *\n * {@example forms/ts/simpleForm/simple_form_example.ts region='Component'}\n *\n * ### Setting the update options\n *\n * The following example shows you how to change the \"updateOn\" option from its default using\n * ngFormOptions.\n *\n * ```html\n * <form [ngFormOptions]=\"{updateOn: 'blur'}\">\n *    <input name=\"one\" ngModel>  <!-- this ngModel will update on blur -->\n * </form>\n * ```\n *\n * ### Native DOM validation UI\n *\n * In order to prevent the native DOM form validation UI from interfering with Angular's form\n * validation, Angular automatically adds the `novalidate` attribute on any `<form>` whenever\n * `FormModule` or `ReactiveFormModule` are imported into the application.\n * If you want to explicitly enable native DOM validation UI with Angular forms, you can add the\n * `ngNativeValidate` attribute to the `<form>` element:\n *\n * ```html\n * <form ngNativeValidate>\n *   ...\n * </form>\n * ```\n *\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgForm = /*#__PURE__*/(() => {\n  class NgForm extends ControlContainer {\n    callSetDisabledState;\n    /**\n     * @description\n     * Returns whether the form submission has been triggered.\n     */\n    get submitted() {\n      return untracked(this.submittedReactive);\n    }\n    /** @internal */\n    _submitted = computed(() => this.submittedReactive());\n    submittedReactive = signal(false);\n    _directives = new Set();\n    /**\n     * @description\n     * The `FormGroup` instance created for this form.\n     */\n    form;\n    /**\n     * @description\n     * Event emitter for the \"ngSubmit\" event\n     */\n    ngSubmit = new EventEmitter();\n    /**\n     * @description\n     * Tracks options for the `NgForm` instance.\n     *\n     * **updateOn**: Sets the default `updateOn` value for all child `NgModels` below it\n     * unless explicitly set by a child `NgModel` using `ngModelOptions`). Defaults to 'change'.\n     * Possible values: `'change'` | `'blur'` | `'submit'`.\n     *\n     */\n    options;\n    constructor(validators, asyncValidators, callSetDisabledState) {\n      super();\n      this.callSetDisabledState = callSetDisabledState;\n      this.form = new FormGroup({}, composeValidators(validators), composeAsyncValidators(asyncValidators));\n    }\n    /** @docs-private */\n    ngAfterViewInit() {\n      this._setUpdateStrategy();\n    }\n    /**\n     * @description\n     * The directive instance.\n     */\n    get formDirective() {\n      return this;\n    }\n    /**\n     * @description\n     * The internal `FormGroup` instance.\n     */\n    get control() {\n      return this.form;\n    }\n    /**\n     * @description\n     * Returns an array representing the path to this group. Because this directive\n     * always lives at the top level of a form, it is always an empty array.\n     */\n    get path() {\n      return [];\n    }\n    /**\n     * @description\n     * Returns a map of the controls in this group.\n     */\n    get controls() {\n      return this.form.controls;\n    }\n    /**\n     * @description\n     * Method that sets up the control directive in this group, re-calculates its value\n     * and validity, and adds the instance to the internal list of directives.\n     *\n     * @param dir The `NgModel` directive instance.\n     */\n    addControl(dir) {\n      resolvedPromise$1.then(() => {\n        const container = this._findContainer(dir.path);\n        dir.control = container.registerControl(dir.name, dir.control);\n        setUpControl(dir.control, dir, this.callSetDisabledState);\n        dir.control.updateValueAndValidity({\n          emitEvent: false\n        });\n        this._directives.add(dir);\n      });\n    }\n    /**\n     * @description\n     * Retrieves the `FormControl` instance from the provided `NgModel` directive.\n     *\n     * @param dir The `NgModel` directive instance.\n     */\n    getControl(dir) {\n      return this.form.get(dir.path);\n    }\n    /**\n     * @description\n     * Removes the `NgModel` instance from the internal list of directives\n     *\n     * @param dir The `NgModel` directive instance.\n     */\n    removeControl(dir) {\n      resolvedPromise$1.then(() => {\n        const container = this._findContainer(dir.path);\n        if (container) {\n          container.removeControl(dir.name);\n        }\n        this._directives.delete(dir);\n      });\n    }\n    /**\n     * @description\n     * Adds a new `NgModelGroup` directive instance to the form.\n     *\n     * @param dir The `NgModelGroup` directive instance.\n     */\n    addFormGroup(dir) {\n      resolvedPromise$1.then(() => {\n        const container = this._findContainer(dir.path);\n        const group = new FormGroup({});\n        setUpFormContainer(group, dir);\n        container.registerControl(dir.name, group);\n        group.updateValueAndValidity({\n          emitEvent: false\n        });\n      });\n    }\n    /**\n     * @description\n     * Removes the `NgModelGroup` directive instance from the form.\n     *\n     * @param dir The `NgModelGroup` directive instance.\n     */\n    removeFormGroup(dir) {\n      resolvedPromise$1.then(() => {\n        const container = this._findContainer(dir.path);\n        if (container) {\n          container.removeControl(dir.name);\n        }\n      });\n    }\n    /**\n     * @description\n     * Retrieves the `FormGroup` for a provided `NgModelGroup` directive instance\n     *\n     * @param dir The `NgModelGroup` directive instance.\n     */\n    getFormGroup(dir) {\n      return this.form.get(dir.path);\n    }\n    /**\n     * Sets the new value for the provided `NgControl` directive.\n     *\n     * @param dir The `NgControl` directive instance.\n     * @param value The new value for the directive's control.\n     */\n    updateModel(dir, value) {\n      resolvedPromise$1.then(() => {\n        const ctrl = this.form.get(dir.path);\n        ctrl.setValue(value);\n      });\n    }\n    /**\n     * @description\n     * Sets the value for this `FormGroup`.\n     *\n     * @param value The new value\n     */\n    setValue(value) {\n      this.control.setValue(value);\n    }\n    /**\n     * @description\n     * Method called when the \"submit\" event is triggered on the form.\n     * Triggers the `ngSubmit` emitter to emit the \"submit\" event as its payload.\n     *\n     * @param $event The \"submit\" event object\n     */\n    onSubmit($event) {\n      this.submittedReactive.set(true);\n      syncPendingControls(this.form, this._directives);\n      this.ngSubmit.emit($event);\n      this.form._events.next(new FormSubmittedEvent(this.control));\n      // Forms with `method=\"dialog\"` have some special behavior\n      // that won't reload the page and that shouldn't be prevented.\n      return $event?.target?.method === 'dialog';\n    }\n    /**\n     * @description\n     * Method called when the \"reset\" event is triggered on the form.\n     */\n    onReset() {\n      this.resetForm();\n    }\n    /**\n     * @description\n     * Resets the form to an initial value and resets its submitted status.\n     *\n     * @param value The new value for the form.\n     */\n    resetForm(value = undefined) {\n      this.form.reset(value);\n      this.submittedReactive.set(false);\n      this.form._events.next(new FormResetEvent(this.form));\n    }\n    _setUpdateStrategy() {\n      if (this.options && this.options.updateOn != null) {\n        this.form._updateOn = this.options.updateOn;\n      }\n    }\n    _findContainer(path) {\n      path.pop();\n      return path.length ? this.form.get(path) : this.form;\n    }\n    static ɵfac = function NgForm_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgForm)(i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), i0.ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgForm,\n      selectors: [[\"form\", 3, \"ngNoForm\", \"\", 3, \"formGroup\", \"\"], [\"ng-form\"], [\"\", \"ngForm\", \"\"]],\n      hostBindings: function NgForm_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"submit\", function NgForm_submit_HostBindingHandler($event) {\n            return ctx.onSubmit($event);\n          })(\"reset\", function NgForm_reset_HostBindingHandler() {\n            return ctx.onReset();\n          });\n        }\n      },\n      inputs: {\n        options: [0, \"ngFormOptions\", \"options\"]\n      },\n      outputs: {\n        ngSubmit: \"ngSubmit\"\n      },\n      exportAs: [\"ngForm\"],\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formDirectiveProvider$1]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return NgForm;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction removeListItem(list, el) {\n  const index = list.indexOf(el);\n  if (index > -1) list.splice(index, 1);\n}\nfunction isFormControlState(formState) {\n  return typeof formState === 'object' && formState !== null && Object.keys(formState).length === 2 && 'value' in formState && 'disabled' in formState;\n}\nconst FormControl = class FormControl extends AbstractControl {\n  /** @publicApi */\n  defaultValue = null;\n  /** @internal */\n  _onChange = [];\n  /** @internal */\n  _pendingValue;\n  /** @internal */\n  _pendingChange = false;\n  constructor(\n  // formState and defaultValue will only be null if T is nullable\n  formState = null, validatorOrOpts, asyncValidator) {\n    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));\n    this._applyFormState(formState);\n    this._setUpdateStrategy(validatorOrOpts);\n    this._initObservables();\n    this.updateValueAndValidity({\n      onlySelf: true,\n      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to\n      // `VALID` or `INVALID`.\n      // The status should be broadcasted via the `statusChanges` observable, so we set\n      // `emitEvent` to `true` to allow that during the control creation process.\n      emitEvent: !!this.asyncValidator\n    });\n    if (isOptionsObj(validatorOrOpts) && (validatorOrOpts.nonNullable || validatorOrOpts.initialValueIsDefault)) {\n      if (isFormControlState(formState)) {\n        this.defaultValue = formState.value;\n      } else {\n        this.defaultValue = formState;\n      }\n    }\n  }\n  setValue(value, options = {}) {\n    this.value = this._pendingValue = value;\n    if (this._onChange.length && options.emitModelToViewChange !== false) {\n      this._onChange.forEach(changeFn => changeFn(this.value, options.emitViewToModelChange !== false));\n    }\n    this.updateValueAndValidity(options);\n  }\n  patchValue(value, options = {}) {\n    this.setValue(value, options);\n  }\n  reset(formState = this.defaultValue, options = {}) {\n    this._applyFormState(formState);\n    this.markAsPristine(options);\n    this.markAsUntouched(options);\n    this.setValue(this.value, options);\n    this._pendingChange = false;\n  }\n  /**  @internal */\n  _updateValue() {}\n  /**  @internal */\n  _anyControls(condition) {\n    return false;\n  }\n  /**  @internal */\n  _allControlsDisabled() {\n    return this.disabled;\n  }\n  registerOnChange(fn) {\n    this._onChange.push(fn);\n  }\n  /** @internal */\n  _unregisterOnChange(fn) {\n    removeListItem(this._onChange, fn);\n  }\n  registerOnDisabledChange(fn) {\n    this._onDisabledChange.push(fn);\n  }\n  /** @internal */\n  _unregisterOnDisabledChange(fn) {\n    removeListItem(this._onDisabledChange, fn);\n  }\n  /** @internal */\n  _forEachChild(cb) {}\n  /** @internal */\n  _syncPendingControls() {\n    if (this.updateOn === 'submit') {\n      if (this._pendingDirty) this.markAsDirty();\n      if (this._pendingTouched) this.markAsTouched();\n      if (this._pendingChange) {\n        this.setValue(this._pendingValue, {\n          onlySelf: true,\n          emitModelToViewChange: false\n        });\n        return true;\n      }\n    }\n    return false;\n  }\n  _applyFormState(formState) {\n    if (isFormControlState(formState)) {\n      this.value = this._pendingValue = formState.value;\n      formState.disabled ? this.disable({\n        onlySelf: true,\n        emitEvent: false\n      }) : this.enable({\n        onlySelf: true,\n        emitEvent: false\n      });\n    } else {\n      this.value = this._pendingValue = formState;\n    }\n  }\n};\nconst UntypedFormControl = FormControl;\n/**\n * @description\n * Asserts that the given control is an instance of `FormControl`\n *\n * @publicApi\n */\nconst isFormControl = control => control instanceof FormControl;\n\n/**\n * @description\n * A base class for code shared between the `NgModelGroup` and `FormGroupName` directives.\n *\n * @publicApi\n */\nlet AbstractFormGroupDirective = /*#__PURE__*/(() => {\n  class AbstractFormGroupDirective extends ControlContainer {\n    /**\n     * @description\n     * The parent control for the group\n     *\n     * @internal\n     */\n    _parent;\n    /** @docs-private */\n    ngOnInit() {\n      this._checkParentType();\n      // Register the group with its parent group.\n      this.formDirective.addFormGroup(this);\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this.formDirective) {\n        // Remove the group from its parent group.\n        this.formDirective.removeFormGroup(this);\n      }\n    }\n    /**\n     * @description\n     * The `FormGroup` bound to this directive.\n     */\n    get control() {\n      return this.formDirective.getFormGroup(this);\n    }\n    /**\n     * @description\n     * The path to this group from the top-level directive.\n     */\n    get path() {\n      return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);\n    }\n    /**\n     * @description\n     * The top-level directive for this group if present, otherwise null.\n     */\n    get formDirective() {\n      return this._parent ? this._parent.formDirective : null;\n    }\n    /** @internal */\n    _checkParentType() {}\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵAbstractFormGroupDirective_BaseFactory;\n      return function AbstractFormGroupDirective_Factory(__ngFactoryType__) {\n        return (ɵAbstractFormGroupDirective_BaseFactory || (ɵAbstractFormGroupDirective_BaseFactory = i0.ɵɵgetInheritedFactory(AbstractFormGroupDirective)))(__ngFactoryType__ || AbstractFormGroupDirective);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: AbstractFormGroupDirective,\n      standalone: false,\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return AbstractFormGroupDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction modelParentException() {\n  return new _RuntimeError(1350 /* RuntimeErrorCode.NGMODEL_IN_FORM_GROUP */, `\n    ngModel cannot be used to register form controls with a parent formGroup directive.  Try using\n    formGroup's partner directive \"formControlName\" instead.  Example:\n\n    ${formControlNameExample}\n\n    Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions:\n\n    Example:\n\n    ${ngModelWithFormGroupExample}`);\n}\nfunction formGroupNameException() {\n  return new _RuntimeError(1351 /* RuntimeErrorCode.NGMODEL_IN_FORM_GROUP_NAME */, `\n    ngModel cannot be used to register form controls with a parent formGroupName or formArrayName directive.\n\n    Option 1: Use formControlName instead of ngModel (reactive strategy):\n\n    ${formGroupNameExample}\n\n    Option 2:  Update ngModel's parent be ngModelGroup (template-driven strategy):\n\n    ${ngModelGroupExample}`);\n}\nfunction missingNameException() {\n  return new _RuntimeError(1352 /* RuntimeErrorCode.NGMODEL_WITHOUT_NAME */, `If ngModel is used within a form tag, either the name attribute must be set or the form\n    control must be defined as 'standalone' in ngModelOptions.\n\n    Example 1: <input [(ngModel)]=\"person.firstName\" name=\"first\">\n    Example 2: <input [(ngModel)]=\"person.firstName\" [ngModelOptions]=\"{standalone: true}\">`);\n}\nfunction modelGroupParentException() {\n  return new _RuntimeError(1353 /* RuntimeErrorCode.NGMODELGROUP_IN_FORM_GROUP */, `\n    ngModelGroup cannot be used with a parent formGroup directive.\n\n    Option 1: Use formGroupName instead of ngModelGroup (reactive strategy):\n\n    ${formGroupNameExample}\n\n    Option 2:  Use a regular form tag instead of the formGroup directive (template-driven strategy):\n\n    ${ngModelGroupExample}`);\n}\nconst modelGroupProvider = {\n  provide: ControlContainer,\n  useExisting: /*#__PURE__*/forwardRef(() => NgModelGroup)\n};\n/**\n * @description\n * Creates and binds a `FormGroup` instance to a DOM element.\n *\n * This directive can only be used as a child of `NgForm` (within `<form>` tags).\n *\n * Use this directive to validate a sub-group of your form separately from the\n * rest of your form, or if some values in your domain model make more sense\n * to consume together in a nested object.\n *\n * Provide a name for the sub-group and it will become the key\n * for the sub-group in the form's full value. If you need direct access, export the directive into\n * a local template variable using `ngModelGroup` (ex: `#myGroup=\"ngModelGroup\"`).\n *\n * @usageNotes\n *\n * ### Consuming controls in a grouping\n *\n * The following example shows you how to combine controls together in a sub-group\n * of the form.\n *\n * {@example forms/ts/ngModelGroup/ng_model_group_example.ts region='Component'}\n *\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgModelGroup = /*#__PURE__*/(() => {\n  class NgModelGroup extends AbstractFormGroupDirective {\n    /**\n     * @description\n     * Tracks the name of the `NgModelGroup` bound to the directive. The name corresponds\n     * to a key in the parent `NgForm`.\n     */\n    name = '';\n    constructor(parent, validators, asyncValidators) {\n      super();\n      this._parent = parent;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n    }\n    /** @internal */\n    _checkParentType() {\n      if (!(this._parent instanceof NgModelGroup) && !(this._parent instanceof NgForm) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw modelGroupParentException();\n      }\n    }\n    static ɵfac = function NgModelGroup_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgModelGroup)(i0.ɵɵdirectiveInject(ControlContainer, 5), i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgModelGroup,\n      selectors: [[\"\", \"ngModelGroup\", \"\"]],\n      inputs: {\n        name: [0, \"ngModelGroup\", \"name\"]\n      },\n      exportAs: [\"ngModelGroup\"],\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([modelGroupProvider]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return NgModelGroup;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst formControlBinding$1 = {\n  provide: NgControl,\n  useExisting: /*#__PURE__*/forwardRef(() => NgModel)\n};\n/**\n * `ngModel` forces an additional change detection run when its inputs change:\n * E.g.:\n * ```html\n * <div>{{myModel.valid}}</div>\n * <input [(ngModel)]=\"myValue\" #myModel=\"ngModel\">\n * ```\n * I.e. `ngModel` can export itself on the element and then be used in the template.\n * Normally, this would result in expressions before the `input` that use the exported directive\n * to have an old value as they have been\n * dirty checked before. As this is a very common case for `ngModel`, we added this second change\n * detection run.\n *\n * Notes:\n * - this is just one extra run no matter how many `ngModel`s have been changed.\n * - this is a general problem when using `exportAs` for directives!\n */\nconst resolvedPromise = /*#__PURE__*/(() => Promise.resolve())();\n/**\n * @description\n * Creates a `FormControl` instance from a [domain\n * model](https://en.wikipedia.org/wiki/Domain_model) and binds it to a form control element.\n *\n * The `FormControl` instance tracks the value, user interaction, and\n * validation status of the control and keeps the view synced with the model. If used\n * within a parent form, the directive also registers itself with the form as a child\n * control.\n *\n * This directive is used by itself or as part of a larger form. Use the\n * `ngModel` selector to activate it.\n *\n * It accepts a domain model as an optional `Input`. If you have a one-way binding\n * to `ngModel` with `[]` syntax, changing the domain model's value in the component\n * class sets the value in the view. If you have a two-way binding with `[()]` syntax\n * (also known as 'banana-in-a-box syntax'), the value in the UI always syncs back to\n * the domain model in your class.\n *\n * To inspect the properties of the associated `FormControl` (like the validity state),\n * export the directive into a local template variable using `ngModel` as the key (ex:\n * `#myVar=\"ngModel\"`). You can then access the control using the directive's `control` property.\n * However, the most commonly used properties (like `valid` and `dirty`) also exist on the control\n * for direct access. See a full list of properties directly available in\n * `AbstractControlDirective`.\n *\n * @see {@link RadioControlValueAccessor}\n * @see {@link SelectControlValueAccessor}\n *\n * @usageNotes\n *\n * ### Using ngModel on a standalone control\n *\n * The following examples show a simple standalone control using `ngModel`:\n *\n * {@example forms/ts/simpleNgModel/simple_ng_model_example.ts region='Component'}\n *\n * When using the `ngModel` within `<form>` tags, you'll also need to supply a `name` attribute\n * so that the control can be registered with the parent form under that name.\n *\n * In the context of a parent form, it's often unnecessary to include one-way or two-way binding,\n * as the parent form syncs the value for you. You access its properties by exporting it into a\n * local template variable using `ngForm` such as (`#f=\"ngForm\"`). Use the variable where\n * needed on form submission.\n *\n * If you do need to populate initial values into your form, using a one-way binding for\n * `ngModel` tends to be sufficient as long as you use the exported form's value rather\n * than the domain model's value on submit.\n *\n * ### Using ngModel within a form\n *\n * The following example shows controls using `ngModel` within a form:\n *\n * {@example forms/ts/simpleForm/simple_form_example.ts region='Component'}\n *\n * ### Using a standalone ngModel within a group\n *\n * The following example shows you how to use a standalone ngModel control\n * within a form. This controls the display of the form, but doesn't contain form data.\n *\n * ```html\n * <form>\n *   <input name=\"login\" ngModel placeholder=\"Login\">\n *   <input type=\"checkbox\" ngModel [ngModelOptions]=\"{standalone: true}\"> Show more options?\n * </form>\n * <!-- form value: {login: ''} -->\n * ```\n *\n * ### Setting the ngModel `name` attribute through options\n *\n * The following example shows you an alternate way to set the name attribute. Here,\n * an attribute identified as name is used within a custom form control component. To still be able\n * to specify the NgModel's name, you must specify it using the `ngModelOptions` input instead.\n *\n * ```html\n * <form>\n *   <my-custom-form-control name=\"Nancy\" ngModel [ngModelOptions]=\"{name: 'user'}\">\n *   </my-custom-form-control>\n * </form>\n * <!-- form value: {user: ''} -->\n * ```\n *\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgModel = /*#__PURE__*/(() => {\n  class NgModel extends NgControl {\n    _changeDetectorRef;\n    callSetDisabledState;\n    control = new FormControl();\n    // At runtime we coerce arbitrary values assigned to the \"disabled\" input to a \"boolean\".\n    // This is not reflected in the type of the property because outside of templates, consumers\n    // should only deal with booleans. In templates, a string is allowed for convenience and to\n    // match the native \"disabled attribute\" semantics which can be observed on input elements.\n    // This static member tells the compiler that values of type \"string\" can also be assigned\n    // to the input in a template.\n    /** @docs-private */\n    static ngAcceptInputType_isDisabled;\n    /** @internal */\n    _registered = false;\n    /**\n     * Internal reference to the view model value.\n     * @docs-private\n     */\n    viewModel;\n    /**\n     * @description\n     * Tracks the name bound to the directive. If a parent form exists, it\n     * uses this name as a key to retrieve this control's value.\n     */\n    name = '';\n    /**\n     * @description\n     * Tracks whether the control is disabled.\n     */\n    isDisabled;\n    /**\n     * @description\n     * Tracks the value bound to this directive.\n     */\n    model;\n    /**\n     * @description\n     * Tracks the configuration options for this `ngModel` instance.\n     *\n     * **name**: An alternative to setting the name attribute on the form control element. See\n     * the [example](api/forms/NgModel#using-ngmodel-on-a-standalone-control) for using `NgModel`\n     * as a standalone control.\n     *\n     * **standalone**: When set to true, the `ngModel` will not register itself with its parent form,\n     * and acts as if it's not in the form. Defaults to false. If no parent form exists, this option\n     * has no effect.\n     *\n     * **updateOn**: Defines the event upon which the form control value and validity update.\n     * Defaults to 'change'. Possible values: `'change'` | `'blur'` | `'submit'`.\n     *\n     */\n    options;\n    /**\n     * @description\n     * Event emitter for producing the `ngModelChange` event after\n     * the view model updates.\n     */\n    update = new EventEmitter();\n    constructor(parent, validators, asyncValidators, valueAccessors, _changeDetectorRef, callSetDisabledState) {\n      super();\n      this._changeDetectorRef = _changeDetectorRef;\n      this.callSetDisabledState = callSetDisabledState;\n      this._parent = parent;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n      this.valueAccessor = selectValueAccessor(this, valueAccessors);\n    }\n    /** @docs-private */\n    ngOnChanges(changes) {\n      this._checkForErrors();\n      if (!this._registered || 'name' in changes) {\n        if (this._registered) {\n          this._checkName();\n          if (this.formDirective) {\n            // We can't call `formDirective.removeControl(this)`, because the `name` has already been\n            // changed. We also can't reset the name temporarily since the logic in `removeControl`\n            // is inside a promise and it won't run immediately. We work around it by giving it an\n            // object with the same shape instead.\n            const oldName = changes['name'].previousValue;\n            this.formDirective.removeControl({\n              name: oldName,\n              path: this._getPath(oldName)\n            });\n          }\n        }\n        this._setUpControl();\n      }\n      if ('isDisabled' in changes) {\n        this._updateDisabled(changes);\n      }\n      if (isPropertyUpdated(changes, this.viewModel)) {\n        this._updateValue(this.model);\n        this.viewModel = this.model;\n      }\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      this.formDirective && this.formDirective.removeControl(this);\n    }\n    /**\n     * @description\n     * Returns an array that represents the path from the top-level form to this control.\n     * Each index is the string name of the control on that level.\n     */\n    get path() {\n      return this._getPath(this.name);\n    }\n    /**\n     * @description\n     * The top-level directive for this control if present, otherwise null.\n     */\n    get formDirective() {\n      return this._parent ? this._parent.formDirective : null;\n    }\n    /**\n     * @description\n     * Sets the new value for the view model and emits an `ngModelChange` event.\n     *\n     * @param newValue The new value emitted by `ngModelChange`.\n     */\n    viewToModelUpdate(newValue) {\n      this.viewModel = newValue;\n      this.update.emit(newValue);\n    }\n    _setUpControl() {\n      this._setUpdateStrategy();\n      this._isStandalone() ? this._setUpStandalone() : this.formDirective.addControl(this);\n      this._registered = true;\n    }\n    _setUpdateStrategy() {\n      if (this.options && this.options.updateOn != null) {\n        this.control._updateOn = this.options.updateOn;\n      }\n    }\n    _isStandalone() {\n      return !this._parent || !!(this.options && this.options.standalone);\n    }\n    _setUpStandalone() {\n      setUpControl(this.control, this, this.callSetDisabledState);\n      this.control.updateValueAndValidity({\n        emitEvent: false\n      });\n    }\n    _checkForErrors() {\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._isStandalone()) {\n        checkParentType$1(this._parent);\n      }\n      this._checkName();\n    }\n    _checkName() {\n      if (this.options && this.options.name) this.name = this.options.name;\n      if (!this._isStandalone() && !this.name && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw missingNameException();\n      }\n    }\n    _updateValue(value) {\n      resolvedPromise.then(() => {\n        this.control.setValue(value, {\n          emitViewToModelChange: false\n        });\n        this._changeDetectorRef?.markForCheck();\n      });\n    }\n    _updateDisabled(changes) {\n      const disabledValue = changes['isDisabled'].currentValue;\n      // checking for 0 to avoid breaking change\n      const isDisabled = disabledValue !== 0 && booleanAttribute(disabledValue);\n      resolvedPromise.then(() => {\n        if (isDisabled && !this.control.disabled) {\n          this.control.disable();\n        } else if (!isDisabled && this.control.disabled) {\n          this.control.enable();\n        }\n        this._changeDetectorRef?.markForCheck();\n      });\n    }\n    _getPath(controlName) {\n      return this._parent ? controlPath(controlName, this._parent) : [controlName];\n    }\n    static ɵfac = function NgModel_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgModel)(i0.ɵɵdirectiveInject(ControlContainer, 9), i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), i0.ɵɵdirectiveInject(ChangeDetectorRef, 8), i0.ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgModel,\n      selectors: [[\"\", \"ngModel\", \"\", 3, \"formControlName\", \"\", 3, \"formControl\", \"\"]],\n      inputs: {\n        name: \"name\",\n        isDisabled: [0, \"disabled\", \"isDisabled\"],\n        model: [0, \"ngModel\", \"model\"],\n        options: [0, \"ngModelOptions\", \"options\"]\n      },\n      outputs: {\n        update: \"ngModelChange\"\n      },\n      exportAs: [\"ngModel\"],\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formControlBinding$1]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return NgModel;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction checkParentType$1(parent) {\n  if (!(parent instanceof NgModelGroup) && parent instanceof AbstractFormGroupDirective) {\n    throw formGroupNameException();\n  } else if (!(parent instanceof NgModelGroup) && !(parent instanceof NgForm)) {\n    throw modelParentException();\n  }\n}\n\n/**\n * @description\n *\n * Adds `novalidate` attribute to all forms by default.\n *\n * `novalidate` is used to disable browser's native form validation.\n *\n * If you want to use native validation with Angular forms, just add `ngNativeValidate` attribute:\n *\n * ```html\n * <form ngNativeValidate></form>\n * ```\n *\n * @publicApi\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n */\nlet ɵNgNoValidate = /*#__PURE__*/(() => {\n  class ɵNgNoValidate {\n    static ɵfac = function ɵNgNoValidate_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ɵNgNoValidate)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: ɵNgNoValidate,\n      selectors: [[\"form\", 3, \"ngNoForm\", \"\", 3, \"ngNativeValidate\", \"\"]],\n      hostAttrs: [\"novalidate\", \"\"],\n      standalone: false\n    });\n  }\n  return ɵNgNoValidate;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst NUMBER_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => NumberValueAccessor),\n  multi: true\n};\n/**\n * @description\n * The `ControlValueAccessor` for writing a number value and listening to number input changes.\n * The value accessor is used by the `FormControlDirective`, `FormControlName`, and `NgModel`\n * directives.\n *\n * @usageNotes\n *\n * ### Using a number input with a reactive form.\n *\n * The following example shows how to use a number input with a reactive form.\n *\n * ```ts\n * const totalCountControl = new FormControl();\n * ```\n *\n * ```html\n * <input type=\"number\" [formControl]=\"totalCountControl\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet NumberValueAccessor = /*#__PURE__*/(() => {\n  class NumberValueAccessor extends BuiltInControlValueAccessor {\n    /**\n     * Sets the \"value\" property on the input element.\n     * @docs-private\n     */\n    writeValue(value) {\n      // The value needs to be normalized for IE9, otherwise it is set to 'null' when null\n      const normalizedValue = value == null ? '' : value;\n      this.setProperty('value', normalizedValue);\n    }\n    /**\n     * Registers a function called when the control value changes.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this.onChange = value => {\n        fn(value == '' ? null : parseFloat(value));\n      };\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵNumberValueAccessor_BaseFactory;\n      return function NumberValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵNumberValueAccessor_BaseFactory || (ɵNumberValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(NumberValueAccessor)))(__ngFactoryType__ || NumberValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NumberValueAccessor,\n      selectors: [[\"input\", \"type\", \"number\", \"formControlName\", \"\"], [\"input\", \"type\", \"number\", \"formControl\", \"\"], [\"input\", \"type\", \"number\", \"ngModel\", \"\"]],\n      hostBindings: function NumberValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"input\", function NumberValueAccessor_input_HostBindingHandler($event) {\n            return ctx.onChange($event.target.value);\n          })(\"blur\", function NumberValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([NUMBER_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return NumberValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst RADIO_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => RadioControlValueAccessor),\n  multi: true\n};\nfunction throwNameError() {\n  throw new _RuntimeError(1202 /* RuntimeErrorCode.NAME_AND_FORM_CONTROL_NAME_MUST_MATCH */, `\n      If you define both a name and a formControlName attribute on your radio button, their values\n      must match. Ex: <input type=\"radio\" formControlName=\"food\" name=\"food\">\n    `);\n}\n/**\n * @description\n * Class used by Angular to track radio buttons. For internal use only.\n */\nlet RadioControlRegistry = /*#__PURE__*/(() => {\n  class RadioControlRegistry {\n    _accessors = [];\n    /**\n     * @description\n     * Adds a control to the internal registry. For internal use only.\n     */\n    add(control, accessor) {\n      this._accessors.push([control, accessor]);\n    }\n    /**\n     * @description\n     * Removes a control from the internal registry. For internal use only.\n     */\n    remove(accessor) {\n      for (let i = this._accessors.length - 1; i >= 0; --i) {\n        if (this._accessors[i][1] === accessor) {\n          this._accessors.splice(i, 1);\n          return;\n        }\n      }\n    }\n    /**\n     * @description\n     * Selects a radio button. For internal use only.\n     */\n    select(accessor) {\n      this._accessors.forEach(c => {\n        if (this._isSameGroup(c, accessor) && c[1] !== accessor) {\n          c[1].fireUncheck(accessor.value);\n        }\n      });\n    }\n    _isSameGroup(controlPair, accessor) {\n      if (!controlPair[0].control) return false;\n      return controlPair[0]._parent === accessor._control._parent && controlPair[1].name === accessor.name;\n    }\n    static ɵfac = function RadioControlRegistry_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || RadioControlRegistry)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: RadioControlRegistry,\n      factory: RadioControlRegistry.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return RadioControlRegistry;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * The `ControlValueAccessor` for writing radio control values and listening to radio control\n * changes. The value accessor is used by the `FormControlDirective`, `FormControlName`, and\n * `NgModel` directives.\n *\n * @usageNotes\n *\n * ### Using radio buttons with reactive form directives\n *\n * The follow example shows how to use radio buttons in a reactive form. When using radio buttons in\n * a reactive form, radio buttons in the same group should have the same `formControlName`.\n * Providing a `name` attribute is optional.\n *\n * {@example forms/ts/reactiveRadioButtons/reactive_radio_button_example.ts region='Reactive'}\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet RadioControlValueAccessor = /*#__PURE__*/(() => {\n  class RadioControlValueAccessor extends BuiltInControlValueAccessor {\n    _registry;\n    _injector;\n    /** @internal */\n    _state;\n    /** @internal */\n    _control;\n    /** @internal */\n    _fn;\n    setDisabledStateFired = false;\n    /**\n     * The registered callback function called when a change event occurs on the input element.\n     * Note: we declare `onChange` here (also used as host listener) as a function with no arguments\n     * to override the `onChange` function (which expects 1 argument) in the parent\n     * `BaseControlValueAccessor` class.\n     * @docs-private\n     */\n    onChange = () => {};\n    /**\n     * @description\n     * Tracks the name of the radio input element.\n     */\n    name;\n    /**\n     * @description\n     * Tracks the name of the `FormControl` bound to the directive. The name corresponds\n     * to a key in the parent `FormGroup` or `FormArray`.\n     */\n    formControlName;\n    /**\n     * @description\n     * Tracks the value of the radio input element\n     */\n    value;\n    callSetDisabledState = inject(CALL_SET_DISABLED_STATE, {\n      optional: true\n    }) ?? setDisabledStateDefault;\n    constructor(renderer, elementRef, _registry, _injector) {\n      super(renderer, elementRef);\n      this._registry = _registry;\n      this._injector = _injector;\n    }\n    /** @docs-private */\n    ngOnInit() {\n      this._control = this._injector.get(NgControl);\n      this._checkName();\n      this._registry.add(this._control, this);\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      this._registry.remove(this);\n    }\n    /**\n     * Sets the \"checked\" property value on the radio input element.\n     * @docs-private\n     */\n    writeValue(value) {\n      this._state = value === this.value;\n      this.setProperty('checked', this._state);\n    }\n    /**\n     * Registers a function called when the control value changes.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this._fn = fn;\n      this.onChange = () => {\n        fn(this.value);\n        this._registry.select(this);\n      };\n    }\n    /** @docs-private */\n    setDisabledState(isDisabled) {\n      /**\n       * `setDisabledState` is supposed to be called whenever the disabled state of a control changes,\n       * including upon control creation. However, a longstanding bug caused the method to not fire\n       * when an *enabled* control was attached. This bug was fixed in v15 in #47576.\n       *\n       * This had a side effect: previously, it was possible to instantiate a reactive form control\n       * with `[attr.disabled]=true`, even though the corresponding control was enabled in the\n       * model. This resulted in a mismatch between the model and the DOM. Now, because\n       * `setDisabledState` is always called, the value in the DOM will be immediately overwritten\n       * with the \"correct\" enabled value.\n       *\n       * However, the fix also created an exceptional case: radio buttons. Because Reactive Forms\n       * models the entire group of radio buttons as a single `FormControl`, there is no way to\n       * control the disabled state for individual radios, so they can no longer be configured as\n       * disabled. Thus, we keep the old behavior for radio buttons, so that `[attr.disabled]`\n       * continues to work. Specifically, we drop the first call to `setDisabledState` if `disabled`\n       * is `false`, and we are not in legacy mode.\n       */\n      if (this.setDisabledStateFired || isDisabled || this.callSetDisabledState === 'whenDisabledForLegacyCode') {\n        this.setProperty('disabled', isDisabled);\n      }\n      this.setDisabledStateFired = true;\n    }\n    /**\n     * Sets the \"value\" on the radio input element and unchecks it.\n     *\n     * @param value\n     */\n    fireUncheck(value) {\n      this.writeValue(value);\n    }\n    _checkName() {\n      if (this.name && this.formControlName && this.name !== this.formControlName && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throwNameError();\n      }\n      if (!this.name && this.formControlName) this.name = this.formControlName;\n    }\n    static ɵfac = function RadioControlValueAccessor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || RadioControlValueAccessor)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(RadioControlRegistry), i0.ɵɵdirectiveInject(i0.Injector));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: RadioControlValueAccessor,\n      selectors: [[\"input\", \"type\", \"radio\", \"formControlName\", \"\"], [\"input\", \"type\", \"radio\", \"formControl\", \"\"], [\"input\", \"type\", \"radio\", \"ngModel\", \"\"]],\n      hostBindings: function RadioControlValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"change\", function RadioControlValueAccessor_change_HostBindingHandler() {\n            return ctx.onChange();\n          })(\"blur\", function RadioControlValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      inputs: {\n        name: \"name\",\n        formControlName: \"formControlName\",\n        value: \"value\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([RADIO_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return RadioControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst RANGE_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => RangeValueAccessor),\n  multi: true\n};\n/**\n * @description\n * The `ControlValueAccessor` for writing a range value and listening to range input changes.\n * The value accessor is used by the `FormControlDirective`, `FormControlName`, and  `NgModel`\n * directives.\n *\n * @usageNotes\n *\n * ### Using a range input with a reactive form\n *\n * The following example shows how to use a range input with a reactive form.\n *\n * ```ts\n * const ageControl = new FormControl();\n * ```\n *\n * ```html\n * <input type=\"range\" [formControl]=\"ageControl\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet RangeValueAccessor = /*#__PURE__*/(() => {\n  class RangeValueAccessor extends BuiltInControlValueAccessor {\n    /**\n     * Sets the \"value\" property on the input element.\n     * @docs-private\n     */\n    writeValue(value) {\n      this.setProperty('value', parseFloat(value));\n    }\n    /**\n     * Registers a function called when the control value changes.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this.onChange = value => {\n        fn(value == '' ? null : parseFloat(value));\n      };\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵRangeValueAccessor_BaseFactory;\n      return function RangeValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵRangeValueAccessor_BaseFactory || (ɵRangeValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(RangeValueAccessor)))(__ngFactoryType__ || RangeValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: RangeValueAccessor,\n      selectors: [[\"input\", \"type\", \"range\", \"formControlName\", \"\"], [\"input\", \"type\", \"range\", \"formControl\", \"\"], [\"input\", \"type\", \"range\", \"ngModel\", \"\"]],\n      hostBindings: function RangeValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"change\", function RangeValueAccessor_change_HostBindingHandler($event) {\n            return ctx.onChange($event.target.value);\n          })(\"input\", function RangeValueAccessor_input_HostBindingHandler($event) {\n            return ctx.onChange($event.target.value);\n          })(\"blur\", function RangeValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([RANGE_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return RangeValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Token to provide to turn off the ngModel warning on formControl and formControlName.\n */\nconst NG_MODEL_WITH_FORM_CONTROL_WARNING = /*#__PURE__*/new InjectionToken(ngDevMode ? 'NgModelWithFormControlWarning' : '');\nconst formControlBinding = {\n  provide: NgControl,\n  useExisting: /*#__PURE__*/forwardRef(() => FormControlDirective)\n};\n/**\n * @description\n * Synchronizes a standalone `FormControl` instance to a form control element.\n *\n * Note that support for using the `ngModel` input property and `ngModelChange` event with reactive\n * form directives was deprecated in Angular v6 and is scheduled for removal in\n * a future version of Angular.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n * @see {@link FormControl}\n * @see {@link AbstractControl}\n *\n * @usageNotes\n *\n * The following example shows how to register a standalone control and set its value.\n *\n * {@example forms/ts/simpleFormControl/simple_form_control_example.ts region='Component'}\n *\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet FormControlDirective = /*#__PURE__*/(() => {\n  class FormControlDirective extends NgControl {\n    _ngModelWarningConfig;\n    callSetDisabledState;\n    /**\n     * Internal reference to the view model value.\n     * @docs-private\n     */\n    viewModel;\n    /**\n     * @description\n     * Tracks the `FormControl` instance bound to the directive.\n     */\n    form;\n    /**\n     * @description\n     * Triggers a warning in dev mode that this input should not be used with reactive forms.\n     */\n    set isDisabled(isDisabled) {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.warn(disabledAttrWarning);\n      }\n    }\n    // TODO(kara): remove next 4 properties once deprecation period is over\n    /** @deprecated as of v6 */\n    model;\n    /** @deprecated as of v6 */\n    update = new EventEmitter();\n    /**\n     * @description\n     * Static property used to track whether any ngModel warnings have been sent across\n     * all instances of FormControlDirective. Used to support warning config of \"once\".\n     *\n     * @internal\n     */\n    static _ngModelWarningSentOnce = false;\n    /**\n     * @description\n     * Instance property used to track whether an ngModel warning has been sent out for this\n     * particular `FormControlDirective` instance. Used to support warning config of \"always\".\n     *\n     * @internal\n     */\n    _ngModelWarningSent = false;\n    constructor(validators, asyncValidators, valueAccessors, _ngModelWarningConfig, callSetDisabledState) {\n      super();\n      this._ngModelWarningConfig = _ngModelWarningConfig;\n      this.callSetDisabledState = callSetDisabledState;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n      this.valueAccessor = selectValueAccessor(this, valueAccessors);\n    }\n    /** @docs-private */\n    ngOnChanges(changes) {\n      if (this._isControlChanged(changes)) {\n        const previousForm = changes['form'].previousValue;\n        if (previousForm) {\n          cleanUpControl(previousForm, this, /* validateControlPresenceOnChange */false);\n        }\n        setUpControl(this.form, this, this.callSetDisabledState);\n        this.form.updateValueAndValidity({\n          emitEvent: false\n        });\n      }\n      if (isPropertyUpdated(changes, this.viewModel)) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          _ngModelWarning('formControl', FormControlDirective, this, this._ngModelWarningConfig);\n        }\n        this.form.setValue(this.model);\n        this.viewModel = this.model;\n      }\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this.form) {\n        cleanUpControl(this.form, this, /* validateControlPresenceOnChange */false);\n      }\n    }\n    /**\n     * @description\n     * Returns an array that represents the path from the top-level form to this control.\n     * Each index is the string name of the control on that level.\n     */\n    get path() {\n      return [];\n    }\n    /**\n     * @description\n     * The `FormControl` bound to this directive.\n     */\n    get control() {\n      return this.form;\n    }\n    /**\n     * @description\n     * Sets the new value for the view model and emits an `ngModelChange` event.\n     *\n     * @param newValue The new value for the view model.\n     */\n    viewToModelUpdate(newValue) {\n      this.viewModel = newValue;\n      this.update.emit(newValue);\n    }\n    _isControlChanged(changes) {\n      return changes.hasOwnProperty('form');\n    }\n    static ɵfac = function FormControlDirective_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormControlDirective)(i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), i0.ɵɵdirectiveInject(NG_MODEL_WITH_FORM_CONTROL_WARNING, 8), i0.ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: FormControlDirective,\n      selectors: [[\"\", \"formControl\", \"\"]],\n      inputs: {\n        form: [0, \"formControl\", \"form\"],\n        isDisabled: [0, \"disabled\", \"isDisabled\"],\n        model: [0, \"ngModel\", \"model\"]\n      },\n      outputs: {\n        update: \"ngModelChange\"\n      },\n      exportAs: [\"ngForm\"],\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formControlBinding]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return FormControlDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst formDirectiveProvider = {\n  provide: ControlContainer,\n  useExisting: /*#__PURE__*/forwardRef(() => FormGroupDirective)\n};\n/**\n * @description\n *\n * Binds an existing `FormGroup` or `FormRecord` to a DOM element.\n *\n * This directive accepts an existing `FormGroup` instance. It will then use this\n * `FormGroup` instance to match any child `FormControl`, `FormGroup`/`FormRecord`,\n * and `FormArray` instances to child `FormControlName`, `FormGroupName`,\n * and `FormArrayName` directives.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n * @see {@link AbstractControl}\n *\n * @usageNotes\n * ### Register Form Group\n *\n * The following example registers a `FormGroup` with first name and last name controls,\n * and listens for the *ngSubmit* event when the button is clicked.\n *\n * {@example forms/ts/simpleFormGroup/simple_form_group_example.ts region='Component'}\n *\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet FormGroupDirective = /*#__PURE__*/(() => {\n  class FormGroupDirective extends ControlContainer {\n    callSetDisabledState;\n    /**\n     * @description\n     * Reports whether the form submission has been triggered.\n     */\n    get submitted() {\n      return untracked(this._submittedReactive);\n    }\n    // TODO(atscott): Remove once invalid API usage is cleaned up internally\n    set submitted(value) {\n      this._submittedReactive.set(value);\n    }\n    /** @internal */\n    _submitted = computed(() => this._submittedReactive());\n    _submittedReactive = signal(false);\n    /**\n     * Reference to an old form group input value, which is needed to cleanup\n     * old instance in case it was replaced with a new one.\n     */\n    _oldForm;\n    /**\n     * Callback that should be invoked when controls in FormGroup or FormArray collection change\n     * (added or removed). This callback triggers corresponding DOM updates.\n     */\n    _onCollectionChange = () => this._updateDomValue();\n    /**\n     * @description\n     * Tracks the list of added `FormControlName` instances\n     */\n    directives = [];\n    /**\n     * @description\n     * Tracks the `FormGroup` bound to this directive.\n     */\n    form = null;\n    /**\n     * @description\n     * Emits an event when the form submission has been triggered.\n     */\n    ngSubmit = new EventEmitter();\n    constructor(validators, asyncValidators, callSetDisabledState) {\n      super();\n      this.callSetDisabledState = callSetDisabledState;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n    }\n    /** @docs-private */\n    ngOnChanges(changes) {\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this.form) {\n        throw missingFormException();\n      }\n      if (changes.hasOwnProperty('form')) {\n        this._updateValidators();\n        this._updateDomValue();\n        this._updateRegistrations();\n        this._oldForm = this.form;\n      }\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this.form) {\n        cleanUpValidators(this.form, this);\n        // Currently the `onCollectionChange` callback is rewritten each time the\n        // `_registerOnCollectionChange` function is invoked. The implication is that cleanup should\n        // happen *only* when the `onCollectionChange` callback was set by this directive instance.\n        // Otherwise it might cause overriding a callback of some other directive instances. We should\n        // consider updating this logic later to make it similar to how `onChange` callbacks are\n        // handled, see https://github.com/angular/angular/issues/39732 for additional info.\n        if (this.form._onCollectionChange === this._onCollectionChange) {\n          this.form._registerOnCollectionChange(() => {});\n        }\n      }\n    }\n    /**\n     * @description\n     * Returns this directive's instance.\n     */\n    get formDirective() {\n      return this;\n    }\n    /**\n     * @description\n     * Returns the `FormGroup` bound to this directive.\n     */\n    get control() {\n      return this.form;\n    }\n    /**\n     * @description\n     * Returns an array representing the path to this group. Because this directive\n     * always lives at the top level of a form, it always an empty array.\n     */\n    get path() {\n      return [];\n    }\n    /**\n     * @description\n     * Method that sets up the control directive in this group, re-calculates its value\n     * and validity, and adds the instance to the internal list of directives.\n     *\n     * @param dir The `FormControlName` directive instance.\n     */\n    addControl(dir) {\n      const ctrl = this.form.get(dir.path);\n      setUpControl(ctrl, dir, this.callSetDisabledState);\n      ctrl.updateValueAndValidity({\n        emitEvent: false\n      });\n      this.directives.push(dir);\n      return ctrl;\n    }\n    /**\n     * @description\n     * Retrieves the `FormControl` instance from the provided `FormControlName` directive\n     *\n     * @param dir The `FormControlName` directive instance.\n     */\n    getControl(dir) {\n      return this.form.get(dir.path);\n    }\n    /**\n     * @description\n     * Removes the `FormControlName` instance from the internal list of directives\n     *\n     * @param dir The `FormControlName` directive instance.\n     */\n    removeControl(dir) {\n      cleanUpControl(dir.control || null, dir, /* validateControlPresenceOnChange */false);\n      removeListItem$1(this.directives, dir);\n    }\n    /**\n     * Adds a new `FormGroupName` directive instance to the form.\n     *\n     * @param dir The `FormGroupName` directive instance.\n     */\n    addFormGroup(dir) {\n      this._setUpFormContainer(dir);\n    }\n    /**\n     * Performs the necessary cleanup when a `FormGroupName` directive instance is removed from the\n     * view.\n     *\n     * @param dir The `FormGroupName` directive instance.\n     */\n    removeFormGroup(dir) {\n      this._cleanUpFormContainer(dir);\n    }\n    /**\n     * @description\n     * Retrieves the `FormGroup` for a provided `FormGroupName` directive instance\n     *\n     * @param dir The `FormGroupName` directive instance.\n     */\n    getFormGroup(dir) {\n      return this.form.get(dir.path);\n    }\n    /**\n     * Performs the necessary setup when a `FormArrayName` directive instance is added to the view.\n     *\n     * @param dir The `FormArrayName` directive instance.\n     */\n    addFormArray(dir) {\n      this._setUpFormContainer(dir);\n    }\n    /**\n     * Performs the necessary cleanup when a `FormArrayName` directive instance is removed from the\n     * view.\n     *\n     * @param dir The `FormArrayName` directive instance.\n     */\n    removeFormArray(dir) {\n      this._cleanUpFormContainer(dir);\n    }\n    /**\n     * @description\n     * Retrieves the `FormArray` for a provided `FormArrayName` directive instance.\n     *\n     * @param dir The `FormArrayName` directive instance.\n     */\n    getFormArray(dir) {\n      return this.form.get(dir.path);\n    }\n    /**\n     * Sets the new value for the provided `FormControlName` directive.\n     *\n     * @param dir The `FormControlName` directive instance.\n     * @param value The new value for the directive's control.\n     */\n    updateModel(dir, value) {\n      const ctrl = this.form.get(dir.path);\n      ctrl.setValue(value);\n    }\n    /**\n     * @description\n     * Method called with the \"submit\" event is triggered on the form.\n     * Triggers the `ngSubmit` emitter to emit the \"submit\" event as its payload.\n     *\n     * @param $event The \"submit\" event object\n     */\n    onSubmit($event) {\n      this._submittedReactive.set(true);\n      syncPendingControls(this.form, this.directives);\n      this.ngSubmit.emit($event);\n      this.form._events.next(new FormSubmittedEvent(this.control));\n      // Forms with `method=\"dialog\"` have some special behavior that won't reload the page and that\n      // shouldn't be prevented. Note that we need to null check the `event` and the `target`, because\n      // some internal apps call this method directly with the wrong arguments.\n      return $event?.target?.method === 'dialog';\n    }\n    /**\n     * @description\n     * Method called when the \"reset\" event is triggered on the form.\n     */\n    onReset() {\n      this.resetForm();\n    }\n    /**\n     * @description\n     * Resets the form to an initial value and resets its submitted status.\n     *\n     * @param value The new value for the form.\n     */\n    resetForm(value = undefined) {\n      this.form.reset(value);\n      this._submittedReactive.set(false);\n      this.form._events.next(new FormResetEvent(this.form));\n    }\n    /** @internal */\n    _updateDomValue() {\n      this.directives.forEach(dir => {\n        const oldCtrl = dir.control;\n        const newCtrl = this.form.get(dir.path);\n        if (oldCtrl !== newCtrl) {\n          // Note: the value of the `dir.control` may not be defined, for example when it's a first\n          // `FormControl` that is added to a `FormGroup` instance (via `addControl` call).\n          cleanUpControl(oldCtrl || null, dir);\n          // Check whether new control at the same location inside the corresponding `FormGroup` is an\n          // instance of `FormControl` and perform control setup only if that's the case.\n          // Note: we don't need to clear the list of directives (`this.directives`) here, it would be\n          // taken care of in the `removeControl` method invoked when corresponding `formControlName`\n          // directive instance is being removed (invoked from `FormControlName.ngOnDestroy`).\n          if (isFormControl(newCtrl)) {\n            setUpControl(newCtrl, dir, this.callSetDisabledState);\n            dir.control = newCtrl;\n          }\n        }\n      });\n      this.form._updateTreeValidity({\n        emitEvent: false\n      });\n    }\n    _setUpFormContainer(dir) {\n      const ctrl = this.form.get(dir.path);\n      setUpFormContainer(ctrl, dir);\n      // NOTE: this operation looks unnecessary in case no new validators were added in\n      // `setUpFormContainer` call. Consider updating this code to match the logic in\n      // `_cleanUpFormContainer` function.\n      ctrl.updateValueAndValidity({\n        emitEvent: false\n      });\n    }\n    _cleanUpFormContainer(dir) {\n      if (this.form) {\n        const ctrl = this.form.get(dir.path);\n        if (ctrl) {\n          const isControlUpdated = cleanUpFormContainer(ctrl, dir);\n          if (isControlUpdated) {\n            // Run validity check only in case a control was updated (i.e. view validators were\n            // removed) as removing view validators might cause validity to change.\n            ctrl.updateValueAndValidity({\n              emitEvent: false\n            });\n          }\n        }\n      }\n    }\n    _updateRegistrations() {\n      this.form._registerOnCollectionChange(this._onCollectionChange);\n      if (this._oldForm) {\n        this._oldForm._registerOnCollectionChange(() => {});\n      }\n    }\n    _updateValidators() {\n      setUpValidators(this.form, this);\n      if (this._oldForm) {\n        cleanUpValidators(this._oldForm, this);\n      }\n    }\n    static ɵfac = function FormGroupDirective_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormGroupDirective)(i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), i0.ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: FormGroupDirective,\n      selectors: [[\"\", \"formGroup\", \"\"]],\n      hostBindings: function FormGroupDirective_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"submit\", function FormGroupDirective_submit_HostBindingHandler($event) {\n            return ctx.onSubmit($event);\n          })(\"reset\", function FormGroupDirective_reset_HostBindingHandler() {\n            return ctx.onReset();\n          });\n        }\n      },\n      inputs: {\n        form: [0, \"formGroup\", \"form\"]\n      },\n      outputs: {\n        ngSubmit: \"ngSubmit\"\n      },\n      exportAs: [\"ngForm\"],\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formDirectiveProvider]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return FormGroupDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst formGroupNameProvider = {\n  provide: ControlContainer,\n  useExisting: /*#__PURE__*/forwardRef(() => FormGroupName)\n};\n/**\n * @description\n *\n * Syncs a nested `FormGroup` or `FormRecord` to a DOM element.\n *\n * This directive can only be used with a parent `FormGroupDirective`.\n *\n * It accepts the string name of the nested `FormGroup` or `FormRecord` to link, and\n * looks for a `FormGroup` or `FormRecord` registered with that name in the parent\n * `FormGroup` instance you passed into `FormGroupDirective`.\n *\n * Use nested form groups to validate a sub-group of a\n * form separately from the rest or to group the values of certain\n * controls into their own nested object.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n *\n * @usageNotes\n *\n * ### Access the group by name\n *\n * The following example uses the `AbstractControl.get` method to access the\n * associated `FormGroup`\n *\n * ```ts\n *   this.form.get('name');\n * ```\n *\n * ### Access individual controls in the group\n *\n * The following example uses the `AbstractControl.get` method to access\n * individual controls within the group using dot syntax.\n *\n * ```ts\n *   this.form.get('name.first');\n * ```\n *\n * ### Register a nested `FormGroup`.\n *\n * The following example registers a nested *name* `FormGroup` within an existing `FormGroup`,\n * and provides methods to retrieve the nested `FormGroup` and individual controls.\n *\n * {@example forms/ts/nestedFormGroup/nested_form_group_example.ts region='Component'}\n *\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet FormGroupName = /*#__PURE__*/(() => {\n  class FormGroupName extends AbstractFormGroupDirective {\n    /**\n     * @description\n     * Tracks the name of the `FormGroup` bound to the directive. The name corresponds\n     * to a key in the parent `FormGroup` or `FormArray`.\n     * Accepts a name as a string or a number.\n     * The name in the form of a string is useful for individual forms,\n     * while the numerical form allows for form groups to be bound\n     * to indices when iterating over groups in a `FormArray`.\n     */\n    name = null;\n    constructor(parent, validators, asyncValidators) {\n      super();\n      this._parent = parent;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n    }\n    /** @internal */\n    _checkParentType() {\n      if (hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw groupParentException();\n      }\n    }\n    static ɵfac = function FormGroupName_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormGroupName)(i0.ɵɵdirectiveInject(ControlContainer, 13), i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: FormGroupName,\n      selectors: [[\"\", \"formGroupName\", \"\"]],\n      inputs: {\n        name: [0, \"formGroupName\", \"name\"]\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formGroupNameProvider]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return FormGroupName;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst formArrayNameProvider = {\n  provide: ControlContainer,\n  useExisting: /*#__PURE__*/forwardRef(() => FormArrayName)\n};\n/**\n * @description\n *\n * Syncs a nested `FormArray` to a DOM element.\n *\n * This directive is designed to be used with a parent `FormGroupDirective` (selector:\n * `[formGroup]`).\n *\n * It accepts the string name of the nested `FormArray` you want to link, and\n * will look for a `FormArray` registered with that name in the parent\n * `FormGroup` instance you passed into `FormGroupDirective`.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n * @see {@link AbstractControl}\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example forms/ts/nestedFormArray/nested_form_array_example.ts region='Component'}\n *\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet FormArrayName = /*#__PURE__*/(() => {\n  class FormArrayName extends ControlContainer {\n    /** @internal */\n    _parent;\n    /**\n     * @description\n     * Tracks the name of the `FormArray` bound to the directive. The name corresponds\n     * to a key in the parent `FormGroup` or `FormArray`.\n     * Accepts a name as a string or a number.\n     * The name in the form of a string is useful for individual forms,\n     * while the numerical form allows for form arrays to be bound\n     * to indices when iterating over arrays in a `FormArray`.\n     */\n    name = null;\n    constructor(parent, validators, asyncValidators) {\n      super();\n      this._parent = parent;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n    }\n    /**\n     * A lifecycle method called when the directive's inputs are initialized. For internal use only.\n     * @throws If the directive does not have a valid parent.\n     * @docs-private\n     */\n    ngOnInit() {\n      if (hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw arrayParentException();\n      }\n      this.formDirective.addFormArray(this);\n    }\n    /**\n     * A lifecycle method called before the directive's instance is destroyed. For internal use only.\n     * @docs-private\n     */\n    ngOnDestroy() {\n      this.formDirective?.removeFormArray(this);\n    }\n    /**\n     * @description\n     * The `FormArray` bound to this directive.\n     */\n    get control() {\n      return this.formDirective.getFormArray(this);\n    }\n    /**\n     * @description\n     * The top-level directive for this group if present, otherwise null.\n     */\n    get formDirective() {\n      return this._parent ? this._parent.formDirective : null;\n    }\n    /**\n     * @description\n     * Returns an array that represents the path from the top-level form to this control.\n     * Each index is the string name of the control on that level.\n     */\n    get path() {\n      return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);\n    }\n    static ɵfac = function FormArrayName_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormArrayName)(i0.ɵɵdirectiveInject(ControlContainer, 13), i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: FormArrayName,\n      selectors: [[\"\", \"formArrayName\", \"\"]],\n      inputs: {\n        name: [0, \"formArrayName\", \"name\"]\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([formArrayNameProvider]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return FormArrayName;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction hasInvalidParent(parent) {\n  return !(parent instanceof FormGroupName) && !(parent instanceof FormGroupDirective) && !(parent instanceof FormArrayName);\n}\nconst controlNameBinding = {\n  provide: NgControl,\n  useExisting: /*#__PURE__*/forwardRef(() => FormControlName)\n};\n/**\n * @description\n * Syncs a `FormControl` in an existing `FormGroup` to a form control\n * element by name.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n * @see {@link FormControl}\n * @see {@link AbstractControl}\n *\n * @usageNotes\n *\n * ### Register `FormControl` within a group\n *\n * The following example shows how to register multiple form controls within a form group\n * and set their value.\n *\n * {@example forms/ts/simpleFormGroup/simple_form_group_example.ts region='Component'}\n *\n * To see `formControlName` examples with different form control types, see:\n *\n * * Radio buttons: `RadioControlValueAccessor`\n * * Selects: `SelectControlValueAccessor`\n *\n * ### Use with ngModel is deprecated\n *\n * Support for using the `ngModel` input property and `ngModelChange` event with reactive\n * form directives has been deprecated in Angular v6 and is scheduled for removal in\n * a future version of Angular.\n *\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet FormControlName = /*#__PURE__*/(() => {\n  class FormControlName extends NgControl {\n    _ngModelWarningConfig;\n    _added = false;\n    /**\n     * Internal reference to the view model value.\n     * @internal\n     */\n    viewModel;\n    /**\n     * @description\n     * Tracks the `FormControl` instance bound to the directive.\n     */\n    control;\n    /**\n     * @description\n     * Tracks the name of the `FormControl` bound to the directive. The name corresponds\n     * to a key in the parent `FormGroup` or `FormArray`.\n     * Accepts a name as a string or a number.\n     * The name in the form of a string is useful for individual forms,\n     * while the numerical form allows for form controls to be bound\n     * to indices when iterating over controls in a `FormArray`.\n     */\n    name = null;\n    /**\n     * @description\n     * Triggers a warning in dev mode that this input should not be used with reactive forms.\n     */\n    set isDisabled(isDisabled) {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.warn(disabledAttrWarning);\n      }\n    }\n    // TODO(kara): remove next 4 properties once deprecation period is over\n    /** @deprecated as of v6 */\n    model;\n    /** @deprecated as of v6 */\n    update = new EventEmitter();\n    /**\n     * @description\n     * Static property used to track whether any ngModel warnings have been sent across\n     * all instances of FormControlName. Used to support warning config of \"once\".\n     *\n     * @internal\n     */\n    static _ngModelWarningSentOnce = false;\n    /**\n     * @description\n     * Instance property used to track whether an ngModel warning has been sent out for this\n     * particular FormControlName instance. Used to support warning config of \"always\".\n     *\n     * @internal\n     */\n    _ngModelWarningSent = false;\n    constructor(parent, validators, asyncValidators, valueAccessors, _ngModelWarningConfig) {\n      super();\n      this._ngModelWarningConfig = _ngModelWarningConfig;\n      this._parent = parent;\n      this._setValidators(validators);\n      this._setAsyncValidators(asyncValidators);\n      this.valueAccessor = selectValueAccessor(this, valueAccessors);\n    }\n    /** @docs-private */\n    ngOnChanges(changes) {\n      if (!this._added) this._setUpControl();\n      if (isPropertyUpdated(changes, this.viewModel)) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          _ngModelWarning('formControlName', FormControlName, this, this._ngModelWarningConfig);\n        }\n        this.viewModel = this.model;\n        this.formDirective.updateModel(this, this.model);\n      }\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this.formDirective) {\n        this.formDirective.removeControl(this);\n      }\n    }\n    /**\n     * @description\n     * Sets the new value for the view model and emits an `ngModelChange` event.\n     *\n     * @param newValue The new value for the view model.\n     */\n    viewToModelUpdate(newValue) {\n      this.viewModel = newValue;\n      this.update.emit(newValue);\n    }\n    /**\n     * @description\n     * Returns an array that represents the path from the top-level form to this control.\n     * Each index is the string name of the control on that level.\n     */\n    get path() {\n      return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);\n    }\n    /**\n     * @description\n     * The top-level directive for this group if present, otherwise null.\n     */\n    get formDirective() {\n      return this._parent ? this._parent.formDirective : null;\n    }\n    _setUpControl() {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        checkParentType(this._parent, this.name);\n      }\n      this.control = this.formDirective.addControl(this);\n      this._added = true;\n    }\n    static ɵfac = function FormControlName_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormControlName)(i0.ɵɵdirectiveInject(ControlContainer, 13), i0.ɵɵdirectiveInject(NG_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), i0.ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), i0.ɵɵdirectiveInject(NG_MODEL_WITH_FORM_CONTROL_WARNING, 8));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: FormControlName,\n      selectors: [[\"\", \"formControlName\", \"\"]],\n      inputs: {\n        name: [0, \"formControlName\", \"name\"],\n        isDisabled: [0, \"disabled\", \"isDisabled\"],\n        model: [0, \"ngModel\", \"model\"]\n      },\n      outputs: {\n        update: \"ngModelChange\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([controlNameBinding]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return FormControlName;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction checkParentType(parent, name) {\n  if (!(parent instanceof FormGroupName) && parent instanceof AbstractFormGroupDirective) {\n    throw ngModelGroupException();\n  } else if (!(parent instanceof FormGroupName) && !(parent instanceof FormGroupDirective) && !(parent instanceof FormArrayName)) {\n    throw controlParentException(name);\n  }\n}\nconst SELECT_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => SelectControlValueAccessor),\n  multi: true\n};\nfunction _buildValueString$1(id, value) {\n  if (id == null) return `${value}`;\n  if (value && typeof value === 'object') value = 'Object';\n  return `${id}: ${value}`.slice(0, 50);\n}\nfunction _extractId$1(valueString) {\n  return valueString.split(':')[0];\n}\n/**\n * @description\n * The `ControlValueAccessor` for writing select control values and listening to select control\n * changes. The value accessor is used by the `FormControlDirective`, `FormControlName`, and\n * `NgModel` directives.\n *\n * @usageNotes\n *\n * ### Using select controls in a reactive form\n *\n * The following examples show how to use a select control in a reactive form.\n *\n * {@example forms/ts/reactiveSelectControl/reactive_select_control_example.ts region='Component'}\n *\n * ### Using select controls in a template-driven form\n *\n * To use a select in a template-driven form, simply add an `ngModel` and a `name`\n * attribute to the main `<select>` tag.\n *\n * {@example forms/ts/selectControl/select_control_example.ts region='Component'}\n *\n * ### Customizing option selection\n *\n * Angular uses object identity to select option. It's possible for the identities of items\n * to change while the data does not. This can happen, for example, if the items are produced\n * from an RPC to the server, and that RPC is re-run. Even if the data hasn't changed, the\n * second response will produce objects with different identities.\n *\n * To customize the default option comparison algorithm, `<select>` supports `compareWith` input.\n * `compareWith` takes a **function** which has two arguments: `option1` and `option2`.\n * If `compareWith` is given, Angular selects option by the return value of the function.\n *\n * ```ts\n * const selectedCountriesControl = new FormControl();\n * ```\n *\n * ```html\n * <select [compareWith]=\"compareFn\"  [formControl]=\"selectedCountriesControl\">\n *     <option *ngFor=\"let country of countries\" [ngValue]=\"country\">\n *         {{country.name}}\n *     </option>\n * </select>\n *\n * compareFn(c1: Country, c2: Country): boolean {\n *     return c1 && c2 ? c1.id === c2.id : c1 === c2;\n * }\n * ```\n *\n * **Note:** We listen to the 'change' event because 'input' events aren't fired\n * for selects in IE, see:\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event#browser_compatibility\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet SelectControlValueAccessor = /*#__PURE__*/(() => {\n  class SelectControlValueAccessor extends BuiltInControlValueAccessor {\n    /** @docs-private */\n    value;\n    /** @internal */\n    _optionMap = new Map();\n    /** @internal */\n    _idCounter = 0;\n    /**\n     * @description\n     * Tracks the option comparison algorithm for tracking identities when\n     * checking for changes.\n     */\n    set compareWith(fn) {\n      if (typeof fn !== 'function' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw new _RuntimeError(1201 /* RuntimeErrorCode.COMPAREWITH_NOT_A_FN */, `compareWith must be a function, but received ${JSON.stringify(fn)}`);\n      }\n      this._compareWith = fn;\n    }\n    _compareWith = Object.is;\n    /**\n     * Sets the \"value\" property on the select element.\n     * @docs-private\n     */\n    writeValue(value) {\n      this.value = value;\n      const id = this._getOptionId(value);\n      const valueString = _buildValueString$1(id, value);\n      this.setProperty('value', valueString);\n    }\n    /**\n     * Registers a function called when the control value changes.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this.onChange = valueString => {\n        this.value = this._getOptionValue(valueString);\n        fn(this.value);\n      };\n    }\n    /** @internal */\n    _registerOption() {\n      return (this._idCounter++).toString();\n    }\n    /** @internal */\n    _getOptionId(value) {\n      for (const id of this._optionMap.keys()) {\n        if (this._compareWith(this._optionMap.get(id), value)) return id;\n      }\n      return null;\n    }\n    /** @internal */\n    _getOptionValue(valueString) {\n      const id = _extractId$1(valueString);\n      return this._optionMap.has(id) ? this._optionMap.get(id) : valueString;\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵSelectControlValueAccessor_BaseFactory;\n      return function SelectControlValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵSelectControlValueAccessor_BaseFactory || (ɵSelectControlValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(SelectControlValueAccessor)))(__ngFactoryType__ || SelectControlValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: SelectControlValueAccessor,\n      selectors: [[\"select\", \"formControlName\", \"\", 3, \"multiple\", \"\"], [\"select\", \"formControl\", \"\", 3, \"multiple\", \"\"], [\"select\", \"ngModel\", \"\", 3, \"multiple\", \"\"]],\n      hostBindings: function SelectControlValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"change\", function SelectControlValueAccessor_change_HostBindingHandler($event) {\n            return ctx.onChange($event.target.value);\n          })(\"blur\", function SelectControlValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      inputs: {\n        compareWith: \"compareWith\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([SELECT_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return SelectControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Marks `<option>` as dynamic, so Angular can be notified when options change.\n *\n * @see {@link SelectControlValueAccessor}\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet NgSelectOption = /*#__PURE__*/(() => {\n  class NgSelectOption {\n    _element;\n    _renderer;\n    _select;\n    /**\n     * @description\n     * ID of the option element\n     */\n    id;\n    constructor(_element, _renderer, _select) {\n      this._element = _element;\n      this._renderer = _renderer;\n      this._select = _select;\n      if (this._select) this.id = this._select._registerOption();\n    }\n    /**\n     * @description\n     * Tracks the value bound to the option element. Unlike the value binding,\n     * ngValue supports binding to objects.\n     */\n    set ngValue(value) {\n      if (this._select == null) return;\n      this._select._optionMap.set(this.id, value);\n      this._setElementValue(_buildValueString$1(this.id, value));\n      this._select.writeValue(this._select.value);\n    }\n    /**\n     * @description\n     * Tracks simple string values bound to the option element.\n     * For objects, use the `ngValue` input binding.\n     */\n    set value(value) {\n      this._setElementValue(value);\n      if (this._select) this._select.writeValue(this._select.value);\n    }\n    /** @internal */\n    _setElementValue(value) {\n      this._renderer.setProperty(this._element.nativeElement, 'value', value);\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this._select) {\n        this._select._optionMap.delete(this.id);\n        this._select.writeValue(this._select.value);\n      }\n    }\n    static ɵfac = function NgSelectOption_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NgSelectOption)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(SelectControlValueAccessor, 9));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: NgSelectOption,\n      selectors: [[\"option\"]],\n      inputs: {\n        ngValue: \"ngValue\",\n        value: \"value\"\n      },\n      standalone: false\n    });\n  }\n  return NgSelectOption;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst SELECT_MULTIPLE_VALUE_ACCESSOR = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: /*#__PURE__*/forwardRef(() => SelectMultipleControlValueAccessor),\n  multi: true\n};\nfunction _buildValueString(id, value) {\n  if (id == null) return `${value}`;\n  if (typeof value === 'string') value = `'${value}'`;\n  if (value && typeof value === 'object') value = 'Object';\n  return `${id}: ${value}`.slice(0, 50);\n}\nfunction _extractId(valueString) {\n  return valueString.split(':')[0];\n}\n/**\n * @description\n * The `ControlValueAccessor` for writing multi-select control values and listening to multi-select\n * control changes. The value accessor is used by the `FormControlDirective`, `FormControlName`, and\n * `NgModel` directives.\n *\n * @see {@link SelectControlValueAccessor}\n *\n * @usageNotes\n *\n * ### Using a multi-select control\n *\n * The follow example shows you how to use a multi-select control with a reactive form.\n *\n * ```ts\n * const countryControl = new FormControl();\n * ```\n *\n * ```html\n * <select multiple name=\"countries\" [formControl]=\"countryControl\">\n *   <option *ngFor=\"let country of countries\" [ngValue]=\"country\">\n *     {{ country.name }}\n *   </option>\n * </select>\n * ```\n *\n * ### Customizing option selection\n *\n * To customize the default option comparison algorithm, `<select>` supports `compareWith` input.\n * See the `SelectControlValueAccessor` for usage.\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet SelectMultipleControlValueAccessor = /*#__PURE__*/(() => {\n  class SelectMultipleControlValueAccessor extends BuiltInControlValueAccessor {\n    /**\n     * The current value.\n     * @docs-private\n     */\n    value;\n    /** @internal */\n    _optionMap = new Map();\n    /** @internal */\n    _idCounter = 0;\n    /**\n     * @description\n     * Tracks the option comparison algorithm for tracking identities when\n     * checking for changes.\n     */\n    set compareWith(fn) {\n      if (typeof fn !== 'function' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw new _RuntimeError(1201 /* RuntimeErrorCode.COMPAREWITH_NOT_A_FN */, `compareWith must be a function, but received ${JSON.stringify(fn)}`);\n      }\n      this._compareWith = fn;\n    }\n    _compareWith = Object.is;\n    /**\n     * Sets the \"value\" property on one or of more of the select's options.\n     * @docs-private\n     */\n    writeValue(value) {\n      this.value = value;\n      let optionSelectedStateSetter;\n      if (Array.isArray(value)) {\n        // convert values to ids\n        const ids = value.map(v => this._getOptionId(v));\n        optionSelectedStateSetter = (opt, o) => {\n          opt._setSelected(ids.indexOf(o.toString()) > -1);\n        };\n      } else {\n        optionSelectedStateSetter = (opt, o) => {\n          opt._setSelected(false);\n        };\n      }\n      this._optionMap.forEach(optionSelectedStateSetter);\n    }\n    /**\n     * Registers a function called when the control value changes\n     * and writes an array of the selected options.\n     * @docs-private\n     */\n    registerOnChange(fn) {\n      this.onChange = element => {\n        const selected = [];\n        const selectedOptions = element.selectedOptions;\n        if (selectedOptions !== undefined) {\n          const options = selectedOptions;\n          for (let i = 0; i < options.length; i++) {\n            const opt = options[i];\n            const val = this._getOptionValue(opt.value);\n            selected.push(val);\n          }\n        }\n        // Degrade to use `options` when `selectedOptions` property is not available.\n        // Note: the `selectedOptions` is available in all supported browsers, but the Domino lib\n        // doesn't have it currently, see https://github.com/fgnass/domino/issues/177.\n        else {\n          const options = element.options;\n          for (let i = 0; i < options.length; i++) {\n            const opt = options[i];\n            if (opt.selected) {\n              const val = this._getOptionValue(opt.value);\n              selected.push(val);\n            }\n          }\n        }\n        this.value = selected;\n        fn(selected);\n      };\n    }\n    /** @internal */\n    _registerOption(value) {\n      const id = (this._idCounter++).toString();\n      this._optionMap.set(id, value);\n      return id;\n    }\n    /** @internal */\n    _getOptionId(value) {\n      for (const id of this._optionMap.keys()) {\n        if (this._compareWith(this._optionMap.get(id)._value, value)) return id;\n      }\n      return null;\n    }\n    /** @internal */\n    _getOptionValue(valueString) {\n      const id = _extractId(valueString);\n      return this._optionMap.has(id) ? this._optionMap.get(id)._value : valueString;\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵSelectMultipleControlValueAccessor_BaseFactory;\n      return function SelectMultipleControlValueAccessor_Factory(__ngFactoryType__) {\n        return (ɵSelectMultipleControlValueAccessor_BaseFactory || (ɵSelectMultipleControlValueAccessor_BaseFactory = i0.ɵɵgetInheritedFactory(SelectMultipleControlValueAccessor)))(__ngFactoryType__ || SelectMultipleControlValueAccessor);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: SelectMultipleControlValueAccessor,\n      selectors: [[\"select\", \"multiple\", \"\", \"formControlName\", \"\"], [\"select\", \"multiple\", \"\", \"formControl\", \"\"], [\"select\", \"multiple\", \"\", \"ngModel\", \"\"]],\n      hostBindings: function SelectMultipleControlValueAccessor_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"change\", function SelectMultipleControlValueAccessor_change_HostBindingHandler($event) {\n            return ctx.onChange($event.target);\n          })(\"blur\", function SelectMultipleControlValueAccessor_blur_HostBindingHandler() {\n            return ctx.onTouched();\n          });\n        }\n      },\n      inputs: {\n        compareWith: \"compareWith\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([SELECT_MULTIPLE_VALUE_ACCESSOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return SelectMultipleControlValueAccessor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Marks `<option>` as dynamic, so Angular can be notified when options change.\n *\n * @see {@link SelectMultipleControlValueAccessor}\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet ɵNgSelectMultipleOption = /*#__PURE__*/(() => {\n  class ɵNgSelectMultipleOption {\n    _element;\n    _renderer;\n    _select;\n    id;\n    /** @internal */\n    _value;\n    constructor(_element, _renderer, _select) {\n      this._element = _element;\n      this._renderer = _renderer;\n      this._select = _select;\n      if (this._select) {\n        this.id = this._select._registerOption(this);\n      }\n    }\n    /**\n     * @description\n     * Tracks the value bound to the option element. Unlike the value binding,\n     * ngValue supports binding to objects.\n     */\n    set ngValue(value) {\n      if (this._select == null) return;\n      this._value = value;\n      this._setElementValue(_buildValueString(this.id, value));\n      this._select.writeValue(this._select.value);\n    }\n    /**\n     * @description\n     * Tracks simple string values bound to the option element.\n     * For objects, use the `ngValue` input binding.\n     */\n    set value(value) {\n      if (this._select) {\n        this._value = value;\n        this._setElementValue(_buildValueString(this.id, value));\n        this._select.writeValue(this._select.value);\n      } else {\n        this._setElementValue(value);\n      }\n    }\n    /** @internal */\n    _setElementValue(value) {\n      this._renderer.setProperty(this._element.nativeElement, 'value', value);\n    }\n    /** @internal */\n    _setSelected(selected) {\n      this._renderer.setProperty(this._element.nativeElement, 'selected', selected);\n    }\n    /** @docs-private */\n    ngOnDestroy() {\n      if (this._select) {\n        this._select._optionMap.delete(this.id);\n        this._select.writeValue(this._select.value);\n      }\n    }\n    static ɵfac = function ɵNgSelectMultipleOption_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ɵNgSelectMultipleOption)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(SelectMultipleControlValueAccessor, 9));\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: ɵNgSelectMultipleOption,\n      selectors: [[\"option\"]],\n      inputs: {\n        ngValue: \"ngValue\",\n        value: \"value\"\n      },\n      standalone: false\n    });\n  }\n  return ɵNgSelectMultipleOption;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Method that updates string to integer if not already a number\n *\n * @param value The value to convert to integer.\n * @returns value of parameter converted to number or integer.\n */\nfunction toInteger(value) {\n  return typeof value === 'number' ? value : parseInt(value, 10);\n}\n/**\n * Method that ensures that provided value is a float (and converts it to float if needed).\n *\n * @param value The value to convert to float.\n * @returns value of parameter converted to number or float.\n */\nfunction toFloat(value) {\n  return typeof value === 'number' ? value : parseFloat(value);\n}\n/**\n * A base class for Validator-based Directives. The class contains common logic shared across such\n * Directives.\n *\n * For internal use only, this class is not intended for use outside of the Forms package.\n */\nlet AbstractValidatorDirective = /*#__PURE__*/(() => {\n  class AbstractValidatorDirective {\n    _validator = nullValidator;\n    _onChange;\n    /**\n     * A flag that tracks whether this validator is enabled.\n     *\n     * Marking it `internal` (vs `protected`), so that this flag can be used in host bindings of\n     * directive classes that extend this base class.\n     * @internal\n     */\n    _enabled;\n    /** @docs-private */\n    ngOnChanges(changes) {\n      if (this.inputName in changes) {\n        const input = this.normalizeInput(changes[this.inputName].currentValue);\n        this._enabled = this.enabled(input);\n        this._validator = this._enabled ? this.createValidator(input) : nullValidator;\n        if (this._onChange) {\n          this._onChange();\n        }\n      }\n    }\n    /** @docs-private */\n    validate(control) {\n      return this._validator(control);\n    }\n    /** @docs-private */\n    registerOnValidatorChange(fn) {\n      this._onChange = fn;\n    }\n    /**\n     * @description\n     * Determines whether this validator should be active or not based on an input.\n     * Base class implementation checks whether an input is defined (if the value is different from\n     * `null` and `undefined`). Validator classes that extend this base class can override this\n     * function with the logic specific to a particular validator directive.\n     */\n    enabled(input) {\n      return input != null /* both `null` and `undefined` */;\n    }\n    static ɵfac = function AbstractValidatorDirective_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || AbstractValidatorDirective)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: AbstractValidatorDirective,\n      features: [i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return AbstractValidatorDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `MaxValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst MAX_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => MaxValidator),\n  multi: true\n};\n/**\n * A directive which installs the {@link MaxValidator} for any `formControlName`,\n * `formControl`, or control with `ngModel` that also has a `max` attribute.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a max validator\n *\n * The following example shows how to add a max validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input type=\"number\" ngModel max=\"4\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet MaxValidator = /*#__PURE__*/(() => {\n  class MaxValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the max bound to this directive.\n     */\n    max;\n    /** @internal */\n    inputName = 'max';\n    /** @internal */\n    normalizeInput = input => toFloat(input);\n    /** @internal */\n    createValidator = max => maxValidator(max);\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMaxValidator_BaseFactory;\n      return function MaxValidator_Factory(__ngFactoryType__) {\n        return (ɵMaxValidator_BaseFactory || (ɵMaxValidator_BaseFactory = i0.ɵɵgetInheritedFactory(MaxValidator)))(__ngFactoryType__ || MaxValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MaxValidator,\n      selectors: [[\"input\", \"type\", \"number\", \"max\", \"\", \"formControlName\", \"\"], [\"input\", \"type\", \"number\", \"max\", \"\", \"formControl\", \"\"], [\"input\", \"type\", \"number\", \"max\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function MaxValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"max\", ctx._enabled ? ctx.max : null);\n        }\n      },\n      inputs: {\n        max: \"max\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([MAX_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return MaxValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `MinValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst MIN_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => MinValidator),\n  multi: true\n};\n/**\n * A directive which installs the {@link MinValidator} for any `formControlName`,\n * `formControl`, or control with `ngModel` that also has a `min` attribute.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a min validator\n *\n * The following example shows how to add a min validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input type=\"number\" ngModel min=\"4\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet MinValidator = /*#__PURE__*/(() => {\n  class MinValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the min bound to this directive.\n     */\n    min;\n    /** @internal */\n    inputName = 'min';\n    /** @internal */\n    normalizeInput = input => toFloat(input);\n    /** @internal */\n    createValidator = min => minValidator(min);\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMinValidator_BaseFactory;\n      return function MinValidator_Factory(__ngFactoryType__) {\n        return (ɵMinValidator_BaseFactory || (ɵMinValidator_BaseFactory = i0.ɵɵgetInheritedFactory(MinValidator)))(__ngFactoryType__ || MinValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MinValidator,\n      selectors: [[\"input\", \"type\", \"number\", \"min\", \"\", \"formControlName\", \"\"], [\"input\", \"type\", \"number\", \"min\", \"\", \"formControl\", \"\"], [\"input\", \"type\", \"number\", \"min\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function MinValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"min\", ctx._enabled ? ctx.min : null);\n        }\n      },\n      inputs: {\n        min: \"min\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([MIN_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return MinValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `RequiredValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst REQUIRED_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => RequiredValidator),\n  multi: true\n};\n/**\n * @description\n * Provider which adds `CheckboxRequiredValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst CHECKBOX_REQUIRED_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => CheckboxRequiredValidator),\n  multi: true\n};\n/**\n * @description\n * A directive that adds the `required` validator to any controls marked with the\n * `required` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a required validator using template-driven forms\n *\n * ```html\n * <input name=\"fullName\" ngModel required>\n * ```\n *\n * @ngModule FormsModule\n * @ngModule ReactiveFormsModule\n * @publicApi\n */\nlet RequiredValidator = /*#__PURE__*/(() => {\n  class RequiredValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the required attribute bound to this directive.\n     */\n    required;\n    /** @internal */\n    inputName = 'required';\n    /** @internal */\n    normalizeInput = booleanAttribute;\n    /** @internal */\n    createValidator = input => requiredValidator;\n    /** @docs-private */\n    enabled(input) {\n      return input;\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵRequiredValidator_BaseFactory;\n      return function RequiredValidator_Factory(__ngFactoryType__) {\n        return (ɵRequiredValidator_BaseFactory || (ɵRequiredValidator_BaseFactory = i0.ɵɵgetInheritedFactory(RequiredValidator)))(__ngFactoryType__ || RequiredValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: RequiredValidator,\n      selectors: [[\"\", \"required\", \"\", \"formControlName\", \"\", 3, \"type\", \"checkbox\"], [\"\", \"required\", \"\", \"formControl\", \"\", 3, \"type\", \"checkbox\"], [\"\", \"required\", \"\", \"ngModel\", \"\", 3, \"type\", \"checkbox\"]],\n      hostVars: 1,\n      hostBindings: function RequiredValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"required\", ctx._enabled ? \"\" : null);\n        }\n      },\n      inputs: {\n        required: \"required\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([REQUIRED_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return RequiredValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * A Directive that adds the `required` validator to checkbox controls marked with the\n * `required` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a required checkbox validator using template-driven forms\n *\n * The following example shows how to add a checkbox required validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input type=\"checkbox\" name=\"active\" ngModel required>\n * ```\n *\n * @publicApi\n * @ngModule FormsModule\n * @ngModule ReactiveFormsModule\n */\nlet CheckboxRequiredValidator = /*#__PURE__*/(() => {\n  class CheckboxRequiredValidator extends RequiredValidator {\n    /** @internal */\n    createValidator = input => requiredTrueValidator;\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵCheckboxRequiredValidator_BaseFactory;\n      return function CheckboxRequiredValidator_Factory(__ngFactoryType__) {\n        return (ɵCheckboxRequiredValidator_BaseFactory || (ɵCheckboxRequiredValidator_BaseFactory = i0.ɵɵgetInheritedFactory(CheckboxRequiredValidator)))(__ngFactoryType__ || CheckboxRequiredValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CheckboxRequiredValidator,\n      selectors: [[\"input\", \"type\", \"checkbox\", \"required\", \"\", \"formControlName\", \"\"], [\"input\", \"type\", \"checkbox\", \"required\", \"\", \"formControl\", \"\"], [\"input\", \"type\", \"checkbox\", \"required\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function CheckboxRequiredValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"required\", ctx._enabled ? \"\" : null);\n        }\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([CHECKBOX_REQUIRED_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CheckboxRequiredValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `EmailValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst EMAIL_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => EmailValidator),\n  multi: true\n};\n/**\n * A directive that adds the `email` validator to controls marked with the\n * `email` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * The email validation is based on the WHATWG HTML specification with some enhancements to\n * incorporate more RFC rules. More information can be found on the [Validators.email\n * page](api/forms/Validators#email).\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding an email validator\n *\n * The following example shows how to add an email validator to an input attached to an ngModel\n * binding.\n *\n * ```html\n * <input type=\"email\" name=\"email\" ngModel email>\n * <input type=\"email\" name=\"email\" ngModel email=\"true\">\n * <input type=\"email\" name=\"email\" ngModel [email]=\"true\">\n * ```\n *\n * @publicApi\n * @ngModule FormsModule\n * @ngModule ReactiveFormsModule\n */\nlet EmailValidator = /*#__PURE__*/(() => {\n  class EmailValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the email attribute bound to this directive.\n     */\n    email;\n    /** @internal */\n    inputName = 'email';\n    /** @internal */\n    normalizeInput = booleanAttribute;\n    /** @internal */\n    createValidator = input => emailValidator;\n    /** @docs-private */\n    enabled(input) {\n      return input;\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵEmailValidator_BaseFactory;\n      return function EmailValidator_Factory(__ngFactoryType__) {\n        return (ɵEmailValidator_BaseFactory || (ɵEmailValidator_BaseFactory = i0.ɵɵgetInheritedFactory(EmailValidator)))(__ngFactoryType__ || EmailValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: EmailValidator,\n      selectors: [[\"\", \"email\", \"\", \"formControlName\", \"\"], [\"\", \"email\", \"\", \"formControl\", \"\"], [\"\", \"email\", \"\", \"ngModel\", \"\"]],\n      inputs: {\n        email: \"email\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([EMAIL_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return EmailValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `MinLengthValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst MIN_LENGTH_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => MinLengthValidator),\n  multi: true\n};\n/**\n * A directive that adds minimum length validation to controls marked with the\n * `minlength` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a minimum length validator\n *\n * The following example shows how to add a minimum length validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input name=\"firstName\" ngModel minlength=\"4\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet MinLengthValidator = /*#__PURE__*/(() => {\n  class MinLengthValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the minimum length bound to this directive.\n     */\n    minlength;\n    /** @internal */\n    inputName = 'minlength';\n    /** @internal */\n    normalizeInput = input => toInteger(input);\n    /** @internal */\n    createValidator = minlength => minLengthValidator(minlength);\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMinLengthValidator_BaseFactory;\n      return function MinLengthValidator_Factory(__ngFactoryType__) {\n        return (ɵMinLengthValidator_BaseFactory || (ɵMinLengthValidator_BaseFactory = i0.ɵɵgetInheritedFactory(MinLengthValidator)))(__ngFactoryType__ || MinLengthValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MinLengthValidator,\n      selectors: [[\"\", \"minlength\", \"\", \"formControlName\", \"\"], [\"\", \"minlength\", \"\", \"formControl\", \"\"], [\"\", \"minlength\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function MinLengthValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"minlength\", ctx._enabled ? ctx.minlength : null);\n        }\n      },\n      inputs: {\n        minlength: \"minlength\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([MIN_LENGTH_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return MinLengthValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `MaxLengthValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst MAX_LENGTH_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => MaxLengthValidator),\n  multi: true\n};\n/**\n * A directive that adds maximum length validation to controls marked with the\n * `maxlength` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a maximum length validator\n *\n * The following example shows how to add a maximum length validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input name=\"firstName\" ngModel maxlength=\"25\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet MaxLengthValidator = /*#__PURE__*/(() => {\n  class MaxLengthValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the maximum length bound to this directive.\n     */\n    maxlength;\n    /** @internal */\n    inputName = 'maxlength';\n    /** @internal */\n    normalizeInput = input => toInteger(input);\n    /** @internal */\n    createValidator = maxlength => maxLengthValidator(maxlength);\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMaxLengthValidator_BaseFactory;\n      return function MaxLengthValidator_Factory(__ngFactoryType__) {\n        return (ɵMaxLengthValidator_BaseFactory || (ɵMaxLengthValidator_BaseFactory = i0.ɵɵgetInheritedFactory(MaxLengthValidator)))(__ngFactoryType__ || MaxLengthValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MaxLengthValidator,\n      selectors: [[\"\", \"maxlength\", \"\", \"formControlName\", \"\"], [\"\", \"maxlength\", \"\", \"formControl\", \"\"], [\"\", \"maxlength\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function MaxLengthValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"maxlength\", ctx._enabled ? ctx.maxlength : null);\n        }\n      },\n      inputs: {\n        maxlength: \"maxlength\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([MAX_LENGTH_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return MaxLengthValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * Provider which adds `PatternValidator` to the `NG_VALIDATORS` multi-provider list.\n */\nconst PATTERN_VALIDATOR = {\n  provide: NG_VALIDATORS,\n  useExisting: /*#__PURE__*/forwardRef(() => PatternValidator),\n  multi: true\n};\n/**\n * @description\n * A directive that adds regex pattern validation to controls marked with the\n * `pattern` attribute. The regex must match the entire control value.\n * The directive is provided with the `NG_VALIDATORS` multi-provider list.\n *\n * @see [Form Validation](guide/forms/form-validation)\n *\n * @usageNotes\n *\n * ### Adding a pattern validator\n *\n * The following example shows how to add a pattern validator to an input attached to an\n * ngModel binding.\n *\n * ```html\n * <input name=\"firstName\" ngModel pattern=\"[a-zA-Z ]*\">\n * ```\n *\n * @ngModule ReactiveFormsModule\n * @ngModule FormsModule\n * @publicApi\n */\nlet PatternValidator = /*#__PURE__*/(() => {\n  class PatternValidator extends AbstractValidatorDirective {\n    /**\n     * @description\n     * Tracks changes to the pattern bound to this directive.\n     */\n    pattern; // This input is always defined, since the name matches selector.\n    /** @internal */\n    inputName = 'pattern';\n    /** @internal */\n    normalizeInput = input => input;\n    /** @internal */\n    createValidator = input => patternValidator(input);\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵPatternValidator_BaseFactory;\n      return function PatternValidator_Factory(__ngFactoryType__) {\n        return (ɵPatternValidator_BaseFactory || (ɵPatternValidator_BaseFactory = i0.ɵɵgetInheritedFactory(PatternValidator)))(__ngFactoryType__ || PatternValidator);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: PatternValidator,\n      selectors: [[\"\", \"pattern\", \"\", \"formControlName\", \"\"], [\"\", \"pattern\", \"\", \"formControl\", \"\"], [\"\", \"pattern\", \"\", \"ngModel\", \"\"]],\n      hostVars: 1,\n      hostBindings: function PatternValidator_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"pattern\", ctx._enabled ? ctx.pattern : null);\n        }\n      },\n      inputs: {\n        pattern: \"pattern\"\n      },\n      standalone: false,\n      features: [i0.ɵɵProvidersFeature([PATTERN_VALIDATOR]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return PatternValidator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst SHARED_FORM_DIRECTIVES = [ɵNgNoValidate, NgSelectOption, ɵNgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator, CheckboxRequiredValidator, EmailValidator, MinValidator, MaxValidator];\nconst TEMPLATE_DRIVEN_DIRECTIVES = [NgModel, NgModelGroup, NgForm];\nconst REACTIVE_DRIVEN_DIRECTIVES = [FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName];\n/**\n * Internal module used for sharing directives between FormsModule and ReactiveFormsModule\n */\nlet ɵInternalFormsSharedModule = /*#__PURE__*/(() => {\n  class ɵInternalFormsSharedModule {\n    static ɵfac = function ɵInternalFormsSharedModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ɵInternalFormsSharedModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: ɵInternalFormsSharedModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n  }\n  return ɵInternalFormsSharedModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Tracks the value and validity state of an array of `FormControl`,\n * `FormGroup` or `FormArray` instances.\n *\n * A `FormArray` aggregates the values of each child `FormControl` into an array.\n * It calculates its status by reducing the status values of its children. For example, if one of\n * the controls in a `FormArray` is invalid, the entire array becomes invalid.\n *\n * `FormArray` accepts one generic argument, which is the type of the controls inside.\n * If you need a heterogenous array, use {@link UntypedFormArray}.\n *\n * `FormArray` is one of the four fundamental building blocks used to define forms in Angular,\n * along with `FormControl`, `FormGroup`, and `FormRecord`.\n *\n * @usageNotes\n *\n * ### Create an array of form controls\n *\n * ```ts\n * const arr = new FormArray([\n *   new FormControl('Nancy', Validators.minLength(2)),\n *   new FormControl('Drew'),\n * ]);\n *\n * console.log(arr.value);   // ['Nancy', 'Drew']\n * console.log(arr.status);  // 'VALID'\n * ```\n *\n * ### Create a form array with array-level validators\n *\n * You include array-level validators and async validators. These come in handy\n * when you want to perform validation that considers the value of more than one child\n * control.\n *\n * The two types of validators are passed in separately as the second and third arg\n * respectively, or together as part of an options object.\n *\n * ```ts\n * const arr = new FormArray([\n *   new FormControl('Nancy'),\n *   new FormControl('Drew')\n * ], {validators: myValidator, asyncValidators: myAsyncValidator});\n * ```\n *\n * ### Set the updateOn property for all controls in a form array\n *\n * The options object is used to set a default value for each child\n * control's `updateOn` property. If you set `updateOn` to `'blur'` at the\n * array level, all child controls default to 'blur', unless the child\n * has explicitly specified a different `updateOn` value.\n *\n * ```ts\n * const arr = new FormArray([\n *    new FormControl()\n * ], {updateOn: 'blur'});\n * ```\n *\n * ### Adding or removing controls from a form array\n *\n * To change the controls in the array, use the `push`, `insert`, `removeAt` or `clear` methods\n * in `FormArray` itself. These methods ensure the controls are properly tracked in the\n * form's hierarchy. Do not modify the array of `AbstractControl`s used to instantiate\n * the `FormArray` directly, as that result in strange and unexpected behavior such\n * as broken change detection.\n *\n * @publicApi\n */\nclass FormArray extends AbstractControl {\n  /**\n   * Creates a new `FormArray` instance.\n   *\n   * @param controls An array of child controls. Each child control is given an index\n   * where it is registered.\n   *\n   * @param validatorOrOpts A synchronous validator function, or an array of\n   * such functions, or an `AbstractControlOptions` object that contains validation functions\n   * and a validation trigger.\n   *\n   * @param asyncValidator A single async validator or array of async validator functions\n   *\n   */\n  constructor(controls, validatorOrOpts, asyncValidator) {\n    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));\n    this.controls = controls;\n    this._initObservables();\n    this._setUpdateStrategy(validatorOrOpts);\n    this._setUpControls();\n    this.updateValueAndValidity({\n      onlySelf: true,\n      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to\n      // `VALID` or `INVALID`.\n      // The status should be broadcasted via the `statusChanges` observable, so we set `emitEvent`\n      // to `true` to allow that during the control creation process.\n      emitEvent: !!this.asyncValidator\n    });\n  }\n  controls;\n  /**\n   * Get the `AbstractControl` at the given `index` in the array.\n   *\n   * @param index Index in the array to retrieve the control. If `index` is negative, it will wrap\n   *     around from the back, and if index is greatly negative (less than `-length`), the result is\n   * undefined. This behavior is the same as `Array.at(index)`.\n   */\n  at(index) {\n    return this.controls[this._adjustIndex(index)];\n  }\n  /**\n   * Insert a new `AbstractControl` at the end of the array.\n   *\n   * @param control Form control to be inserted\n   * @param options Specifies whether this FormArray instance should emit events after a new\n   *     control is added.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control is\n   * inserted. When false, no events are emitted.\n   */\n  push(control, options = {}) {\n    this.controls.push(control);\n    this._registerControl(control);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n    this._onCollectionChange();\n  }\n  /**\n   * Insert a new `AbstractControl` at the given `index` in the array.\n   *\n   * @param index Index in the array to insert the control. If `index` is negative, wraps around\n   *     from the back. If `index` is greatly negative (less than `-length`), prepends to the array.\n   * This behavior is the same as `Array.splice(index, 0, control)`.\n   * @param control Form control to be inserted\n   * @param options Specifies whether this FormArray instance should emit events after a new\n   *     control is inserted.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control is\n   * inserted. When false, no events are emitted.\n   */\n  insert(index, control, options = {}) {\n    this.controls.splice(index, 0, control);\n    this._registerControl(control);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n  }\n  /**\n   * Remove the control at the given `index` in the array.\n   *\n   * @param index Index in the array to remove the control.  If `index` is negative, wraps around\n   *     from the back. If `index` is greatly negative (less than `-length`), removes the first\n   *     element. This behavior is the same as `Array.splice(index, 1)`.\n   * @param options Specifies whether this FormArray instance should emit events after a\n   *     control is removed.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control is\n   * removed. When false, no events are emitted.\n   */\n  removeAt(index, options = {}) {\n    // Adjust the index, then clamp it at no less than 0 to prevent undesired underflows.\n    let adjustedIndex = this._adjustIndex(index);\n    if (adjustedIndex < 0) adjustedIndex = 0;\n    if (this.controls[adjustedIndex]) this.controls[adjustedIndex]._registerOnCollectionChange(() => {});\n    this.controls.splice(adjustedIndex, 1);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n  }\n  /**\n   * Replace an existing control.\n   *\n   * @param index Index in the array to replace the control. If `index` is negative, wraps around\n   *     from the back. If `index` is greatly negative (less than `-length`), replaces the first\n   *     element. This behavior is the same as `Array.splice(index, 1, control)`.\n   * @param control The `AbstractControl` control to replace the existing control\n   * @param options Specifies whether this FormArray instance should emit events after an\n   *     existing control is replaced with a new one.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control is\n   * replaced with a new one. When false, no events are emitted.\n   */\n  setControl(index, control, options = {}) {\n    // Adjust the index, then clamp it at no less than 0 to prevent undesired underflows.\n    let adjustedIndex = this._adjustIndex(index);\n    if (adjustedIndex < 0) adjustedIndex = 0;\n    if (this.controls[adjustedIndex]) this.controls[adjustedIndex]._registerOnCollectionChange(() => {});\n    this.controls.splice(adjustedIndex, 1);\n    if (control) {\n      this.controls.splice(adjustedIndex, 0, control);\n      this._registerControl(control);\n    }\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n    this._onCollectionChange();\n  }\n  /**\n   * Length of the control array.\n   */\n  get length() {\n    return this.controls.length;\n  }\n  /**\n   * Sets the value of the `FormArray`. It accepts an array that matches\n   * the structure of the control.\n   *\n   * This method performs strict checks, and throws an error if you try\n   * to set the value of a control that doesn't exist or if you exclude the\n   * value of a control.\n   *\n   * @usageNotes\n   * ### Set the values for the controls in the form array\n   *\n   * ```ts\n   * const arr = new FormArray([\n   *   new FormControl(),\n   *   new FormControl()\n   * ]);\n   * console.log(arr.value);   // [null, null]\n   *\n   * arr.setValue(['Nancy', 'Drew']);\n   * console.log(arr.value);   // ['Nancy', 'Drew']\n   * ```\n   *\n   * @param value Array of values for the controls\n   * @param options Configure options that determine how the control propagates changes and\n   * emits events after the value changes\n   *\n   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default\n   * is false.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges`\n   * observables emit events with the latest status and value when the control value is updated.\n   * When false, no events are emitted.\n   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity\n   * updateValueAndValidity} method.\n   */\n  setValue(value, options = {}) {\n    assertAllValuesPresent(this, false, value);\n    value.forEach((newValue, index) => {\n      assertControlPresent(this, false, index);\n      this.at(index).setValue(newValue, {\n        onlySelf: true,\n        emitEvent: options.emitEvent\n      });\n    });\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * Patches the value of the `FormArray`. It accepts an array that matches the\n   * structure of the control, and does its best to match the values to the correct\n   * controls in the group.\n   *\n   * It accepts both super-sets and sub-sets of the array without throwing an error.\n   *\n   * @usageNotes\n   * ### Patch the values for controls in a form array\n   *\n   * ```ts\n   * const arr = new FormArray([\n   *    new FormControl(),\n   *    new FormControl()\n   * ]);\n   * console.log(arr.value);   // [null, null]\n   *\n   * arr.patchValue(['Nancy']);\n   * console.log(arr.value);   // ['Nancy', null]\n   * ```\n   *\n   * @param value Array of latest values for the controls\n   * @param options Configure options that determine how the control propagates changes and\n   * emits events after the value changes\n   *\n   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default\n   * is false.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when the control\n   * value is updated. When false, no events are emitted. The configuration options are passed to\n   * the {@link AbstractControl#updateValueAndValidity updateValueAndValidity} method.\n   */\n  patchValue(value, options = {}) {\n    // Even though the `value` argument type doesn't allow `null` and `undefined` values, the\n    // `patchValue` can be called recursively and inner data structures might have these values,\n    // so we just ignore such cases when a field containing FormArray instance receives `null` or\n    // `undefined` as a value.\n    if (value == null /* both `null` and `undefined` */) return;\n    value.forEach((newValue, index) => {\n      if (this.at(index)) {\n        this.at(index).patchValue(newValue, {\n          onlySelf: true,\n          emitEvent: options.emitEvent\n        });\n      }\n    });\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * Resets the `FormArray` and all descendants are marked `pristine` and `untouched`, and the\n   * value of all descendants to null or null maps.\n   *\n   * You reset to a specific form state by passing in an array of states\n   * that matches the structure of the control. The state is a standalone value\n   * or a form state object with both a value and a disabled status.\n   *\n   * @usageNotes\n   * ### Reset the values in a form array\n   *\n   * ```ts\n   * const arr = new FormArray([\n   *    new FormControl(),\n   *    new FormControl()\n   * ]);\n   * arr.reset(['name', 'last name']);\n   *\n   * console.log(arr.value);  // ['name', 'last name']\n   * ```\n   *\n   * ### Reset the values in a form array and the disabled status for the first control\n   *\n   * ```ts\n   * arr.reset([\n   *   {value: 'name', disabled: true},\n   *   'last'\n   * ]);\n   *\n   * console.log(arr.value);  // ['last']\n   * console.log(arr.at(0).status);  // 'DISABLED'\n   * ```\n   *\n   * @param value Array of values for the controls\n   * @param options Configure options that determine how the control propagates changes and\n   * emits events after the value changes\n   *\n   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default\n   * is false.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges`\n   * observables emit events with the latest status and value when the control is reset.\n   * When false, no events are emitted.\n   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity\n   * updateValueAndValidity} method.\n   */\n  reset(value = [], options = {}) {\n    this._forEachChild((control, index) => {\n      control.reset(value[index], {\n        onlySelf: true,\n        emitEvent: options.emitEvent\n      });\n    });\n    this._updatePristine(options, this);\n    this._updateTouched(options, this);\n    this.updateValueAndValidity(options);\n  }\n  /**\n   * The aggregate value of the array, including any disabled controls.\n   *\n   * Reports all values regardless of disabled status.\n   */\n  getRawValue() {\n    return this.controls.map(control => control.getRawValue());\n  }\n  /**\n   * Remove all controls in the `FormArray`.\n   *\n   * @param options Specifies whether this FormArray instance should emit events after all\n   *     controls are removed.\n   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n   * `valueChanges` observables emit events with the latest status and value when all controls\n   * in this FormArray instance are removed. When false, no events are emitted.\n   *\n   * @usageNotes\n   * ### Remove all elements from a FormArray\n   *\n   * ```ts\n   * const arr = new FormArray([\n   *    new FormControl(),\n   *    new FormControl()\n   * ]);\n   * console.log(arr.length);  // 2\n   *\n   * arr.clear();\n   * console.log(arr.length);  // 0\n   * ```\n   *\n   * It's a simpler and more efficient alternative to removing all elements one by one:\n   *\n   * ```ts\n   * const arr = new FormArray([\n   *    new FormControl(),\n   *    new FormControl()\n   * ]);\n   *\n   * while (arr.length) {\n   *    arr.removeAt(0);\n   * }\n   * ```\n   */\n  clear(options = {}) {\n    if (this.controls.length < 1) return;\n    this._forEachChild(control => control._registerOnCollectionChange(() => {}));\n    this.controls.splice(0);\n    this.updateValueAndValidity({\n      emitEvent: options.emitEvent\n    });\n  }\n  /**\n   * Adjusts a negative index by summing it with the length of the array. For very negative\n   * indices, the result may remain negative.\n   * @internal\n   */\n  _adjustIndex(index) {\n    return index < 0 ? index + this.length : index;\n  }\n  /** @internal */\n  _syncPendingControls() {\n    let subtreeUpdated = this.controls.reduce((updated, child) => {\n      return child._syncPendingControls() ? true : updated;\n    }, false);\n    if (subtreeUpdated) this.updateValueAndValidity({\n      onlySelf: true\n    });\n    return subtreeUpdated;\n  }\n  /** @internal */\n  _forEachChild(cb) {\n    this.controls.forEach((control, index) => {\n      cb(control, index);\n    });\n  }\n  /** @internal */\n  _updateValue() {\n    this.value = this.controls.filter(control => control.enabled || this.disabled).map(control => control.value);\n  }\n  /** @internal */\n  _anyControls(condition) {\n    return this.controls.some(control => control.enabled && condition(control));\n  }\n  /** @internal */\n  _setUpControls() {\n    this._forEachChild(control => this._registerControl(control));\n  }\n  /** @internal */\n  _allControlsDisabled() {\n    for (const control of this.controls) {\n      if (control.enabled) return false;\n    }\n    return this.controls.length > 0 || this.disabled;\n  }\n  _registerControl(control) {\n    control.setParent(this);\n    control._registerOnCollectionChange(this._onCollectionChange);\n  }\n  /** @internal */\n  _find(name) {\n    return this.at(name) ?? null;\n  }\n}\nconst UntypedFormArray = FormArray;\n/**\n * @description\n * Asserts that the given control is an instance of `FormArray`\n *\n * @publicApi\n */\nconst isFormArray = control => control instanceof FormArray;\nfunction isAbstractControlOptions(options) {\n  return !!options && (options.asyncValidators !== undefined || options.validators !== undefined || options.updateOn !== undefined);\n}\n/**\n * @description\n * Creates an `AbstractControl` from a user-specified configuration.\n *\n * The `FormBuilder` provides syntactic sugar that shortens creating instances of a\n * `FormControl`, `FormGroup`, or `FormArray`. It reduces the amount of boilerplate needed to\n * build complex forms.\n *\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n *\n * @publicApi\n */\nlet FormBuilder = /*#__PURE__*/(() => {\n  class FormBuilder {\n    useNonNullable = false;\n    /**\n     * @description\n     * Returns a FormBuilder in which automatically constructed `FormControl` elements\n     * have `{nonNullable: true}` and are non-nullable.\n     *\n     * **Constructing non-nullable controls**\n     *\n     * When constructing a control, it will be non-nullable, and will reset to its initial value.\n     *\n     * ```ts\n     * let nnfb = new FormBuilder().nonNullable;\n     * let name = nnfb.control('Alex'); // FormControl<string>\n     * name.reset();\n     * console.log(name); // 'Alex'\n     * ```\n     *\n     * **Constructing non-nullable groups or arrays**\n     *\n     * When constructing a group or array, all automatically created inner controls will be\n     * non-nullable, and will reset to their initial values.\n     *\n     * ```ts\n     * let nnfb = new FormBuilder().nonNullable;\n     * let name = nnfb.group({who: 'Alex'}); // FormGroup<{who: FormControl<string>}>\n     * name.reset();\n     * console.log(name); // {who: 'Alex'}\n     * ```\n     * **Constructing *nullable* fields on groups or arrays**\n     *\n     * It is still possible to have a nullable field. In particular, any `FormControl` which is\n     * *already* constructed will not be altered. For example:\n     *\n     * ```ts\n     * let nnfb = new FormBuilder().nonNullable;\n     * // FormGroup<{who: FormControl<string|null>}>\n     * let name = nnfb.group({who: new FormControl('Alex')});\n     * name.reset(); console.log(name); // {who: null}\n     * ```\n     *\n     * Because the inner control is constructed explicitly by the caller, the builder has\n     * no control over how it is created, and cannot exclude the `null`.\n     */\n    get nonNullable() {\n      const nnfb = new FormBuilder();\n      nnfb.useNonNullable = true;\n      return nnfb;\n    }\n    group(controls, options = null) {\n      const reducedControls = this._reduceControls(controls);\n      let newOptions = {};\n      if (isAbstractControlOptions(options)) {\n        // `options` are `AbstractControlOptions`\n        newOptions = options;\n      } else if (options !== null) {\n        // `options` are legacy form group options\n        newOptions.validators = options.validator;\n        newOptions.asyncValidators = options.asyncValidator;\n      }\n      return new FormGroup(reducedControls, newOptions);\n    }\n    /**\n     * @description\n     * Constructs a new `FormRecord` instance. Accepts a single generic argument, which is an object\n     * containing all the keys and corresponding inner control types.\n     *\n     * @param controls A collection of child controls. The key for each child is the name\n     * under which it is registered.\n     *\n     * @param options Configuration options object for the `FormRecord`. The object should have the\n     * `AbstractControlOptions` type and might contain the following fields:\n     * * `validators`: A synchronous validator function, or an array of validator functions.\n     * * `asyncValidators`: A single async validator or array of async validator functions.\n     * * `updateOn`: The event upon which the control should be updated (options: 'change' | 'blur'\n     * | submit').\n     */\n    record(controls, options = null) {\n      const reducedControls = this._reduceControls(controls);\n      // Cast to `any` because the inferred types are not as specific as Element.\n      return new FormRecord(reducedControls, options);\n    }\n    /**\n     * @description\n     * Constructs a new `FormControl` with the given state, validators and options. Sets\n     * `{nonNullable: true}` in the options to get a non-nullable control. Otherwise, the\n     * control will be nullable. Accepts a single generic argument, which is the type  of the\n     * control's value.\n     *\n     * @param formState Initializes the control with an initial state value, or\n     * with an object that contains both a value and a disabled status.\n     *\n     * @param validatorOrOpts A synchronous validator function, or an array of\n     * such functions, or a `FormControlOptions` object that contains\n     * validation functions and a validation trigger.\n     *\n     * @param asyncValidator A single async validator or array of async validator\n     * functions.\n     *\n     * @usageNotes\n     *\n     * ### Initialize a control as disabled\n     *\n     * The following example returns a control with an initial value in a disabled state.\n     *\n     * {@example forms/ts/formBuilder/form_builder_example.ts region='disabled-control'}\n     */\n    control(formState, validatorOrOpts, asyncValidator) {\n      let newOptions = {};\n      if (!this.useNonNullable) {\n        return new FormControl(formState, validatorOrOpts, asyncValidator);\n      }\n      if (isAbstractControlOptions(validatorOrOpts)) {\n        // If the second argument is options, then they are copied.\n        newOptions = validatorOrOpts;\n      } else {\n        // If the other arguments are validators, they are copied into an options object.\n        newOptions.validators = validatorOrOpts;\n        newOptions.asyncValidators = asyncValidator;\n      }\n      return new FormControl(formState, {\n        ...newOptions,\n        nonNullable: true\n      });\n    }\n    /**\n     * Constructs a new `FormArray` from the given array of configurations,\n     * validators and options. Accepts a single generic argument, which is the type of each control\n     * inside the array.\n     *\n     * @param controls An array of child controls or control configs. Each child control is given an\n     *     index when it is registered.\n     *\n     * @param validatorOrOpts A synchronous validator function, or an array of such functions, or an\n     *     `AbstractControlOptions` object that contains\n     * validation functions and a validation trigger.\n     *\n     * @param asyncValidator A single async validator or array of async validator functions.\n     */\n    array(controls, validatorOrOpts, asyncValidator) {\n      const createdControls = controls.map(c => this._createControl(c));\n      // Cast to `any` because the inferred types are not as specific as Element.\n      return new FormArray(createdControls, validatorOrOpts, asyncValidator);\n    }\n    /** @internal */\n    _reduceControls(controls) {\n      const createdControls = {};\n      Object.keys(controls).forEach(controlName => {\n        createdControls[controlName] = this._createControl(controls[controlName]);\n      });\n      return createdControls;\n    }\n    /** @internal */\n    _createControl(controls) {\n      if (controls instanceof FormControl) {\n        return controls;\n      } else if (controls instanceof AbstractControl) {\n        // A control; just return it\n        return controls;\n      } else if (Array.isArray(controls)) {\n        // ControlConfig Tuple\n        const value = controls[0];\n        const validator = controls.length > 1 ? controls[1] : null;\n        const asyncValidator = controls.length > 2 ? controls[2] : null;\n        return this.control(value, validator, asyncValidator);\n      } else {\n        // T or FormControlState<T>\n        return this.control(controls);\n      }\n    }\n    static ɵfac = function FormBuilder_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormBuilder)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: FormBuilder,\n      factory: FormBuilder.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return FormBuilder;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @description\n * `NonNullableFormBuilder` is similar to {@link FormBuilder}, but automatically constructed\n * {@link FormControl} elements have `{nonNullable: true}` and are non-nullable.\n *\n * @publicApi\n */\nlet NonNullableFormBuilder = /*#__PURE__*/(() => {\n  class NonNullableFormBuilder {\n    static ɵfac = function NonNullableFormBuilder_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || NonNullableFormBuilder)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: NonNullableFormBuilder,\n      factory: () => (() => inject(FormBuilder).nonNullable)(),\n      providedIn: 'root'\n    });\n  }\n  return NonNullableFormBuilder;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * UntypedFormBuilder is the same as `FormBuilder`, but it provides untyped controls.\n */\nlet UntypedFormBuilder = /*#__PURE__*/(() => {\n  class UntypedFormBuilder extends FormBuilder {\n    group(controlsConfig, options = null) {\n      return super.group(controlsConfig, options);\n    }\n    /**\n     * Like `FormBuilder#control`, except the resulting control is untyped.\n     */\n    control(formState, validatorOrOpts, asyncValidator) {\n      return super.control(formState, validatorOrOpts, asyncValidator);\n    }\n    /**\n     * Like `FormBuilder#array`, except the resulting array is untyped.\n     */\n    array(controlsConfig, validatorOrOpts, asyncValidator) {\n      return super.array(controlsConfig, validatorOrOpts, asyncValidator);\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵUntypedFormBuilder_BaseFactory;\n      return function UntypedFormBuilder_Factory(__ngFactoryType__) {\n        return (ɵUntypedFormBuilder_BaseFactory || (ɵUntypedFormBuilder_BaseFactory = i0.ɵɵgetInheritedFactory(UntypedFormBuilder)))(__ngFactoryType__ || UntypedFormBuilder);\n      };\n    })();\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: UntypedFormBuilder,\n      factory: UntypedFormBuilder.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return UntypedFormBuilder;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the forms package.\n */\n/**\n * @publicApi\n */\nconst VERSION = /*#__PURE__*/new Version('19.2.20');\n\n/**\n * Exports the required providers and directives for template-driven forms,\n * making them available for import by NgModules that import this module.\n *\n * @see [Forms Overview](guide/forms)\n * @see [Template-driven Forms Guide](guide/forms)\n *\n * @publicApi\n */\nlet FormsModule = /*#__PURE__*/(() => {\n  class FormsModule {\n    /**\n     * @description\n     * Provides options for configuring the forms module.\n     *\n     * @param opts An object of configuration options\n     * * `callSetDisabledState` Configures whether to `always` call `setDisabledState`, which is more\n     * correct, or to only call it `whenDisabled`, which is the legacy behavior.\n     */\n    static withConfig(opts) {\n      return {\n        ngModule: FormsModule,\n        providers: [{\n          provide: CALL_SET_DISABLED_STATE,\n          useValue: opts.callSetDisabledState ?? setDisabledStateDefault\n        }]\n      };\n    }\n    static ɵfac = function FormsModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FormsModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: FormsModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [ɵInternalFormsSharedModule]\n    });\n  }\n  return FormsModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Exports the required infrastructure and directives for reactive forms,\n * making them available for import by NgModules that import this module.\n *\n * @see [Forms Overview](guide/forms)\n * @see [Reactive Forms Guide](guide/forms/reactive-forms)\n *\n * @publicApi\n */\nlet ReactiveFormsModule = /*#__PURE__*/(() => {\n  class ReactiveFormsModule {\n    /**\n     * @description\n     * Provides options for configuring the reactive forms module.\n     *\n     * @param opts An object of configuration options\n     * * `warnOnNgModelWithFormControl` Configures when to emit a warning when an `ngModel`\n     * binding is used with reactive form directives.\n     * * `callSetDisabledState` Configures whether to `always` call `setDisabledState`, which is more\n     * correct, or to only call it `whenDisabled`, which is the legacy behavior.\n     */\n    static withConfig(opts) {\n      return {\n        ngModule: ReactiveFormsModule,\n        providers: [{\n          provide: NG_MODEL_WITH_FORM_CONTROL_WARNING,\n          useValue: opts.warnOnNgModelWithFormControl ?? 'always'\n        }, {\n          provide: CALL_SET_DISABLED_STATE,\n          useValue: opts.callSetDisabledState ?? setDisabledStateDefault\n        }]\n      };\n    }\n    static ɵfac = function ReactiveFormsModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ReactiveFormsModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: ReactiveFormsModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [ɵInternalFormsSharedModule]\n    });\n  }\n  return ReactiveFormsModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { AbstractControl, AbstractControlDirective, AbstractFormGroupDirective, COMPOSITION_BUFFER_MODE, CheckboxControlValueAccessor, CheckboxRequiredValidator, ControlContainer, ControlEvent, DefaultValueAccessor, EmailValidator, FormArray, FormArrayName, FormBuilder, FormControl, FormControlDirective, FormControlName, FormGroup, FormGroupDirective, FormGroupName, FormRecord, FormResetEvent, FormSubmittedEvent, FormsModule, MaxLengthValidator, MaxValidator, MinLengthValidator, MinValidator, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl, NgControlStatus, NgControlStatusGroup, NgForm, NgModel, NgModelGroup, NgSelectOption, NonNullableFormBuilder, NumberValueAccessor, PatternValidator, PristineChangeEvent, RadioControlValueAccessor, RangeValueAccessor, ReactiveFormsModule, RequiredValidator, SelectControlValueAccessor, SelectMultipleControlValueAccessor, StatusChangeEvent, TouchedChangeEvent, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, VERSION, Validators, ValueChangeEvent, isFormArray, isFormControl, isFormGroup, isFormRecord, ɵInternalFormsSharedModule, ɵNgNoValidate, ɵNgSelectMultipleOption };\n","import * as i0 from '@angular/core';\nimport { inject, NgZone, Injectable, RendererFactory2, Component, ChangeDetectionStrategy, ViewEncapsulation, untracked, afterRender, afterNextRender, ElementRef, Injector, ANIMATION_MODULE_TYPE, EnvironmentInjector, ApplicationRef, InjectionToken, Directive, EventEmitter, TemplateRef, ViewContainerRef, booleanAttribute, Input, Output, NgModule } from '@angular/core';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { _ as _bindEventWithOptions } from './backwards-compatibility-DHR38MsD.mjs';\nimport { _ as _getEventTarget } from './shadow-dom-B0oHn41l.mjs';\nimport { _ as _isTestEnvironment } from './test-environment-CT0XxPyp.mjs';\nimport { _ as _CdkPrivateStyleLoader } from './style-loader-Cu9AvjH9.mjs';\nimport { Subject, Subscription, merge } from 'rxjs';\nimport { filter, takeUntil, takeWhile } from 'rxjs/operators';\nimport { c as coerceCssPixelValue } from './css-pixel-value-C_HEqLhI.mjs';\nimport { c as coerceArray } from './array-I1yfCXUO.mjs';\nimport { ScrollDispatcher, ViewportRuler, ScrollingModule } from './scrolling.mjs';\nimport { s as supportsScrollBehavior } from './scrolling-BkvA05C8.mjs';\nimport { b as DomPortalOutlet, T as TemplatePortal, h as PortalModule } from './portal-directives-Bw5woq8I.mjs';\nimport { D as Directionality } from './directionality-CBXD4hga.mjs';\nimport { _ as _IdGenerator } from './id-generator-Dw_9dSDu.mjs';\nimport { g as ESCAPE } from './keycodes-CpHkExLC.mjs';\nimport { hasModifierKey } from './keycodes.mjs';\nimport { BidiModule } from './bidi.mjs';\nconst scrollBehaviorSupported = /*#__PURE__*/supportsScrollBehavior();\n/**\n * Strategy that will prevent the user from scrolling while the overlay is visible.\n */\nclass BlockScrollStrategy {\n  _viewportRuler;\n  _previousHTMLStyles = {\n    top: '',\n    left: ''\n  };\n  _previousScrollPosition;\n  _isEnabled = false;\n  _document;\n  constructor(_viewportRuler, document) {\n    this._viewportRuler = _viewportRuler;\n    this._document = document;\n  }\n  /** Attaches this scroll strategy to an overlay. */\n  attach() {}\n  /** Blocks page-level scroll while the attached overlay is open. */\n  enable() {\n    if (this._canBeEnabled()) {\n      const root = this._document.documentElement;\n      this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition();\n      // Cache the previous inline styles in case the user had set them.\n      this._previousHTMLStyles.left = root.style.left || '';\n      this._previousHTMLStyles.top = root.style.top || '';\n      // Note: we're using the `html` node, instead of the `body`, because the `body` may\n      // have the user agent margin, whereas the `html` is guaranteed not to have one.\n      root.style.left = coerceCssPixelValue(-this._previousScrollPosition.left);\n      root.style.top = coerceCssPixelValue(-this._previousScrollPosition.top);\n      root.classList.add('cdk-global-scrollblock');\n      this._isEnabled = true;\n    }\n  }\n  /** Unblocks page-level scroll while the attached overlay is open. */\n  disable() {\n    if (this._isEnabled) {\n      const html = this._document.documentElement;\n      const body = this._document.body;\n      const htmlStyle = html.style;\n      const bodyStyle = body.style;\n      const previousHtmlScrollBehavior = htmlStyle.scrollBehavior || '';\n      const previousBodyScrollBehavior = bodyStyle.scrollBehavior || '';\n      this._isEnabled = false;\n      htmlStyle.left = this._previousHTMLStyles.left;\n      htmlStyle.top = this._previousHTMLStyles.top;\n      html.classList.remove('cdk-global-scrollblock');\n      // Disable user-defined smooth scrolling temporarily while we restore the scroll position.\n      // See https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n      // Note that we don't mutate the property if the browser doesn't support `scroll-behavior`,\n      // because it can throw off feature detections in `supportsScrollBehavior` which\n      // checks for `'scrollBehavior' in documentElement.style`.\n      if (scrollBehaviorSupported) {\n        htmlStyle.scrollBehavior = bodyStyle.scrollBehavior = 'auto';\n      }\n      window.scroll(this._previousScrollPosition.left, this._previousScrollPosition.top);\n      if (scrollBehaviorSupported) {\n        htmlStyle.scrollBehavior = previousHtmlScrollBehavior;\n        bodyStyle.scrollBehavior = previousBodyScrollBehavior;\n      }\n    }\n  }\n  _canBeEnabled() {\n    // Since the scroll strategies can't be singletons, we have to use a global CSS class\n    // (`cdk-global-scrollblock`) to make sure that we don't try to disable global\n    // scrolling multiple times.\n    const html = this._document.documentElement;\n    if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n      return false;\n    }\n    const rootElement = this._document.documentElement;\n    const viewport = this._viewportRuler.getViewportSize();\n    return rootElement.scrollHeight > viewport.height || rootElement.scrollWidth > viewport.width;\n  }\n}\n\n/**\n * Returns an error to be thrown when attempting to attach an already-attached scroll strategy.\n */\nfunction getMatScrollStrategyAlreadyAttachedError() {\n  return Error(`Scroll strategy has already been attached.`);\n}\n\n/**\n * Strategy that will close the overlay as soon as the user starts scrolling.\n */\nclass CloseScrollStrategy {\n  _scrollDispatcher;\n  _ngZone;\n  _viewportRuler;\n  _config;\n  _scrollSubscription = null;\n  _overlayRef;\n  _initialScrollPosition;\n  constructor(_scrollDispatcher, _ngZone, _viewportRuler, _config) {\n    this._scrollDispatcher = _scrollDispatcher;\n    this._ngZone = _ngZone;\n    this._viewportRuler = _viewportRuler;\n    this._config = _config;\n  }\n  /** Attaches this scroll strategy to an overlay. */\n  attach(overlayRef) {\n    if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw getMatScrollStrategyAlreadyAttachedError();\n    }\n    this._overlayRef = overlayRef;\n  }\n  /** Enables the closing of the attached overlay on scroll. */\n  enable() {\n    if (this._scrollSubscription) {\n      return;\n    }\n    const stream = this._scrollDispatcher.scrolled(0).pipe(filter(scrollable => {\n      return !scrollable || !this._overlayRef.overlayElement.contains(scrollable.getElementRef().nativeElement);\n    }));\n    if (this._config && this._config.threshold && this._config.threshold > 1) {\n      this._initialScrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n      this._scrollSubscription = stream.subscribe(() => {\n        const scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n        if (Math.abs(scrollPosition - this._initialScrollPosition) > this._config.threshold) {\n          this._detach();\n        } else {\n          this._overlayRef.updatePosition();\n        }\n      });\n    } else {\n      this._scrollSubscription = stream.subscribe(this._detach);\n    }\n  }\n  /** Disables the closing the attached overlay on scroll. */\n  disable() {\n    if (this._scrollSubscription) {\n      this._scrollSubscription.unsubscribe();\n      this._scrollSubscription = null;\n    }\n  }\n  detach() {\n    this.disable();\n    this._overlayRef = null;\n  }\n  /** Detaches the overlay ref and disables the scroll strategy. */\n  _detach = () => {\n    this.disable();\n    if (this._overlayRef.hasAttached()) {\n      this._ngZone.run(() => this._overlayRef.detach());\n    }\n  };\n}\n\n/** Scroll strategy that doesn't do anything. */\nclass NoopScrollStrategy {\n  /** Does nothing, as this scroll strategy is a no-op. */\n  enable() {}\n  /** Does nothing, as this scroll strategy is a no-op. */\n  disable() {}\n  /** Does nothing, as this scroll strategy is a no-op. */\n  attach() {}\n}\n\n/**\n * Gets whether an element is scrolled outside of view by any of its parent scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is scrolled out of view\n * @docs-private\n */\nfunction isElementScrolledOutsideView(element, scrollContainers) {\n  return scrollContainers.some(containerBounds => {\n    const outsideAbove = element.bottom < containerBounds.top;\n    const outsideBelow = element.top > containerBounds.bottom;\n    const outsideLeft = element.right < containerBounds.left;\n    const outsideRight = element.left > containerBounds.right;\n    return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n  });\n}\n/**\n * Gets whether an element is clipped by any of its scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is clipped\n * @docs-private\n */\nfunction isElementClippedByScrolling(element, scrollContainers) {\n  return scrollContainers.some(scrollContainerRect => {\n    const clippedAbove = element.top < scrollContainerRect.top;\n    const clippedBelow = element.bottom > scrollContainerRect.bottom;\n    const clippedLeft = element.left < scrollContainerRect.left;\n    const clippedRight = element.right > scrollContainerRect.right;\n    return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n  });\n}\n\n/**\n * Strategy that will update the element position as the user is scrolling.\n */\nclass RepositionScrollStrategy {\n  _scrollDispatcher;\n  _viewportRuler;\n  _ngZone;\n  _config;\n  _scrollSubscription = null;\n  _overlayRef;\n  constructor(_scrollDispatcher, _viewportRuler, _ngZone, _config) {\n    this._scrollDispatcher = _scrollDispatcher;\n    this._viewportRuler = _viewportRuler;\n    this._ngZone = _ngZone;\n    this._config = _config;\n  }\n  /** Attaches this scroll strategy to an overlay. */\n  attach(overlayRef) {\n    if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw getMatScrollStrategyAlreadyAttachedError();\n    }\n    this._overlayRef = overlayRef;\n  }\n  /** Enables repositioning of the attached overlay on scroll. */\n  enable() {\n    if (!this._scrollSubscription) {\n      const throttle = this._config ? this._config.scrollThrottle : 0;\n      this._scrollSubscription = this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n        this._overlayRef.updatePosition();\n        // TODO(crisbeto): make `close` on by default once all components can handle it.\n        if (this._config && this._config.autoClose) {\n          const overlayRect = this._overlayRef.overlayElement.getBoundingClientRect();\n          const {\n            width,\n            height\n          } = this._viewportRuler.getViewportSize();\n          // TODO(crisbeto): include all ancestor scroll containers here once\n          // we have a way of exposing the trigger element to the scroll strategy.\n          const parentRects = [{\n            width,\n            height,\n            bottom: height,\n            right: width,\n            top: 0,\n            left: 0\n          }];\n          if (isElementScrolledOutsideView(overlayRect, parentRects)) {\n            this.disable();\n            this._ngZone.run(() => this._overlayRef.detach());\n          }\n        }\n      });\n    }\n  }\n  /** Disables repositioning of the attached overlay on scroll. */\n  disable() {\n    if (this._scrollSubscription) {\n      this._scrollSubscription.unsubscribe();\n      this._scrollSubscription = null;\n    }\n  }\n  detach() {\n    this.disable();\n    this._overlayRef = null;\n  }\n}\n\n/**\n * Options for how an overlay will handle scrolling.\n *\n * Users can provide a custom value for `ScrollStrategyOptions` to replace the default\n * behaviors. This class primarily acts as a factory for ScrollStrategy instances.\n */\nlet ScrollStrategyOptions = /*#__PURE__*/(() => {\n  class ScrollStrategyOptions {\n    _scrollDispatcher = inject(ScrollDispatcher);\n    _viewportRuler = inject(ViewportRuler);\n    _ngZone = inject(NgZone);\n    _document = inject(DOCUMENT);\n    constructor() {}\n    /** Do nothing on scroll. */\n    noop = () => new NoopScrollStrategy();\n    /**\n     * Close the overlay as soon as the user scrolls.\n     * @param config Configuration to be used inside the scroll strategy.\n     */\n    close = config => new CloseScrollStrategy(this._scrollDispatcher, this._ngZone, this._viewportRuler, config);\n    /** Block scrolling. */\n    block = () => new BlockScrollStrategy(this._viewportRuler, this._document);\n    /**\n     * Update the overlay's position on scroll.\n     * @param config Configuration to be used inside the scroll strategy.\n     * Allows debouncing the reposition calls.\n     */\n    reposition = config => new RepositionScrollStrategy(this._scrollDispatcher, this._viewportRuler, this._ngZone, config);\n    static ɵfac = function ScrollStrategyOptions_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ScrollStrategyOptions)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: ScrollStrategyOptions,\n      factory: ScrollStrategyOptions.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return ScrollStrategyOptions;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Initial configuration used when creating an overlay. */\nclass OverlayConfig {\n  /** Strategy with which to position the overlay. */\n  positionStrategy;\n  /** Strategy to be used when handling scroll events while the overlay is open. */\n  scrollStrategy = /*#__PURE__*/new NoopScrollStrategy();\n  /** Custom class to add to the overlay pane. */\n  panelClass = '';\n  /** Whether the overlay has a backdrop. */\n  hasBackdrop = false;\n  /** Custom class to add to the backdrop */\n  backdropClass = 'cdk-overlay-dark-backdrop';\n  /** The width of the overlay panel. If a number is provided, pixel units are assumed. */\n  width;\n  /** The height of the overlay panel. If a number is provided, pixel units are assumed. */\n  height;\n  /** The min-width of the overlay panel. If a number is provided, pixel units are assumed. */\n  minWidth;\n  /** The min-height of the overlay panel. If a number is provided, pixel units are assumed. */\n  minHeight;\n  /** The max-width of the overlay panel. If a number is provided, pixel units are assumed. */\n  maxWidth;\n  /** The max-height of the overlay panel. If a number is provided, pixel units are assumed. */\n  maxHeight;\n  /**\n   * Direction of the text in the overlay panel. If a `Directionality` instance\n   * is passed in, the overlay will handle changes to its value automatically.\n   */\n  direction;\n  /**\n   * Whether the overlay should be disposed of when the user goes backwards/forwards in history.\n   * Note that this usually doesn't include clicking on links (unless the user is using\n   * the `HashLocationStrategy`).\n   */\n  disposeOnNavigation = false;\n  constructor(config) {\n    if (config) {\n      // Use `Iterable` instead of `Array` because TypeScript, as of 3.6.3,\n      // loses the array generic type in the `for of`. But we *also* have to use `Array` because\n      // typescript won't iterate over an `Iterable` unless you compile with `--downlevelIteration`\n      const configKeys = Object.keys(config);\n      for (const key of configKeys) {\n        if (config[key] !== undefined) {\n          // TypeScript, as of version 3.5, sees the left-hand-side of this expression\n          // as \"I don't know *which* key this is, so the only valid value is the intersection\n          // of all the possible values.\" In this case, that happens to be `undefined`. TypeScript\n          // is not smart enough to see that the right-hand-side is actually an access of the same\n          // exact type with the same exact key, meaning that the value type must be identical.\n          // So we use `any` to work around this.\n          this[key] = config[key];\n        }\n      }\n    }\n  }\n}\n\n/** The points of the origin element and the overlay element to connect. */\nclass ConnectionPositionPair {\n  offsetX;\n  offsetY;\n  panelClass;\n  /** X-axis attachment point for connected overlay origin. Can be 'start', 'end', or 'center'. */\n  originX;\n  /** Y-axis attachment point for connected overlay origin. Can be 'top', 'bottom', or 'center'. */\n  originY;\n  /** X-axis attachment point for connected overlay. Can be 'start', 'end', or 'center'. */\n  overlayX;\n  /** Y-axis attachment point for connected overlay. Can be 'top', 'bottom', or 'center'. */\n  overlayY;\n  constructor(origin, overlay, /** Offset along the X axis. */\n  offsetX, /** Offset along the Y axis. */\n  offsetY, /** Class(es) to be applied to the panel while this position is active. */\n  panelClass) {\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    this.panelClass = panelClass;\n    this.originX = origin.originX;\n    this.originY = origin.originY;\n    this.overlayX = overlay.overlayX;\n    this.overlayY = overlay.overlayY;\n  }\n}\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n *       -----------                    -----------\n *       | outside |                    | clipped |\n *       |  view   |              --------------------------\n *       |         |              |     |         |        |\n *       ----------               |     -----------        |\n *  --------------------------    |                        |\n *  |                        |    |      Scrollable        |\n *  |                        |    |                        |\n *  |                        |     --------------------------\n *  |      Scrollable        |\n *  |                        |\n *  --------------------------\n *\n *  @docs-private\n */\nclass ScrollingVisibility {\n  isOriginClipped;\n  isOriginOutsideView;\n  isOverlayClipped;\n  isOverlayOutsideView;\n}\n/** The change event emitted by the strategy when a fallback position is used. */\nclass ConnectedOverlayPositionChange {\n  connectionPair;\n  scrollableViewProperties;\n  constructor(/** The position used as a result of this change. */\n  connectionPair, /** @docs-private */\n  scrollableViewProperties) {\n    this.connectionPair = connectionPair;\n    this.scrollableViewProperties = scrollableViewProperties;\n  }\n}\n/**\n * Validates whether a vertical position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateVerticalPosition(property, value) {\n  if (value !== 'top' && value !== 'bottom' && value !== 'center') {\n    throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"top\", \"bottom\" or \"center\".`);\n  }\n}\n/**\n * Validates whether a horizontal position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateHorizontalPosition(property, value) {\n  if (value !== 'start' && value !== 'end' && value !== 'center') {\n    throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"start\", \"end\" or \"center\".`);\n  }\n}\n\n/**\n * Service for dispatching events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet BaseOverlayDispatcher = /*#__PURE__*/(() => {\n  class BaseOverlayDispatcher {\n    /** Currently attached overlays in the order they were attached. */\n    _attachedOverlays = [];\n    _document = inject(DOCUMENT);\n    _isAttached;\n    constructor() {}\n    ngOnDestroy() {\n      this.detach();\n    }\n    /** Add a new overlay to the list of attached overlay refs. */\n    add(overlayRef) {\n      // Ensure that we don't get the same overlay multiple times.\n      this.remove(overlayRef);\n      this._attachedOverlays.push(overlayRef);\n    }\n    /** Remove an overlay from the list of attached overlay refs. */\n    remove(overlayRef) {\n      const index = this._attachedOverlays.indexOf(overlayRef);\n      if (index > -1) {\n        this._attachedOverlays.splice(index, 1);\n      }\n      // Remove the global listener once there are no more overlays.\n      if (this._attachedOverlays.length === 0) {\n        this.detach();\n      }\n    }\n    static ɵfac = function BaseOverlayDispatcher_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BaseOverlayDispatcher)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: BaseOverlayDispatcher,\n      factory: BaseOverlayDispatcher.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return BaseOverlayDispatcher;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching keyboard events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayKeyboardDispatcher = /*#__PURE__*/(() => {\n  class OverlayKeyboardDispatcher extends BaseOverlayDispatcher {\n    _ngZone = inject(NgZone);\n    _renderer = inject(RendererFactory2).createRenderer(null, null);\n    _cleanupKeydown;\n    /** Add a new overlay to the list of attached overlay refs. */\n    add(overlayRef) {\n      super.add(overlayRef);\n      // Lazily start dispatcher once first overlay is added\n      if (!this._isAttached) {\n        this._ngZone.runOutsideAngular(() => {\n          this._cleanupKeydown = this._renderer.listen('body', 'keydown', this._keydownListener);\n        });\n        this._isAttached = true;\n      }\n    }\n    /** Detaches the global keyboard event listener. */\n    detach() {\n      if (this._isAttached) {\n        this._cleanupKeydown?.();\n        this._isAttached = false;\n      }\n    }\n    /** Keyboard event listener that will be attached to the body. */\n    _keydownListener = event => {\n      const overlays = this._attachedOverlays;\n      for (let i = overlays.length - 1; i > -1; i--) {\n        // Dispatch the keydown event to the top overlay which has subscribers to its keydown events.\n        // We want to target the most recent overlay, rather than trying to match where the event came\n        // from, because some components might open an overlay, but keep focus on a trigger element\n        // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,\n        // because we don't want overlays that don't handle keyboard events to block the ones below\n        // them that do.\n        if (overlays[i]._keydownEvents.observers.length > 0) {\n          this._ngZone.run(() => overlays[i]._keydownEvents.next(event));\n          break;\n        }\n      }\n    };\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵOverlayKeyboardDispatcher_BaseFactory;\n      return function OverlayKeyboardDispatcher_Factory(__ngFactoryType__) {\n        return (ɵOverlayKeyboardDispatcher_BaseFactory || (ɵOverlayKeyboardDispatcher_BaseFactory = i0.ɵɵgetInheritedFactory(OverlayKeyboardDispatcher)))(__ngFactoryType__ || OverlayKeyboardDispatcher);\n      };\n    })();\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: OverlayKeyboardDispatcher,\n      factory: OverlayKeyboardDispatcher.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return OverlayKeyboardDispatcher;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching mouse click events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayOutsideClickDispatcher = /*#__PURE__*/(() => {\n  class OverlayOutsideClickDispatcher extends BaseOverlayDispatcher {\n    _platform = inject(Platform);\n    _ngZone = inject(NgZone);\n    _renderer = inject(RendererFactory2).createRenderer(null, null);\n    _cursorOriginalValue;\n    _cursorStyleIsSet = false;\n    _pointerDownEventTarget;\n    _cleanups;\n    /** Add a new overlay to the list of attached overlay refs. */\n    add(overlayRef) {\n      super.add(overlayRef);\n      // Safari on iOS does not generate click events for non-interactive\n      // elements. However, we want to receive a click for any element outside\n      // the overlay. We can force a \"clickable\" state by setting\n      // `cursor: pointer` on the document body. See:\n      // https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile\n      // https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n      if (!this._isAttached) {\n        const body = this._document.body;\n        const eventOptions = {\n          capture: true\n        };\n        this._cleanups = this._ngZone.runOutsideAngular(() => [_bindEventWithOptions(this._renderer, body, 'pointerdown', this._pointerDownListener, eventOptions), _bindEventWithOptions(this._renderer, body, 'click', this._clickListener, eventOptions), _bindEventWithOptions(this._renderer, body, 'auxclick', this._clickListener, eventOptions), _bindEventWithOptions(this._renderer, body, 'contextmenu', this._clickListener, eventOptions)]);\n        // click event is not fired on iOS. To make element \"clickable\" we are\n        // setting the cursor to pointer\n        if (this._platform.IOS && !this._cursorStyleIsSet) {\n          this._cursorOriginalValue = body.style.cursor;\n          body.style.cursor = 'pointer';\n          this._cursorStyleIsSet = true;\n        }\n        this._isAttached = true;\n      }\n    }\n    /** Detaches the global keyboard event listener. */\n    detach() {\n      if (this._isAttached) {\n        this._cleanups?.forEach(cleanup => cleanup());\n        this._cleanups = undefined;\n        if (this._platform.IOS && this._cursorStyleIsSet) {\n          this._document.body.style.cursor = this._cursorOriginalValue;\n          this._cursorStyleIsSet = false;\n        }\n        this._isAttached = false;\n      }\n    }\n    /** Store pointerdown event target to track origin of click. */\n    _pointerDownListener = event => {\n      this._pointerDownEventTarget = _getEventTarget(event);\n    };\n    /** Click event listener that will be attached to the body propagate phase. */\n    _clickListener = event => {\n      const target = _getEventTarget(event);\n      // In case of a click event, we want to check the origin of the click\n      // (e.g. in case where a user starts a click inside the overlay and\n      // releases the click outside of it).\n      // This is done by using the event target of the preceding pointerdown event.\n      // Every click event caused by a pointer device has a preceding pointerdown\n      // event, unless the click was programmatically triggered (e.g. in a unit test).\n      const origin = event.type === 'click' && this._pointerDownEventTarget ? this._pointerDownEventTarget : target;\n      // Reset the stored pointerdown event target, to avoid having it interfere\n      // in subsequent events.\n      this._pointerDownEventTarget = null;\n      // We copy the array because the original may be modified asynchronously if the\n      // outsidePointerEvents listener decides to detach overlays resulting in index errors inside\n      // the for loop.\n      const overlays = this._attachedOverlays.slice();\n      // Dispatch the mouse event to the top overlay which has subscribers to its mouse events.\n      // We want to target all overlays for which the click could be considered as outside click.\n      // As soon as we reach an overlay for which the click is not outside click we break off\n      // the loop.\n      for (let i = overlays.length - 1; i > -1; i--) {\n        const overlayRef = overlays[i];\n        if (overlayRef._outsidePointerEvents.observers.length < 1 || !overlayRef.hasAttached()) {\n          continue;\n        }\n        // If it's a click inside the overlay, just break - we should do nothing\n        // If it's an outside click (both origin and target of the click) dispatch the mouse event,\n        // and proceed with the next overlay\n        if (containsPierceShadowDom(overlayRef.overlayElement, target) || containsPierceShadowDom(overlayRef.overlayElement, origin)) {\n          break;\n        }\n        const outsidePointerEvents = overlayRef._outsidePointerEvents;\n        /** @breaking-change 14.0.0 _ngZone will be required. */\n        if (this._ngZone) {\n          this._ngZone.run(() => outsidePointerEvents.next(event));\n        } else {\n          outsidePointerEvents.next(event);\n        }\n      }\n    };\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵOverlayOutsideClickDispatcher_BaseFactory;\n      return function OverlayOutsideClickDispatcher_Factory(__ngFactoryType__) {\n        return (ɵOverlayOutsideClickDispatcher_BaseFactory || (ɵOverlayOutsideClickDispatcher_BaseFactory = i0.ɵɵgetInheritedFactory(OverlayOutsideClickDispatcher)))(__ngFactoryType__ || OverlayOutsideClickDispatcher);\n      };\n    })();\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: OverlayOutsideClickDispatcher,\n      factory: OverlayOutsideClickDispatcher.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return OverlayOutsideClickDispatcher;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Version of `Element.contains` that transcends shadow DOM boundaries. */\nfunction containsPierceShadowDom(parent, child) {\n  const supportsShadowRoot = typeof ShadowRoot !== 'undefined' && ShadowRoot;\n  let current = child;\n  while (current) {\n    if (current === parent) {\n      return true;\n    }\n    current = supportsShadowRoot && current instanceof ShadowRoot ? current.host : current.parentNode;\n  }\n  return false;\n}\nlet _CdkOverlayStyleLoader = /*#__PURE__*/(() => {\n  class _CdkOverlayStyleLoader {\n    static ɵfac = function _CdkOverlayStyleLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _CdkOverlayStyleLoader)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: _CdkOverlayStyleLoader,\n      selectors: [[\"ng-component\"]],\n      hostAttrs: [\"cdk-overlay-style-loader\", \"\"],\n      decls: 0,\n      vars: 0,\n      template: function _CdkOverlayStyleLoader_Template(rf, ctx) {},\n      styles: [\".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return _CdkOverlayStyleLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Container inside which all overlays will render. */\nlet OverlayContainer = /*#__PURE__*/(() => {\n  class OverlayContainer {\n    _platform = inject(Platform);\n    _containerElement;\n    _document = inject(DOCUMENT);\n    _styleLoader = inject(_CdkPrivateStyleLoader);\n    constructor() {}\n    ngOnDestroy() {\n      this._containerElement?.remove();\n    }\n    /**\n     * This method returns the overlay container element. It will lazily\n     * create the element the first time it is called to facilitate using\n     * the container in non-browser environments.\n     * @returns the container element\n     */\n    getContainerElement() {\n      this._loadStyles();\n      if (!this._containerElement) {\n        this._createContainer();\n      }\n      return this._containerElement;\n    }\n    /**\n     * Create the overlay container element, which is simply a div\n     * with the 'cdk-overlay-container' class on the document body.\n     */\n    _createContainer() {\n      const containerClass = 'cdk-overlay-container';\n      // TODO(crisbeto): remove the testing check once we have an overlay testing\n      // module or Angular starts tearing down the testing `NgModule`. See:\n      // https://github.com/angular/angular/issues/18831\n      if (this._platform.isBrowser || _isTestEnvironment()) {\n        const oppositePlatformContainers = this._document.querySelectorAll(`.${containerClass}[platform=\"server\"], ` + `.${containerClass}[platform=\"test\"]`);\n        // Remove any old containers from the opposite platform.\n        // This can happen when transitioning from the server to the client.\n        for (let i = 0; i < oppositePlatformContainers.length; i++) {\n          oppositePlatformContainers[i].remove();\n        }\n      }\n      const container = this._document.createElement('div');\n      container.classList.add(containerClass);\n      // A long time ago we kept adding new overlay containers whenever a new app was instantiated,\n      // but at some point we added logic which clears the duplicate ones in order to avoid leaks.\n      // The new logic was a little too aggressive since it was breaking some legitimate use cases.\n      // To mitigate the problem we made it so that only containers from a different platform are\n      // cleared, but the side-effect was that people started depending on the overly-aggressive\n      // logic to clean up their tests for them. Until we can introduce an overlay-specific testing\n      // module which does the cleanup, we try to detect that we're in a test environment and we\n      // always clear the container. See #17006.\n      // TODO(crisbeto): remove the test environment check once we have an overlay testing module.\n      if (_isTestEnvironment()) {\n        container.setAttribute('platform', 'test');\n      } else if (!this._platform.isBrowser) {\n        container.setAttribute('platform', 'server');\n      }\n      this._document.body.appendChild(container);\n      this._containerElement = container;\n    }\n    /** Loads the structural styles necessary for the overlay to work. */\n    _loadStyles() {\n      this._styleLoader.load(_CdkOverlayStyleLoader);\n    }\n    static ɵfac = function OverlayContainer_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || OverlayContainer)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: OverlayContainer,\n      factory: OverlayContainer.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return OverlayContainer;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Encapsulates the logic for attaching and detaching a backdrop. */\nclass BackdropRef {\n  _renderer;\n  _ngZone;\n  element;\n  _cleanupClick;\n  _cleanupTransitionEnd;\n  _fallbackTimeout;\n  constructor(document, _renderer, _ngZone, onClick) {\n    this._renderer = _renderer;\n    this._ngZone = _ngZone;\n    this.element = document.createElement('div');\n    this.element.classList.add('cdk-overlay-backdrop');\n    this._cleanupClick = _renderer.listen(this.element, 'click', onClick);\n  }\n  detach() {\n    this._ngZone.runOutsideAngular(() => {\n      const element = this.element;\n      clearTimeout(this._fallbackTimeout);\n      this._cleanupTransitionEnd?.();\n      this._cleanupTransitionEnd = this._renderer.listen(element, 'transitionend', this.dispose);\n      this._fallbackTimeout = setTimeout(this.dispose, 500);\n      // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n      // In this case we make it unclickable and we try to remove it after a delay.\n      element.style.pointerEvents = 'none';\n      element.classList.remove('cdk-overlay-backdrop-showing');\n    });\n  }\n  dispose = () => {\n    clearTimeout(this._fallbackTimeout);\n    this._cleanupClick?.();\n    this._cleanupTransitionEnd?.();\n    this._cleanupClick = this._cleanupTransitionEnd = this._fallbackTimeout = undefined;\n    this.element.remove();\n  };\n}\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nclass OverlayRef {\n  _portalOutlet;\n  _host;\n  _pane;\n  _config;\n  _ngZone;\n  _keyboardDispatcher;\n  _document;\n  _location;\n  _outsideClickDispatcher;\n  _animationsDisabled;\n  _injector;\n  _renderer;\n  _backdropClick = /*#__PURE__*/new Subject();\n  _attachments = /*#__PURE__*/new Subject();\n  _detachments = /*#__PURE__*/new Subject();\n  _positionStrategy;\n  _scrollStrategy;\n  _locationChanges = Subscription.EMPTY;\n  _backdropRef = null;\n  /**\n   * Reference to the parent of the `_host` at the time it was detached. Used to restore\n   * the `_host` to its original position in the DOM when it gets re-attached.\n   */\n  _previousHostParent;\n  /** Stream of keydown events dispatched to this overlay. */\n  _keydownEvents = /*#__PURE__*/new Subject();\n  /** Stream of mouse outside events dispatched to this overlay. */\n  _outsidePointerEvents = /*#__PURE__*/new Subject();\n  _renders = /*#__PURE__*/new Subject();\n  _afterRenderRef;\n  /** Reference to the currently-running `afterNextRender` call. */\n  _afterNextRenderRef;\n  constructor(_portalOutlet, _host, _pane, _config, _ngZone, _keyboardDispatcher, _document, _location, _outsideClickDispatcher, _animationsDisabled = false, _injector, _renderer) {\n    this._portalOutlet = _portalOutlet;\n    this._host = _host;\n    this._pane = _pane;\n    this._config = _config;\n    this._ngZone = _ngZone;\n    this._keyboardDispatcher = _keyboardDispatcher;\n    this._document = _document;\n    this._location = _location;\n    this._outsideClickDispatcher = _outsideClickDispatcher;\n    this._animationsDisabled = _animationsDisabled;\n    this._injector = _injector;\n    this._renderer = _renderer;\n    if (_config.scrollStrategy) {\n      this._scrollStrategy = _config.scrollStrategy;\n      this._scrollStrategy.attach(this);\n    }\n    this._positionStrategy = _config.positionStrategy;\n    // Users could open the overlay from an `effect`, in which case we need to\n    // run the `afterRender` as `untracked`. We don't recommend that users do\n    // this, but we also don't want to break users who are doing it.\n    this._afterRenderRef = untracked(() => afterRender(() => {\n      this._renders.next();\n    }, {\n      injector: this._injector\n    }));\n  }\n  /** The overlay's HTML element */\n  get overlayElement() {\n    return this._pane;\n  }\n  /** The overlay's backdrop HTML element. */\n  get backdropElement() {\n    return this._backdropRef?.element || null;\n  }\n  /**\n   * Wrapper around the panel element. Can be used for advanced\n   * positioning where a wrapper with specific styling is\n   * required around the overlay pane.\n   */\n  get hostElement() {\n    return this._host;\n  }\n  /**\n   * Attaches content, given via a Portal, to the overlay.\n   * If the overlay is configured to have a backdrop, it will be created.\n   *\n   * @param portal Portal instance to which to attach the overlay.\n   * @returns The portal attachment result.\n   */\n  attach(portal) {\n    // Insert the host into the DOM before attaching the portal, otherwise\n    // the animations module will skip animations on repeat attachments.\n    if (!this._host.parentElement && this._previousHostParent) {\n      this._previousHostParent.appendChild(this._host);\n    }\n    const attachResult = this._portalOutlet.attach(portal);\n    if (this._positionStrategy) {\n      this._positionStrategy.attach(this);\n    }\n    this._updateStackingOrder();\n    this._updateElementSize();\n    this._updateElementDirection();\n    if (this._scrollStrategy) {\n      this._scrollStrategy.enable();\n    }\n    // We need to clean this up ourselves, because we're passing in an\n    // `EnvironmentInjector` below which won't ever be destroyed.\n    // Otherwise it causes some callbacks to be retained (see #29696).\n    this._afterNextRenderRef?.destroy();\n    // Update the position once the overlay is fully rendered before attempting to position it,\n    // as the position may depend on the size of the rendered content.\n    this._afterNextRenderRef = afterNextRender(() => {\n      // The overlay could've been detached before the callback executed.\n      if (this.hasAttached()) {\n        this.updatePosition();\n      }\n    }, {\n      injector: this._injector\n    });\n    // Enable pointer events for the overlay pane element.\n    this._togglePointerEvents(true);\n    if (this._config.hasBackdrop) {\n      this._attachBackdrop();\n    }\n    if (this._config.panelClass) {\n      this._toggleClasses(this._pane, this._config.panelClass, true);\n    }\n    // Only emit the `attachments` event once all other setup is done.\n    this._attachments.next();\n    // Track this overlay by the keyboard dispatcher\n    this._keyboardDispatcher.add(this);\n    if (this._config.disposeOnNavigation) {\n      this._locationChanges = this._location.subscribe(() => this.dispose());\n    }\n    this._outsideClickDispatcher.add(this);\n    // TODO(crisbeto): the null check is here, because the portal outlet returns `any`.\n    // We should be guaranteed for the result to be `ComponentRef | EmbeddedViewRef`, but\n    // `instanceof EmbeddedViewRef` doesn't appear to work at the moment.\n    if (typeof attachResult?.onDestroy === 'function') {\n      // In most cases we control the portal and we know when it is being detached so that\n      // we can finish the disposal process. The exception is if the user passes in a custom\n      // `ViewContainerRef` that isn't destroyed through the overlay API. Note that we use\n      // `detach` here instead of `dispose`, because we don't know if the user intends to\n      // reattach the overlay at a later point. It also has the advantage of waiting for animations.\n      attachResult.onDestroy(() => {\n        if (this.hasAttached()) {\n          // We have to delay the `detach` call, because detaching immediately prevents\n          // other destroy hooks from running. This is likely a framework bug similar to\n          // https://github.com/angular/angular/issues/46119\n          this._ngZone.runOutsideAngular(() => Promise.resolve().then(() => this.detach()));\n        }\n      });\n    }\n    return attachResult;\n  }\n  /**\n   * Detaches an overlay from a portal.\n   * @returns The portal detachment result.\n   */\n  detach() {\n    if (!this.hasAttached()) {\n      return;\n    }\n    this.detachBackdrop();\n    // When the overlay is detached, the pane element should disable pointer events.\n    // This is necessary because otherwise the pane element will cover the page and disable\n    // pointer events therefore. Depends on the position strategy and the applied pane boundaries.\n    this._togglePointerEvents(false);\n    if (this._positionStrategy && this._positionStrategy.detach) {\n      this._positionStrategy.detach();\n    }\n    if (this._scrollStrategy) {\n      this._scrollStrategy.disable();\n    }\n    const detachmentResult = this._portalOutlet.detach();\n    // Only emit after everything is detached.\n    this._detachments.next();\n    // Remove this overlay from keyboard dispatcher tracking.\n    this._keyboardDispatcher.remove(this);\n    // Keeping the host element in the DOM can cause scroll jank, because it still gets\n    // rendered, even though it's transparent and unclickable which is why we remove it.\n    this._detachContentWhenEmpty();\n    this._locationChanges.unsubscribe();\n    this._outsideClickDispatcher.remove(this);\n    return detachmentResult;\n  }\n  /** Cleans up the overlay from the DOM. */\n  dispose() {\n    const isAttached = this.hasAttached();\n    if (this._positionStrategy) {\n      this._positionStrategy.dispose();\n    }\n    this._disposeScrollStrategy();\n    this._backdropRef?.dispose();\n    this._locationChanges.unsubscribe();\n    this._keyboardDispatcher.remove(this);\n    this._portalOutlet.dispose();\n    this._attachments.complete();\n    this._backdropClick.complete();\n    this._keydownEvents.complete();\n    this._outsidePointerEvents.complete();\n    this._outsideClickDispatcher.remove(this);\n    this._host?.remove();\n    this._afterNextRenderRef?.destroy();\n    this._previousHostParent = this._pane = this._host = this._backdropRef = null;\n    if (isAttached) {\n      this._detachments.next();\n    }\n    this._detachments.complete();\n    this._afterRenderRef.destroy();\n    this._renders.complete();\n  }\n  /** Whether the overlay has attached content. */\n  hasAttached() {\n    return this._portalOutlet.hasAttached();\n  }\n  /** Gets an observable that emits when the backdrop has been clicked. */\n  backdropClick() {\n    return this._backdropClick;\n  }\n  /** Gets an observable that emits when the overlay has been attached. */\n  attachments() {\n    return this._attachments;\n  }\n  /** Gets an observable that emits when the overlay has been detached. */\n  detachments() {\n    return this._detachments;\n  }\n  /** Gets an observable of keydown events targeted to this overlay. */\n  keydownEvents() {\n    return this._keydownEvents;\n  }\n  /** Gets an observable of pointer events targeted outside this overlay. */\n  outsidePointerEvents() {\n    return this._outsidePointerEvents;\n  }\n  /** Gets the current overlay configuration, which is immutable. */\n  getConfig() {\n    return this._config;\n  }\n  /** Updates the position of the overlay based on the position strategy. */\n  updatePosition() {\n    if (this._positionStrategy) {\n      this._positionStrategy.apply();\n    }\n  }\n  /** Switches to a new position strategy and updates the overlay position. */\n  updatePositionStrategy(strategy) {\n    if (strategy === this._positionStrategy) {\n      return;\n    }\n    if (this._positionStrategy) {\n      this._positionStrategy.dispose();\n    }\n    this._positionStrategy = strategy;\n    if (this.hasAttached()) {\n      strategy.attach(this);\n      this.updatePosition();\n    }\n  }\n  /** Update the size properties of the overlay. */\n  updateSize(sizeConfig) {\n    this._config = {\n      ...this._config,\n      ...sizeConfig\n    };\n    this._updateElementSize();\n  }\n  /** Sets the LTR/RTL direction for the overlay. */\n  setDirection(dir) {\n    this._config = {\n      ...this._config,\n      direction: dir\n    };\n    this._updateElementDirection();\n  }\n  /** Add a CSS class or an array of classes to the overlay pane. */\n  addPanelClass(classes) {\n    if (this._pane) {\n      this._toggleClasses(this._pane, classes, true);\n    }\n  }\n  /** Remove a CSS class or an array of classes from the overlay pane. */\n  removePanelClass(classes) {\n    if (this._pane) {\n      this._toggleClasses(this._pane, classes, false);\n    }\n  }\n  /**\n   * Returns the layout direction of the overlay panel.\n   */\n  getDirection() {\n    const direction = this._config.direction;\n    if (!direction) {\n      return 'ltr';\n    }\n    return typeof direction === 'string' ? direction : direction.value;\n  }\n  /** Switches to a new scroll strategy. */\n  updateScrollStrategy(strategy) {\n    if (strategy === this._scrollStrategy) {\n      return;\n    }\n    this._disposeScrollStrategy();\n    this._scrollStrategy = strategy;\n    if (this.hasAttached()) {\n      strategy.attach(this);\n      strategy.enable();\n    }\n  }\n  /** Updates the text direction of the overlay panel. */\n  _updateElementDirection() {\n    this._host.setAttribute('dir', this.getDirection());\n  }\n  /** Updates the size of the overlay element based on the overlay config. */\n  _updateElementSize() {\n    if (!this._pane) {\n      return;\n    }\n    const style = this._pane.style;\n    style.width = coerceCssPixelValue(this._config.width);\n    style.height = coerceCssPixelValue(this._config.height);\n    style.minWidth = coerceCssPixelValue(this._config.minWidth);\n    style.minHeight = coerceCssPixelValue(this._config.minHeight);\n    style.maxWidth = coerceCssPixelValue(this._config.maxWidth);\n    style.maxHeight = coerceCssPixelValue(this._config.maxHeight);\n  }\n  /** Toggles the pointer events for the overlay pane element. */\n  _togglePointerEvents(enablePointer) {\n    this._pane.style.pointerEvents = enablePointer ? '' : 'none';\n  }\n  /** Attaches a backdrop for this overlay. */\n  _attachBackdrop() {\n    const showingClass = 'cdk-overlay-backdrop-showing';\n    this._backdropRef?.dispose();\n    this._backdropRef = new BackdropRef(this._document, this._renderer, this._ngZone, event => {\n      this._backdropClick.next(event);\n    });\n    if (this._animationsDisabled) {\n      this._backdropRef.element.classList.add('cdk-overlay-backdrop-noop-animation');\n    }\n    if (this._config.backdropClass) {\n      this._toggleClasses(this._backdropRef.element, this._config.backdropClass, true);\n    }\n    // Insert the backdrop before the pane in the DOM order,\n    // in order to handle stacked overlays properly.\n    this._host.parentElement.insertBefore(this._backdropRef.element, this._host);\n    // Add class to fade-in the backdrop after one frame.\n    if (!this._animationsDisabled && typeof requestAnimationFrame !== 'undefined') {\n      this._ngZone.runOutsideAngular(() => {\n        requestAnimationFrame(() => this._backdropRef?.element.classList.add(showingClass));\n      });\n    } else {\n      this._backdropRef.element.classList.add(showingClass);\n    }\n  }\n  /**\n   * Updates the stacking order of the element, moving it to the top if necessary.\n   * This is required in cases where one overlay was detached, while another one,\n   * that should be behind it, was destroyed. The next time both of them are opened,\n   * the stacking will be wrong, because the detached element's pane will still be\n   * in its original DOM position.\n   */\n  _updateStackingOrder() {\n    if (this._host.nextSibling) {\n      this._host.parentNode.appendChild(this._host);\n    }\n  }\n  /** Detaches the backdrop (if any) associated with the overlay. */\n  detachBackdrop() {\n    if (this._animationsDisabled) {\n      this._backdropRef?.dispose();\n      this._backdropRef = null;\n    } else {\n      this._backdropRef?.detach();\n    }\n  }\n  /** Toggles a single CSS class or an array of classes on an element. */\n  _toggleClasses(element, cssClasses, isAdd) {\n    const classes = coerceArray(cssClasses || []).filter(c => !!c);\n    if (classes.length) {\n      isAdd ? element.classList.add(...classes) : element.classList.remove(...classes);\n    }\n  }\n  /** Detaches the overlay content next time the zone stabilizes. */\n  _detachContentWhenEmpty() {\n    // Normally we wouldn't have to explicitly run this outside the `NgZone`, however\n    // if the consumer is using `zone-patch-rxjs`, the `Subscription.unsubscribe` call will\n    // be patched to run inside the zone, which will throw us into an infinite loop.\n    this._ngZone.runOutsideAngular(() => {\n      // We can't remove the host here immediately, because the overlay pane's content\n      // might still be animating. This stream helps us avoid interrupting the animation\n      // by waiting for the pane to become empty.\n      const subscription = this._renders.pipe(takeUntil(merge(this._attachments, this._detachments))).subscribe(() => {\n        // Needs a couple of checks for the pane and host, because\n        // they may have been removed by the time the zone stabilizes.\n        if (!this._pane || !this._host || this._pane.children.length === 0) {\n          if (this._pane && this._config.panelClass) {\n            this._toggleClasses(this._pane, this._config.panelClass, false);\n          }\n          if (this._host && this._host.parentElement) {\n            this._previousHostParent = this._host.parentElement;\n            this._host.remove();\n          }\n          subscription.unsubscribe();\n        }\n      });\n    });\n  }\n  /** Disposes of a scroll strategy. */\n  _disposeScrollStrategy() {\n    const scrollStrategy = this._scrollStrategy;\n    scrollStrategy?.disable();\n    scrollStrategy?.detach?.();\n  }\n}\n\n// TODO: refactor clipping detection into a separate thing (part of scrolling module)\n// TODO: doesn't handle both flexible width and height when it has to scroll along both axis.\n/** Class to be added to the overlay bounding box. */\nconst boundingBoxClass = 'cdk-overlay-connected-position-bounding-box';\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nclass FlexibleConnectedPositionStrategy {\n  _viewportRuler;\n  _document;\n  _platform;\n  _overlayContainer;\n  /** The overlay to which this strategy is attached. */\n  _overlayRef;\n  /** Whether we're performing the very first positioning of the overlay. */\n  _isInitialRender;\n  /** Last size used for the bounding box. Used to avoid resizing the overlay after open. */\n  _lastBoundingBoxSize = {\n    width: 0,\n    height: 0\n  };\n  /** Whether the overlay was pushed in a previous positioning. */\n  _isPushed = false;\n  /** Whether the overlay can be pushed on-screen on the initial open. */\n  _canPush = true;\n  /** Whether the overlay can grow via flexible width/height after the initial open. */\n  _growAfterOpen = false;\n  /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n  _hasFlexibleDimensions = true;\n  /** Whether the overlay position is locked. */\n  _positionLocked = false;\n  /** Cached origin dimensions */\n  _originRect;\n  /** Cached overlay dimensions */\n  _overlayRect;\n  /** Cached viewport dimensions */\n  _viewportRect;\n  /** Cached container dimensions */\n  _containerRect;\n  /** Amount of space that must be maintained between the overlay and the edge of the viewport. */\n  _viewportMargin = 0;\n  /** The Scrollable containers used to check scrollable view properties on position change. */\n  _scrollables = [];\n  /** Ordered list of preferred positions, from most to least desirable. */\n  _preferredPositions = [];\n  /** The origin element against which the overlay will be positioned. */\n  _origin;\n  /** The overlay pane element. */\n  _pane;\n  /** Whether the strategy has been disposed of already. */\n  _isDisposed;\n  /**\n   * Parent element for the overlay panel used to constrain the overlay panel's size to fit\n   * within the viewport.\n   */\n  _boundingBox;\n  /** The last position to have been calculated as the best fit position. */\n  _lastPosition;\n  /** The last calculated scroll visibility. Only tracked  */\n  _lastScrollVisibility;\n  /** Subject that emits whenever the position changes. */\n  _positionChanges = /*#__PURE__*/new Subject();\n  /** Subscription to viewport size changes. */\n  _resizeSubscription = Subscription.EMPTY;\n  /** Default offset for the overlay along the x axis. */\n  _offsetX = 0;\n  /** Default offset for the overlay along the y axis. */\n  _offsetY = 0;\n  /** Selector to be used when finding the elements on which to set the transform origin. */\n  _transformOriginSelector;\n  /** Keeps track of the CSS classes that the position strategy has applied on the overlay panel. */\n  _appliedPanelClasses = [];\n  /** Amount by which the overlay was pushed in each axis during the last time it was positioned. */\n  _previousPushAmount;\n  /** Observable sequence of position changes. */\n  positionChanges = this._positionChanges;\n  /** Ordered list of preferred positions, from most to least desirable. */\n  get positions() {\n    return this._preferredPositions;\n  }\n  constructor(connectedTo, _viewportRuler, _document, _platform, _overlayContainer) {\n    this._viewportRuler = _viewportRuler;\n    this._document = _document;\n    this._platform = _platform;\n    this._overlayContainer = _overlayContainer;\n    this.setOrigin(connectedTo);\n  }\n  /** Attaches this position strategy to an overlay. */\n  attach(overlayRef) {\n    if (this._overlayRef && overlayRef !== this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw Error('This position strategy is already attached to an overlay');\n    }\n    this._validatePositions();\n    overlayRef.hostElement.classList.add(boundingBoxClass);\n    this._overlayRef = overlayRef;\n    this._boundingBox = overlayRef.hostElement;\n    this._pane = overlayRef.overlayElement;\n    this._isDisposed = false;\n    this._isInitialRender = true;\n    this._lastPosition = null;\n    this._resizeSubscription.unsubscribe();\n    this._resizeSubscription = this._viewportRuler.change().subscribe(() => {\n      // When the window is resized, we want to trigger the next reposition as if it\n      // was an initial render, in order for the strategy to pick a new optimal position,\n      // otherwise position locking will cause it to stay at the old one.\n      this._isInitialRender = true;\n      this.apply();\n    });\n  }\n  /**\n   * Updates the position of the overlay element, using whichever preferred position relative\n   * to the origin best fits on-screen.\n   *\n   * The selection of a position goes as follows:\n   *  - If any positions fit completely within the viewport as-is,\n   *      choose the first position that does so.\n   *  - If flexible dimensions are enabled and at least one satisfies the given minimum width/height,\n   *      choose the position with the greatest available size modified by the positions' weight.\n   *  - If pushing is enabled, take the position that went off-screen the least and push it\n   *      on-screen.\n   *  - If none of the previous criteria were met, use the position that goes off-screen the least.\n   * @docs-private\n   */\n  apply() {\n    // We shouldn't do anything if the strategy was disposed or we're on the server.\n    if (this._isDisposed || !this._platform.isBrowser) {\n      return;\n    }\n    // If the position has been applied already (e.g. when the overlay was opened) and the\n    // consumer opted into locking in the position, re-use the old position, in order to\n    // prevent the overlay from jumping around.\n    if (!this._isInitialRender && this._positionLocked && this._lastPosition) {\n      this.reapplyLastPosition();\n      return;\n    }\n    this._clearPanelClasses();\n    this._resetOverlayElementStyles();\n    this._resetBoundingBoxStyles();\n    // We need the bounding rects for the origin, the overlay and the container to determine how to position\n    // the overlay relative to the origin.\n    // We use the viewport rect to determine whether a position would go off-screen.\n    this._viewportRect = this._getNarrowedViewportRect();\n    this._originRect = this._getOriginRect();\n    this._overlayRect = this._pane.getBoundingClientRect();\n    this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n    const originRect = this._originRect;\n    const overlayRect = this._overlayRect;\n    const viewportRect = this._viewportRect;\n    const containerRect = this._containerRect;\n    // Positions where the overlay will fit with flexible dimensions.\n    const flexibleFits = [];\n    // Fallback if none of the preferred positions fit within the viewport.\n    let fallback;\n    // Go through each of the preferred positions looking for a good fit.\n    // If a good fit is found, it will be applied immediately.\n    for (let pos of this._preferredPositions) {\n      // Get the exact (x, y) coordinate for the point-of-origin on the origin element.\n      let originPoint = this._getOriginPoint(originRect, containerRect, pos);\n      // From that point-of-origin, get the exact (x, y) coordinate for the top-left corner of the\n      // overlay in this position. We use the top-left corner for calculations and later translate\n      // this into an appropriate (top, left, bottom, right) style.\n      let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n      // Calculate how well the overlay would fit into the viewport with this point.\n      let overlayFit = this._getOverlayFit(overlayPoint, overlayRect, viewportRect, pos);\n      // If the overlay, without any further work, fits into the viewport, use this position.\n      if (overlayFit.isCompletelyWithinViewport) {\n        this._isPushed = false;\n        this._applyPosition(pos, originPoint);\n        return;\n      }\n      // If the overlay has flexible dimensions, we can use this position\n      // so long as there's enough space for the minimum dimensions.\n      if (this._canFitWithFlexibleDimensions(overlayFit, overlayPoint, viewportRect)) {\n        // Save positions where the overlay will fit with flexible dimensions. We will use these\n        // if none of the positions fit *without* flexible dimensions.\n        flexibleFits.push({\n          position: pos,\n          origin: originPoint,\n          overlayRect,\n          boundingBoxRect: this._calculateBoundingBoxRect(originPoint, pos)\n        });\n        continue;\n      }\n      // If the current preferred position does not fit on the screen, remember the position\n      // if it has more visible area on-screen than we've seen and move onto the next preferred\n      // position.\n      if (!fallback || fallback.overlayFit.visibleArea < overlayFit.visibleArea) {\n        fallback = {\n          overlayFit,\n          overlayPoint,\n          originPoint,\n          position: pos,\n          overlayRect\n        };\n      }\n    }\n    // If there are any positions where the overlay would fit with flexible dimensions, choose the\n    // one that has the greatest area available modified by the position's weight\n    if (flexibleFits.length) {\n      let bestFit = null;\n      let bestScore = -1;\n      for (const fit of flexibleFits) {\n        const score = fit.boundingBoxRect.width * fit.boundingBoxRect.height * (fit.position.weight || 1);\n        if (score > bestScore) {\n          bestScore = score;\n          bestFit = fit;\n        }\n      }\n      this._isPushed = false;\n      this._applyPosition(bestFit.position, bestFit.origin);\n      return;\n    }\n    // When none of the preferred positions fit within the viewport, take the position\n    // that went off-screen the least and attempt to push it on-screen.\n    if (this._canPush) {\n      // TODO(jelbourn): after pushing, the opening \"direction\" of the overlay might not make sense.\n      this._isPushed = true;\n      this._applyPosition(fallback.position, fallback.originPoint);\n      return;\n    }\n    // All options for getting the overlay within the viewport have been exhausted, so go with the\n    // position that went off-screen the least.\n    this._applyPosition(fallback.position, fallback.originPoint);\n  }\n  detach() {\n    this._clearPanelClasses();\n    this._lastPosition = null;\n    this._previousPushAmount = null;\n    this._resizeSubscription.unsubscribe();\n  }\n  /** Cleanup after the element gets destroyed. */\n  dispose() {\n    if (this._isDisposed) {\n      return;\n    }\n    // We can't use `_resetBoundingBoxStyles` here, because it resets\n    // some properties to zero, rather than removing them.\n    if (this._boundingBox) {\n      extendStyles(this._boundingBox.style, {\n        top: '',\n        left: '',\n        right: '',\n        bottom: '',\n        height: '',\n        width: '',\n        alignItems: '',\n        justifyContent: ''\n      });\n    }\n    if (this._pane) {\n      this._resetOverlayElementStyles();\n    }\n    if (this._overlayRef) {\n      this._overlayRef.hostElement.classList.remove(boundingBoxClass);\n    }\n    this.detach();\n    this._positionChanges.complete();\n    this._overlayRef = this._boundingBox = null;\n    this._isDisposed = true;\n  }\n  /**\n   * This re-aligns the overlay element with the trigger in its last calculated position,\n   * even if a position higher in the \"preferred positions\" list would now fit. This\n   * allows one to re-align the panel without changing the orientation of the panel.\n   */\n  reapplyLastPosition() {\n    if (this._isDisposed || !this._platform.isBrowser) {\n      return;\n    }\n    const lastPosition = this._lastPosition;\n    if (lastPosition) {\n      this._originRect = this._getOriginRect();\n      this._overlayRect = this._pane.getBoundingClientRect();\n      this._viewportRect = this._getNarrowedViewportRect();\n      this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n      const originPoint = this._getOriginPoint(this._originRect, this._containerRect, lastPosition);\n      this._applyPosition(lastPosition, originPoint);\n    } else {\n      this.apply();\n    }\n  }\n  /**\n   * Sets the list of Scrollable containers that host the origin element so that\n   * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n   * Scrollable must be an ancestor element of the strategy's origin element.\n   */\n  withScrollableContainers(scrollables) {\n    this._scrollables = scrollables;\n    return this;\n  }\n  /**\n   * Adds new preferred positions.\n   * @param positions List of positions options for this overlay.\n   */\n  withPositions(positions) {\n    this._preferredPositions = positions;\n    // If the last calculated position object isn't part of the positions anymore, clear\n    // it in order to avoid it being picked up if the consumer tries to re-apply.\n    if (positions.indexOf(this._lastPosition) === -1) {\n      this._lastPosition = null;\n    }\n    this._validatePositions();\n    return this;\n  }\n  /**\n   * Sets a minimum distance the overlay may be positioned to the edge of the viewport.\n   * @param margin Required margin between the overlay and the viewport edge in pixels.\n   */\n  withViewportMargin(margin) {\n    this._viewportMargin = margin;\n    return this;\n  }\n  /** Sets whether the overlay's width and height can be constrained to fit within the viewport. */\n  withFlexibleDimensions(flexibleDimensions = true) {\n    this._hasFlexibleDimensions = flexibleDimensions;\n    return this;\n  }\n  /** Sets whether the overlay can grow after the initial open via flexible width/height. */\n  withGrowAfterOpen(growAfterOpen = true) {\n    this._growAfterOpen = growAfterOpen;\n    return this;\n  }\n  /** Sets whether the overlay can be pushed on-screen if none of the provided positions fit. */\n  withPush(canPush = true) {\n    this._canPush = canPush;\n    return this;\n  }\n  /**\n   * Sets whether the overlay's position should be locked in after it is positioned\n   * initially. When an overlay is locked in, it won't attempt to reposition itself\n   * when the position is re-applied (e.g. when the user scrolls away).\n   * @param isLocked Whether the overlay should locked in.\n   */\n  withLockedPosition(isLocked = true) {\n    this._positionLocked = isLocked;\n    return this;\n  }\n  /**\n   * Sets the origin, relative to which to position the overlay.\n   * Using an element origin is useful for building components that need to be positioned\n   * relatively to a trigger (e.g. dropdown menus or tooltips), whereas using a point can be\n   * used for cases like contextual menus which open relative to the user's pointer.\n   * @param origin Reference to the new origin.\n   */\n  setOrigin(origin) {\n    this._origin = origin;\n    return this;\n  }\n  /**\n   * Sets the default offset for the overlay's connection point on the x-axis.\n   * @param offset New offset in the X axis.\n   */\n  withDefaultOffsetX(offset) {\n    this._offsetX = offset;\n    return this;\n  }\n  /**\n   * Sets the default offset for the overlay's connection point on the y-axis.\n   * @param offset New offset in the Y axis.\n   */\n  withDefaultOffsetY(offset) {\n    this._offsetY = offset;\n    return this;\n  }\n  /**\n   * Configures that the position strategy should set a `transform-origin` on some elements\n   * inside the overlay, depending on the current position that is being applied. This is\n   * useful for the cases where the origin of an animation can change depending on the\n   * alignment of the overlay.\n   * @param selector CSS selector that will be used to find the target\n   *    elements onto which to set the transform origin.\n   */\n  withTransformOriginOn(selector) {\n    this._transformOriginSelector = selector;\n    return this;\n  }\n  /**\n   * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n   */\n  _getOriginPoint(originRect, containerRect, pos) {\n    let x;\n    if (pos.originX == 'center') {\n      // Note: when centering we should always use the `left`\n      // offset, otherwise the position will be wrong in RTL.\n      x = originRect.left + originRect.width / 2;\n    } else {\n      const startX = this._isRtl() ? originRect.right : originRect.left;\n      const endX = this._isRtl() ? originRect.left : originRect.right;\n      x = pos.originX == 'start' ? startX : endX;\n    }\n    // When zooming in Safari the container rectangle contains negative values for the position\n    // and we need to re-add them to the calculated coordinates.\n    if (containerRect.left < 0) {\n      x -= containerRect.left;\n    }\n    let y;\n    if (pos.originY == 'center') {\n      y = originRect.top + originRect.height / 2;\n    } else {\n      y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n    }\n    // Normally the containerRect's top value would be zero, however when the overlay is attached to an input\n    // (e.g. in an autocomplete), mobile browsers will shift everything in order to put the input in the middle\n    // of the screen and to make space for the virtual keyboard. We need to account for this offset,\n    // otherwise our positioning will be thrown off.\n    // Additionally, when zooming in Safari this fixes the vertical position.\n    if (containerRect.top < 0) {\n      y -= containerRect.top;\n    }\n    return {\n      x,\n      y\n    };\n  }\n  /**\n   * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n   * origin point to which the overlay should be connected.\n   */\n  _getOverlayPoint(originPoint, overlayRect, pos) {\n    // Calculate the (overlayStartX, overlayStartY), the start of the\n    // potential overlay position relative to the origin point.\n    let overlayStartX;\n    if (pos.overlayX == 'center') {\n      overlayStartX = -overlayRect.width / 2;\n    } else if (pos.overlayX === 'start') {\n      overlayStartX = this._isRtl() ? -overlayRect.width : 0;\n    } else {\n      overlayStartX = this._isRtl() ? 0 : -overlayRect.width;\n    }\n    let overlayStartY;\n    if (pos.overlayY == 'center') {\n      overlayStartY = -overlayRect.height / 2;\n    } else {\n      overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n    }\n    // The (x, y) coordinates of the overlay.\n    return {\n      x: originPoint.x + overlayStartX,\n      y: originPoint.y + overlayStartY\n    };\n  }\n  /** Gets how well an overlay at the given point will fit within the viewport. */\n  _getOverlayFit(point, rawOverlayRect, viewport, position) {\n    // Round the overlay rect when comparing against the\n    // viewport, because the viewport is always rounded.\n    const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n    let {\n      x,\n      y\n    } = point;\n    let offsetX = this._getOffset(position, 'x');\n    let offsetY = this._getOffset(position, 'y');\n    // Account for the offsets since they could push the overlay out of the viewport.\n    if (offsetX) {\n      x += offsetX;\n    }\n    if (offsetY) {\n      y += offsetY;\n    }\n    // How much the overlay would overflow at this position, on each side.\n    let leftOverflow = 0 - x;\n    let rightOverflow = x + overlay.width - viewport.width;\n    let topOverflow = 0 - y;\n    let bottomOverflow = y + overlay.height - viewport.height;\n    // Visible parts of the element on each axis.\n    let visibleWidth = this._subtractOverflows(overlay.width, leftOverflow, rightOverflow);\n    let visibleHeight = this._subtractOverflows(overlay.height, topOverflow, bottomOverflow);\n    let visibleArea = visibleWidth * visibleHeight;\n    return {\n      visibleArea,\n      isCompletelyWithinViewport: overlay.width * overlay.height === visibleArea,\n      fitsInViewportVertically: visibleHeight === overlay.height,\n      fitsInViewportHorizontally: visibleWidth == overlay.width\n    };\n  }\n  /**\n   * Whether the overlay can fit within the viewport when it may resize either its width or height.\n   * @param fit How well the overlay fits in the viewport at some position.\n   * @param point The (x, y) coordinates of the overlay at some position.\n   * @param viewport The geometry of the viewport.\n   */\n  _canFitWithFlexibleDimensions(fit, point, viewport) {\n    if (this._hasFlexibleDimensions) {\n      const availableHeight = viewport.bottom - point.y;\n      const availableWidth = viewport.right - point.x;\n      const minHeight = getPixelValue(this._overlayRef.getConfig().minHeight);\n      const minWidth = getPixelValue(this._overlayRef.getConfig().minWidth);\n      const verticalFit = fit.fitsInViewportVertically || minHeight != null && minHeight <= availableHeight;\n      const horizontalFit = fit.fitsInViewportHorizontally || minWidth != null && minWidth <= availableWidth;\n      return verticalFit && horizontalFit;\n    }\n    return false;\n  }\n  /**\n   * Gets the point at which the overlay can be \"pushed\" on-screen. If the overlay is larger than\n   * the viewport, the top-left corner will be pushed on-screen (with overflow occurring on the\n   * right and bottom).\n   *\n   * @param start Starting point from which the overlay is pushed.\n   * @param rawOverlayRect Dimensions of the overlay.\n   * @param scrollPosition Current viewport scroll position.\n   * @returns The point at which to position the overlay after pushing. This is effectively a new\n   *     originPoint.\n   */\n  _pushOverlayOnScreen(start, rawOverlayRect, scrollPosition) {\n    // If the position is locked and we've pushed the overlay already, reuse the previous push\n    // amount, rather than pushing it again. If we were to continue pushing, the element would\n    // remain in the viewport, which goes against the expectations when position locking is enabled.\n    if (this._previousPushAmount && this._positionLocked) {\n      return {\n        x: start.x + this._previousPushAmount.x,\n        y: start.y + this._previousPushAmount.y\n      };\n    }\n    // Round the overlay rect when comparing against the\n    // viewport, because the viewport is always rounded.\n    const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n    const viewport = this._viewportRect;\n    // Determine how much the overlay goes outside the viewport on each\n    // side, which we'll use to decide which direction to push it.\n    const overflowRight = Math.max(start.x + overlay.width - viewport.width, 0);\n    const overflowBottom = Math.max(start.y + overlay.height - viewport.height, 0);\n    const overflowTop = Math.max(viewport.top - scrollPosition.top - start.y, 0);\n    const overflowLeft = Math.max(viewport.left - scrollPosition.left - start.x, 0);\n    // Amount by which to push the overlay in each axis such that it remains on-screen.\n    let pushX = 0;\n    let pushY = 0;\n    // If the overlay fits completely within the bounds of the viewport, push it from whichever\n    // direction is goes off-screen. Otherwise, push the top-left corner such that its in the\n    // viewport and allow for the trailing end of the overlay to go out of bounds.\n    if (overlay.width <= viewport.width) {\n      pushX = overflowLeft || -overflowRight;\n    } else {\n      pushX = start.x < this._viewportMargin ? viewport.left - scrollPosition.left - start.x : 0;\n    }\n    if (overlay.height <= viewport.height) {\n      pushY = overflowTop || -overflowBottom;\n    } else {\n      pushY = start.y < this._viewportMargin ? viewport.top - scrollPosition.top - start.y : 0;\n    }\n    this._previousPushAmount = {\n      x: pushX,\n      y: pushY\n    };\n    return {\n      x: start.x + pushX,\n      y: start.y + pushY\n    };\n  }\n  /**\n   * Applies a computed position to the overlay and emits a position change.\n   * @param position The position preference\n   * @param originPoint The point on the origin element where the overlay is connected.\n   */\n  _applyPosition(position, originPoint) {\n    this._setTransformOrigin(position);\n    this._setOverlayElementStyles(originPoint, position);\n    this._setBoundingBoxStyles(originPoint, position);\n    if (position.panelClass) {\n      this._addPanelClasses(position.panelClass);\n    }\n    // Notify that the position has been changed along with its change properties.\n    // We only emit if we've got any subscriptions, because the scroll visibility\n    // calculations can be somewhat expensive.\n    if (this._positionChanges.observers.length) {\n      const scrollVisibility = this._getScrollVisibility();\n      // We're recalculating on scroll, but we only want to emit if anything\n      // changed since downstream code might be hitting the `NgZone`.\n      if (position !== this._lastPosition || !this._lastScrollVisibility || !compareScrollVisibility(this._lastScrollVisibility, scrollVisibility)) {\n        const changeEvent = new ConnectedOverlayPositionChange(position, scrollVisibility);\n        this._positionChanges.next(changeEvent);\n      }\n      this._lastScrollVisibility = scrollVisibility;\n    }\n    // Save the last connected position in case the position needs to be re-calculated.\n    this._lastPosition = position;\n    this._isInitialRender = false;\n  }\n  /** Sets the transform origin based on the configured selector and the passed-in position.  */\n  _setTransformOrigin(position) {\n    if (!this._transformOriginSelector) {\n      return;\n    }\n    const elements = this._boundingBox.querySelectorAll(this._transformOriginSelector);\n    let xOrigin;\n    let yOrigin = position.overlayY;\n    if (position.overlayX === 'center') {\n      xOrigin = 'center';\n    } else if (this._isRtl()) {\n      xOrigin = position.overlayX === 'start' ? 'right' : 'left';\n    } else {\n      xOrigin = position.overlayX === 'start' ? 'left' : 'right';\n    }\n    for (let i = 0; i < elements.length; i++) {\n      elements[i].style.transformOrigin = `${xOrigin} ${yOrigin}`;\n    }\n  }\n  /**\n   * Gets the position and size of the overlay's sizing container.\n   *\n   * This method does no measuring and applies no styles so that we can cheaply compute the\n   * bounds for all positions and choose the best fit based on these results.\n   */\n  _calculateBoundingBoxRect(origin, position) {\n    const viewport = this._viewportRect;\n    const isRtl = this._isRtl();\n    let height, top, bottom;\n    if (position.overlayY === 'top') {\n      // Overlay is opening \"downward\" and thus is bound by the bottom viewport edge.\n      top = origin.y;\n      height = viewport.height - top + this._viewportMargin;\n    } else if (position.overlayY === 'bottom') {\n      // Overlay is opening \"upward\" and thus is bound by the top viewport edge. We need to add\n      // the viewport margin back in, because the viewport rect is narrowed down to remove the\n      // margin, whereas the `origin` position is calculated based on its `DOMRect`.\n      bottom = viewport.height - origin.y + this._viewportMargin * 2;\n      height = viewport.height - bottom + this._viewportMargin;\n    } else {\n      // If neither top nor bottom, it means that the overlay is vertically centered on the\n      // origin point. Note that we want the position relative to the viewport, rather than\n      // the page, which is why we don't use something like `viewport.bottom - origin.y` and\n      // `origin.y - viewport.top`.\n      const smallestDistanceToViewportEdge = Math.min(viewport.bottom - origin.y + viewport.top, origin.y);\n      const previousHeight = this._lastBoundingBoxSize.height;\n      height = smallestDistanceToViewportEdge * 2;\n      top = origin.y - smallestDistanceToViewportEdge;\n      if (height > previousHeight && !this._isInitialRender && !this._growAfterOpen) {\n        top = origin.y - previousHeight / 2;\n      }\n    }\n    // The overlay is opening 'right-ward' (the content flows to the right).\n    const isBoundedByRightViewportEdge = position.overlayX === 'start' && !isRtl || position.overlayX === 'end' && isRtl;\n    // The overlay is opening 'left-ward' (the content flows to the left).\n    const isBoundedByLeftViewportEdge = position.overlayX === 'end' && !isRtl || position.overlayX === 'start' && isRtl;\n    let width, left, right;\n    if (isBoundedByLeftViewportEdge) {\n      right = viewport.width - origin.x + this._viewportMargin * 2;\n      width = origin.x - this._viewportMargin;\n    } else if (isBoundedByRightViewportEdge) {\n      left = origin.x;\n      width = viewport.right - origin.x;\n    } else {\n      // If neither start nor end, it means that the overlay is horizontally centered on the\n      // origin point. Note that we want the position relative to the viewport, rather than\n      // the page, which is why we don't use something like `viewport.right - origin.x` and\n      // `origin.x - viewport.left`.\n      const smallestDistanceToViewportEdge = Math.min(viewport.right - origin.x + viewport.left, origin.x);\n      const previousWidth = this._lastBoundingBoxSize.width;\n      width = smallestDistanceToViewportEdge * 2;\n      left = origin.x - smallestDistanceToViewportEdge;\n      if (width > previousWidth && !this._isInitialRender && !this._growAfterOpen) {\n        left = origin.x - previousWidth / 2;\n      }\n    }\n    return {\n      top: top,\n      left: left,\n      bottom: bottom,\n      right: right,\n      width,\n      height\n    };\n  }\n  /**\n   * Sets the position and size of the overlay's sizing wrapper. The wrapper is positioned on the\n   * origin's connection point and stretches to the bounds of the viewport.\n   *\n   * @param origin The point on the origin element where the overlay is connected.\n   * @param position The position preference\n   */\n  _setBoundingBoxStyles(origin, position) {\n    const boundingBoxRect = this._calculateBoundingBoxRect(origin, position);\n    // It's weird if the overlay *grows* while scrolling, so we take the last size into account\n    // when applying a new size.\n    if (!this._isInitialRender && !this._growAfterOpen) {\n      boundingBoxRect.height = Math.min(boundingBoxRect.height, this._lastBoundingBoxSize.height);\n      boundingBoxRect.width = Math.min(boundingBoxRect.width, this._lastBoundingBoxSize.width);\n    }\n    const styles = {};\n    if (this._hasExactPosition()) {\n      styles.top = styles.left = '0';\n      styles.bottom = styles.right = styles.maxHeight = styles.maxWidth = '';\n      styles.width = styles.height = '100%';\n    } else {\n      const maxHeight = this._overlayRef.getConfig().maxHeight;\n      const maxWidth = this._overlayRef.getConfig().maxWidth;\n      styles.height = coerceCssPixelValue(boundingBoxRect.height);\n      styles.top = coerceCssPixelValue(boundingBoxRect.top);\n      styles.bottom = coerceCssPixelValue(boundingBoxRect.bottom);\n      styles.width = coerceCssPixelValue(boundingBoxRect.width);\n      styles.left = coerceCssPixelValue(boundingBoxRect.left);\n      styles.right = coerceCssPixelValue(boundingBoxRect.right);\n      // Push the pane content towards the proper direction.\n      if (position.overlayX === 'center') {\n        styles.alignItems = 'center';\n      } else {\n        styles.alignItems = position.overlayX === 'end' ? 'flex-end' : 'flex-start';\n      }\n      if (position.overlayY === 'center') {\n        styles.justifyContent = 'center';\n      } else {\n        styles.justifyContent = position.overlayY === 'bottom' ? 'flex-end' : 'flex-start';\n      }\n      if (maxHeight) {\n        styles.maxHeight = coerceCssPixelValue(maxHeight);\n      }\n      if (maxWidth) {\n        styles.maxWidth = coerceCssPixelValue(maxWidth);\n      }\n    }\n    this._lastBoundingBoxSize = boundingBoxRect;\n    extendStyles(this._boundingBox.style, styles);\n  }\n  /** Resets the styles for the bounding box so that a new positioning can be computed. */\n  _resetBoundingBoxStyles() {\n    extendStyles(this._boundingBox.style, {\n      top: '0',\n      left: '0',\n      right: '0',\n      bottom: '0',\n      height: '',\n      width: '',\n      alignItems: '',\n      justifyContent: ''\n    });\n  }\n  /** Resets the styles for the overlay pane so that a new positioning can be computed. */\n  _resetOverlayElementStyles() {\n    extendStyles(this._pane.style, {\n      top: '',\n      left: '',\n      bottom: '',\n      right: '',\n      position: '',\n      transform: ''\n    });\n  }\n  /** Sets positioning styles to the overlay element. */\n  _setOverlayElementStyles(originPoint, position) {\n    const styles = {};\n    const hasExactPosition = this._hasExactPosition();\n    const hasFlexibleDimensions = this._hasFlexibleDimensions;\n    const config = this._overlayRef.getConfig();\n    if (hasExactPosition) {\n      const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n      extendStyles(styles, this._getExactOverlayY(position, originPoint, scrollPosition));\n      extendStyles(styles, this._getExactOverlayX(position, originPoint, scrollPosition));\n    } else {\n      styles.position = 'static';\n    }\n    // Use a transform to apply the offsets. We do this because the `center` positions rely on\n    // being in the normal flex flow and setting a `top` / `left` at all will completely throw\n    // off the position. We also can't use margins, because they won't have an effect in some\n    // cases where the element doesn't have anything to \"push off of\". Finally, this works\n    // better both with flexible and non-flexible positioning.\n    let transformString = '';\n    let offsetX = this._getOffset(position, 'x');\n    let offsetY = this._getOffset(position, 'y');\n    if (offsetX) {\n      transformString += `translateX(${offsetX}px) `;\n    }\n    if (offsetY) {\n      transformString += `translateY(${offsetY}px)`;\n    }\n    styles.transform = transformString.trim();\n    // If a maxWidth or maxHeight is specified on the overlay, we remove them. We do this because\n    // we need these values to both be set to \"100%\" for the automatic flexible sizing to work.\n    // The maxHeight and maxWidth are set on the boundingBox in order to enforce the constraint.\n    // Note that this doesn't apply when we have an exact position, in which case we do want to\n    // apply them because they'll be cleared from the bounding box.\n    if (config.maxHeight) {\n      if (hasExactPosition) {\n        styles.maxHeight = coerceCssPixelValue(config.maxHeight);\n      } else if (hasFlexibleDimensions) {\n        styles.maxHeight = '';\n      }\n    }\n    if (config.maxWidth) {\n      if (hasExactPosition) {\n        styles.maxWidth = coerceCssPixelValue(config.maxWidth);\n      } else if (hasFlexibleDimensions) {\n        styles.maxWidth = '';\n      }\n    }\n    extendStyles(this._pane.style, styles);\n  }\n  /** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */\n  _getExactOverlayY(position, originPoint, scrollPosition) {\n    // Reset any existing styles. This is necessary in case the\n    // preferred position has changed since the last `apply`.\n    let styles = {\n      top: '',\n      bottom: ''\n    };\n    let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n    if (this._isPushed) {\n      overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n    }\n    // We want to set either `top` or `bottom` based on whether the overlay wants to appear\n    // above or below the origin and the direction in which the element will expand.\n    if (position.overlayY === 'bottom') {\n      // When using `bottom`, we adjust the y position such that it is the distance\n      // from the bottom of the viewport rather than the top.\n      const documentHeight = this._document.documentElement.clientHeight;\n      styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`;\n    } else {\n      styles.top = coerceCssPixelValue(overlayPoint.y);\n    }\n    return styles;\n  }\n  /** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */\n  _getExactOverlayX(position, originPoint, scrollPosition) {\n    // Reset any existing styles. This is necessary in case the preferred position has\n    // changed since the last `apply`.\n    let styles = {\n      left: '',\n      right: ''\n    };\n    let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n    if (this._isPushed) {\n      overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n    }\n    // We want to set either `left` or `right` based on whether the overlay wants to appear \"before\"\n    // or \"after\" the origin, which determines the direction in which the element will expand.\n    // For the horizontal axis, the meaning of \"before\" and \"after\" change based on whether the\n    // page is in RTL or LTR.\n    let horizontalStyleProperty;\n    if (this._isRtl()) {\n      horizontalStyleProperty = position.overlayX === 'end' ? 'left' : 'right';\n    } else {\n      horizontalStyleProperty = position.overlayX === 'end' ? 'right' : 'left';\n    }\n    // When we're setting `right`, we adjust the x position such that it is the distance\n    // from the right edge of the viewport rather than the left edge.\n    if (horizontalStyleProperty === 'right') {\n      const documentWidth = this._document.documentElement.clientWidth;\n      styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`;\n    } else {\n      styles.left = coerceCssPixelValue(overlayPoint.x);\n    }\n    return styles;\n  }\n  /**\n   * Gets the view properties of the trigger and overlay, including whether they are clipped\n   * or completely outside the view of any of the strategy's scrollables.\n   */\n  _getScrollVisibility() {\n    // Note: needs fresh rects since the position could've changed.\n    const originBounds = this._getOriginRect();\n    const overlayBounds = this._pane.getBoundingClientRect();\n    // TODO(jelbourn): instead of needing all of the client rects for these scrolling containers\n    // every time, we should be able to use the scrollTop of the containers if the size of those\n    // containers hasn't changed.\n    const scrollContainerBounds = this._scrollables.map(scrollable => {\n      return scrollable.getElementRef().nativeElement.getBoundingClientRect();\n    });\n    return {\n      isOriginClipped: isElementClippedByScrolling(originBounds, scrollContainerBounds),\n      isOriginOutsideView: isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n      isOverlayClipped: isElementClippedByScrolling(overlayBounds, scrollContainerBounds),\n      isOverlayOutsideView: isElementScrolledOutsideView(overlayBounds, scrollContainerBounds)\n    };\n  }\n  /** Subtracts the amount that an element is overflowing on an axis from its length. */\n  _subtractOverflows(length, ...overflows) {\n    return overflows.reduce((currentValue, currentOverflow) => {\n      return currentValue - Math.max(currentOverflow, 0);\n    }, length);\n  }\n  /** Narrows the given viewport rect by the current _viewportMargin. */\n  _getNarrowedViewportRect() {\n    // We recalculate the viewport rect here ourselves, rather than using the ViewportRuler,\n    // because we want to use the `clientWidth` and `clientHeight` as the base. The difference\n    // being that the client properties don't include the scrollbar, as opposed to `innerWidth`\n    // and `innerHeight` that do. This is necessary, because the overlay container uses\n    // 100% `width` and `height` which don't include the scrollbar either.\n    const width = this._document.documentElement.clientWidth;\n    const height = this._document.documentElement.clientHeight;\n    const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n    return {\n      top: scrollPosition.top + this._viewportMargin,\n      left: scrollPosition.left + this._viewportMargin,\n      right: scrollPosition.left + width - this._viewportMargin,\n      bottom: scrollPosition.top + height - this._viewportMargin,\n      width: width - 2 * this._viewportMargin,\n      height: height - 2 * this._viewportMargin\n    };\n  }\n  /** Whether the we're dealing with an RTL context */\n  _isRtl() {\n    return this._overlayRef.getDirection() === 'rtl';\n  }\n  /** Determines whether the overlay uses exact or flexible positioning. */\n  _hasExactPosition() {\n    return !this._hasFlexibleDimensions || this._isPushed;\n  }\n  /** Retrieves the offset of a position along the x or y axis. */\n  _getOffset(position, axis) {\n    if (axis === 'x') {\n      // We don't do something like `position['offset' + axis]` in\n      // order to avoid breaking minifiers that rename properties.\n      return position.offsetX == null ? this._offsetX : position.offsetX;\n    }\n    return position.offsetY == null ? this._offsetY : position.offsetY;\n  }\n  /** Validates that the current position match the expected values. */\n  _validatePositions() {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (!this._preferredPositions.length) {\n        throw Error('FlexibleConnectedPositionStrategy: At least one position is required.');\n      }\n      // TODO(crisbeto): remove these once Angular's template type\n      // checking is advanced enough to catch these cases.\n      this._preferredPositions.forEach(pair => {\n        validateHorizontalPosition('originX', pair.originX);\n        validateVerticalPosition('originY', pair.originY);\n        validateHorizontalPosition('overlayX', pair.overlayX);\n        validateVerticalPosition('overlayY', pair.overlayY);\n      });\n    }\n  }\n  /** Adds a single CSS class or an array of classes on the overlay panel. */\n  _addPanelClasses(cssClasses) {\n    if (this._pane) {\n      coerceArray(cssClasses).forEach(cssClass => {\n        if (cssClass !== '' && this._appliedPanelClasses.indexOf(cssClass) === -1) {\n          this._appliedPanelClasses.push(cssClass);\n          this._pane.classList.add(cssClass);\n        }\n      });\n    }\n  }\n  /** Clears the classes that the position strategy has applied from the overlay panel. */\n  _clearPanelClasses() {\n    if (this._pane) {\n      this._appliedPanelClasses.forEach(cssClass => {\n        this._pane.classList.remove(cssClass);\n      });\n      this._appliedPanelClasses = [];\n    }\n  }\n  /** Returns the DOMRect of the current origin. */\n  _getOriginRect() {\n    const origin = this._origin;\n    if (origin instanceof ElementRef) {\n      return origin.nativeElement.getBoundingClientRect();\n    }\n    // Check for Element so SVG elements are also supported.\n    if (origin instanceof Element) {\n      return origin.getBoundingClientRect();\n    }\n    const width = origin.width || 0;\n    const height = origin.height || 0;\n    // If the origin is a point, return a client rect as if it was a 0x0 element at the point.\n    return {\n      top: origin.y,\n      bottom: origin.y + height,\n      left: origin.x,\n      right: origin.x + width,\n      height,\n      width\n    };\n  }\n}\n/** Shallow-extends a stylesheet object with another stylesheet object. */\nfunction extendStyles(destination, source) {\n  for (let key in source) {\n    if (source.hasOwnProperty(key)) {\n      destination[key] = source[key];\n    }\n  }\n  return destination;\n}\n/**\n * Extracts the pixel value as a number from a value, if it's a number\n * or a CSS pixel string (e.g. `1337px`). Otherwise returns null.\n */\nfunction getPixelValue(input) {\n  if (typeof input !== 'number' && input != null) {\n    const [value, units] = input.split(cssUnitPattern);\n    return !units || units === 'px' ? parseFloat(value) : null;\n  }\n  return input || null;\n}\n/**\n * Gets a version of an element's bounding `DOMRect` where all the values are rounded down to\n * the nearest pixel. This allows us to account for the cases where there may be sub-pixel\n * deviations in the `DOMRect` returned by the browser (e.g. when zoomed in with a percentage\n * size, see #21350).\n */\nfunction getRoundedBoundingClientRect(clientRect) {\n  return {\n    top: Math.floor(clientRect.top),\n    right: Math.floor(clientRect.right),\n    bottom: Math.floor(clientRect.bottom),\n    left: Math.floor(clientRect.left),\n    width: Math.floor(clientRect.width),\n    height: Math.floor(clientRect.height)\n  };\n}\n/** Returns whether two `ScrollingVisibility` objects are identical. */\nfunction compareScrollVisibility(a, b) {\n  if (a === b) {\n    return true;\n  }\n  return a.isOriginClipped === b.isOriginClipped && a.isOriginOutsideView === b.isOriginOutsideView && a.isOverlayClipped === b.isOverlayClipped && a.isOverlayOutsideView === b.isOverlayOutsideView;\n}\nconst STANDARD_DROPDOWN_BELOW_POSITIONS = [{\n  originX: 'start',\n  originY: 'bottom',\n  overlayX: 'start',\n  overlayY: 'top'\n}, {\n  originX: 'start',\n  originY: 'top',\n  overlayX: 'start',\n  overlayY: 'bottom'\n}, {\n  originX: 'end',\n  originY: 'bottom',\n  overlayX: 'end',\n  overlayY: 'top'\n}, {\n  originX: 'end',\n  originY: 'top',\n  overlayX: 'end',\n  overlayY: 'bottom'\n}];\nconst STANDARD_DROPDOWN_ADJACENT_POSITIONS = [{\n  originX: 'end',\n  originY: 'top',\n  overlayX: 'start',\n  overlayY: 'top'\n}, {\n  originX: 'end',\n  originY: 'bottom',\n  overlayX: 'start',\n  overlayY: 'bottom'\n}, {\n  originX: 'start',\n  originY: 'top',\n  overlayX: 'end',\n  overlayY: 'top'\n}, {\n  originX: 'start',\n  originY: 'bottom',\n  overlayX: 'end',\n  overlayY: 'bottom'\n}];\n\n/** Class to be added to the overlay pane wrapper. */\nconst wrapperClass = 'cdk-global-overlay-wrapper';\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nclass GlobalPositionStrategy {\n  /** The overlay to which this strategy is attached. */\n  _overlayRef;\n  _cssPosition = 'static';\n  _topOffset = '';\n  _bottomOffset = '';\n  _alignItems = '';\n  _xPosition = '';\n  _xOffset = '';\n  _width = '';\n  _height = '';\n  _isDisposed = false;\n  attach(overlayRef) {\n    const config = overlayRef.getConfig();\n    this._overlayRef = overlayRef;\n    if (this._width && !config.width) {\n      overlayRef.updateSize({\n        width: this._width\n      });\n    }\n    if (this._height && !config.height) {\n      overlayRef.updateSize({\n        height: this._height\n      });\n    }\n    overlayRef.hostElement.classList.add(wrapperClass);\n    this._isDisposed = false;\n  }\n  /**\n   * Sets the top position of the overlay. Clears any previously set vertical position.\n   * @param value New top offset.\n   */\n  top(value = '') {\n    this._bottomOffset = '';\n    this._topOffset = value;\n    this._alignItems = 'flex-start';\n    return this;\n  }\n  /**\n   * Sets the left position of the overlay. Clears any previously set horizontal position.\n   * @param value New left offset.\n   */\n  left(value = '') {\n    this._xOffset = value;\n    this._xPosition = 'left';\n    return this;\n  }\n  /**\n   * Sets the bottom position of the overlay. Clears any previously set vertical position.\n   * @param value New bottom offset.\n   */\n  bottom(value = '') {\n    this._topOffset = '';\n    this._bottomOffset = value;\n    this._alignItems = 'flex-end';\n    return this;\n  }\n  /**\n   * Sets the right position of the overlay. Clears any previously set horizontal position.\n   * @param value New right offset.\n   */\n  right(value = '') {\n    this._xOffset = value;\n    this._xPosition = 'right';\n    return this;\n  }\n  /**\n   * Sets the overlay to the start of the viewport, depending on the overlay direction.\n   * This will be to the left in LTR layouts and to the right in RTL.\n   * @param offset Offset from the edge of the screen.\n   */\n  start(value = '') {\n    this._xOffset = value;\n    this._xPosition = 'start';\n    return this;\n  }\n  /**\n   * Sets the overlay to the end of the viewport, depending on the overlay direction.\n   * This will be to the right in LTR layouts and to the left in RTL.\n   * @param offset Offset from the edge of the screen.\n   */\n  end(value = '') {\n    this._xOffset = value;\n    this._xPosition = 'end';\n    return this;\n  }\n  /**\n   * Sets the overlay width and clears any previously set width.\n   * @param value New width for the overlay\n   * @deprecated Pass the `width` through the `OverlayConfig`.\n   * @breaking-change 8.0.0\n   */\n  width(value = '') {\n    if (this._overlayRef) {\n      this._overlayRef.updateSize({\n        width: value\n      });\n    } else {\n      this._width = value;\n    }\n    return this;\n  }\n  /**\n   * Sets the overlay height and clears any previously set height.\n   * @param value New height for the overlay\n   * @deprecated Pass the `height` through the `OverlayConfig`.\n   * @breaking-change 8.0.0\n   */\n  height(value = '') {\n    if (this._overlayRef) {\n      this._overlayRef.updateSize({\n        height: value\n      });\n    } else {\n      this._height = value;\n    }\n    return this;\n  }\n  /**\n   * Centers the overlay horizontally with an optional offset.\n   * Clears any previously set horizontal position.\n   *\n   * @param offset Overlay offset from the horizontal center.\n   */\n  centerHorizontally(offset = '') {\n    this.left(offset);\n    this._xPosition = 'center';\n    return this;\n  }\n  /**\n   * Centers the overlay vertically with an optional offset.\n   * Clears any previously set vertical position.\n   *\n   * @param offset Overlay offset from the vertical center.\n   */\n  centerVertically(offset = '') {\n    this.top(offset);\n    this._alignItems = 'center';\n    return this;\n  }\n  /**\n   * Apply the position to the element.\n   * @docs-private\n   */\n  apply() {\n    // Since the overlay ref applies the strategy asynchronously, it could\n    // have been disposed before it ends up being applied. If that is the\n    // case, we shouldn't do anything.\n    if (!this._overlayRef || !this._overlayRef.hasAttached()) {\n      return;\n    }\n    const styles = this._overlayRef.overlayElement.style;\n    const parentStyles = this._overlayRef.hostElement.style;\n    const config = this._overlayRef.getConfig();\n    const {\n      width,\n      height,\n      maxWidth,\n      maxHeight\n    } = config;\n    const shouldBeFlushHorizontally = (width === '100%' || width === '100vw') && (!maxWidth || maxWidth === '100%' || maxWidth === '100vw');\n    const shouldBeFlushVertically = (height === '100%' || height === '100vh') && (!maxHeight || maxHeight === '100%' || maxHeight === '100vh');\n    const xPosition = this._xPosition;\n    const xOffset = this._xOffset;\n    const isRtl = this._overlayRef.getConfig().direction === 'rtl';\n    let marginLeft = '';\n    let marginRight = '';\n    let justifyContent = '';\n    if (shouldBeFlushHorizontally) {\n      justifyContent = 'flex-start';\n    } else if (xPosition === 'center') {\n      justifyContent = 'center';\n      if (isRtl) {\n        marginRight = xOffset;\n      } else {\n        marginLeft = xOffset;\n      }\n    } else if (isRtl) {\n      if (xPosition === 'left' || xPosition === 'end') {\n        justifyContent = 'flex-end';\n        marginLeft = xOffset;\n      } else if (xPosition === 'right' || xPosition === 'start') {\n        justifyContent = 'flex-start';\n        marginRight = xOffset;\n      }\n    } else if (xPosition === 'left' || xPosition === 'start') {\n      justifyContent = 'flex-start';\n      marginLeft = xOffset;\n    } else if (xPosition === 'right' || xPosition === 'end') {\n      justifyContent = 'flex-end';\n      marginRight = xOffset;\n    }\n    styles.position = this._cssPosition;\n    styles.marginLeft = shouldBeFlushHorizontally ? '0' : marginLeft;\n    styles.marginTop = shouldBeFlushVertically ? '0' : this._topOffset;\n    styles.marginBottom = this._bottomOffset;\n    styles.marginRight = shouldBeFlushHorizontally ? '0' : marginRight;\n    parentStyles.justifyContent = justifyContent;\n    parentStyles.alignItems = shouldBeFlushVertically ? 'flex-start' : this._alignItems;\n  }\n  /**\n   * Cleans up the DOM changes from the position strategy.\n   * @docs-private\n   */\n  dispose() {\n    if (this._isDisposed || !this._overlayRef) {\n      return;\n    }\n    const styles = this._overlayRef.overlayElement.style;\n    const parent = this._overlayRef.hostElement;\n    const parentStyles = parent.style;\n    parent.classList.remove(wrapperClass);\n    parentStyles.justifyContent = parentStyles.alignItems = styles.marginTop = styles.marginBottom = styles.marginLeft = styles.marginRight = styles.position = '';\n    this._overlayRef = null;\n    this._isDisposed = true;\n  }\n}\n\n/** Builder for overlay position strategy. */\nlet OverlayPositionBuilder = /*#__PURE__*/(() => {\n  class OverlayPositionBuilder {\n    _viewportRuler = inject(ViewportRuler);\n    _document = inject(DOCUMENT);\n    _platform = inject(Platform);\n    _overlayContainer = inject(OverlayContainer);\n    constructor() {}\n    /**\n     * Creates a global position strategy.\n     */\n    global() {\n      return new GlobalPositionStrategy();\n    }\n    /**\n     * Creates a flexible position strategy.\n     * @param origin Origin relative to which to position the overlay.\n     */\n    flexibleConnectedTo(origin) {\n      return new FlexibleConnectedPositionStrategy(origin, this._viewportRuler, this._document, this._platform, this._overlayContainer);\n    }\n    static ɵfac = function OverlayPositionBuilder_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || OverlayPositionBuilder)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: OverlayPositionBuilder,\n      factory: OverlayPositionBuilder.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return OverlayPositionBuilder;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalOutlet, so any kind of Portal can be loaded into one.\n */\nlet Overlay = /*#__PURE__*/(() => {\n  class Overlay {\n    scrollStrategies = inject(ScrollStrategyOptions);\n    _overlayContainer = inject(OverlayContainer);\n    _positionBuilder = inject(OverlayPositionBuilder);\n    _keyboardDispatcher = inject(OverlayKeyboardDispatcher);\n    _injector = inject(Injector);\n    _ngZone = inject(NgZone);\n    _document = inject(DOCUMENT);\n    _directionality = inject(Directionality);\n    _location = inject(Location);\n    _outsideClickDispatcher = inject(OverlayOutsideClickDispatcher);\n    _animationsModuleType = inject(ANIMATION_MODULE_TYPE, {\n      optional: true\n    });\n    _idGenerator = inject(_IdGenerator);\n    _renderer = inject(RendererFactory2).createRenderer(null, null);\n    _appRef;\n    _styleLoader = inject(_CdkPrivateStyleLoader);\n    constructor() {}\n    /**\n     * Creates an overlay.\n     * @param config Configuration applied to the overlay.\n     * @returns Reference to the created overlay.\n     */\n    create(config) {\n      // This is done in the overlay container as well, but we have it here\n      // since it's common to mock out the overlay container in tests.\n      this._styleLoader.load(_CdkOverlayStyleLoader);\n      const host = this._createHostElement();\n      const pane = this._createPaneElement(host);\n      const portalOutlet = this._createPortalOutlet(pane);\n      const overlayConfig = new OverlayConfig(config);\n      overlayConfig.direction = overlayConfig.direction || this._directionality.value;\n      return new OverlayRef(portalOutlet, host, pane, overlayConfig, this._ngZone, this._keyboardDispatcher, this._document, this._location, this._outsideClickDispatcher, this._animationsModuleType === 'NoopAnimations', this._injector.get(EnvironmentInjector), this._renderer);\n    }\n    /**\n     * Gets a position builder that can be used, via fluent API,\n     * to construct and configure a position strategy.\n     * @returns An overlay position builder.\n     */\n    position() {\n      return this._positionBuilder;\n    }\n    /**\n     * Creates the DOM element for an overlay and appends it to the overlay container.\n     * @returns Newly-created pane element\n     */\n    _createPaneElement(host) {\n      const pane = this._document.createElement('div');\n      pane.id = this._idGenerator.getId('cdk-overlay-');\n      pane.classList.add('cdk-overlay-pane');\n      host.appendChild(pane);\n      return pane;\n    }\n    /**\n     * Creates the host element that wraps around an overlay\n     * and can be used for advanced positioning.\n     * @returns Newly-create host element.\n     */\n    _createHostElement() {\n      const host = this._document.createElement('div');\n      this._overlayContainer.getContainerElement().appendChild(host);\n      return host;\n    }\n    /**\n     * Create a DomPortalOutlet into which the overlay content can be loaded.\n     * @param pane The DOM element to turn into a portal outlet.\n     * @returns A portal outlet for the given DOM element.\n     */\n    _createPortalOutlet(pane) {\n      // We have to resolve the ApplicationRef later in order to allow people\n      // to use overlay-based providers during app initialization.\n      if (!this._appRef) {\n        this._appRef = this._injector.get(ApplicationRef);\n      }\n      return new DomPortalOutlet(pane, null, this._appRef, this._injector, this._document);\n    }\n    static ɵfac = function Overlay_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Overlay)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: Overlay,\n      factory: Overlay.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return Overlay;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList = [{\n  originX: 'start',\n  originY: 'bottom',\n  overlayX: 'start',\n  overlayY: 'top'\n}, {\n  originX: 'start',\n  originY: 'top',\n  overlayX: 'start',\n  overlayY: 'bottom'\n}, {\n  originX: 'end',\n  originY: 'top',\n  overlayX: 'end',\n  overlayY: 'bottom'\n}, {\n  originX: 'end',\n  originY: 'bottom',\n  overlayX: 'end',\n  overlayY: 'top'\n}];\n/** Injection token that determines the scroll handling while the connected overlay is open. */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('cdk-connected-overlay-scroll-strategy', {\n  providedIn: 'root',\n  factory: () => {\n    const overlay = inject(Overlay);\n    return () => overlay.scrollStrategies.reposition();\n  }\n});\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nlet CdkOverlayOrigin = /*#__PURE__*/(() => {\n  class CdkOverlayOrigin {\n    elementRef = inject(ElementRef);\n    constructor() {}\n    static ɵfac = function CdkOverlayOrigin_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkOverlayOrigin)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkOverlayOrigin,\n      selectors: [[\"\", \"cdk-overlay-origin\", \"\"], [\"\", \"overlay-origin\", \"\"], [\"\", \"cdkOverlayOrigin\", \"\"]],\n      exportAs: [\"cdkOverlayOrigin\"]\n    });\n  }\n  return CdkOverlayOrigin;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive to facilitate declarative creation of an\n * Overlay using a FlexibleConnectedPositionStrategy.\n */\nlet CdkConnectedOverlay = /*#__PURE__*/(() => {\n  class CdkConnectedOverlay {\n    _overlay = inject(Overlay);\n    _dir = inject(Directionality, {\n      optional: true\n    });\n    _overlayRef;\n    _templatePortal;\n    _backdropSubscription = Subscription.EMPTY;\n    _attachSubscription = Subscription.EMPTY;\n    _detachSubscription = Subscription.EMPTY;\n    _positionSubscription = Subscription.EMPTY;\n    _offsetX;\n    _offsetY;\n    _position;\n    _scrollStrategyFactory = inject(CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY);\n    _disposeOnNavigation = false;\n    _ngZone = inject(NgZone);\n    /** Origin for the connected overlay. */\n    origin;\n    /** Registered connected position pairs. */\n    positions;\n    /**\n     * This input overrides the positions input if specified. It lets users pass\n     * in arbitrary positioning strategies.\n     */\n    positionStrategy;\n    /** The offset in pixels for the overlay connection point on the x-axis */\n    get offsetX() {\n      return this._offsetX;\n    }\n    set offsetX(offsetX) {\n      this._offsetX = offsetX;\n      if (this._position) {\n        this._updatePositionStrategy(this._position);\n      }\n    }\n    /** The offset in pixels for the overlay connection point on the y-axis */\n    get offsetY() {\n      return this._offsetY;\n    }\n    set offsetY(offsetY) {\n      this._offsetY = offsetY;\n      if (this._position) {\n        this._updatePositionStrategy(this._position);\n      }\n    }\n    /** The width of the overlay panel. */\n    width;\n    /** The height of the overlay panel. */\n    height;\n    /** The min width of the overlay panel. */\n    minWidth;\n    /** The min height of the overlay panel. */\n    minHeight;\n    /** The custom class to be set on the backdrop element. */\n    backdropClass;\n    /** The custom class to add to the overlay pane element. */\n    panelClass;\n    /** Margin between the overlay and the viewport edges. */\n    viewportMargin = 0;\n    /** Strategy to be used when handling scroll events while the overlay is open. */\n    scrollStrategy;\n    /** Whether the overlay is open. */\n    open = false;\n    /** Whether the overlay can be closed by user interaction. */\n    disableClose = false;\n    /** CSS selector which to set the transform origin. */\n    transformOriginSelector;\n    /** Whether or not the overlay should attach a backdrop. */\n    hasBackdrop = false;\n    /** Whether or not the overlay should be locked when scrolling. */\n    lockPosition = false;\n    /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n    flexibleDimensions = false;\n    /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */\n    growAfterOpen = false;\n    /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */\n    push = false;\n    /** Whether the overlay should be disposed of when the user goes backwards/forwards in history. */\n    get disposeOnNavigation() {\n      return this._disposeOnNavigation;\n    }\n    set disposeOnNavigation(value) {\n      this._disposeOnNavigation = value;\n    }\n    /** Event emitted when the backdrop is clicked. */\n    backdropClick = new EventEmitter();\n    /** Event emitted when the position has changed. */\n    positionChange = new EventEmitter();\n    /** Event emitted when the overlay has been attached. */\n    attach = new EventEmitter();\n    /** Event emitted when the overlay has been detached. */\n    detach = new EventEmitter();\n    /** Emits when there are keyboard events that are targeted at the overlay. */\n    overlayKeydown = new EventEmitter();\n    /** Emits when there are mouse outside click events that are targeted at the overlay. */\n    overlayOutsideClick = new EventEmitter();\n    // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n    constructor() {\n      const templateRef = inject(TemplateRef);\n      const viewContainerRef = inject(ViewContainerRef);\n      this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n      this.scrollStrategy = this._scrollStrategyFactory();\n    }\n    /** The associated overlay reference. */\n    get overlayRef() {\n      return this._overlayRef;\n    }\n    /** The element's layout direction. */\n    get dir() {\n      return this._dir ? this._dir.value : 'ltr';\n    }\n    ngOnDestroy() {\n      this._attachSubscription.unsubscribe();\n      this._detachSubscription.unsubscribe();\n      this._backdropSubscription.unsubscribe();\n      this._positionSubscription.unsubscribe();\n      this._overlayRef?.dispose();\n    }\n    ngOnChanges(changes) {\n      if (this._position) {\n        this._updatePositionStrategy(this._position);\n        this._overlayRef?.updateSize({\n          width: this.width,\n          minWidth: this.minWidth,\n          height: this.height,\n          minHeight: this.minHeight\n        });\n        if (changes['origin'] && this.open) {\n          this._position.apply();\n        }\n      }\n      if (changes['open']) {\n        this.open ? this.attachOverlay() : this.detachOverlay();\n      }\n    }\n    /** Creates an overlay */\n    _createOverlay() {\n      if (!this.positions || !this.positions.length) {\n        this.positions = defaultPositionList;\n      }\n      const overlayRef = this._overlayRef = this._overlay.create(this._buildConfig());\n      this._attachSubscription = overlayRef.attachments().subscribe(() => this.attach.emit());\n      this._detachSubscription = overlayRef.detachments().subscribe(() => this.detach.emit());\n      overlayRef.keydownEvents().subscribe(event => {\n        this.overlayKeydown.next(event);\n        if (event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event)) {\n          event.preventDefault();\n          this.detachOverlay();\n        }\n      });\n      this._overlayRef.outsidePointerEvents().subscribe(event => {\n        const origin = this._getOriginElement();\n        const target = _getEventTarget(event);\n        if (!origin || origin !== target && !origin.contains(target)) {\n          this.overlayOutsideClick.next(event);\n        }\n      });\n    }\n    /** Builds the overlay config based on the directive's inputs */\n    _buildConfig() {\n      const positionStrategy = this._position = this.positionStrategy || this._createPositionStrategy();\n      const overlayConfig = new OverlayConfig({\n        direction: this._dir || 'ltr',\n        positionStrategy,\n        scrollStrategy: this.scrollStrategy,\n        hasBackdrop: this.hasBackdrop,\n        disposeOnNavigation: this.disposeOnNavigation\n      });\n      if (this.width || this.width === 0) {\n        overlayConfig.width = this.width;\n      }\n      if (this.height || this.height === 0) {\n        overlayConfig.height = this.height;\n      }\n      if (this.minWidth || this.minWidth === 0) {\n        overlayConfig.minWidth = this.minWidth;\n      }\n      if (this.minHeight || this.minHeight === 0) {\n        overlayConfig.minHeight = this.minHeight;\n      }\n      if (this.backdropClass) {\n        overlayConfig.backdropClass = this.backdropClass;\n      }\n      if (this.panelClass) {\n        overlayConfig.panelClass = this.panelClass;\n      }\n      return overlayConfig;\n    }\n    /** Updates the state of a position strategy, based on the values of the directive inputs. */\n    _updatePositionStrategy(positionStrategy) {\n      const positions = this.positions.map(currentPosition => ({\n        originX: currentPosition.originX,\n        originY: currentPosition.originY,\n        overlayX: currentPosition.overlayX,\n        overlayY: currentPosition.overlayY,\n        offsetX: currentPosition.offsetX || this.offsetX,\n        offsetY: currentPosition.offsetY || this.offsetY,\n        panelClass: currentPosition.panelClass || undefined\n      }));\n      return positionStrategy.setOrigin(this._getOrigin()).withPositions(positions).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector);\n    }\n    /** Returns the position strategy of the overlay to be set on the overlay config */\n    _createPositionStrategy() {\n      const strategy = this._overlay.position().flexibleConnectedTo(this._getOrigin());\n      this._updatePositionStrategy(strategy);\n      return strategy;\n    }\n    _getOrigin() {\n      if (this.origin instanceof CdkOverlayOrigin) {\n        return this.origin.elementRef;\n      } else {\n        return this.origin;\n      }\n    }\n    _getOriginElement() {\n      if (this.origin instanceof CdkOverlayOrigin) {\n        return this.origin.elementRef.nativeElement;\n      }\n      if (this.origin instanceof ElementRef) {\n        return this.origin.nativeElement;\n      }\n      if (typeof Element !== 'undefined' && this.origin instanceof Element) {\n        return this.origin;\n      }\n      return null;\n    }\n    /** Attaches the overlay. */\n    attachOverlay() {\n      if (!this._overlayRef) {\n        this._createOverlay();\n      } else {\n        // Update the overlay size, in case the directive's inputs have changed\n        this._overlayRef.getConfig().hasBackdrop = this.hasBackdrop;\n      }\n      if (!this._overlayRef.hasAttached()) {\n        this._overlayRef.attach(this._templatePortal);\n      }\n      if (this.hasBackdrop) {\n        this._backdropSubscription = this._overlayRef.backdropClick().subscribe(event => {\n          this.backdropClick.emit(event);\n        });\n      } else {\n        this._backdropSubscription.unsubscribe();\n      }\n      this._positionSubscription.unsubscribe();\n      // Only subscribe to `positionChanges` if requested, because putting\n      // together all the information for it can be expensive.\n      if (this.positionChange.observers.length > 0) {\n        this._positionSubscription = this._position.positionChanges.pipe(takeWhile(() => this.positionChange.observers.length > 0)).subscribe(position => {\n          this._ngZone.run(() => this.positionChange.emit(position));\n          if (this.positionChange.observers.length === 0) {\n            this._positionSubscription.unsubscribe();\n          }\n        });\n      }\n      this.open = true;\n    }\n    /** Detaches the overlay. */\n    detachOverlay() {\n      this._overlayRef?.detach();\n      this._backdropSubscription.unsubscribe();\n      this._positionSubscription.unsubscribe();\n      this.open = false;\n    }\n    static ɵfac = function CdkConnectedOverlay_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkConnectedOverlay)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkConnectedOverlay,\n      selectors: [[\"\", \"cdk-connected-overlay\", \"\"], [\"\", \"connected-overlay\", \"\"], [\"\", \"cdkConnectedOverlay\", \"\"]],\n      inputs: {\n        origin: [0, \"cdkConnectedOverlayOrigin\", \"origin\"],\n        positions: [0, \"cdkConnectedOverlayPositions\", \"positions\"],\n        positionStrategy: [0, \"cdkConnectedOverlayPositionStrategy\", \"positionStrategy\"],\n        offsetX: [0, \"cdkConnectedOverlayOffsetX\", \"offsetX\"],\n        offsetY: [0, \"cdkConnectedOverlayOffsetY\", \"offsetY\"],\n        width: [0, \"cdkConnectedOverlayWidth\", \"width\"],\n        height: [0, \"cdkConnectedOverlayHeight\", \"height\"],\n        minWidth: [0, \"cdkConnectedOverlayMinWidth\", \"minWidth\"],\n        minHeight: [0, \"cdkConnectedOverlayMinHeight\", \"minHeight\"],\n        backdropClass: [0, \"cdkConnectedOverlayBackdropClass\", \"backdropClass\"],\n        panelClass: [0, \"cdkConnectedOverlayPanelClass\", \"panelClass\"],\n        viewportMargin: [0, \"cdkConnectedOverlayViewportMargin\", \"viewportMargin\"],\n        scrollStrategy: [0, \"cdkConnectedOverlayScrollStrategy\", \"scrollStrategy\"],\n        open: [0, \"cdkConnectedOverlayOpen\", \"open\"],\n        disableClose: [0, \"cdkConnectedOverlayDisableClose\", \"disableClose\"],\n        transformOriginSelector: [0, \"cdkConnectedOverlayTransformOriginOn\", \"transformOriginSelector\"],\n        hasBackdrop: [2, \"cdkConnectedOverlayHasBackdrop\", \"hasBackdrop\", booleanAttribute],\n        lockPosition: [2, \"cdkConnectedOverlayLockPosition\", \"lockPosition\", booleanAttribute],\n        flexibleDimensions: [2, \"cdkConnectedOverlayFlexibleDimensions\", \"flexibleDimensions\", booleanAttribute],\n        growAfterOpen: [2, \"cdkConnectedOverlayGrowAfterOpen\", \"growAfterOpen\", booleanAttribute],\n        push: [2, \"cdkConnectedOverlayPush\", \"push\", booleanAttribute],\n        disposeOnNavigation: [2, \"cdkConnectedOverlayDisposeOnNavigation\", \"disposeOnNavigation\", booleanAttribute]\n      },\n      outputs: {\n        backdropClick: \"backdropClick\",\n        positionChange: \"positionChange\",\n        attach: \"attach\",\n        detach: \"detach\",\n        overlayKeydown: \"overlayKeydown\",\n        overlayOutsideClick: \"overlayOutsideClick\"\n      },\n      exportAs: [\"cdkConnectedOverlay\"],\n      features: [i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return CdkConnectedOverlay;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nfunction CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {\n  return () => overlay.scrollStrategies.reposition();\n}\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n  provide: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n  deps: [Overlay],\n  useFactory: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY\n};\nlet OverlayModule = /*#__PURE__*/(() => {\n  class OverlayModule {\n    static ɵfac = function OverlayModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || OverlayModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: OverlayModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [Overlay, CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER],\n      imports: [BidiModule, PortalModule, ScrollingModule, ScrollingModule]\n    });\n  }\n  return OverlayModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { BlockScrollStrategy as B, CdkOverlayOrigin as C, FlexibleConnectedPositionStrategy as F, GlobalPositionStrategy as G, NoopScrollStrategy as N, OverlayContainer as O, RepositionScrollStrategy as R, STANDARD_DROPDOWN_ADJACENT_POSITIONS as S, Overlay as a, CdkConnectedOverlay as b, OverlayRef as c, OverlayPositionBuilder as d, STANDARD_DROPDOWN_BELOW_POSITIONS as e, OverlayConfig as f, ConnectionPositionPair as g, ScrollingVisibility as h, ConnectedOverlayPositionChange as i, validateHorizontalPosition as j, ScrollStrategyOptions as k, CloseScrollStrategy as l, OverlayModule as m, OverlayOutsideClickDispatcher as n, OverlayKeyboardDispatcher as o, validateVerticalPosition as v };\n","import * as i0 from '@angular/core';\nimport { NgModule } from '@angular/core';\nimport { M as MatCommonModule } from './common-module-WayjW0Pb.mjs';\nimport { M as MatRipple } from './ripple-BT3tzh6F.mjs';\nlet MatRippleModule = /*#__PURE__*/(() => {\n  class MatRippleModule {\n    static ɵfac = function MatRippleModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatRippleModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: MatRippleModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [MatCommonModule, MatCommonModule]\n    });\n  }\n  return MatRippleModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatRippleModule as M };\n","import { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { inject, ANIMATION_MODULE_TYPE, NgZone, Injector, RendererFactory2, Injectable } from '@angular/core';\nimport { Platform, _bindEventWithOptions, _getEventTarget } from '@angular/cdk/platform';\nimport { a as MAT_RIPPLE_GLOBAL_OPTIONS, R as RippleRenderer, d as defaultRippleAnimationConfig } from './ripple-BT3tzh6F.mjs';\n\n/** The options for the MatRippleLoader's event listeners. */\nconst eventListenerOptions = {\n  capture: true\n};\n/**\n * The events that should trigger the initialization of the ripple.\n * Note that we use `mousedown`, rather than `click`, for mouse devices because\n * we can't rely on `mouseenter` in the shadow DOM and `click` happens too late.\n */\nconst rippleInteractionEvents = ['focus', 'mousedown', 'mouseenter', 'touchstart'];\n/** The attribute attached to a component whose ripple has not yet been initialized. */\nconst matRippleUninitialized = 'mat-ripple-loader-uninitialized';\n/** Additional classes that should be added to the ripple when it is rendered. */\nconst matRippleClassName = 'mat-ripple-loader-class-name';\n/** Whether the ripple should be centered. */\nconst matRippleCentered = 'mat-ripple-loader-centered';\n/** Whether the ripple should be disabled. */\nconst matRippleDisabled = 'mat-ripple-loader-disabled';\n/**\n * Handles attaching ripples on demand.\n *\n * This service allows us to avoid eagerly creating & attaching MatRipples.\n * It works by creating & attaching a ripple only when a component is first interacted with.\n *\n * @docs-private\n */\nlet MatRippleLoader = /*#__PURE__*/(() => {\n  class MatRippleLoader {\n    _document = inject(DOCUMENT);\n    _animationMode = inject(ANIMATION_MODULE_TYPE, {\n      optional: true\n    });\n    _globalRippleOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {\n      optional: true\n    });\n    _platform = inject(Platform);\n    _ngZone = inject(NgZone);\n    _injector = inject(Injector);\n    _eventCleanups;\n    _hosts = new Map();\n    constructor() {\n      const renderer = inject(RendererFactory2).createRenderer(null, null);\n      this._eventCleanups = this._ngZone.runOutsideAngular(() => {\n        return rippleInteractionEvents.map(name => _bindEventWithOptions(renderer, this._document, name, this._onInteraction, eventListenerOptions));\n      });\n    }\n    ngOnDestroy() {\n      const hosts = this._hosts.keys();\n      for (const host of hosts) {\n        this.destroyRipple(host);\n      }\n      this._eventCleanups.forEach(cleanup => cleanup());\n    }\n    /**\n     * Configures the ripple that will be rendered by the ripple loader.\n     *\n     * Stores the given information about how the ripple should be configured on the host\n     * element so that it can later be retrived & used when the ripple is actually created.\n     */\n    configureRipple(host, config) {\n      // Indicates that the ripple has not yet been rendered for this component.\n      host.setAttribute(matRippleUninitialized, this._globalRippleOptions?.namespace ?? '');\n      // Store the additional class name(s) that should be added to the ripple element.\n      if (config.className || !host.hasAttribute(matRippleClassName)) {\n        host.setAttribute(matRippleClassName, config.className || '');\n      }\n      // Store whether the ripple should be centered.\n      if (config.centered) {\n        host.setAttribute(matRippleCentered, '');\n      }\n      if (config.disabled) {\n        host.setAttribute(matRippleDisabled, '');\n      }\n    }\n    /** Sets the disabled state on the ripple instance corresponding to the given host element. */\n    setDisabled(host, disabled) {\n      const ripple = this._hosts.get(host);\n      // If the ripple has already been instantiated, just disable it.\n      if (ripple) {\n        ripple.target.rippleDisabled = disabled;\n        if (!disabled && !ripple.hasSetUpEvents) {\n          ripple.hasSetUpEvents = true;\n          ripple.renderer.setupTriggerEvents(host);\n        }\n      } else if (disabled) {\n        // Otherwise, set an attribute so we know what the\n        // disabled state should be when the ripple is initialized.\n        host.setAttribute(matRippleDisabled, '');\n      } else {\n        host.removeAttribute(matRippleDisabled);\n      }\n    }\n    /**\n     * Handles creating and attaching component internals\n     * when a component is initially interacted with.\n     */\n    _onInteraction = event => {\n      const eventTarget = _getEventTarget(event);\n      if (eventTarget instanceof HTMLElement) {\n        // TODO(wagnermaciel): Consider batching these events to improve runtime performance.\n        const element = eventTarget.closest(`[${matRippleUninitialized}=\"${this._globalRippleOptions?.namespace ?? ''}\"]`);\n        if (element) {\n          this._createRipple(element);\n        }\n      }\n    };\n    /** Creates a MatRipple and appends it to the given element. */\n    _createRipple(host) {\n      if (!this._document || this._hosts.has(host)) {\n        return;\n      }\n      // Create the ripple element.\n      host.querySelector('.mat-ripple')?.remove();\n      const rippleEl = this._document.createElement('span');\n      rippleEl.classList.add('mat-ripple', host.getAttribute(matRippleClassName));\n      host.append(rippleEl);\n      const isNoopAnimations = this._animationMode === 'NoopAnimations';\n      const globalOptions = this._globalRippleOptions;\n      const enterDuration = isNoopAnimations ? 0 : globalOptions?.animation?.enterDuration ?? defaultRippleAnimationConfig.enterDuration;\n      const exitDuration = isNoopAnimations ? 0 : globalOptions?.animation?.exitDuration ?? defaultRippleAnimationConfig.exitDuration;\n      const target = {\n        rippleDisabled: isNoopAnimations || globalOptions?.disabled || host.hasAttribute(matRippleDisabled),\n        rippleConfig: {\n          centered: host.hasAttribute(matRippleCentered),\n          terminateOnPointerUp: globalOptions?.terminateOnPointerUp,\n          animation: {\n            enterDuration,\n            exitDuration\n          }\n        }\n      };\n      const renderer = new RippleRenderer(target, this._ngZone, rippleEl, this._platform, this._injector);\n      const hasSetUpEvents = !target.rippleDisabled;\n      if (hasSetUpEvents) {\n        renderer.setupTriggerEvents(host);\n      }\n      this._hosts.set(host, {\n        target,\n        renderer,\n        hasSetUpEvents\n      });\n      host.removeAttribute(matRippleUninitialized);\n    }\n    destroyRipple(host) {\n      const ripple = this._hosts.get(host);\n      if (ripple) {\n        ripple.renderer._removeTriggerEvents();\n        this._hosts.delete(host);\n      }\n    }\n    static ɵfac = function MatRippleLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatRippleLoader)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: MatRippleLoader,\n      factory: MatRippleLoader.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return MatRippleLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatRippleLoader as M };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, inject, ElementRef, NgZone, ANIMATION_MODULE_TYPE, booleanAttribute, Directive, Input, Renderer2, numberAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\nimport { M as MatRippleLoader } from './ripple-loader-Ce3DAhPW.mjs';\nimport { _ as _StructuralStylesLoader } from './structural-styles-BQUT6wsL.mjs';\n\n/** Injection token that can be used to provide the default options the button component. */\nconst _c0 = [\"mat-icon-button\", \"\"];\nconst _c1 = [\"*\"];\nconst _c2 = \".mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;color:inherit;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:50%;flex-shrink:0;text-align:center;width:var(--mdc-icon-button-state-layer-size, 40px);height:var(--mdc-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mdc-icon-button-state-layer-size, 40px) - var(--mdc-icon-button-icon-size, 24px)) / 2);font-size:var(--mdc-icon-button-icon-size, 24px);color:var(--mdc-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus>.mat-focus-indicator::before{content:\\\"\\\";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-icon-button-touch-target-display, block)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mdc-icon-button-icon-size, 24px);height:var(--mdc-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:50%}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1}\\n\";\nconst _c3 = \"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\\n\";\nconst MAT_BUTTON_CONFIG = /*#__PURE__*/new InjectionToken('MAT_BUTTON_CONFIG');\n/** Shared host configuration for all buttons */\nconst MAT_BUTTON_HOST = {\n  '[attr.disabled]': '_getDisabledAttribute()',\n  '[attr.aria-disabled]': '_getAriaDisabled()',\n  '[class.mat-mdc-button-disabled]': 'disabled',\n  '[class.mat-mdc-button-disabled-interactive]': 'disabledInteractive',\n  '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n  // MDC automatically applies the primary theme color to the button, but we want to support\n  // an unthemed version. If color is undefined, apply a CSS class that makes it easy to\n  // select and style this \"theme\".\n  '[class.mat-unthemed]': '!color',\n  // Add a class that applies to all buttons. This makes it easier to target if somebody\n  // wants to target all Material buttons.\n  '[class.mat-mdc-button-base]': 'true',\n  '[class]': 'color ? \"mat-\" + color : \"\"'\n};\n/** List of classes to add to buttons instances based on host attribute selector. */\nconst HOST_SELECTOR_MDC_CLASS_PAIR = [{\n  attribute: 'mat-button',\n  mdcClasses: ['mdc-button', 'mat-mdc-button']\n}, {\n  attribute: 'mat-flat-button',\n  mdcClasses: ['mdc-button', 'mdc-button--unelevated', 'mat-mdc-unelevated-button']\n}, {\n  attribute: 'mat-raised-button',\n  mdcClasses: ['mdc-button', 'mdc-button--raised', 'mat-mdc-raised-button']\n}, {\n  attribute: 'mat-stroked-button',\n  mdcClasses: ['mdc-button', 'mdc-button--outlined', 'mat-mdc-outlined-button']\n}, {\n  attribute: 'mat-fab',\n  mdcClasses: ['mdc-fab', 'mat-mdc-fab-base', 'mat-mdc-fab']\n}, {\n  attribute: 'mat-mini-fab',\n  mdcClasses: ['mdc-fab', 'mat-mdc-fab-base', 'mdc-fab--mini', 'mat-mdc-mini-fab']\n}, {\n  attribute: 'mat-icon-button',\n  mdcClasses: ['mdc-icon-button', 'mat-mdc-icon-button']\n}];\n/** Base class for all buttons.  */\nlet MatButtonBase = /*#__PURE__*/(() => {\n  class MatButtonBase {\n    _elementRef = inject(ElementRef);\n    _ngZone = inject(NgZone);\n    _animationMode = inject(ANIMATION_MODULE_TYPE, {\n      optional: true\n    });\n    _focusMonitor = inject(FocusMonitor);\n    /**\n     * Handles the lazy creation of the MatButton ripple.\n     * Used to improve initial load time of large applications.\n     */\n    _rippleLoader = inject(MatRippleLoader);\n    /** Whether this button is a FAB. Used to apply the correct class on the ripple. */\n    _isFab = false;\n    /**\n     * Theme color of the button. This API is supported in M2 themes only, it has\n     * no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/button/styling.\n     *\n     * For information on applying color variants in M3, see\n     * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n     */\n    color;\n    /** Whether the ripple effect is disabled or not. */\n    get disableRipple() {\n      return this._disableRipple;\n    }\n    set disableRipple(value) {\n      this._disableRipple = value;\n      this._updateRippleDisabled();\n    }\n    _disableRipple = false;\n    /** Whether the button is disabled. */\n    get disabled() {\n      return this._disabled;\n    }\n    set disabled(value) {\n      this._disabled = value;\n      this._updateRippleDisabled();\n    }\n    _disabled = false;\n    /** `aria-disabled` value of the button. */\n    ariaDisabled;\n    /**\n     * Natively disabled buttons prevent focus and any pointer events from reaching the button.\n     * In some scenarios this might not be desirable, because it can prevent users from finding out\n     * why the button is disabled (e.g. via tooltip). This is also useful for buttons that may\n     * become disabled when activated, which would cause focus to be transferred to the document\n     * body instead of remaining on the button.\n     *\n     * Enabling this input will change the button so that it is styled to be disabled and will be\n     * marked as `aria-disabled`, but it will allow the button to receive events and focus.\n     *\n     * Note that by enabling this, you need to set the `tabindex` yourself if the button isn't\n     * meant to be tabbable and you have to prevent the button action (e.g. form submissions).\n     */\n    disabledInteractive;\n    constructor() {\n      inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);\n      const config = inject(MAT_BUTTON_CONFIG, {\n        optional: true\n      });\n      const element = this._elementRef.nativeElement;\n      const classList = element.classList;\n      this.disabledInteractive = config?.disabledInteractive ?? false;\n      this.color = config?.color ?? null;\n      this._rippleLoader?.configureRipple(element, {\n        className: 'mat-mdc-button-ripple'\n      });\n      // For each of the variant selectors that is present in the button's host\n      // attributes, add the correct corresponding MDC classes.\n      for (const {\n        attribute,\n        mdcClasses\n      } of HOST_SELECTOR_MDC_CLASS_PAIR) {\n        if (element.hasAttribute(attribute)) {\n          classList.add(...mdcClasses);\n        }\n      }\n    }\n    ngAfterViewInit() {\n      this._focusMonitor.monitor(this._elementRef, true);\n    }\n    ngOnDestroy() {\n      this._focusMonitor.stopMonitoring(this._elementRef);\n      this._rippleLoader?.destroyRipple(this._elementRef.nativeElement);\n    }\n    /** Focuses the button. */\n    focus(origin = 'program', options) {\n      if (origin) {\n        this._focusMonitor.focusVia(this._elementRef.nativeElement, origin, options);\n      } else {\n        this._elementRef.nativeElement.focus(options);\n      }\n    }\n    _getAriaDisabled() {\n      if (this.ariaDisabled != null) {\n        return this.ariaDisabled;\n      }\n      return this.disabled && this.disabledInteractive ? true : null;\n    }\n    _getDisabledAttribute() {\n      return this.disabledInteractive || !this.disabled ? null : true;\n    }\n    _updateRippleDisabled() {\n      this._rippleLoader?.setDisabled(this._elementRef.nativeElement, this.disableRipple || this.disabled);\n    }\n    static ɵfac = function MatButtonBase_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatButtonBase)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatButtonBase,\n      inputs: {\n        color: \"color\",\n        disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n        disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n        ariaDisabled: [2, \"aria-disabled\", \"ariaDisabled\", booleanAttribute],\n        disabledInteractive: [2, \"disabledInteractive\", \"disabledInteractive\", booleanAttribute]\n      }\n    });\n  }\n  return MatButtonBase;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Shared host configuration for buttons using the `<a>` tag. */\nconst MAT_ANCHOR_HOST = {\n  // Note that this is basically a noop on anchors,\n  // but it appears that some internal apps depend on it.\n  '[attr.disabled]': '_getDisabledAttribute()',\n  '[class.mat-mdc-button-disabled]': 'disabled',\n  '[class.mat-mdc-button-disabled-interactive]': 'disabledInteractive',\n  '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n  // Note that we ignore the user-specified tabindex when it's disabled for\n  // consistency with the `mat-button` applied on native buttons where even\n  // though they have an index, they're not tabbable.\n  '[attr.tabindex]': 'disabled && !disabledInteractive ? -1 : tabIndex',\n  '[attr.aria-disabled]': '_getAriaDisabled()',\n  // MDC automatically applies the primary theme color to the button, but we want to support\n  // an unthemed version. If color is undefined, apply a CSS class that makes it easy to\n  // select and style this \"theme\".\n  '[class.mat-unthemed]': '!color',\n  // Add a class that applies to all buttons. This makes it easier to target if somebody\n  // wants to target all Material buttons.\n  '[class.mat-mdc-button-base]': 'true',\n  '[class]': 'color ? \"mat-\" + color : \"\"'\n};\n/**\n * Anchor button base.\n */\nlet MatAnchorBase = /*#__PURE__*/(() => {\n  class MatAnchorBase extends MatButtonBase {\n    _renderer = inject(Renderer2);\n    _cleanupClick;\n    tabIndex;\n    ngOnInit() {\n      this._ngZone.runOutsideAngular(() => {\n        this._cleanupClick = this._renderer.listen(this._elementRef.nativeElement, 'click', this._haltDisabledEvents);\n      });\n    }\n    ngOnDestroy() {\n      super.ngOnDestroy();\n      this._cleanupClick?.();\n    }\n    _haltDisabledEvents = event => {\n      // A disabled button shouldn't apply any actions\n      if (this.disabled) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n      }\n    };\n    _getAriaDisabled() {\n      if (this.ariaDisabled != null) {\n        return this.ariaDisabled;\n      }\n      return this.disabled || null;\n    }\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMatAnchorBase_BaseFactory;\n      return function MatAnchorBase_Factory(__ngFactoryType__) {\n        return (ɵMatAnchorBase_BaseFactory || (ɵMatAnchorBase_BaseFactory = i0.ɵɵgetInheritedFactory(MatAnchorBase)))(__ngFactoryType__ || MatAnchorBase);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatAnchorBase,\n      inputs: {\n        tabIndex: [2, \"tabIndex\", \"tabIndex\", value => {\n          return value == null ? undefined : numberAttribute(value);\n        }]\n      },\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return MatAnchorBase;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Material Design icon button component. This type of button displays a single interactive icon for\n * users to perform an action.\n * See https://material.io/develop/web/components/buttons/icon-buttons/\n */\nlet MatIconButton = /*#__PURE__*/(() => {\n  class MatIconButton extends MatButtonBase {\n    constructor() {\n      super();\n      this._rippleLoader.configureRipple(this._elementRef.nativeElement, {\n        centered: true\n      });\n    }\n    static ɵfac = function MatIconButton_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatIconButton)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatIconButton,\n      selectors: [[\"button\", \"mat-icon-button\", \"\"]],\n      hostVars: 14,\n      hostBindings: function MatIconButton_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c0,\n      ngContentSelectors: _c1,\n      decls: 4,\n      vars: 0,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\", \"mdc-icon-button__ripple\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatIconButton_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef();\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelement(2, \"span\", 1)(3, \"span\", 2);\n        }\n      },\n      styles: [\".mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;color:inherit;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:50%;flex-shrink:0;text-align:center;width:var(--mdc-icon-button-state-layer-size, 40px);height:var(--mdc-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mdc-icon-button-state-layer-size, 40px) - var(--mdc-icon-button-icon-size, 24px)) / 2);font-size:var(--mdc-icon-button-icon-size, 24px);color:var(--mdc-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus>.mat-focus-indicator::before{content:\\\"\\\";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-icon-button-touch-target-display, block)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mdc-icon-button-icon-size, 24px);height:var(--mdc-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:50%}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1}\\n\", \"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatIconButton;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Material Design icon button component for anchor elements. This button displays a single\n * interaction icon that allows users to navigate across different routes or pages.\n * See https://material.io/develop/web/components/buttons/icon-buttons/\n */\nlet MatIconAnchor = /*#__PURE__*/(() => {\n  class MatIconAnchor extends MatAnchorBase {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMatIconAnchor_BaseFactory;\n      return function MatIconAnchor_Factory(__ngFactoryType__) {\n        return (ɵMatIconAnchor_BaseFactory || (ɵMatIconAnchor_BaseFactory = i0.ɵɵgetInheritedFactory(MatIconAnchor)))(__ngFactoryType__ || MatIconAnchor);\n      };\n    })();\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatIconAnchor,\n      selectors: [[\"a\", \"mat-icon-button\", \"\"]],\n      hostVars: 15,\n      hostBindings: function MatIconAnchor_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"tabindex\", ctx.disabled && !ctx.disabledInteractive ? -1 : ctx.tabIndex)(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\", \"matAnchor\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c0,\n      ngContentSelectors: _c1,\n      decls: 4,\n      vars: 0,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\", \"mdc-icon-button__ripple\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatIconAnchor_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef();\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelement(2, \"span\", 1)(3, \"span\", 2);\n        }\n      },\n      styles: [_c2, _c3],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatIconAnchor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatIconButton as M, MatButtonBase as a, MAT_BUTTON_HOST as b, MatAnchorBase as c, MAT_ANCHOR_HOST as d, MatIconAnchor as e, MAT_BUTTON_CONFIG as f };\n","import { a as MatButtonBase, b as MAT_BUTTON_HOST, c as MatAnchorBase, d as MAT_ANCHOR_HOST, e as MatIconAnchor, M as MatIconButton } from './icon-button-D1J0zeqv.mjs';\nconst _c0 = [\"mat-button\", \"\"];\nconst _c1 = [[[\"\", 8, \"material-icons\", 3, \"iconPositionEnd\", \"\"], [\"mat-icon\", 3, \"iconPositionEnd\", \"\"], [\"\", \"matButtonIcon\", \"\", 3, \"iconPositionEnd\", \"\"]], \"*\", [[\"\", \"iconPositionEnd\", \"\", 8, \"material-icons\"], [\"mat-icon\", \"iconPositionEnd\", \"\"], [\"\", \"matButtonIcon\", \"\", \"iconPositionEnd\", \"\"]]];\nconst _c2 = [\".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])\", \"*\", \".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]\"];\nconst _c3 = \".mat-mdc-button-base{text-decoration:none}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-text-button-horizontal-padding, 12px);height:var(--mdc-text-button-container-height, 40px);font-family:var(--mdc-text-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-text-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-text-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-text-button-label-text-transform);font-weight:var(--mdc-text-button-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mdc-text-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mdc-text-button-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-text-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-text-button-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-text-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-text-button-touch-target-display, block)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-filled-button-container-height, 40px);font-family:var(--mdc-filled-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-filled-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-filled-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-filled-button-label-text-transform);font-weight:var(--mdc-filled-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-filled-button-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-filled-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-filled-button-touch-target-display, block)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mdc-filled-button-label-text-color, var(--mat-sys-on-primary));background-color:var(--mdc-filled-button-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mdc-filled-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-filled-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-filled-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mdc-protected-button-container-elevation-shadow, var(--mat-sys-level1));height:var(--mdc-protected-button-container-height, 40px);font-family:var(--mdc-protected-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-protected-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-protected-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-protected-button-label-text-transform);font-weight:var(--mdc-protected-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-protected-button-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-protected-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-protected-button-touch-target-display, block)}.mat-mdc-raised-button:not(:disabled){color:var(--mdc-protected-button-label-text-color, var(--mat-sys-primary));background-color:var(--mdc-protected-button-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mdc-protected-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-raised-button:hover{box-shadow:var(--mdc-protected-button-hover-container-elevation-shadow, var(--mat-sys-level2))}.mat-mdc-raised-button:focus{box-shadow:var(--mdc-protected-button-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mdc-protected-button-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-protected-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-protected-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mdc-protected-button-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-outlined-button-container-height, 40px);font-family:var(--mdc-outlined-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-outlined-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-outlined-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-outlined-button-label-text-transform);font-weight:var(--mdc-outlined-button-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mdc-outlined-button-container-shape, var(--mat-sys-corner-full));border-width:var(--mdc-outlined-button-outline-width, 1px);padding:0 var(--mat-outlined-button-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-outlined-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-outlined-button-touch-target-display, block)}.mat-mdc-outlined-button:not(:disabled){color:var(--mdc-outlined-button-label-text-color, var(--mat-sys-primary));border-color:var(--mdc-outlined-button-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-outlined-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mdc-outlined-button-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus>.mat-focus-indicator::before,.mat-mdc-raised-button:focus>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus>.mat-focus-indicator::before{content:\\\"\\\";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)}\\n\";\nconst _c4 = \"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\\n\";\nconst _c5 = [\"mat-fab\", \"\"];\nconst _c6 = [\"mat-mini-fab\", \"\"];\nconst _c7 = \".mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:\\\"\\\"}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}\\n\";\nexport { f as MAT_BUTTON_CONFIG } from './icon-button-D1J0zeqv.mjs';\nimport * as i0 from '@angular/core';\nimport { Component, ViewEncapsulation, ChangeDetectionStrategy, InjectionToken, inject, booleanAttribute, Input, NgModule } from '@angular/core';\nimport { M as MatRippleModule } from './index-SYVYjXwK.mjs';\nimport { M as MatCommonModule } from './common-module-WayjW0Pb.mjs';\nimport '@angular/cdk/a11y';\nimport '@angular/cdk/private';\nimport './ripple-loader-Ce3DAhPW.mjs';\nimport '@angular/common';\nimport '@angular/cdk/platform';\nimport './ripple-BT3tzh6F.mjs';\nimport '@angular/cdk/coercion';\nimport './structural-styles-BQUT6wsL.mjs';\nimport '@angular/cdk/bidi';\n\n/**\n * Material Design button component. Users interact with a button to perform an action.\n * See https://material.io/components/buttons\n *\n * The `MatButton` class applies to native button elements and captures the appearances for\n * \"text button\", \"outlined button\", and \"contained button\" per the Material Design\n * specification. `MatButton` additionally captures an additional \"flat\" appearance, which matches\n * \"contained\" but without elevation.\n */\nlet MatButton = /*#__PURE__*/(() => {\n  class MatButton extends MatButtonBase {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMatButton_BaseFactory;\n      return function MatButton_Factory(__ngFactoryType__) {\n        return (ɵMatButton_BaseFactory || (ɵMatButton_BaseFactory = i0.ɵɵgetInheritedFactory(MatButton)))(__ngFactoryType__ || MatButton);\n      };\n    })();\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatButton,\n      selectors: [[\"button\", \"mat-button\", \"\"], [\"button\", \"mat-raised-button\", \"\"], [\"button\", \"mat-flat-button\", \"\"], [\"button\", \"mat-stroked-button\", \"\"]],\n      hostVars: 14,\n      hostBindings: function MatButton_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c0,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatButton_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [\".mat-mdc-button-base{text-decoration:none}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-text-button-horizontal-padding, 12px);height:var(--mdc-text-button-container-height, 40px);font-family:var(--mdc-text-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-text-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-text-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-text-button-label-text-transform);font-weight:var(--mdc-text-button-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mdc-text-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mdc-text-button-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-text-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-text-button-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-text-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-text-button-touch-target-display, block)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-filled-button-container-height, 40px);font-family:var(--mdc-filled-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-filled-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-filled-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-filled-button-label-text-transform);font-weight:var(--mdc-filled-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-filled-button-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-filled-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-filled-button-touch-target-display, block)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mdc-filled-button-label-text-color, var(--mat-sys-on-primary));background-color:var(--mdc-filled-button-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mdc-filled-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-filled-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-filled-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mdc-protected-button-container-elevation-shadow, var(--mat-sys-level1));height:var(--mdc-protected-button-container-height, 40px);font-family:var(--mdc-protected-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-protected-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-protected-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-protected-button-label-text-transform);font-weight:var(--mdc-protected-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-protected-button-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-protected-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-protected-button-touch-target-display, block)}.mat-mdc-raised-button:not(:disabled){color:var(--mdc-protected-button-label-text-color, var(--mat-sys-primary));background-color:var(--mdc-protected-button-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mdc-protected-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-raised-button:hover{box-shadow:var(--mdc-protected-button-hover-container-elevation-shadow, var(--mat-sys-level2))}.mat-mdc-raised-button:focus{box-shadow:var(--mdc-protected-button-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mdc-protected-button-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-protected-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-protected-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mdc-protected-button-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-outlined-button-container-height, 40px);font-family:var(--mdc-outlined-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-outlined-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-outlined-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-outlined-button-label-text-transform);font-weight:var(--mdc-outlined-button-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mdc-outlined-button-container-shape, var(--mat-sys-corner-full));border-width:var(--mdc-outlined-button-outline-width, 1px);padding:0 var(--mat-outlined-button-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-outlined-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-outlined-button-touch-target-display, block)}.mat-mdc-outlined-button:not(:disabled){color:var(--mdc-outlined-button-label-text-color, var(--mat-sys-primary));border-color:var(--mdc-outlined-button-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-outlined-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mdc-outlined-button-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus>.mat-focus-indicator::before,.mat-mdc-raised-button:focus>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus>.mat-focus-indicator::before{content:\\\"\\\";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)}\\n\", \"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatButton;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Material Design button component for anchor elements. Anchor elements are used to provide\n * links for the user to navigate across different routes or pages.\n * See https://material.io/components/buttons\n *\n * The `MatAnchor` class applies to native anchor elements and captures the appearances for\n * \"text button\", \"outlined button\", and \"contained button\" per the Material Design\n * specification. `MatAnchor` additionally captures an additional \"flat\" appearance, which matches\n * \"contained\" but without elevation.\n */\nlet MatAnchor = /*#__PURE__*/(() => {\n  class MatAnchor extends MatAnchorBase {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵMatAnchor_BaseFactory;\n      return function MatAnchor_Factory(__ngFactoryType__) {\n        return (ɵMatAnchor_BaseFactory || (ɵMatAnchor_BaseFactory = i0.ɵɵgetInheritedFactory(MatAnchor)))(__ngFactoryType__ || MatAnchor);\n      };\n    })();\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatAnchor,\n      selectors: [[\"a\", \"mat-button\", \"\"], [\"a\", \"mat-raised-button\", \"\"], [\"a\", \"mat-flat-button\", \"\"], [\"a\", \"mat-stroked-button\", \"\"]],\n      hostVars: 15,\n      hostBindings: function MatAnchor_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"tabindex\", ctx.disabled && !ctx.disabledInteractive ? -1 : ctx.tabIndex)(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\", \"matAnchor\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c0,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatAnchor_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [_c3, _c4],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatAnchor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Injection token to be used to override the default options for FAB. */\nconst MAT_FAB_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('mat-mdc-fab-default-options', {\n  providedIn: 'root',\n  factory: MAT_FAB_DEFAULT_OPTIONS_FACTORY\n});\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nfunction MAT_FAB_DEFAULT_OPTIONS_FACTORY() {\n  return {\n    // The FAB by default has its color set to accent.\n    color: 'accent'\n  };\n}\n// Default FAB configuration.\nconst defaults = /*#__PURE__*/MAT_FAB_DEFAULT_OPTIONS_FACTORY();\n/**\n * Material Design floating action button (FAB) component. These buttons represent the primary\n * or most common action for users to interact with.\n * See https://material.io/components/buttons-floating-action-button/\n *\n * The `MatFabButton` class has two appearances: normal and extended.\n */\nlet MatFabButton = /*#__PURE__*/(() => {\n  class MatFabButton extends MatButtonBase {\n    _options = inject(MAT_FAB_DEFAULT_OPTIONS, {\n      optional: true\n    });\n    _isFab = true;\n    extended;\n    constructor() {\n      super();\n      this._options = this._options || defaults;\n      this.color = this._options.color || defaults.color;\n    }\n    static ɵfac = function MatFabButton_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatFabButton)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatFabButton,\n      selectors: [[\"button\", \"mat-fab\", \"\"]],\n      hostVars: 18,\n      hostBindings: function MatFabButton_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true)(\"mdc-fab--extended\", ctx.extended)(\"mat-mdc-extended-fab\", ctx.extended);\n        }\n      },\n      inputs: {\n        extended: [2, \"extended\", \"extended\", booleanAttribute]\n      },\n      exportAs: [\"matButton\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c5,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatFabButton_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [\".mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:\\\"\\\";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:\\\"\\\"}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatFabButton;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Material Design mini floating action button (FAB) component. These buttons represent the primary\n * or most common action for users to interact with.\n * See https://material.io/components/buttons-floating-action-button/\n */\nlet MatMiniFabButton = /*#__PURE__*/(() => {\n  class MatMiniFabButton extends MatButtonBase {\n    _options = inject(MAT_FAB_DEFAULT_OPTIONS, {\n      optional: true\n    });\n    _isFab = true;\n    constructor() {\n      super();\n      this._options = this._options || defaults;\n      this.color = this._options.color || defaults.color;\n    }\n    static ɵfac = function MatMiniFabButton_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatMiniFabButton)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatMiniFabButton,\n      selectors: [[\"button\", \"mat-mini-fab\", \"\"]],\n      hostVars: 14,\n      hostBindings: function MatMiniFabButton_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c6,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatMiniFabButton_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [_c7],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatMiniFabButton;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Material Design floating action button (FAB) component for anchor elements. Anchor elements\n * are used to provide links for the user to navigate across different routes or pages.\n * See https://material.io/components/buttons-floating-action-button/\n *\n * The `MatFabAnchor` class has two appearances: normal and extended.\n */\nlet MatFabAnchor = /*#__PURE__*/(() => {\n  class MatFabAnchor extends MatAnchor {\n    _options = inject(MAT_FAB_DEFAULT_OPTIONS, {\n      optional: true\n    });\n    _isFab = true;\n    extended;\n    constructor() {\n      super();\n      this._options = this._options || defaults;\n      this.color = this._options.color || defaults.color;\n    }\n    static ɵfac = function MatFabAnchor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatFabAnchor)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatFabAnchor,\n      selectors: [[\"a\", \"mat-fab\", \"\"]],\n      hostVars: 19,\n      hostBindings: function MatFabAnchor_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"tabindex\", ctx.disabled && !ctx.disabledInteractive ? -1 : ctx.tabIndex)(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true)(\"mdc-fab--extended\", ctx.extended)(\"mat-mdc-extended-fab\", ctx.extended);\n        }\n      },\n      inputs: {\n        extended: [2, \"extended\", \"extended\", booleanAttribute]\n      },\n      exportAs: [\"matButton\", \"matAnchor\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c5,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatFabAnchor_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [_c7],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatFabAnchor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Material Design mini floating action button (FAB) component for anchor elements. Anchor elements\n * are used to provide links for the user to navigate across different routes or pages.\n * See https://material.io/components/buttons-floating-action-button/\n */\nlet MatMiniFabAnchor = /*#__PURE__*/(() => {\n  class MatMiniFabAnchor extends MatAnchor {\n    _options = inject(MAT_FAB_DEFAULT_OPTIONS, {\n      optional: true\n    });\n    _isFab = true;\n    constructor() {\n      super();\n      this._options = this._options || defaults;\n      this.color = this._options.color || defaults.color;\n    }\n    static ɵfac = function MatMiniFabAnchor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatMiniFabAnchor)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatMiniFabAnchor,\n      selectors: [[\"a\", \"mat-mini-fab\", \"\"]],\n      hostVars: 15,\n      hostBindings: function MatMiniFabAnchor_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"disabled\", ctx._getDisabledAttribute())(\"tabindex\", ctx.disabled && !ctx.disabledInteractive ? -1 : ctx.tabIndex)(\"aria-disabled\", ctx._getAriaDisabled());\n          i0.ɵɵclassMap(ctx.color ? \"mat-\" + ctx.color : \"\");\n          i0.ɵɵclassProp(\"mat-mdc-button-disabled\", ctx.disabled)(\"mat-mdc-button-disabled-interactive\", ctx.disabledInteractive)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-unthemed\", !ctx.color)(\"mat-mdc-button-base\", true);\n        }\n      },\n      exportAs: [\"matButton\", \"matAnchor\"],\n      features: [i0.ɵɵInheritDefinitionFeature],\n      attrs: _c6,\n      ngContentSelectors: _c2,\n      decls: 7,\n      vars: 4,\n      consts: [[1, \"mat-mdc-button-persistent-ripple\"], [1, \"mdc-button__label\"], [1, \"mat-focus-indicator\"], [1, \"mat-mdc-button-touch-target\"]],\n      template: function MatMiniFabAnchor_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef(_c1);\n          i0.ɵɵelement(0, \"span\", 0);\n          i0.ɵɵprojection(1);\n          i0.ɵɵelementStart(2, \"span\", 1);\n          i0.ɵɵprojection(3, 1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵprojection(4, 2);\n          i0.ɵɵelement(5, \"span\", 2)(6, \"span\", 3);\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mdc-button__ripple\", !ctx._isFab)(\"mdc-fab__ripple\", ctx._isFab);\n        }\n      },\n      styles: [_c7],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return MatMiniFabAnchor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatButtonModule = /*#__PURE__*/(() => {\n  class MatButtonModule {\n    static ɵfac = function MatButtonModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatButtonModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: MatButtonModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [MatCommonModule, MatRippleModule, MatCommonModule]\n    });\n  }\n  return MatButtonModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MAT_FAB_DEFAULT_OPTIONS, MAT_FAB_DEFAULT_OPTIONS_FACTORY, MatAnchor, MatButton, MatButtonModule, MatFabAnchor, MatFabButton, MatIconAnchor, MatIconButton, MatMiniFabAnchor, MatMiniFabButton };\n","import * as i0 from '@angular/core';\nimport { NgModule } from '@angular/core';\nexport { B as BreakpointObserver, M as MediaMatcher } from './breakpoints-observer-CljOfYGy.mjs';\nimport 'rxjs';\nimport 'rxjs/operators';\nimport './platform-DmdVEw_C.mjs';\nimport '@angular/common';\nimport './array-I1yfCXUO.mjs';\nlet LayoutModule = /*#__PURE__*/(() => {\n  class LayoutModule {\n    static ɵfac = function LayoutModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || LayoutModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: LayoutModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n  }\n  return LayoutModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// PascalCase is being used as Breakpoints is used like an enum.\n// tslint:disable-next-line:variable-name\nconst Breakpoints = {\n  XSmall: '(max-width: 599.98px)',\n  Small: '(min-width: 600px) and (max-width: 959.98px)',\n  Medium: '(min-width: 960px) and (max-width: 1279.98px)',\n  Large: '(min-width: 1280px) and (max-width: 1919.98px)',\n  XLarge: '(min-width: 1920px)',\n  Handset: '(max-width: 599.98px) and (orientation: portrait), ' + '(max-width: 959.98px) and (orientation: landscape)',\n  Tablet: '(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), ' + '(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)',\n  Web: '(min-width: 840px) and (orientation: portrait), ' + '(min-width: 1280px) and (orientation: landscape)',\n  HandsetPortrait: '(max-width: 599.98px) and (orientation: portrait)',\n  TabletPortrait: '(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)',\n  WebPortrait: '(min-width: 840px) and (orientation: portrait)',\n  HandsetLandscape: '(max-width: 959.98px) and (orientation: landscape)',\n  TabletLandscape: '(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)',\n  WebLandscape: '(min-width: 1280px) and (orientation: landscape)'\n};\nexport { Breakpoints, LayoutModule };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, Directive, inject, Component, ViewEncapsulation, ChangeDetectionStrategy, NgZone, ElementRef, ChangeDetectorRef, ANIMATION_MODULE_TYPE, afterRender, ViewChild, Injector, TemplateRef, Injectable, NgModule } from '@angular/core';\nimport { Subject, of } from 'rxjs';\nimport { MatButton, MatButtonModule } from './button.mjs';\nimport { DOCUMENT } from '@angular/common';\nimport { BasePortalOutlet, CdkPortalOutlet, ComponentPortal, TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport { _IdGenerator, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Platform } from '@angular/cdk/platform';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport { M as MatCommonModule } from './common-module-WayjW0Pb.mjs';\nimport './icon-button-D1J0zeqv.mjs';\nimport '@angular/cdk/private';\nimport './ripple-loader-Ce3DAhPW.mjs';\nimport './ripple-BT3tzh6F.mjs';\nimport '@angular/cdk/coercion';\nimport './structural-styles-BQUT6wsL.mjs';\nimport './index-SYVYjXwK.mjs';\nimport '@angular/cdk/bidi';\n\n/** Maximum amount of milliseconds that can be passed into setTimeout. */\nfunction SimpleSnackBar_Conditional_2_Template(rf, ctx) {\n  if (rf & 1) {\n    const _r1 = i0.ɵɵgetCurrentView();\n    i0.ɵɵelementStart(0, \"div\", 1)(1, \"button\", 2);\n    i0.ɵɵlistener(\"click\", function SimpleSnackBar_Conditional_2_Template_button_click_1_listener() {\n      i0.ɵɵrestoreView(_r1);\n      const ctx_r1 = i0.ɵɵnextContext();\n      return i0.ɵɵresetView(ctx_r1.action());\n    });\n    i0.ɵɵtext(2);\n    i0.ɵɵelementEnd()();\n  }\n  if (rf & 2) {\n    const ctx_r1 = i0.ɵɵnextContext();\n    i0.ɵɵadvance(2);\n    i0.ɵɵtextInterpolate1(\" \", ctx_r1.data.action, \" \");\n  }\n}\nconst _c0 = [\"label\"];\nfunction MatSnackBarContainer_ng_template_4_Template(rf, ctx) {}\nconst MAX_TIMEOUT = /*#__PURE__*/Math.pow(2, 31) - 1;\n/**\n * Reference to a snack bar dispatched from the snack bar service.\n */\nclass MatSnackBarRef {\n  _overlayRef;\n  /** The instance of the component making up the content of the snack bar. */\n  instance;\n  /**\n   * The instance of the component making up the content of the snack bar.\n   * @docs-private\n   */\n  containerInstance;\n  /** Subject for notifying the user that the snack bar has been dismissed. */\n  _afterDismissed = /*#__PURE__*/new Subject();\n  /** Subject for notifying the user that the snack bar has opened and appeared. */\n  _afterOpened = /*#__PURE__*/new Subject();\n  /** Subject for notifying the user that the snack bar action was called. */\n  _onAction = /*#__PURE__*/new Subject();\n  /**\n   * Timeout ID for the duration setTimeout call. Used to clear the timeout if the snackbar is\n   * dismissed before the duration passes.\n   */\n  _durationTimeoutId;\n  /** Whether the snack bar was dismissed using the action button. */\n  _dismissedByAction = false;\n  constructor(containerInstance, _overlayRef) {\n    this._overlayRef = _overlayRef;\n    this.containerInstance = containerInstance;\n    containerInstance._onExit.subscribe(() => this._finishDismiss());\n  }\n  /** Dismisses the snack bar. */\n  dismiss() {\n    if (!this._afterDismissed.closed) {\n      this.containerInstance.exit();\n    }\n    clearTimeout(this._durationTimeoutId);\n  }\n  /** Marks the snackbar action clicked. */\n  dismissWithAction() {\n    if (!this._onAction.closed) {\n      this._dismissedByAction = true;\n      this._onAction.next();\n      this._onAction.complete();\n      this.dismiss();\n    }\n    clearTimeout(this._durationTimeoutId);\n  }\n  /**\n   * Marks the snackbar action clicked.\n   * @deprecated Use `dismissWithAction` instead.\n   * @breaking-change 8.0.0\n   */\n  closeWithAction() {\n    this.dismissWithAction();\n  }\n  /** Dismisses the snack bar after some duration */\n  _dismissAfter(duration) {\n    // Note that we need to cap the duration to the maximum value for setTimeout, because\n    // it'll revert to 1 if somebody passes in something greater (e.g. `Infinity`). See #17234.\n    this._durationTimeoutId = setTimeout(() => this.dismiss(), Math.min(duration, MAX_TIMEOUT));\n  }\n  /** Marks the snackbar as opened */\n  _open() {\n    if (!this._afterOpened.closed) {\n      this._afterOpened.next();\n      this._afterOpened.complete();\n    }\n  }\n  /** Cleans up the DOM after closing. */\n  _finishDismiss() {\n    this._overlayRef.dispose();\n    if (!this._onAction.closed) {\n      this._onAction.complete();\n    }\n    this._afterDismissed.next({\n      dismissedByAction: this._dismissedByAction\n    });\n    this._afterDismissed.complete();\n    this._dismissedByAction = false;\n  }\n  /** Gets an observable that is notified when the snack bar is finished closing. */\n  afterDismissed() {\n    return this._afterDismissed;\n  }\n  /** Gets an observable that is notified when the snack bar has opened and appeared. */\n  afterOpened() {\n    return this.containerInstance._onEnter;\n  }\n  /** Gets an observable that is notified when the snack bar action is called. */\n  onAction() {\n    return this._onAction;\n  }\n}\n\n/** Injection token that can be used to access the data that was passed in to a snack bar. */\nconst MAT_SNACK_BAR_DATA = /*#__PURE__*/new InjectionToken('MatSnackBarData');\n/**\n * Configuration used when opening a snack-bar.\n */\nclass MatSnackBarConfig {\n  /** The politeness level for the MatAriaLiveAnnouncer announcement. */\n  politeness = 'assertive';\n  /**\n   * Message to be announced by the LiveAnnouncer. When opening a snackbar without a custom\n   * component or template, the announcement message will default to the specified message.\n   */\n  announcementMessage = '';\n  /**\n   * The view container that serves as the parent for the snackbar for the purposes of dependency\n   * injection. Note: this does not affect where the snackbar is inserted in the DOM.\n   */\n  viewContainerRef;\n  /** The length of time in milliseconds to wait before automatically dismissing the snack bar. */\n  duration = 0;\n  /** Extra CSS classes to be added to the snack bar container. */\n  panelClass;\n  /** Text layout direction for the snack bar. */\n  direction;\n  /** Data being injected into the child component. */\n  data = null;\n  /** The horizontal position to place the snack bar. */\n  horizontalPosition = 'center';\n  /** The vertical position to place the snack bar. */\n  verticalPosition = 'bottom';\n}\n\n/** Directive that should be applied to the text element to be rendered in the snack bar. */\nlet MatSnackBarLabel = /*#__PURE__*/(() => {\n  class MatSnackBarLabel {\n    static ɵfac = function MatSnackBarLabel_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBarLabel)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatSnackBarLabel,\n      selectors: [[\"\", \"matSnackBarLabel\", \"\"]],\n      hostAttrs: [1, \"mat-mdc-snack-bar-label\", \"mdc-snackbar__label\"]\n    });\n  }\n  return MatSnackBarLabel;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Directive that should be applied to the element containing the snack bar's action buttons. */\nlet MatSnackBarActions = /*#__PURE__*/(() => {\n  class MatSnackBarActions {\n    static ɵfac = function MatSnackBarActions_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBarActions)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatSnackBarActions,\n      selectors: [[\"\", \"matSnackBarActions\", \"\"]],\n      hostAttrs: [1, \"mat-mdc-snack-bar-actions\", \"mdc-snackbar__actions\"]\n    });\n  }\n  return MatSnackBarActions;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Directive that should be applied to each of the snack bar's action buttons. */\nlet MatSnackBarAction = /*#__PURE__*/(() => {\n  class MatSnackBarAction {\n    static ɵfac = function MatSnackBarAction_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBarAction)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatSnackBarAction,\n      selectors: [[\"\", \"matSnackBarAction\", \"\"]],\n      hostAttrs: [1, \"mat-mdc-snack-bar-action\", \"mdc-snackbar__action\"]\n    });\n  }\n  return MatSnackBarAction;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet SimpleSnackBar = /*#__PURE__*/(() => {\n  class SimpleSnackBar {\n    snackBarRef = inject(MatSnackBarRef);\n    data = inject(MAT_SNACK_BAR_DATA);\n    constructor() {}\n    /** Performs the action on the snack bar. */\n    action() {\n      this.snackBarRef.dismissWithAction();\n    }\n    /** If the action button should be shown. */\n    get hasAction() {\n      return !!this.data.action;\n    }\n    static ɵfac = function SimpleSnackBar_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || SimpleSnackBar)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: SimpleSnackBar,\n      selectors: [[\"simple-snack-bar\"]],\n      hostAttrs: [1, \"mat-mdc-simple-snack-bar\"],\n      exportAs: [\"matSnackBar\"],\n      decls: 3,\n      vars: 2,\n      consts: [[\"matSnackBarLabel\", \"\"], [\"matSnackBarActions\", \"\"], [\"mat-button\", \"\", \"matSnackBarAction\", \"\", 3, \"click\"]],\n      template: function SimpleSnackBar_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵelementStart(0, \"div\", 0);\n          i0.ɵɵtext(1);\n          i0.ɵɵelementEnd();\n          i0.ɵɵtemplate(2, SimpleSnackBar_Conditional_2_Template, 3, 1, \"div\", 1);\n        }\n        if (rf & 2) {\n          i0.ɵɵadvance();\n          i0.ɵɵtextInterpolate1(\" \", ctx.data.message, \"\\n\");\n          i0.ɵɵadvance();\n          i0.ɵɵconditional(ctx.hasAction ? 2 : -1);\n        }\n      },\n      dependencies: [MatButton, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n      styles: [\".mat-mdc-simple-snack-bar{display:flex}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return SimpleSnackBar;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst ENTER_ANIMATION = '_mat-snack-bar-enter';\nconst EXIT_ANIMATION = '_mat-snack-bar-exit';\n/**\n * Internal component that wraps user-provided snack bar content.\n * @docs-private\n */\nlet MatSnackBarContainer = /*#__PURE__*/(() => {\n  class MatSnackBarContainer extends BasePortalOutlet {\n    _ngZone = inject(NgZone);\n    _elementRef = inject(ElementRef);\n    _changeDetectorRef = inject(ChangeDetectorRef);\n    _platform = inject(Platform);\n    _rendersRef;\n    _animationsDisabled = inject(ANIMATION_MODULE_TYPE, {\n      optional: true\n    }) === 'NoopAnimations';\n    snackBarConfig = inject(MatSnackBarConfig);\n    _document = inject(DOCUMENT);\n    _trackedModals = new Set();\n    _enterFallback;\n    _exitFallback;\n    _renders = new Subject();\n    /** The number of milliseconds to wait before announcing the snack bar's content. */\n    _announceDelay = 150;\n    /** The timeout for announcing the snack bar's content. */\n    _announceTimeoutId;\n    /** Whether the component has been destroyed. */\n    _destroyed = false;\n    /** The portal outlet inside of this container into which the snack bar content will be loaded. */\n    _portalOutlet;\n    /** Subject for notifying that the snack bar has announced to screen readers. */\n    _onAnnounce = new Subject();\n    /** Subject for notifying that the snack bar has exited from view. */\n    _onExit = new Subject();\n    /** Subject for notifying that the snack bar has finished entering the view. */\n    _onEnter = new Subject();\n    /** The state of the snack bar animations. */\n    _animationState = 'void';\n    /** aria-live value for the live region. */\n    _live;\n    /**\n     * Element that will have the `mdc-snackbar__label` class applied if the attached component\n     * or template does not have it. This ensures that the appropriate structure, typography, and\n     * color is applied to the attached view.\n     */\n    _label;\n    /**\n     * Role of the live region. This is only for Firefox as there is a known issue where Firefox +\n     * JAWS does not read out aria-live message.\n     */\n    _role;\n    /** Unique ID of the aria-live element. */\n    _liveElementId = inject(_IdGenerator).getId('mat-snack-bar-container-live-');\n    constructor() {\n      super();\n      const config = this.snackBarConfig;\n      // Use aria-live rather than a live role like 'alert' or 'status'\n      // because NVDA and JAWS have show inconsistent behavior with live roles.\n      if (config.politeness === 'assertive' && !config.announcementMessage) {\n        this._live = 'assertive';\n      } else if (config.politeness === 'off') {\n        this._live = 'off';\n      } else {\n        this._live = 'polite';\n      }\n      // Only set role for Firefox. Set role based on aria-live because setting role=\"alert\" implies\n      // aria-live=\"assertive\" which may cause issues if aria-live is set to \"polite\" above.\n      if (this._platform.FIREFOX) {\n        if (this._live === 'polite') {\n          this._role = 'status';\n        }\n        if (this._live === 'assertive') {\n          this._role = 'alert';\n        }\n      }\n      // Note: ideally we'd just do an `afterNextRender` in the places where we need to delay\n      // something, however in some cases (TestBed teardown) the injector can be destroyed at an\n      // unexpected time, causing the `afterRender` to fail.\n      this._rendersRef = afterRender(() => this._renders.next(), {\n        manualCleanup: true\n      });\n    }\n    /** Attach a component portal as content to this snack bar container. */\n    attachComponentPortal(portal) {\n      this._assertNotAttached();\n      const result = this._portalOutlet.attachComponentPortal(portal);\n      this._afterPortalAttached();\n      return result;\n    }\n    /** Attach a template portal as content to this snack bar container. */\n    attachTemplatePortal(portal) {\n      this._assertNotAttached();\n      const result = this._portalOutlet.attachTemplatePortal(portal);\n      this._afterPortalAttached();\n      return result;\n    }\n    /**\n     * Attaches a DOM portal to the snack bar container.\n     * @deprecated To be turned into a method.\n     * @breaking-change 10.0.0\n     */\n    attachDomPortal = portal => {\n      this._assertNotAttached();\n      const result = this._portalOutlet.attachDomPortal(portal);\n      this._afterPortalAttached();\n      return result;\n    };\n    /** Handle end of animations, updating the state of the snackbar. */\n    onAnimationEnd(animationName) {\n      if (animationName === EXIT_ANIMATION) {\n        this._completeExit();\n      } else if (animationName === ENTER_ANIMATION) {\n        clearTimeout(this._enterFallback);\n        this._ngZone.run(() => {\n          this._onEnter.next();\n          this._onEnter.complete();\n        });\n      }\n    }\n    /** Begin animation of snack bar entrance into view. */\n    enter() {\n      if (!this._destroyed) {\n        this._animationState = 'visible';\n        // _animationState lives in host bindings and `detectChanges` does not refresh host bindings\n        // so we have to call `markForCheck` to ensure the host view is refreshed eventually.\n        this._changeDetectorRef.markForCheck();\n        this._changeDetectorRef.detectChanges();\n        this._screenReaderAnnounce();\n        if (this._animationsDisabled) {\n          this._renders.pipe(take(1)).subscribe(() => {\n            this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(ENTER_ANIMATION)));\n          });\n        } else {\n          clearTimeout(this._enterFallback);\n          this._enterFallback = setTimeout(() => {\n            // The snack bar will stay invisible if it fails to animate. Add a fallback class so it\n            // becomes visible. This can happen in some apps that do `* {animation: none !important}`.\n            this._elementRef.nativeElement.classList.add('mat-snack-bar-fallback-visible');\n            this.onAnimationEnd(ENTER_ANIMATION);\n          }, 200);\n        }\n      }\n    }\n    /** Begin animation of the snack bar exiting from view. */\n    exit() {\n      if (this._destroyed) {\n        return of(undefined);\n      }\n      // It's common for snack bars to be opened by random outside calls like HTTP requests or\n      // errors. Run inside the NgZone to ensure that it functions correctly.\n      this._ngZone.run(() => {\n        // Note: this one transitions to `hidden`, rather than `void`, in order to handle the case\n        // where multiple snack bars are opened in quick succession (e.g. two consecutive calls to\n        // `MatSnackBar.open`).\n        this._animationState = 'hidden';\n        this._changeDetectorRef.markForCheck();\n        // Mark this element with an 'exit' attribute to indicate that the snackbar has\n        // been dismissed and will soon be removed from the DOM. This is used by the snackbar\n        // test harness.\n        this._elementRef.nativeElement.setAttribute('mat-exit', '');\n        // If the snack bar hasn't been announced by the time it exits it wouldn't have been open\n        // long enough to visually read it either, so clear the timeout for announcing.\n        clearTimeout(this._announceTimeoutId);\n        if (this._animationsDisabled) {\n          this._renders.pipe(take(1)).subscribe(() => {\n            this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(EXIT_ANIMATION)));\n          });\n        } else {\n          clearTimeout(this._exitFallback);\n          this._exitFallback = setTimeout(() => this.onAnimationEnd(EXIT_ANIMATION), 200);\n        }\n      });\n      return this._onExit;\n    }\n    /** Makes sure the exit callbacks have been invoked when the element is destroyed. */\n    ngOnDestroy() {\n      this._destroyed = true;\n      this._clearFromModals();\n      this._completeExit();\n      this._renders.complete();\n      this._rendersRef.destroy();\n    }\n    _completeExit() {\n      clearTimeout(this._exitFallback);\n      queueMicrotask(() => {\n        this._onExit.next();\n        this._onExit.complete();\n      });\n    }\n    /**\n     * Called after the portal contents have been attached. Can be\n     * used to modify the DOM once it's guaranteed to be in place.\n     */\n    _afterPortalAttached() {\n      const element = this._elementRef.nativeElement;\n      const panelClasses = this.snackBarConfig.panelClass;\n      if (panelClasses) {\n        if (Array.isArray(panelClasses)) {\n          // Note that we can't use a spread here, because IE doesn't support multiple arguments.\n          panelClasses.forEach(cssClass => element.classList.add(cssClass));\n        } else {\n          element.classList.add(panelClasses);\n        }\n      }\n      this._exposeToModals();\n      // Check to see if the attached component or template uses the MDC template structure,\n      // specifically the MDC label. If not, the container should apply the MDC label class to this\n      // component's label container, which will apply MDC's label styles to the attached view.\n      const label = this._label.nativeElement;\n      const labelClass = 'mdc-snackbar__label';\n      label.classList.toggle(labelClass, !label.querySelector(`.${labelClass}`));\n    }\n    /**\n     * Some browsers won't expose the accessibility node of the live element if there is an\n     * `aria-modal` and the live element is outside of it. This method works around the issue by\n     * pointing the `aria-owns` of all modals to the live element.\n     */\n    _exposeToModals() {\n      // TODO(http://github.com/angular/components/issues/26853): consider de-duplicating this with the\n      // `LiveAnnouncer` and any other usages.\n      //\n      // Note that the selector here is limited to CDK overlays at the moment in order to reduce the\n      // section of the DOM we need to look through. This should cover all the cases we support, but\n      // the selector can be expanded if it turns out to be too narrow.\n      const id = this._liveElementId;\n      const modals = this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal=\"true\"]');\n      for (let i = 0; i < modals.length; i++) {\n        const modal = modals[i];\n        const ariaOwns = modal.getAttribute('aria-owns');\n        this._trackedModals.add(modal);\n        if (!ariaOwns) {\n          modal.setAttribute('aria-owns', id);\n        } else if (ariaOwns.indexOf(id) === -1) {\n          modal.setAttribute('aria-owns', ariaOwns + ' ' + id);\n        }\n      }\n    }\n    /** Clears the references to the live element from any modals it was added to. */\n    _clearFromModals() {\n      this._trackedModals.forEach(modal => {\n        const ariaOwns = modal.getAttribute('aria-owns');\n        if (ariaOwns) {\n          const newValue = ariaOwns.replace(this._liveElementId, '').trim();\n          if (newValue.length > 0) {\n            modal.setAttribute('aria-owns', newValue);\n          } else {\n            modal.removeAttribute('aria-owns');\n          }\n        }\n      });\n      this._trackedModals.clear();\n    }\n    /** Asserts that no content is already attached to the container. */\n    _assertNotAttached() {\n      if (this._portalOutlet.hasAttached() && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw Error('Attempting to attach snack bar content after content is already attached');\n      }\n    }\n    /**\n     * Starts a timeout to move the snack bar content to the live region so screen readers will\n     * announce it.\n     */\n    _screenReaderAnnounce() {\n      if (this._announceTimeoutId) {\n        return;\n      }\n      this._ngZone.runOutsideAngular(() => {\n        this._announceTimeoutId = setTimeout(() => {\n          if (this._destroyed) {\n            return;\n          }\n          const element = this._elementRef.nativeElement;\n          const inertElement = element.querySelector('[aria-hidden]');\n          const liveElement = element.querySelector('[aria-live]');\n          if (inertElement && liveElement) {\n            // If an element in the snack bar content is focused before being moved\n            // track it and restore focus after moving to the live region.\n            let focusedElement = null;\n            if (this._platform.isBrowser && document.activeElement instanceof HTMLElement && inertElement.contains(document.activeElement)) {\n              focusedElement = document.activeElement;\n            }\n            inertElement.removeAttribute('aria-hidden');\n            liveElement.appendChild(inertElement);\n            focusedElement?.focus();\n            this._onAnnounce.next();\n            this._onAnnounce.complete();\n          }\n        }, this._announceDelay);\n      });\n    }\n    static ɵfac = function MatSnackBarContainer_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBarContainer)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: MatSnackBarContainer,\n      selectors: [[\"mat-snack-bar-container\"]],\n      viewQuery: function MatSnackBarContainer_Query(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵviewQuery(CdkPortalOutlet, 7);\n          i0.ɵɵviewQuery(_c0, 7);\n        }\n        if (rf & 2) {\n          let _t;\n          i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._portalOutlet = _t.first);\n          i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._label = _t.first);\n        }\n      },\n      hostAttrs: [1, \"mdc-snackbar\", \"mat-mdc-snack-bar-container\"],\n      hostVars: 6,\n      hostBindings: function MatSnackBarContainer_HostBindings(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵlistener(\"animationend\", function MatSnackBarContainer_animationend_HostBindingHandler($event) {\n            return ctx.onAnimationEnd($event.animationName);\n          })(\"animationcancel\", function MatSnackBarContainer_animationcancel_HostBindingHandler($event) {\n            return ctx.onAnimationEnd($event.animationName);\n          });\n        }\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mat-snack-bar-container-enter\", ctx._animationState === \"visible\")(\"mat-snack-bar-container-exit\", ctx._animationState === \"hidden\")(\"mat-snack-bar-container-animations-enabled\", !ctx._animationsDisabled);\n        }\n      },\n      features: [i0.ɵɵInheritDefinitionFeature],\n      decls: 6,\n      vars: 3,\n      consts: [[\"label\", \"\"], [1, \"mdc-snackbar__surface\", \"mat-mdc-snackbar-surface\"], [1, \"mat-mdc-snack-bar-label\"], [\"aria-hidden\", \"true\"], [\"cdkPortalOutlet\", \"\"]],\n      template: function MatSnackBarContainer_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵelementStart(0, \"div\", 1)(1, \"div\", 2, 0)(3, \"div\", 3);\n          i0.ɵɵtemplate(4, MatSnackBarContainer_ng_template_4_Template, 0, 0, \"ng-template\", 4);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelement(5, \"div\");\n          i0.ɵɵelementEnd()();\n        }\n        if (rf & 2) {\n          i0.ɵɵadvance(5);\n          i0.ɵɵattribute(\"aria-live\", ctx._live)(\"role\", ctx._role)(\"id\", ctx._liveElementId);\n        }\n      },\n      dependencies: [CdkPortalOutlet],\n      styles: [\"@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mdc-snackbar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mdc-snackbar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mdc-snackbar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mdc-snackbar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mdc-snackbar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mdc-snackbar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mdc-snackbar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-text-button-state-layer-color:currentColor;--mat-text-button-ripple-color:currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1}\\n\"],\n      encapsulation: 2\n    });\n  }\n  return MatSnackBarContainer;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nfunction MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY() {\n  return new MatSnackBarConfig();\n}\n/** Injection token that can be used to specify default snack bar. */\nconst MAT_SNACK_BAR_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('mat-snack-bar-default-options', {\n  providedIn: 'root',\n  factory: MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY\n});\n/**\n * Service to dispatch Material Design snack bar messages.\n */\nlet MatSnackBar = /*#__PURE__*/(() => {\n  class MatSnackBar {\n    _overlay = inject(Overlay);\n    _live = inject(LiveAnnouncer);\n    _injector = inject(Injector);\n    _breakpointObserver = inject(BreakpointObserver);\n    _parentSnackBar = inject(MatSnackBar, {\n      optional: true,\n      skipSelf: true\n    });\n    _defaultConfig = inject(MAT_SNACK_BAR_DEFAULT_OPTIONS);\n    /**\n     * Reference to the current snack bar in the view *at this level* (in the Angular injector tree).\n     * If there is a parent snack-bar service, all operations should delegate to that parent\n     * via `_openedSnackBarRef`.\n     */\n    _snackBarRefAtThisLevel = null;\n    /** The component that should be rendered as the snack bar's simple component. */\n    simpleSnackBarComponent = SimpleSnackBar;\n    /** The container component that attaches the provided template or component. */\n    snackBarContainerComponent = MatSnackBarContainer;\n    /** The CSS class to apply for handset mode. */\n    handsetCssClass = 'mat-mdc-snack-bar-handset';\n    /** Reference to the currently opened snackbar at *any* level. */\n    get _openedSnackBarRef() {\n      const parent = this._parentSnackBar;\n      return parent ? parent._openedSnackBarRef : this._snackBarRefAtThisLevel;\n    }\n    set _openedSnackBarRef(value) {\n      if (this._parentSnackBar) {\n        this._parentSnackBar._openedSnackBarRef = value;\n      } else {\n        this._snackBarRefAtThisLevel = value;\n      }\n    }\n    constructor() {}\n    /**\n     * Creates and dispatches a snack bar with a custom component for the content, removing any\n     * currently opened snack bars.\n     *\n     * @param component Component to be instantiated.\n     * @param config Extra configuration for the snack bar.\n     */\n    openFromComponent(component, config) {\n      return this._attach(component, config);\n    }\n    /**\n     * Creates and dispatches a snack bar with a custom template for the content, removing any\n     * currently opened snack bars.\n     *\n     * @param template Template to be instantiated.\n     * @param config Extra configuration for the snack bar.\n     */\n    openFromTemplate(template, config) {\n      return this._attach(template, config);\n    }\n    /**\n     * Opens a snackbar with a message and an optional action.\n     * @param message The message to show in the snackbar.\n     * @param action The label for the snackbar action.\n     * @param config Additional configuration options for the snackbar.\n     */\n    open(message, action = '', config) {\n      const _config = {\n        ...this._defaultConfig,\n        ...config\n      };\n      // Since the user doesn't have access to the component, we can\n      // override the data to pass in our own message and action.\n      _config.data = {\n        message,\n        action\n      };\n      // Since the snack bar has `role=\"alert\"`, we don't\n      // want to announce the same message twice.\n      if (_config.announcementMessage === message) {\n        _config.announcementMessage = undefined;\n      }\n      return this.openFromComponent(this.simpleSnackBarComponent, _config);\n    }\n    /**\n     * Dismisses the currently-visible snack bar.\n     */\n    dismiss() {\n      if (this._openedSnackBarRef) {\n        this._openedSnackBarRef.dismiss();\n      }\n    }\n    ngOnDestroy() {\n      // Only dismiss the snack bar at the current level on destroy.\n      if (this._snackBarRefAtThisLevel) {\n        this._snackBarRefAtThisLevel.dismiss();\n      }\n    }\n    /**\n     * Attaches the snack bar container component to the overlay.\n     */\n    _attachSnackBarContainer(overlayRef, config) {\n      const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n      const injector = Injector.create({\n        parent: userInjector || this._injector,\n        providers: [{\n          provide: MatSnackBarConfig,\n          useValue: config\n        }]\n      });\n      const containerPortal = new ComponentPortal(this.snackBarContainerComponent, config.viewContainerRef, injector);\n      const containerRef = overlayRef.attach(containerPortal);\n      containerRef.instance.snackBarConfig = config;\n      return containerRef.instance;\n    }\n    /**\n     * Places a new component or a template as the content of the snack bar container.\n     */\n    _attach(content, userConfig) {\n      const config = {\n        ...new MatSnackBarConfig(),\n        ...this._defaultConfig,\n        ...userConfig\n      };\n      const overlayRef = this._createOverlay(config);\n      const container = this._attachSnackBarContainer(overlayRef, config);\n      const snackBarRef = new MatSnackBarRef(container, overlayRef);\n      if (content instanceof TemplateRef) {\n        const portal = new TemplatePortal(content, null, {\n          $implicit: config.data,\n          snackBarRef\n        });\n        snackBarRef.instance = container.attachTemplatePortal(portal);\n      } else {\n        const injector = this._createInjector(config, snackBarRef);\n        const portal = new ComponentPortal(content, undefined, injector);\n        const contentRef = container.attachComponentPortal(portal);\n        // We can't pass this via the injector, because the injector is created earlier.\n        snackBarRef.instance = contentRef.instance;\n      }\n      // Subscribe to the breakpoint observer and attach the mat-snack-bar-handset class as\n      // appropriate. This class is applied to the overlay element because the overlay must expand to\n      // fill the width of the screen for full width snackbars.\n      this._breakpointObserver.observe(Breakpoints.HandsetPortrait).pipe(takeUntil(overlayRef.detachments())).subscribe(state => {\n        overlayRef.overlayElement.classList.toggle(this.handsetCssClass, state.matches);\n      });\n      if (config.announcementMessage) {\n        // Wait until the snack bar contents have been announced then deliver this message.\n        container._onAnnounce.subscribe(() => {\n          this._live.announce(config.announcementMessage, config.politeness);\n        });\n      }\n      this._animateSnackBar(snackBarRef, config);\n      this._openedSnackBarRef = snackBarRef;\n      return this._openedSnackBarRef;\n    }\n    /** Animates the old snack bar out and the new one in. */\n    _animateSnackBar(snackBarRef, config) {\n      // When the snackbar is dismissed, clear the reference to it.\n      snackBarRef.afterDismissed().subscribe(() => {\n        // Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.\n        if (this._openedSnackBarRef == snackBarRef) {\n          this._openedSnackBarRef = null;\n        }\n        if (config.announcementMessage) {\n          this._live.clear();\n        }\n      });\n      // If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.\n      if (config.duration && config.duration > 0) {\n        snackBarRef.afterOpened().subscribe(() => snackBarRef._dismissAfter(config.duration));\n      }\n      if (this._openedSnackBarRef) {\n        // If a snack bar is already in view, dismiss it and enter the\n        // new snack bar after exit animation is complete.\n        this._openedSnackBarRef.afterDismissed().subscribe(() => {\n          snackBarRef.containerInstance.enter();\n        });\n        this._openedSnackBarRef.dismiss();\n      } else {\n        // If no snack bar is in view, enter the new snack bar.\n        snackBarRef.containerInstance.enter();\n      }\n    }\n    /**\n     * Creates a new overlay and places it in the correct location.\n     * @param config The user-specified snack bar config.\n     */\n    _createOverlay(config) {\n      const overlayConfig = new OverlayConfig();\n      overlayConfig.direction = config.direction;\n      let positionStrategy = this._overlay.position().global();\n      // Set horizontal position.\n      const isRtl = config.direction === 'rtl';\n      const isLeft = config.horizontalPosition === 'left' || config.horizontalPosition === 'start' && !isRtl || config.horizontalPosition === 'end' && isRtl;\n      const isRight = !isLeft && config.horizontalPosition !== 'center';\n      if (isLeft) {\n        positionStrategy.left('0');\n      } else if (isRight) {\n        positionStrategy.right('0');\n      } else {\n        positionStrategy.centerHorizontally();\n      }\n      // Set horizontal position.\n      if (config.verticalPosition === 'top') {\n        positionStrategy.top('0');\n      } else {\n        positionStrategy.bottom('0');\n      }\n      overlayConfig.positionStrategy = positionStrategy;\n      return this._overlay.create(overlayConfig);\n    }\n    /**\n     * Creates an injector to be used inside of a snack bar component.\n     * @param config Config that was used to create the snack bar.\n     * @param snackBarRef Reference to the snack bar.\n     */\n    _createInjector(config, snackBarRef) {\n      const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n      return Injector.create({\n        parent: userInjector || this._injector,\n        providers: [{\n          provide: MatSnackBarRef,\n          useValue: snackBarRef\n        }, {\n          provide: MAT_SNACK_BAR_DATA,\n          useValue: config.data\n        }]\n      });\n    }\n    static ɵfac = function MatSnackBar_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBar)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: MatSnackBar,\n      factory: MatSnackBar.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return MatSnackBar;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst DIRECTIVES = [MatSnackBarContainer, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction];\nlet MatSnackBarModule = /*#__PURE__*/(() => {\n  class MatSnackBarModule {\n    static ɵfac = function MatSnackBarModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatSnackBarModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: MatSnackBarModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [MatSnackBar],\n      imports: [OverlayModule, PortalModule, MatButtonModule, MatCommonModule, SimpleSnackBar, MatCommonModule]\n    });\n  }\n  return MatSnackBarModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Animations used by the Material snack bar.\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nconst matSnackBarAnimations = {\n  // Represents\n  // trigger('state', [\n  //   state(\n  //     'void, hidden',\n  //     style({\n  //       transform: 'scale(0.8)',\n  //       opacity: 0,\n  //     }),\n  //   ),\n  //   state(\n  //     'visible',\n  //     style({\n  //       transform: 'scale(1)',\n  //       opacity: 1,\n  //     }),\n  //   ),\n  //   transition('* => visible', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),\n  //   transition(\n  //     '* => void, * => hidden',\n  //     animate(\n  //       '75ms cubic-bezier(0.4, 0.0, 1, 1)',\n  //       style({\n  //         opacity: 0,\n  //       }),\n  //     ),\n  //   ),\n  // ])\n  /** Animation that shows and hides a snack bar. */\n  snackBarState: {\n    type: 7,\n    name: 'state',\n    'definitions': [{\n      type: 0,\n      name: 'void, hidden',\n      styles: {\n        type: 6,\n        styles: {\n          transform: 'scale(0.8)',\n          opacity: 0\n        },\n        offset: null\n      }\n    }, {\n      type: 0,\n      name: 'visible',\n      styles: {\n        type: 6,\n        styles: {\n          transform: 'scale(1)',\n          opacity: 1\n        },\n        offset: null\n      }\n    }, {\n      type: 1,\n      expr: '* => visible',\n      animation: {\n        type: 4,\n        styles: null,\n        timings: '150ms cubic-bezier(0, 0, 0.2, 1)'\n      },\n      options: null\n    }, {\n      type: 1,\n      expr: '* => void, * => hidden',\n      animation: {\n        type: 4,\n        styles: {\n          type: 6,\n          styles: {\n            opacity: 0\n          },\n          offset: null\n        },\n        timings: '75ms cubic-bezier(0.4, 0.0, 1, 1)'\n      },\n      options: null\n    }],\n    options: {}\n  }\n};\nexport { MAT_SNACK_BAR_DATA, MAT_SNACK_BAR_DEFAULT_OPTIONS, MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY, MatSnackBar, MatSnackBarAction, MatSnackBarActions, MatSnackBarConfig, MatSnackBarContainer, MatSnackBarLabel, MatSnackBarModule, MatSnackBarRef, SimpleSnackBar, matSnackBarAnimations };\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ToolsService {\r\n\r\n  constructor(private _snackBar: MatSnackBar) { }\r\n\r\n\r\n  openSnackBar(msg: string, type: boolean) {\r\n    this._snackBar.open(msg, 'fermer', {\r\n      horizontalPosition: 'center',\r\n      verticalPosition: 'top',\r\n      duration: 6000,\r\n      panelClass: !type ? 'snackbar-error' : 'snackbar-success'\r\n    });\r\n  }\r\n}\r\n\r\n/**\r\n * Affiche un message à l'utilisateur\r\n *\r\n * @param msg - Message affiché\r\n * @param type - Type de message (success ou error)\r\n */\r\n\r\n"],"mappings":"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","names":["BaseControlValueAccessor","_","_renderer","_elementRef","key","value","fn","isDisabled","__ngFactoryType__","ɵɵdirectiveInject","Renderer2","ElementRef","ɵɵdefineDirective","BuiltInControlValueAccessor","ɵBuiltInControlValueAccessor_BaseFactory","ɵɵgetInheritedFactory","ɵɵInheritDefinitionFeature","NG_VALUE_ACCESSOR","InjectionToken","CHECKBOX_VALUE_ACCESSOR","forwardRef","CheckboxControlValueAccessor","ɵCheckboxControlValueAccessor_BaseFactory","rf","ctx","ɵɵlistener","$event","ɵɵProvidersFeature","DEFAULT_VALUE_ACCESSOR","DefaultValueAccessor","_isAndroid","userAgent","getDOM","COMPOSITION_BUFFER_MODE","renderer","elementRef","_compositionMode","normalizedValue","isEmptyInputValue","lengthOrSize","NG_VALIDATORS","NG_ASYNC_VALIDATORS","EMAIL_REGEXP","Validators","min","minValidator","max","maxValidator","control","requiredValidator","requiredTrueValidator","emailValidator","minLength","minLengthValidator","maxLength","maxLengthValidator","pattern","patternValidator","nullValidator","validators","compose","composeAsync","length","regex","regexStr","isPresent","o","toObservable","isPromise","from","mergeErrors","arrayOfErrors","res","errors","__spreadValues","executeValidators","validator","isValidatorFn","normalizeValidators","c","presentValidators","composeValidators","observables","forkJoin","map","composeAsyncValidators","mergeValidators","controlValidators","dirValidator","getControlValidators","getControlAsyncValidators","makeValidatorsArray","hasValidator","addValidators","currentValidators","current","v","removeValidators","AbstractControlDirective","errorCode","path","ControlContainer","NgControl","AbstractControlStatus","cd","ngControlStatusHost","ngGroupStatusHost","__spreadProps","NgControlStatus","ɵɵclassProp","NgControlStatusGroup","VALID","INVALID","PENDING","DISABLED","ControlEvent","ValueChangeEvent","value","source","PristineChangeEvent","pristine","TouchedChangeEvent","touched","StatusChangeEvent","status","FormSubmittedEvent","FormResetEvent","pickValidators","validatorOrOpts","isOptionsObj","coerceToValidator","validator","composeValidators","pickAsyncValidators","asyncValidator","coerceToAsyncValidator","composeAsyncValidators","assertControlPresent","parent","isGroup","key","controls","RuntimeError","assertAllValuesPresent","control","_","AbstractControl","validators","asyncValidators","validatorFn","asyncValidatorFn","untracked","v","computed","signal","Subject","addValidators","removeValidators","hasValidator","opts","changed","sourceControl","__spreadProps","__spreadValues","skipPristineCheck","changeFn","shouldHaveEmitted","ctrl","emitEvent","obs","toObservable","errors","path","currPath","name","errorCode","x","changedControl","EventEmitter","newPristine","fn","onlySelf","parentDirty","FormGroup","options","controlName","acc","subtreeUpdated","updated","child","cb","condition","initValue","res","FormRecord","FormGroup","CALL_SET_DISABLED_STATE","InjectionToken","setDisabledStateDefault","controlPath","name","parent","setUpControl","control","dir","callSetDisabledState","setUpValidators","setUpViewChangePipeline","setUpModelChangePipeline","setUpBlurPipeline","setUpDisabledChangeHandler","cleanUpControl","validateControlPresenceOnChange","noop","cleanUpValidators","registerOnValidatorChange","validators","onChange","validator","onDisabledChange","isDisabled","getControlValidators","mergeValidators","asyncValidators","getControlAsyncValidators","onValidatorChange","isControlUpdated","updatedValidators","updatedAsyncValidators","asyncValidator","newValue","updateControl","emitModelEvent","setUpFormContainer","cleanUpFormContainer","isPropertyUpdated","changes","viewModel","change","isBuiltInAccessor","valueAccessor","BuiltInControlValueAccessor","syncPendingControls","form","directives","dir","control","selectValueAccessor","valueAccessors","defaultAccessor","builtinAccessor","customAccessor","v","DefaultValueAccessor","removeListItem$1","list","el","index","removeListItem","list","el","index","isFormControlState","formState","FormControl","AbstractControl","validatorOrOpts","asyncValidator","pickValidators","pickAsyncValidators","isOptionsObj","value","options","changeFn","condition","fn","cb","isFormControl","control","FormControl","ɵNgNoValidate","__ngFactoryType__","ɵɵdefineDirective","NG_MODEL_WITH_FORM_CONTROL_WARNING","InjectionToken","formControlBinding","NgControl","forwardRef","FormControlDirective","isDisabled","EventEmitter","validators","asyncValidators","valueAccessors","_ngModelWarningConfig","callSetDisabledState","selectValueAccessor","changes","previousForm","cleanUpControl","setUpControl","isPropertyUpdated","newValue","__ngFactoryType__","ɵɵdirectiveInject","NG_VALIDATORS","NG_ASYNC_VALIDATORS","NG_VALUE_ACCESSOR","CALL_SET_DISABLED_STATE","ɵɵdefineDirective","ɵɵProvidersFeature","ɵɵInheritDefinitionFeature","ɵɵNgOnChangesFeature","formDirectiveProvider","ControlContainer","FormGroupDirective","untracked","value","computed","signal","cleanUpValidators","dir","ctrl","removeListItem$1","$event","syncPendingControls","FormSubmittedEvent","FormResetEvent","oldCtrl","newCtrl","isFormControl","setUpFormContainer","cleanUpFormContainer","setUpValidators","rf","ctx","ɵɵlistener","controlNameBinding","NgControl","forwardRef","FormControlName","isDisabled","EventEmitter","parent","validators","asyncValidators","valueAccessors","_ngModelWarningConfig","selectValueAccessor","changes","isPropertyUpdated","newValue","controlPath","__ngFactoryType__","ɵɵdirectiveInject","ControlContainer","NG_VALIDATORS","NG_ASYNC_VALIDATORS","NG_VALUE_ACCESSOR","NG_MODEL_WITH_FORM_CONTROL_WARNING","ɵɵdefineDirective","ɵɵProvidersFeature","ɵɵInheritDefinitionFeature","ɵɵNgOnChangesFeature","AbstractValidatorDirective","nullValidator","changes","input","control","fn","__ngFactoryType__","ɵɵdefineDirective","ɵɵNgOnChangesFeature","REQUIRED_VALIDATOR","NG_VALIDATORS","forwardRef","RequiredValidator","RequiredValidator","AbstractValidatorDirective","booleanAttribute","input","requiredValidator","ɵRequiredValidator_BaseFactory","__ngFactoryType__","ɵɵgetInheritedFactory","ɵɵdefineDirective","rf","ctx","ɵɵattribute","ɵɵProvidersFeature","REQUIRED_VALIDATOR","ɵɵInheritDefinitionFeature","ɵInternalFormsSharedModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","FormArray","AbstractControl","controls","validatorOrOpts","asyncValidator","pickValidators","pickAsyncValidators","index","control","options","adjustedIndex","value","assertAllValuesPresent","newValue","assertControlPresent","subtreeUpdated","updated","child","cb","condition","name","isAbstractControlOptions","options","FormBuilder","nnfb","controls","reducedControls","newOptions","FormGroup","FormRecord","formState","validatorOrOpts","asyncValidator","FormControl","__spreadProps","__spreadValues","createdControls","c","FormArray","controlName","AbstractControl","value","validator","__ngFactoryType__","ɵɵdefineInjectable","FormsModule","opts","CALL_SET_DISABLED_STATE","setDisabledStateDefault","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","ɵInternalFormsSharedModule","ReactiveFormsModule","NG_MODEL_WITH_FORM_CONTROL_WARNING","scrollBehaviorSupported","supportsScrollBehavior","BlockScrollStrategy","_viewportRuler","document","root","coerceCssPixelValue","html","body","htmlStyle","bodyStyle","previousHtmlScrollBehavior","previousBodyScrollBehavior","rootElement","viewport","CloseScrollStrategy","_scrollDispatcher","_ngZone","_viewportRuler","_config","overlayRef","stream","filter","scrollable","scrollPosition","NoopScrollStrategy","isElementScrolledOutsideView","element","scrollContainers","containerBounds","outsideAbove","outsideBelow","outsideLeft","outsideRight","isElementClippedByScrolling","scrollContainerRect","clippedAbove","clippedBelow","clippedLeft","clippedRight","RepositionScrollStrategy","throttle","overlayRect","width","height","ScrollStrategyOptions","inject","ScrollDispatcher","ViewportRuler","NgZone","DOCUMENT","config","BlockScrollStrategy","__ngFactoryType__","ɵɵdefineInjectable","OverlayConfig","configKeys","key","ConnectedOverlayPositionChange","connectionPair","scrollableViewProperties","BaseOverlayDispatcher","inject","DOCUMENT","overlayRef","index","__ngFactoryType__","ɵɵdefineInjectable","OverlayKeyboardDispatcher","NgZone","RendererFactory2","event","overlays","i","ɵOverlayKeyboardDispatcher_BaseFactory","ɵɵgetInheritedFactory","OverlayOutsideClickDispatcher","Platform","body","eventOptions","_bindEventWithOptions","cleanup","_getEventTarget","target","origin","containsPierceShadowDom","outsidePointerEvents","ɵOverlayOutsideClickDispatcher_BaseFactory","parent","child","supportsShadowRoot","current","_CdkOverlayStyleLoader","ɵɵdefineComponent","rf","ctx","OverlayContainer","_CdkPrivateStyleLoader","containerClass","_isTestEnvironment","oppositePlatformContainers","container","BackdropRef","document","_renderer","_ngZone","onClick","element","OverlayRef","Subject","Subscription","_portalOutlet","_host","_pane","_config","_keyboardDispatcher","_document","_location","_outsideClickDispatcher","_animationsDisabled","_injector","untracked","afterRender","portal","attachResult","afterNextRender","detachmentResult","isAttached","strategy","sizeConfig","__spreadValues","dir","__spreadProps","classes","direction","style","coerceCssPixelValue","enablePointer","showingClass","cssClasses","isAdd","coerceArray","c","subscription","takeUntil","merge","scrollStrategy","boundingBoxClass","cssUnitPattern","FlexibleConnectedPositionStrategy","connectedTo","_viewportRuler","_platform","_overlayContainer","originRect","overlayRect","viewportRect","containerRect","flexibleFits","fallback","pos","originPoint","overlayPoint","overlayFit","bestFit","bestScore","fit","score","extendStyles","lastPosition","scrollables","positions","margin","flexibleDimensions","growAfterOpen","canPush","isLocked","offset","selector","x","startX","endX","y","overlayStartX","overlayStartY","point","rawOverlayRect","viewport","position","overlay","getRoundedBoundingClientRect","offsetX","offsetY","leftOverflow","rightOverflow","topOverflow","bottomOverflow","visibleWidth","visibleHeight","visibleArea","availableHeight","availableWidth","minHeight","getPixelValue","minWidth","verticalFit","horizontalFit","start","scrollPosition","overflowRight","overflowBottom","overflowTop","overflowLeft","pushX","pushY","scrollVisibility","compareScrollVisibility","changeEvent","ConnectedOverlayPositionChange","elements","xOrigin","yOrigin","isRtl","height","top","bottom","smallestDistanceToViewportEdge","previousHeight","isBoundedByRightViewportEdge","isBoundedByLeftViewportEdge","width","left","right","previousWidth","boundingBoxRect","styles","maxHeight","maxWidth","hasExactPosition","hasFlexibleDimensions","config","transformString","documentHeight","horizontalStyleProperty","documentWidth","originBounds","overlayBounds","scrollContainerBounds","scrollable","isElementClippedByScrolling","isElementScrolledOutsideView","length","overflows","currentValue","currentOverflow","axis","cssClass","ElementRef","destination","source","key","input","value","units","clientRect","a","b","wrapperClass","GlobalPositionStrategy","overlayRef","config","value","offset","styles","parentStyles","width","height","maxWidth","maxHeight","shouldBeFlushHorizontally","shouldBeFlushVertically","xPosition","xOffset","isRtl","marginLeft","marginRight","justifyContent","parent","OverlayPositionBuilder","inject","ViewportRuler","DOCUMENT","Platform","OverlayContainer","origin","FlexibleConnectedPositionStrategy","__ngFactoryType__","ɵɵdefineInjectable","Overlay","ScrollStrategyOptions","OverlayKeyboardDispatcher","Injector","NgZone","Directionality","Location","OverlayOutsideClickDispatcher","ANIMATION_MODULE_TYPE","_IdGenerator","RendererFactory2","_CdkPrivateStyleLoader","_CdkOverlayStyleLoader","host","pane","portalOutlet","overlayConfig","OverlayConfig","OverlayRef","EnvironmentInjector","ApplicationRef","DomPortalOutlet","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY","InjectionToken","overlay","inject","Overlay","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY","overlay","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY","Overlay","OverlayModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","BidiModule","PortalModule","ScrollingModule","MatRippleModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","eventListenerOptions","rippleInteractionEvents","matRippleUninitialized","matRippleClassName","matRippleCentered","matRippleDisabled","MatRippleLoader","inject","DOCUMENT","ANIMATION_MODULE_TYPE","MAT_RIPPLE_GLOBAL_OPTIONS","Platform","NgZone","Injector","renderer","RendererFactory2","name","_bindEventWithOptions","hosts","host","cleanup","config","disabled","ripple","event","eventTarget","_getEventTarget","element","rippleEl","isNoopAnimations","globalOptions","enterDuration","defaultRippleAnimationConfig","exitDuration","target","RippleRenderer","hasSetUpEvents","__ngFactoryType__","ɵɵdefineInjectable","MAT_BUTTON_CONFIG","InjectionToken","HOST_SELECTOR_MDC_CLASS_PAIR","MatButtonBase","inject","ElementRef","NgZone","ANIMATION_MODULE_TYPE","FocusMonitor","MatRippleLoader","value","_CdkPrivateStyleLoader","_StructuralStylesLoader","config","MAT_BUTTON_CONFIG","element","classList","attribute","mdcClasses","origin","options","__ngFactoryType__","ɵɵdefineDirective","booleanAttribute","_c0","_c1","_c2","MatButton","MatButtonBase","ɵMatButton_BaseFactory","__ngFactoryType__","ɵɵgetInheritedFactory","ɵɵdefineComponent","rf","ctx","ɵɵattribute","ɵɵclassMap","ɵɵclassProp","ɵɵInheritDefinitionFeature","_c0","_c2","ɵɵprojectionDef","_c1","ɵɵelement","ɵɵprojection","ɵɵelementStart","ɵɵelementEnd","Breakpoints","SimpleSnackBar_Conditional_2_Template","rf","ctx","_r1","ɵɵgetCurrentView","ɵɵelementStart","ɵɵlistener","ɵɵrestoreView","ctx_r1","ɵɵnextContext","ɵɵresetView","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate1","_c0","MatSnackBarContainer_ng_template_4_Template","MAX_TIMEOUT","MatSnackBarRef","Subject","containerInstance","_overlayRef","duration","MAT_SNACK_BAR_DATA","InjectionToken","MatSnackBarConfig","MatSnackBarLabel","__ngFactoryType__","ɵɵdefineDirective","MatSnackBarActions","MatSnackBarAction","SimpleSnackBar","inject","ɵɵdefineComponent","ɵɵtemplate","ɵɵconditional","MatButton","ENTER_ANIMATION","EXIT_ANIMATION","MatSnackBarContainer","BasePortalOutlet","NgZone","ElementRef","ChangeDetectorRef","Platform","ANIMATION_MODULE_TYPE","DOCUMENT","_IdGenerator","config","afterRender","portal","result","animationName","take","of","element","panelClasses","cssClass","label","labelClass","id","modals","i","modal","ariaOwns","newValue","inertElement","liveElement","focusedElement","ɵɵviewQuery","CdkPortalOutlet","_t","ɵɵqueryRefresh","ɵɵloadQuery","$event","ɵɵclassProp","ɵɵInheritDefinitionFeature","ɵɵelement","ɵɵattribute","MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY","MAT_SNACK_BAR_DEFAULT_OPTIONS","MatSnackBar","Overlay","LiveAnnouncer","Injector","BreakpointObserver","parent","value","component","template","message","action","_config","__spreadValues","overlayRef","userInjector","injector","containerPortal","ComponentPortal","containerRef","content","userConfig","container","snackBarRef","TemplateRef","TemplatePortal","contentRef","Breakpoints","takeUntil","state","overlayConfig","OverlayConfig","positionStrategy","isRtl","isLeft","isRight","ɵɵdefineInjectable","ToolsService","_snackBar","constructor","openSnackBar","msg","type","open","horizontalPosition","verticalPosition","duration","panelClass","ɵɵinject","MatSnackBar","factory","ɵfac","providedIn"],"x_google_ignoreList":[0,1,2,3,4,5,6,7]}