{"version":3,"file":"firebase-auth-web-extension.js","sources":["../util/dist/postinstall.mjs","../util/src/crypt.ts","../util/src/defaults.ts","../util/src/global.ts","../util/src/deferred.ts","../util/src/environment.ts","../util/src/errors.ts","../util/src/obj.ts","../util/src/query.ts","../util/src/subscribe.ts","../util/src/compat.ts","../util/src/url.ts","../component/src/component.ts","../logger/src/logger.ts","../auth/src/core/errors.ts","../auth/src/core/util/log.ts","../auth/src/core/util/assert.ts","../auth/src/core/util/location.ts","../auth/src/core/util/navigator.ts","../auth/src/core/util/fetch_provider.ts","../auth/src/api/errors.ts","../auth/src/api/index.ts","../auth/src/core/util/delay.ts","../auth/src/core/util/emulator.ts","../auth/src/platform_browser/recaptcha/recaptcha.ts","../auth/src/api/authentication/recaptcha.ts","../auth/src/api/account_management/account.ts","../auth/src/core/util/time.ts","../auth/src/core/user/id_token_result.ts","../auth/src/core/user/invalidation.ts","../auth/src/core/user/proactive_refresh.ts","../auth/src/core/user/user_metadata.ts","../auth/src/core/user/reload.ts","../auth/src/core/user/token_manager.ts","../auth/src/api/authentication/token.ts","../auth/src/core/user/user_impl.ts","../auth/src/core/util/instantiator.ts","../auth/src/core/persistence/in_memory.ts","../auth/src/core/persistence/persistence_user_manager.ts","../auth/src/core/util/browser.ts","../auth/src/core/util/version.ts","../auth/src/core/auth/middleware.ts","../auth/src/core/auth/password_policy_impl.ts","../auth/src/core/auth/auth_impl.ts","../auth/src/api/password_policy/get_password_policy.ts","../auth/src/platform_browser/load_js.ts","../auth/src/platform_browser/recaptcha/recaptcha_mock.ts","../auth/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.ts","../auth/src/core/auth/initialize.ts","../auth/src/core/auth/emulator.ts","../auth/src/core/credentials/auth_credential.ts","../auth/src/api/account_management/email_and_password.ts","../auth/src/api/authentication/email_and_password.ts","../auth/src/core/credentials/email.ts","../auth/src/api/authentication/email_link.ts","../auth/src/api/authentication/idp.ts","../auth/src/core/credentials/oauth.ts","../auth/src/api/authentication/sms.ts","../auth/src/core/credentials/phone.ts","../auth/src/core/action_code_url.ts","../auth/src/core/providers/email.ts","../auth/src/core/providers/federated.ts","../auth/src/core/providers/oauth.ts","../auth/src/core/providers/facebook.ts","../auth/src/core/providers/google.ts","../auth/src/core/providers/github.ts","../auth/src/core/credentials/saml.ts","../auth/src/core/providers/saml.ts","../auth/src/core/providers/twitter.ts","../auth/src/api/authentication/sign_up.ts","../auth/src/core/user/user_credential_impl.ts","../auth/src/core/strategies/anonymous.ts","../auth/src/mfa/mfa_error.ts","../auth/src/core/util/providers.ts","../auth/src/core/user/link_unlink.ts","../auth/src/core/strategies/credential.ts","../auth/src/core/user/reauthenticate.ts","../auth/src/core/strategies/custom_token.ts","../auth/src/api/authentication/custom_token.ts","../auth/src/mfa/mfa_info.ts","../auth/src/core/strategies/action_code_settings.ts","../auth/src/core/strategies/email_and_password.ts","../auth/src/core/strategies/email_link.ts","../auth/src/core/strategies/email.ts","../auth/src/api/authentication/create_auth_uri.ts","../auth/src/core/user/account_info.ts","../auth/src/api/account_management/profile.ts","../auth/src/core/user/additional_user_info.ts","../auth/src/core/index.ts","../auth/src/mfa/mfa_session.ts","../auth/src/mfa/mfa_resolver.ts","../auth/src/mfa/mfa_user.ts","../auth/src/api/account_management/mfa.ts","../auth/src/core/persistence/index.ts","../auth/src/platform_browser/messagechannel/receiver.ts","../auth/src/platform_browser/messagechannel/promise.ts","../auth/src/platform_browser/messagechannel/sender.ts","../auth/src/core/util/event_id.ts","../auth/src/platform_browser/auth_window.ts","../auth/src/platform_browser/util/worker.ts","../auth/src/platform_browser/persistence/indexed_db.ts","../auth/src/mfa/mfa_assertion.ts","../auth/src/mfa/assertions/totp.ts","../auth/src/api/authentication/mfa.ts","../auth/src/core/auth/firebase_internal.ts","../auth/index.web-extension.ts","../auth/src/core/auth/register.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// This value is retrieved and hardcoded by the NPM postinstall script\nconst getDefaultsFromPostinstall = () => undefined;\n\nexport { getDefaultsFromPostinstall };\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst stringToByteArray = function (str: string): number[] {\n  // TODO(user): Use native implementations if/when available\n  const out: number[] = [];\n  let p = 0;\n  for (let i = 0; i < str.length; i++) {\n    let c = str.charCodeAt(i);\n    if (c < 128) {\n      out[p++] = c;\n    } else if (c < 2048) {\n      out[p++] = (c >> 6) | 192;\n      out[p++] = (c & 63) | 128;\n    } else if (\n      (c & 0xfc00) === 0xd800 &&\n      i + 1 < str.length &&\n      (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00\n    ) {\n      // Surrogate Pair\n      c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\n      out[p++] = (c >> 18) | 240;\n      out[p++] = ((c >> 12) & 63) | 128;\n      out[p++] = ((c >> 6) & 63) | 128;\n      out[p++] = (c & 63) | 128;\n    } else {\n      out[p++] = (c >> 12) | 224;\n      out[p++] = ((c >> 6) & 63) | 128;\n      out[p++] = (c & 63) | 128;\n    }\n  }\n  return out;\n};\n\n/**\n * Turns an array of numbers into the string given by the concatenation of the\n * characters to which the numbers correspond.\n * @param bytes Array of numbers representing characters.\n * @return Stringification of the array.\n */\nconst byteArrayToString = function (bytes: number[]): string {\n  // TODO(user): Use native implementations if/when available\n  const out: string[] = [];\n  let pos = 0,\n    c = 0;\n  while (pos < bytes.length) {\n    const c1 = bytes[pos++];\n    if (c1 < 128) {\n      out[c++] = String.fromCharCode(c1);\n    } else if (c1 > 191 && c1 < 224) {\n      const c2 = bytes[pos++];\n      out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\n    } else if (c1 > 239 && c1 < 365) {\n      // Surrogate Pair\n      const c2 = bytes[pos++];\n      const c3 = bytes[pos++];\n      const c4 = bytes[pos++];\n      const u =\n        (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\n        0x10000;\n      out[c++] = String.fromCharCode(0xd800 + (u >> 10));\n      out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\n    } else {\n      const c2 = bytes[pos++];\n      const c3 = bytes[pos++];\n      out[c++] = String.fromCharCode(\n        ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)\n      );\n    }\n  }\n  return out.join('');\n};\n\ninterface Base64 {\n  byteToCharMap_: { [key: number]: string } | null;\n  charToByteMap_: { [key: string]: number } | null;\n  byteToCharMapWebSafe_: { [key: number]: string } | null;\n  charToByteMapWebSafe_: { [key: string]: number } | null;\n  ENCODED_VALS_BASE: string;\n  readonly ENCODED_VALS: string;\n  readonly ENCODED_VALS_WEBSAFE: string;\n  HAS_NATIVE_SUPPORT: boolean;\n  encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string;\n  encodeString(input: string, webSafe?: boolean): string;\n  decodeString(input: string, webSafe: boolean): string;\n  decodeStringToByteArray(input: string, webSafe: boolean): number[];\n  init_(): void;\n}\n\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\n// Static lookup maps, lazily populated by init_()\n// TODO(dlarocque): Define this as a class, since we no longer target ES5.\nexport const base64: Base64 = {\n  /**\n   * Maps bytes to characters.\n   */\n  byteToCharMap_: null,\n\n  /**\n   * Maps characters to bytes.\n   */\n  charToByteMap_: null,\n\n  /**\n   * Maps bytes to websafe characters.\n   * @private\n   */\n  byteToCharMapWebSafe_: null,\n\n  /**\n   * Maps websafe characters to bytes.\n   * @private\n   */\n  charToByteMapWebSafe_: null,\n\n  /**\n   * Our default alphabet, shared between\n   * ENCODED_VALS and ENCODED_VALS_WEBSAFE\n   */\n  ENCODED_VALS_BASE:\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\n\n  /**\n   * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\n   */\n  get ENCODED_VALS() {\n    return this.ENCODED_VALS_BASE + '+/=';\n  },\n\n  /**\n   * Our websafe alphabet.\n   */\n  get ENCODED_VALS_WEBSAFE() {\n    return this.ENCODED_VALS_BASE + '-_.';\n  },\n\n  /**\n   * Whether this browser supports the atob and btoa functions. This extension\n   * started at Mozilla but is now implemented by many browsers. We use the\n   * ASSUME_* variables to avoid pulling in the full useragent detection library\n   * but still allowing the standard per-browser compilations.\n   *\n   */\n  HAS_NATIVE_SUPPORT: typeof atob === 'function',\n\n  /**\n   * Base64-encode an array of bytes.\n   *\n   * @param input An array of bytes (numbers with\n   *     value in [0, 255]) to encode.\n   * @param webSafe Boolean indicating we should use the\n   *     alternative alphabet.\n   * @return The base64 encoded string.\n   */\n  encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string {\n    if (!Array.isArray(input)) {\n      throw Error('encodeByteArray takes an array as a parameter');\n    }\n\n    this.init_();\n\n    const byteToCharMap = webSafe\n      ? this.byteToCharMapWebSafe_!\n      : this.byteToCharMap_!;\n\n    const output = [];\n\n    for (let i = 0; i < input.length; i += 3) {\n      const byte1 = input[i];\n      const haveByte2 = i + 1 < input.length;\n      const byte2 = haveByte2 ? input[i + 1] : 0;\n      const haveByte3 = i + 2 < input.length;\n      const byte3 = haveByte3 ? input[i + 2] : 0;\n\n      const outByte1 = byte1 >> 2;\n      const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\n      let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\n      let outByte4 = byte3 & 0x3f;\n\n      if (!haveByte3) {\n        outByte4 = 64;\n\n        if (!haveByte2) {\n          outByte3 = 64;\n        }\n      }\n\n      output.push(\n        byteToCharMap[outByte1],\n        byteToCharMap[outByte2],\n        byteToCharMap[outByte3],\n        byteToCharMap[outByte4]\n      );\n    }\n\n    return output.join('');\n  },\n\n  /**\n   * Base64-encode a string.\n   *\n   * @param input A string to encode.\n   * @param webSafe If true, we should use the\n   *     alternative alphabet.\n   * @return The base64 encoded string.\n   */\n  encodeString(input: string, webSafe?: boolean): string {\n    // Shortcut for Mozilla browsers that implement\n    // a native base64 encoder in the form of \"btoa/atob\"\n    if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n      return btoa(input);\n    }\n    return this.encodeByteArray(stringToByteArray(input), webSafe);\n  },\n\n  /**\n   * Base64-decode a string.\n   *\n   * @param input to decode.\n   * @param webSafe True if we should use the\n   *     alternative alphabet.\n   * @return string representing the decoded value.\n   */\n  decodeString(input: string, webSafe: boolean): string {\n    // Shortcut for Mozilla browsers that implement\n    // a native base64 encoder in the form of \"btoa/atob\"\n    if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n      return atob(input);\n    }\n    return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\n  },\n\n  /**\n   * Base64-decode a string.\n   *\n   * In base-64 decoding, groups of four characters are converted into three\n   * bytes.  If the encoder did not apply padding, the input length may not\n   * be a multiple of 4.\n   *\n   * In this case, the last group will have fewer than 4 characters, and\n   * padding will be inferred.  If the group has one or two characters, it decodes\n   * to one byte.  If the group has three characters, it decodes to two bytes.\n   *\n   * @param input Input to decode.\n   * @param webSafe True if we should use the web-safe alphabet.\n   * @return bytes representing the decoded value.\n   */\n  decodeStringToByteArray(input: string, webSafe: boolean): number[] {\n    this.init_();\n\n    const charToByteMap = webSafe\n      ? this.charToByteMapWebSafe_!\n      : this.charToByteMap_!;\n\n    const output: number[] = [];\n\n    for (let i = 0; i < input.length; ) {\n      const byte1 = charToByteMap[input.charAt(i++)];\n\n      const haveByte2 = i < input.length;\n      const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\n      ++i;\n\n      const haveByte3 = i < input.length;\n      const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\n      ++i;\n\n      const haveByte4 = i < input.length;\n      const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\n      ++i;\n\n      if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\n        throw new DecodeBase64StringError();\n      }\n\n      const outByte1 = (byte1 << 2) | (byte2 >> 4);\n      output.push(outByte1);\n\n      if (byte3 !== 64) {\n        const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\n        output.push(outByte2);\n\n        if (byte4 !== 64) {\n          const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\n          output.push(outByte3);\n        }\n      }\n    }\n\n    return output;\n  },\n\n  /**\n   * Lazy static initialization function. Called before\n   * accessing any of the static map variables.\n   * @private\n   */\n  init_() {\n    if (!this.byteToCharMap_) {\n      this.byteToCharMap_ = {};\n      this.charToByteMap_ = {};\n      this.byteToCharMapWebSafe_ = {};\n      this.charToByteMapWebSafe_ = {};\n\n      // We want quick mappings back and forth, so we precompute two maps.\n      for (let i = 0; i < this.ENCODED_VALS.length; i++) {\n        this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\n        this.charToByteMap_[this.byteToCharMap_[i]] = i;\n        this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\n        this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\n\n        // Be forgiving when decoding and correctly decode both encodings.\n        if (i >= this.ENCODED_VALS_BASE.length) {\n          this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\n          this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\n        }\n      }\n    }\n  }\n};\n\n/**\n * An error encountered while decoding base64 string.\n */\nexport class DecodeBase64StringError extends Error {\n  readonly name = 'DecodeBase64StringError';\n}\n\n/**\n * URL-safe base64 encoding\n */\nexport const base64Encode = function (str: string): string {\n  const utf8Bytes = stringToByteArray(str);\n  return base64.encodeByteArray(utf8Bytes, true);\n};\n\n/**\n * URL-safe base64 encoding (without \".\" padding in the end).\n * e.g. Used in JSON Web Token (JWT) parts.\n */\nexport const base64urlEncodeWithoutPadding = function (str: string): string {\n  // Use base64url encoding and remove padding in the end (dot characters).\n  return base64Encode(str).replace(/\\./g, '');\n};\n\n/**\n * URL-safe base64 decoding\n *\n * NOTE: DO NOT use the global atob() function - it does NOT support the\n * base64Url variant encoding.\n *\n * @param str To be decoded\n * @return Decoded result, if possible\n */\nexport const base64Decode = function (str: string): string | null {\n  try {\n    return base64.decodeString(str, true);\n  } catch (e) {\n    console.error('base64Decode failed: ', e);\n  }\n  return null;\n};\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { base64Decode } from './crypt';\nimport { getGlobal } from './global';\nimport { getDefaultsFromPostinstall } from './postinstall';\n\n/**\n * Keys for experimental properties on the `FirebaseDefaults` object.\n * @public\n */\nexport type ExperimentalKey = 'authTokenSyncURL' | 'authIdTokenMaxAge';\n\n/**\n * An object that can be injected into the environment as __FIREBASE_DEFAULTS__,\n * either as a property of globalThis, a shell environment variable, or a\n * cookie.\n *\n * This object can be used to automatically configure and initialize\n * a Firebase app as well as any emulators.\n *\n * @public\n */\nexport interface FirebaseDefaults {\n  config?: Record<string, string>;\n  emulatorHosts?: Record<string, string>;\n  _authTokenSyncURL?: string;\n  _authIdTokenMaxAge?: number;\n  /**\n   * Override Firebase's runtime environment detection and\n   * force the SDK to act as if it were in the specified environment.\n   */\n  forceEnvironment?: 'browser' | 'node';\n  [key: string]: unknown;\n}\n\ndeclare global {\n  // Need `var` for this to work.\n  // eslint-disable-next-line no-var\n  var __FIREBASE_DEFAULTS__: FirebaseDefaults | undefined;\n}\n\nconst getDefaultsFromGlobal = (): FirebaseDefaults | undefined =>\n  getGlobal().__FIREBASE_DEFAULTS__;\n\n/**\n * Attempt to read defaults from a JSON string provided to\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\n * The dots are in parens because certain compilers (Vite?) cannot\n * handle seeing that variable in comments.\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\n */\nconst getDefaultsFromEnvVariable = (): FirebaseDefaults | undefined => {\n  if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n    return;\n  }\n  const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\n  if (defaultsJsonString) {\n    return JSON.parse(defaultsJsonString);\n  }\n};\n\nconst getDefaultsFromCookie = (): FirebaseDefaults | undefined => {\n  if (typeof document === 'undefined') {\n    return;\n  }\n  let match;\n  try {\n    match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\n  } catch (e) {\n    // Some environments such as Angular Universal SSR have a\n    // `document` object but error on accessing `document.cookie`.\n    return;\n  }\n  const decoded = match && base64Decode(match[1]);\n  return decoded && JSON.parse(decoded);\n};\n\n/**\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\n * (1) if such an object exists as a property of `globalThis`\n * (2) if such an object was provided on a shell environment variable\n * (3) if such an object exists in a cookie\n * @public\n */\nexport const getDefaults = (): FirebaseDefaults | undefined => {\n  try {\n    return (\n      getDefaultsFromPostinstall() ||\n      getDefaultsFromGlobal() ||\n      getDefaultsFromEnvVariable() ||\n      getDefaultsFromCookie()\n    );\n  } catch (e) {\n    /**\n     * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\n     * to any environment case we have not accounted for. Log to\n     * info instead of swallowing so we can find these unknown cases\n     * and add paths for them if needed.\n     */\n    console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\n    return;\n  }\n};\n\n/**\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\n * @public\n */\nexport const getDefaultEmulatorHost = (\n  productName: string\n): string | undefined => getDefaults()?.emulatorHosts?.[productName];\n\n/**\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\n * @public\n */\nexport const getDefaultEmulatorHostnameAndPort = (\n  productName: string\n): [hostname: string, port: number] | undefined => {\n  const host = getDefaultEmulatorHost(productName);\n  if (!host) {\n    return undefined;\n  }\n  const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\n  if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\n    throw new Error(`Invalid host ${host} with no separate hostname and port!`);\n  }\n  // eslint-disable-next-line no-restricted-globals\n  const port = parseInt(host.substring(separatorIndex + 1), 10);\n  if (host[0] === '[') {\n    // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\n    return [host.substring(1, separatorIndex - 1), port];\n  } else {\n    return [host.substring(0, separatorIndex), port];\n  }\n};\n\n/**\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\n * @public\n */\nexport const getDefaultAppConfig = (): Record<string, string> | undefined =>\n  getDefaults()?.config;\n\n/**\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\n * prefixed by \"_\")\n * @public\n */\nexport const getExperimentalSetting = <T extends ExperimentalKey>(\n  name: T\n): FirebaseDefaults[`_${T}`] =>\n  getDefaults()?.[`_${name}`] as FirebaseDefaults[`_${T}`];\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Polyfill for `globalThis` object.\n * @returns the `globalThis` object for the given environment.\n * @public\n */\nexport function getGlobal(): typeof globalThis {\n  if (typeof self !== 'undefined') {\n    return self;\n  }\n  if (typeof window !== 'undefined') {\n    return window;\n  }\n  if (typeof global !== 'undefined') {\n    return global;\n  }\n  throw new Error('Unable to locate global object.');\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class Deferred<R> {\n  promise: Promise<R>;\n  reject: (value?: unknown) => void = () => {};\n  resolve: (value?: unknown) => void = () => {};\n  constructor() {\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = resolve as (value?: unknown) => void;\n      this.reject = reject as (value?: unknown) => void;\n    });\n  }\n\n  /**\n   * Our API internals are not promisified and cannot because our callback APIs have subtle expectations around\n   * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\n   * and returns a node-style callback which will resolve or reject the Deferred's promise.\n   */\n  wrapCallback(\n    callback?: (error?: unknown, value?: unknown) => void\n  ): (error: unknown, value?: unknown) => void {\n    return (error, value?) => {\n      if (error) {\n        this.reject(error);\n      } else {\n        this.resolve(value);\n      }\n      if (typeof callback === 'function') {\n        // Attaching noop handler just in case developer wasn't expecting\n        // promises\n        this.promise.catch(() => {});\n\n        // Some of our callbacks don't expect a value and our own tests\n        // assert that the parameter length is 1\n        if (callback.length === 1) {\n          callback(error);\n        } else {\n          callback(error, value);\n        }\n      }\n    };\n  }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CONSTANTS } from './constants';\nimport { getDefaults } from './defaults';\n\n/**\n * Type placeholder for `WorkerGlobalScope` from `webworker`\n */\ndeclare class WorkerGlobalScope {}\n\n/**\n * Returns navigator.userAgent string or '' if it's not defined.\n * @return user agent string\n */\nexport function getUA(): string {\n  if (\n    typeof navigator !== 'undefined' &&\n    typeof navigator['userAgent'] === 'string'\n  ) {\n    return navigator['userAgent'];\n  } else {\n    return '';\n  }\n}\n\n/**\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\n *\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\n * wait for a callback.\n */\nexport function isMobileCordova(): boolean {\n  return (\n    typeof window !== 'undefined' &&\n    // @ts-ignore Setting up an broadly applicable index signature for Window\n    // just to deal with this case would probably be a bad idea.\n    !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\n    /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA())\n  );\n}\n\n/**\n * Detect Node.js.\n *\n * @return true if Node.js environment is detected or specified.\n */\n// Node detection logic from: https://github.com/iliakan/detect-node/\nexport function isNode(): boolean {\n  const forceEnvironment = getDefaults()?.forceEnvironment;\n  if (forceEnvironment === 'node') {\n    return true;\n  } else if (forceEnvironment === 'browser') {\n    return false;\n  }\n\n  try {\n    return (\n      Object.prototype.toString.call(global.process) === '[object process]'\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Detect Browser Environment.\n * Note: This will return true for certain test frameworks that are incompletely\n * mimicking a browser, and should not lead to assuming all browser APIs are\n * available.\n */\nexport function isBrowser(): boolean {\n  return typeof window !== 'undefined' || isWebWorker();\n}\n\n/**\n * Detect Web Worker context.\n */\nexport function isWebWorker(): boolean {\n  return (\n    typeof WorkerGlobalScope !== 'undefined' &&\n    typeof self !== 'undefined' &&\n    self instanceof WorkerGlobalScope\n  );\n}\n\n/**\n * Detect Cloudflare Worker context.\n */\nexport function isCloudflareWorker(): boolean {\n  return (\n    typeof navigator !== 'undefined' &&\n    navigator.userAgent === 'Cloudflare-Workers'\n  );\n}\n\n/**\n * Detect browser extensions (Chrome and Firefox at least).\n */\ninterface BrowserRuntime {\n  id?: unknown;\n}\ndeclare const chrome: { runtime?: BrowserRuntime };\ndeclare const browser: { runtime?: BrowserRuntime };\nexport function isBrowserExtension(): boolean {\n  const runtime =\n    typeof chrome === 'object'\n      ? chrome.runtime\n      : typeof browser === 'object'\n      ? browser.runtime\n      : undefined;\n  return typeof runtime === 'object' && runtime.id !== undefined;\n}\n\n/**\n * Detect React Native.\n *\n * @return true if ReactNative environment is detected.\n */\nexport function isReactNative(): boolean {\n  return (\n    typeof navigator === 'object' && navigator['product'] === 'ReactNative'\n  );\n}\n\n/** Detects Electron apps. */\nexport function isElectron(): boolean {\n  return getUA().indexOf('Electron/') >= 0;\n}\n\n/** Detects Internet Explorer. */\nexport function isIE(): boolean {\n  const ua = getUA();\n  return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\n}\n\n/** Detects Universal Windows Platform apps. */\nexport function isUWP(): boolean {\n  return getUA().indexOf('MSAppHost/') >= 0;\n}\n\n/**\n * Detect whether the current SDK build is the Node version.\n *\n * @return true if it's the Node SDK build.\n */\nexport function isNodeSdk(): boolean {\n  return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\n}\n\n/** Returns true if we are running in Safari. */\nexport function isSafari(): boolean {\n  return (\n    !isNode() &&\n    !!navigator.userAgent &&\n    navigator.userAgent.includes('Safari') &&\n    !navigator.userAgent.includes('Chrome')\n  );\n}\n\n/** Returns true if we are running in Safari or WebKit */\nexport function isSafariOrWebkit(): boolean {\n  return (\n    !isNode() &&\n    !!navigator.userAgent &&\n    (navigator.userAgent.includes('Safari') ||\n      navigator.userAgent.includes('WebKit')) &&\n    !navigator.userAgent.includes('Chrome')\n  );\n}\n\n/**\n * This method checks if indexedDB is supported by current browser/service worker context\n * @return true if indexedDB is supported by current browser/service worker context\n */\nexport function isIndexedDBAvailable(): boolean {\n  try {\n    return typeof indexedDB === 'object';\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\n * if errors occur during the database open operation.\n *\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\n * private browsing)\n */\nexport function validateIndexedDBOpenable(): Promise<boolean> {\n  return new Promise((resolve, reject) => {\n    try {\n      let preExist: boolean = true;\n      const DB_CHECK_NAME =\n        'validate-browser-context-for-indexeddb-analytics-module';\n      const request = self.indexedDB.open(DB_CHECK_NAME);\n      request.onsuccess = () => {\n        request.result.close();\n        // delete database only when it doesn't pre-exist\n        if (!preExist) {\n          self.indexedDB.deleteDatabase(DB_CHECK_NAME);\n        }\n        resolve(true);\n      };\n      request.onupgradeneeded = () => {\n        preExist = false;\n      };\n\n      request.onerror = () => {\n        reject(request.error?.message || '');\n      };\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n\n/**\n *\n * This method checks whether cookie is enabled within current browser\n * @return true if cookie is enabled within current browser\n */\nexport function areCookiesEnabled(): boolean {\n  if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\n    return false;\n  }\n  return true;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Standardized Firebase Error.\n *\n * Usage:\n *\n *   // TypeScript string literals for type-safe codes\n *   type Err =\n *     'unknown' |\n *     'object-not-found'\n *     ;\n *\n *   // Closure enum for type-safe error codes\n *   // at-enum {string}\n *   var Err = {\n *     UNKNOWN: 'unknown',\n *     OBJECT_NOT_FOUND: 'object-not-found',\n *   }\n *\n *   let errors: Map<Err, string> = {\n *     'generic-error': \"Unknown error\",\n *     'file-not-found': \"Could not find file: {$file}\",\n *   };\n *\n *   // Type-safe function - must pass a valid error code as param.\n *   let error = new ErrorFactory<Err>('service', 'Service', errors);\n *\n *   ...\n *   throw error.create(Err.GENERIC);\n *   ...\n *   throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n *   ...\n *   // Service: Could not file file: foo.txt (service/file-not-found).\n *\n *   catch (e) {\n *     assert(e.message === \"Could not find file: foo.txt.\");\n *     if ((e as FirebaseError)?.code === 'service/file-not-found') {\n *       console.log(\"Could not read file: \" + e['file']);\n *     }\n *   }\n */\n\nexport type ErrorMap<ErrorCode extends string> = {\n  readonly [K in ErrorCode]: string;\n};\n\nconst ERROR_NAME = 'FirebaseError';\n\nexport interface StringLike {\n  toString(): string;\n}\n\nexport interface ErrorData {\n  [key: string]: unknown;\n}\n\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nexport class FirebaseError extends Error {\n  /** The custom name for all FirebaseErrors. */\n  readonly name: string = ERROR_NAME;\n\n  constructor(\n    /** The error code for this error. */\n    readonly code: string,\n    message: string,\n    /** Custom data for this error. */\n    public customData?: Record<string, unknown>\n  ) {\n    super(message);\n\n    // Fix For ES5\n    // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n    // TODO(dlarocque): Replace this with `new.target`: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n    //                   which we can now use since we no longer target ES5.\n    Object.setPrototypeOf(this, FirebaseError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown.\n    // Only available on V8.\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, ErrorFactory.prototype.create);\n    }\n  }\n}\n\nexport class ErrorFactory<\n  ErrorCode extends string,\n  ErrorParams extends { readonly [K in ErrorCode]?: ErrorData } = {}\n> {\n  constructor(\n    private readonly service: string,\n    private readonly serviceName: string,\n    private readonly errors: ErrorMap<ErrorCode>\n  ) {}\n\n  create<K extends ErrorCode>(\n    code: K,\n    ...data: K extends keyof ErrorParams ? [ErrorParams[K]] : []\n  ): FirebaseError {\n    const customData = (data[0] as ErrorData) || {};\n    const fullCode = `${this.service}/${code}`;\n    const template = this.errors[code];\n\n    const message = template ? replaceTemplate(template, customData) : 'Error';\n    // Service Name: Error message (service/code).\n    const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n\n    const error = new FirebaseError(fullCode, fullMessage, customData);\n\n    return error;\n  }\n}\n\nfunction replaceTemplate(template: string, data: ErrorData): string {\n  try {\n    let ptr = 0;\n    let result = '';\n    while (ptr < template.length) {\n      const start = template.indexOf('{$', ptr);\n      if (start === -1) {\n        result += template.substring(ptr);\n        break;\n      }\n      const end = template.indexOf('}', start + 2);\n      if (end === -1) {\n        result += template.substring(ptr);\n        break;\n      }\n      const key = template.substring(start + 2, end);\n      const value = data[key];\n      result +=\n        template.substring(ptr, start) +\n        (value != null ? String(value) : `<${key}?>`);\n      ptr = end + 1;\n    }\n    return result;\n  } catch (e) {\n    // Should never happen, but fallback just in case\n    return template;\n  }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function contains<T extends object>(obj: T, key: string): boolean {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function safeGet<T extends object, K extends keyof T>(\n  obj: T,\n  key: K\n): T[K] | undefined {\n  if (Object.prototype.hasOwnProperty.call(obj, key)) {\n    return obj[key];\n  } else {\n    return undefined;\n  }\n}\n\nexport function isEmpty(obj: object): obj is {} {\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function map<K extends string, V, U>(\n  obj: { [key in K]: V },\n  fn: (value: V, key: K, obj: { [key in K]: V }) => U,\n  contextObj?: unknown\n): { [key in K]: U } {\n  const res: Partial<{ [key in K]: U }> = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      res[key] = fn.call(contextObj, obj[key], key, obj);\n    }\n  }\n  return res as { [key in K]: U };\n}\n\n/**\n * Deep equal two objects. Support Arrays and Objects.\n */\nexport function deepEqual(a: object, b: object): boolean {\n  if (a === b) {\n    return true;\n  }\n\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  for (const k of aKeys) {\n    if (!bKeys.includes(k)) {\n      return false;\n    }\n\n    const aProp = (a as Record<string, unknown>)[k];\n    const bProp = (b as Record<string, unknown>)[k];\n    if (isObject(aProp) && isObject(bProp)) {\n      if (!deepEqual(aProp, bProp)) {\n        return false;\n      }\n    } else if (aProp !== bProp) {\n      return false;\n    }\n  }\n\n  for (const k of bKeys) {\n    if (!aKeys.includes(k)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isObject(thing: unknown): thing is object {\n  return thing !== null && typeof thing === 'object';\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\n * params object (e.g. {arg: 'val', arg2: 'val2'})\n * Note: You must prepend it with ? when adding it to a URL.\n */\nexport function querystring(querystringParams: {\n  [key: string]: string | number;\n}): string {\n  const params = [];\n  for (const [key, value] of Object.entries(querystringParams)) {\n    if (Array.isArray(value)) {\n      value.forEach(arrayVal => {\n        params.push(\n          encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal)\n        );\n      });\n    } else {\n      params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n    }\n  }\n  return params.length ? '&' + params.join('&') : '';\n}\n\n/**\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\n * (e.g. {arg: 'val', arg2: 'val2'})\n */\nexport function querystringDecode(querystring: string): Record<string, string> {\n  const obj: Record<string, string> = {};\n  const tokens = querystring.replace(/^\\?/, '').split('&');\n\n  tokens.forEach(token => {\n    if (token) {\n      const [key, value] = token.split('=');\n      obj[decodeURIComponent(key)] = decodeURIComponent(value);\n    }\n  });\n  return obj;\n}\n\n/**\n * Extract the query string part of a URL, including the leading question mark (if present).\n */\nexport function extractQuerystring(url: string): string {\n  const queryStart = url.indexOf('?');\n  if (!queryStart) {\n    return '';\n  }\n  const fragmentStart = url.indexOf('#', queryStart);\n  return url.substring(\n    queryStart,\n    fragmentStart > 0 ? fragmentStart : undefined\n  );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport type NextFn<T> = (value: T) => void;\nexport type ErrorFn = (error: Error) => void;\nexport type CompleteFn = () => void;\n\nexport interface Observer<T> {\n  // Called once for each value in a stream of values.\n  next: NextFn<T>;\n\n  // A stream terminates by a single call to EITHER error() or complete().\n  error: ErrorFn;\n\n  // No events will be sent to next() once complete() is called.\n  complete: CompleteFn;\n}\n\nexport type PartialObserver<T> = Partial<Observer<T>>;\n\n// TODO: Support also Unsubscribe.unsubscribe?\nexport type Unsubscribe = () => void;\n\n/**\n * The Subscribe interface has two forms - passing the inline function\n * callbacks, or a object interface with callback properties.\n */\nexport interface Subscribe<T> {\n  (next?: NextFn<T>, error?: ErrorFn, complete?: CompleteFn): Unsubscribe;\n  (observer: PartialObserver<T>): Unsubscribe;\n}\n\nexport interface Observable<T> {\n  // Subscribe method\n  subscribe: Subscribe<T>;\n}\n\nexport type Executor<T> = (observer: Observer<T>) => void;\n\n/**\n * Helper to make a Subscribe function (just like Promise helps make a\n * Thenable).\n *\n * @param executor Function which can make calls to a single Observer\n *     as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\nexport function createSubscribe<T>(\n  executor: Executor<T>,\n  onNoObservers?: Executor<T>\n): Subscribe<T> {\n  const proxy = new ObserverProxy<T>(executor, onNoObservers);\n  return proxy.subscribe.bind(proxy);\n}\n\n/**\n * Implement fan-out for any number of Observers attached via a subscribe\n * function.\n */\nclass ObserverProxy<T> implements Observer<T> {\n  private observers: Array<Observer<T>> | undefined = [];\n  private unsubscribes: Unsubscribe[] = [];\n  private onNoObservers: Executor<T> | undefined;\n  private observerCount = 0;\n  // Micro-task scheduling by calling task.then().\n  private task = Promise.resolve();\n  private finalized = false;\n  private finalError?: Error;\n\n  /**\n   * @param executor Function which can make calls to a single Observer\n   *     as a proxy.\n   * @param onNoObservers Callback when count of Observers goes to zero.\n   */\n  constructor(executor: Executor<T>, onNoObservers?: Executor<T>) {\n    this.onNoObservers = onNoObservers;\n    // Call the executor asynchronously so subscribers that are called\n    // synchronously after the creation of the subscribe function\n    // can still receive the very first value generated in the executor.\n    this.task\n      .then(() => {\n        executor(this);\n      })\n      .catch(e => {\n        this.error(e);\n      });\n  }\n\n  next(value: T): void {\n    this.forEachObserver((observer: Observer<T>) => {\n      observer.next(value);\n    });\n  }\n\n  error(error: Error): void {\n    this.forEachObserver((observer: Observer<T>) => {\n      observer.error(error);\n    });\n    this.close(error);\n  }\n\n  complete(): void {\n    this.forEachObserver((observer: Observer<T>) => {\n      observer.complete();\n    });\n    this.close();\n  }\n\n  /**\n   * Subscribe function that can be used to add an Observer to the fan-out list.\n   *\n   * - We require that no event is sent to a subscriber synchronously to their\n   *   call to subscribe().\n   */\n  subscribe(\n    nextOrObserver?: NextFn<T> | PartialObserver<T>,\n    error?: ErrorFn,\n    complete?: CompleteFn\n  ): Unsubscribe {\n    let observer: Observer<T>;\n\n    if (\n      nextOrObserver === undefined &&\n      error === undefined &&\n      complete === undefined\n    ) {\n      throw new Error('Missing Observer.');\n    }\n\n    // Assemble an Observer object when passed as callback functions.\n    if (\n      implementsAnyMethods(nextOrObserver as { [key: string]: unknown }, [\n        'next',\n        'error',\n        'complete'\n      ])\n    ) {\n      observer = nextOrObserver as Observer<T>;\n    } else {\n      observer = {\n        next: nextOrObserver as NextFn<T>,\n        error,\n        complete\n      } as Observer<T>;\n    }\n\n    if (observer.next === undefined) {\n      observer.next = noop as NextFn<T>;\n    }\n    if (observer.error === undefined) {\n      observer.error = noop as ErrorFn;\n    }\n    if (observer.complete === undefined) {\n      observer.complete = noop as CompleteFn;\n    }\n\n    const unsub = this.unsubscribeOne.bind(this, this.observers!.length);\n\n    // Attempt to subscribe to a terminated Observable - we\n    // just respond to the Observer with the final error or complete\n    // event.\n    if (this.finalized) {\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      this.task.then(() => {\n        try {\n          if (this.finalError) {\n            observer.error(this.finalError);\n          } else {\n            observer.complete();\n          }\n        } catch (e) {\n          // nothing\n        }\n        return;\n      });\n    }\n\n    this.observers!.push(observer as Observer<T>);\n\n    return unsub;\n  }\n\n  // Unsubscribe is synchronous - we guarantee that no events are sent to\n  // any unsubscribed Observer.\n  private unsubscribeOne(i: number): void {\n    if (this.observers === undefined || this.observers[i] === undefined) {\n      return;\n    }\n\n    delete this.observers[i];\n\n    this.observerCount -= 1;\n    if (this.observerCount === 0 && this.onNoObservers !== undefined) {\n      this.onNoObservers(this);\n    }\n  }\n\n  private forEachObserver(fn: (observer: Observer<T>) => void): void {\n    if (this.finalized) {\n      // Already closed by previous event....just eat the additional values.\n      return;\n    }\n\n    // Since sendOne calls asynchronously - there is no chance that\n    // this.observers will become undefined.\n    for (let i = 0; i < this.observers!.length; i++) {\n      this.sendOne(i, fn);\n    }\n  }\n\n  // Call the Observer via one of it's callback function. We are careful to\n  // confirm that the observe has not been unsubscribed since this asynchronous\n  // function had been queued.\n  private sendOne(i: number, fn: (observer: Observer<T>) => void): void {\n    // Execute the callback asynchronously\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.task.then(() => {\n      if (this.observers !== undefined && this.observers[i] !== undefined) {\n        try {\n          fn(this.observers[i]);\n        } catch (e) {\n          // Ignore exceptions raised in Observers or missing methods of an\n          // Observer.\n          // Log error to console. b/31404806\n          if (typeof console !== 'undefined' && console.error) {\n            console.error(e);\n          }\n        }\n      }\n    });\n  }\n\n  private close(err?: Error): void {\n    if (this.finalized) {\n      return;\n    }\n    this.finalized = true;\n    if (err !== undefined) {\n      this.finalError = err;\n    }\n    // Proxy is no longer needed - garbage collect references\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.task.then(() => {\n      this.observers = undefined;\n      this.onNoObservers = undefined;\n    });\n  }\n}\n\n/** Turn synchronous function into one called asynchronously. */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function async(fn: Function, onError?: ErrorFn): Function {\n  return (...args: unknown[]) => {\n    Promise.resolve(true)\n      .then(() => {\n        fn(...args);\n      })\n      .catch((error: Error) => {\n        if (onError) {\n          onError(error);\n        }\n      });\n  };\n}\n\n/**\n * Return true if the object passed in implements any of the named methods.\n */\nfunction implementsAnyMethods(\n  obj: { [key: string]: unknown },\n  methods: string[]\n): boolean {\n  if (typeof obj !== 'object' || obj === null) {\n    return false;\n  }\n\n  for (const method of methods) {\n    if (method in obj && typeof obj[method] === 'function') {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction noop(): void {\n  // do nothing\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface Compat<T> {\n  _delegate: T;\n}\n\nexport function getModularInstance<ExpService>(\n  service: Compat<ExpService> | ExpService\n): ExpService {\n  if (service && (service as Compat<ExpService>)._delegate) {\n    return (service as Compat<ExpService>)._delegate;\n  } else {\n    return service as ExpService;\n  }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Checks whether host is a cloud workstation or not.\n * @public\n */\nexport function isCloudWorkstation(url: string): boolean {\n  // `isCloudWorkstation` is called without protocol in certain connect*Emulator functions\n  // In HTTP request builders, it's called with the protocol.\n  // If called with protocol prefix, it's a valid URL, so we extract the hostname\n  // If called without, we assume the string is the hostname.\n  try {\n    const host =\n      url.startsWith('http://') || url.startsWith('https://')\n        ? new URL(url).hostname\n        : url;\n    return host.endsWith('.cloudworkstations.dev');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Makes a fetch request to the given server.\n * Mostly used for forwarding cookies in Firebase Studio.\n * @public\n */\nexport async function pingServer(endpoint: string): Promise<boolean> {\n  const result = await fetch(endpoint, {\n    credentials: 'include'\n  });\n  return result.ok;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n  InstantiationMode,\n  InstanceFactory,\n  ComponentType,\n  Dictionary,\n  Name,\n  onInstanceCreatedCallback\n} from './types';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nexport class Component<T extends Name = Name> {\n  multipleInstances = false;\n  /**\n   * Properties to be added to the service namespace\n   */\n  serviceProps: Dictionary = {};\n\n  instantiationMode = InstantiationMode.LAZY;\n\n  onInstanceCreated: onInstanceCreatedCallback<T> | null = null;\n\n  /**\n   *\n   * @param name The public service name, e.g. app, auth, firestore, database\n   * @param instanceFactory Service factory responsible for creating the public interface\n   * @param type whether the service provided by the component is public or private\n   */\n  constructor(\n    readonly name: T,\n    readonly instanceFactory: InstanceFactory<T>,\n    readonly type: ComponentType\n  ) {}\n\n  setInstantiationMode(mode: InstantiationMode): this {\n    this.instantiationMode = mode;\n    return this;\n  }\n\n  setMultipleInstances(multipleInstances: boolean): this {\n    this.multipleInstances = multipleInstances;\n    return this;\n  }\n\n  setServiceProps(props: Dictionary): this {\n    this.serviceProps = props;\n    return this;\n  }\n\n  setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this {\n    this.onInstanceCreated = callback;\n    return this;\n  }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type LogLevelString =\n  | 'debug'\n  | 'verbose'\n  | 'info'\n  | 'warn'\n  | 'error'\n  | 'silent';\n\nexport interface LogOptions {\n  level: LogLevelString;\n}\n\nexport type LogCallback = (callbackParams: LogCallbackParams) => void;\n\nexport interface LogCallbackParams {\n  level: LogLevelString;\n  message: string;\n  args: unknown[];\n  type: string;\n}\n\n/**\n * A container for all of the Logger instances\n */\nexport const instances: Logger[] = [];\n\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nexport enum LogLevel {\n  DEBUG,\n  VERBOSE,\n  INFO,\n  WARN,\n  ERROR,\n  SILENT\n}\n\nconst levelStringToEnum: { [key in LogLevelString]: LogLevel } = {\n  'debug': LogLevel.DEBUG,\n  'verbose': LogLevel.VERBOSE,\n  'info': LogLevel.INFO,\n  'warn': LogLevel.WARN,\n  'error': LogLevel.ERROR,\n  'silent': LogLevel.SILENT\n};\n\n/**\n * The default log level\n */\nconst defaultLogLevel: LogLevel = LogLevel.INFO;\n\n/**\n * We allow users the ability to pass their own log handler. We will pass the\n * type of log, the current log level, and any other arguments passed (i.e. the\n * messages that the user wants to log) to this function.\n */\nexport type LogHandler = (\n  loggerInstance: Logger,\n  logType: LogLevel,\n  ...args: unknown[]\n) => void;\n\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n  [LogLevel.DEBUG]: 'log',\n  [LogLevel.VERBOSE]: 'log',\n  [LogLevel.INFO]: 'info',\n  [LogLevel.WARN]: 'warn',\n  [LogLevel.ERROR]: 'error'\n};\n\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler: LogHandler = (instance, logType, ...args): void => {\n  if (logType < instance.logLevel) {\n    return;\n  }\n  const now = new Date().toISOString();\n  const method = ConsoleMethod[logType as keyof typeof ConsoleMethod];\n  if (method) {\n    console[method as 'log' | 'info' | 'warn' | 'error'](\n      `[${now}]  ${instance.name}:`,\n      ...args\n    );\n  } else {\n    throw new Error(\n      `Attempted to log a message with an invalid logType (value: ${logType})`\n    );\n  }\n};\n\nexport class Logger {\n  /**\n   * Gives you an instance of a Logger to capture messages according to\n   * Firebase's logging scheme.\n   *\n   * @param name The name that the logs will be associated with\n   */\n  constructor(public name: string) {\n    /**\n     * Capture the current instance for later use\n     */\n    instances.push(this);\n  }\n\n  /**\n   * The log level of the given Logger instance.\n   */\n  private _logLevel = defaultLogLevel;\n\n  get logLevel(): LogLevel {\n    return this._logLevel;\n  }\n\n  set logLevel(val: LogLevel) {\n    if (!(val in LogLevel)) {\n      throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n    }\n    this._logLevel = val;\n  }\n\n  // Workaround for setter/getter having to be the same type.\n  setLogLevel(val: LogLevel | LogLevelString): void {\n    this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n  }\n\n  /**\n   * The main (internal) log handler for the Logger instance.\n   * Can be set to a new function in internal package code but not by user.\n   */\n  private _logHandler: LogHandler = defaultLogHandler;\n  get logHandler(): LogHandler {\n    return this._logHandler;\n  }\n  set logHandler(val: LogHandler) {\n    if (typeof val !== 'function') {\n      throw new TypeError('Value assigned to `logHandler` must be a function');\n    }\n    this._logHandler = val;\n  }\n\n  /**\n   * The optional, additional, user-defined log handler for the Logger instance.\n   */\n  private _userLogHandler: LogHandler | null = null;\n  get userLogHandler(): LogHandler | null {\n    return this._userLogHandler;\n  }\n  set userLogHandler(val: LogHandler | null) {\n    this._userLogHandler = val;\n  }\n\n  /**\n   * The functions below are all based on the `console` interface\n   */\n\n  debug(...args: unknown[]): void {\n    this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n    this._logHandler(this, LogLevel.DEBUG, ...args);\n  }\n  log(...args: unknown[]): void {\n    this._userLogHandler &&\n      this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n    this._logHandler(this, LogLevel.VERBOSE, ...args);\n  }\n  info(...args: unknown[]): void {\n    this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n    this._logHandler(this, LogLevel.INFO, ...args);\n  }\n  warn(...args: unknown[]): void {\n    this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n    this._logHandler(this, LogLevel.WARN, ...args);\n  }\n  error(...args: unknown[]): void {\n    this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n    this._logHandler(this, LogLevel.ERROR, ...args);\n  }\n}\n\nexport function setLogLevel(level: LogLevelString | LogLevel): void {\n  instances.forEach(inst => {\n    inst.setLogLevel(level);\n  });\n}\n\nexport function setUserLogHandler(\n  logCallback: LogCallback | null,\n  options?: LogOptions\n): void {\n  for (const instance of instances) {\n    let customLogLevel: LogLevel | null = null;\n    if (options && options.level) {\n      customLogLevel = levelStringToEnum[options.level];\n    }\n    if (logCallback === null) {\n      instance.userLogHandler = null;\n    } else {\n      instance.userLogHandler = (\n        instance: Logger,\n        level: LogLevel,\n        ...args: unknown[]\n      ) => {\n        const message = args\n          .map(arg => {\n            if (arg == null) {\n              return null;\n            } else if (typeof arg === 'string') {\n              return arg;\n            } else if (typeof arg === 'number' || typeof arg === 'boolean') {\n              return arg.toString();\n            } else if (arg instanceof Error) {\n              return arg.message;\n            } else {\n              try {\n                return JSON.stringify(arg);\n              } catch (ignored) {\n                return null;\n              }\n            }\n          })\n          .filter(arg => arg)\n          .join(' ');\n        if (level >= (customLogLevel ?? instance.logLevel)) {\n          logCallback({\n            level: LogLevel[level].toLowerCase() as LogLevelString,\n            message,\n            args,\n            type: instance.name\n          });\n        }\n      };\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorMap, User } from '../model/public_types';\nimport { ErrorFactory, ErrorMap } from '@firebase/util';\n\nimport { IdTokenMfaResponse } from '../api/authentication/mfa';\nimport { AppName } from '../model/auth';\nimport { AuthCredential } from './credentials';\n\n/**\n * Enumeration of Firebase Auth error codes.\n *\n * @internal\n */\nexport const enum AuthErrorCode {\n  ADMIN_ONLY_OPERATION = 'admin-restricted-operation',\n  ARGUMENT_ERROR = 'argument-error',\n  APP_NOT_AUTHORIZED = 'app-not-authorized',\n  APP_NOT_INSTALLED = 'app-not-installed',\n  CAPTCHA_CHECK_FAILED = 'captcha-check-failed',\n  CODE_EXPIRED = 'code-expired',\n  CORDOVA_NOT_READY = 'cordova-not-ready',\n  CORS_UNSUPPORTED = 'cors-unsupported',\n  CREDENTIAL_ALREADY_IN_USE = 'credential-already-in-use',\n  CREDENTIAL_MISMATCH = 'custom-token-mismatch',\n  CREDENTIAL_TOO_OLD_LOGIN_AGAIN = 'requires-recent-login',\n  DEPENDENT_SDK_INIT_BEFORE_AUTH = 'dependent-sdk-initialized-before-auth',\n  DYNAMIC_LINK_NOT_ACTIVATED = 'dynamic-link-not-activated',\n  EMAIL_CHANGE_NEEDS_VERIFICATION = 'email-change-needs-verification',\n  EMAIL_EXISTS = 'email-already-in-use',\n  EMULATOR_CONFIG_FAILED = 'emulator-config-failed',\n  EXPIRED_OOB_CODE = 'expired-action-code',\n  EXPIRED_POPUP_REQUEST = 'cancelled-popup-request',\n  INTERNAL_ERROR = 'internal-error',\n  INVALID_API_KEY = 'invalid-api-key',\n  INVALID_APP_CREDENTIAL = 'invalid-app-credential',\n  INVALID_APP_ID = 'invalid-app-id',\n  INVALID_AUTH = 'invalid-user-token',\n  INVALID_AUTH_EVENT = 'invalid-auth-event',\n  INVALID_CERT_HASH = 'invalid-cert-hash',\n  INVALID_CODE = 'invalid-verification-code',\n  INVALID_CONTINUE_URI = 'invalid-continue-uri',\n  INVALID_CORDOVA_CONFIGURATION = 'invalid-cordova-configuration',\n  INVALID_CUSTOM_TOKEN = 'invalid-custom-token',\n  INVALID_DYNAMIC_LINK_DOMAIN = 'invalid-dynamic-link-domain',\n  INVALID_EMAIL = 'invalid-email',\n  INVALID_EMULATOR_SCHEME = 'invalid-emulator-scheme',\n  INVALID_CREDENTIAL = 'invalid-credential',\n  INVALID_MESSAGE_PAYLOAD = 'invalid-message-payload',\n  INVALID_MFA_SESSION = 'invalid-multi-factor-session',\n  INVALID_OAUTH_CLIENT_ID = 'invalid-oauth-client-id',\n  INVALID_OAUTH_PROVIDER = 'invalid-oauth-provider',\n  INVALID_OOB_CODE = 'invalid-action-code',\n  INVALID_ORIGIN = 'unauthorized-domain',\n  INVALID_PASSWORD = 'wrong-password',\n  INVALID_PERSISTENCE = 'invalid-persistence-type',\n  INVALID_PHONE_NUMBER = 'invalid-phone-number',\n  INVALID_PROVIDER_ID = 'invalid-provider-id',\n  INVALID_RECIPIENT_EMAIL = 'invalid-recipient-email',\n  INVALID_SENDER = 'invalid-sender',\n  INVALID_SESSION_INFO = 'invalid-verification-id',\n  INVALID_TENANT_ID = 'invalid-tenant-id',\n  LOGIN_BLOCKED = 'login-blocked',\n  MFA_INFO_NOT_FOUND = 'multi-factor-info-not-found',\n  MFA_REQUIRED = 'multi-factor-auth-required',\n  MISSING_ANDROID_PACKAGE_NAME = 'missing-android-pkg-name',\n  MISSING_APP_CREDENTIAL = 'missing-app-credential',\n  MISSING_AUTH_DOMAIN = 'auth-domain-config-required',\n  MISSING_CODE = 'missing-verification-code',\n  MISSING_CONTINUE_URI = 'missing-continue-uri',\n  MISSING_IFRAME_START = 'missing-iframe-start',\n  MISSING_IOS_BUNDLE_ID = 'missing-ios-bundle-id',\n  MISSING_OR_INVALID_NONCE = 'missing-or-invalid-nonce',\n  MISSING_MFA_INFO = 'missing-multi-factor-info',\n  MISSING_MFA_SESSION = 'missing-multi-factor-session',\n  MISSING_PHONE_NUMBER = 'missing-phone-number',\n  MISSING_PASSWORD = 'missing-password',\n  MISSING_SESSION_INFO = 'missing-verification-id',\n  MODULE_DESTROYED = 'app-deleted',\n  NEED_CONFIRMATION = 'account-exists-with-different-credential',\n  NETWORK_REQUEST_FAILED = 'network-request-failed',\n  NULL_USER = 'null-user',\n  NO_AUTH_EVENT = 'no-auth-event',\n  NO_SUCH_PROVIDER = 'no-such-provider',\n  OPERATION_NOT_ALLOWED = 'operation-not-allowed',\n  OPERATION_NOT_SUPPORTED = 'operation-not-supported-in-this-environment',\n  POPUP_BLOCKED = 'popup-blocked',\n  POPUP_CLOSED_BY_USER = 'popup-closed-by-user',\n  PROVIDER_ALREADY_LINKED = 'provider-already-linked',\n  QUOTA_EXCEEDED = 'quota-exceeded',\n  REDIRECT_CANCELLED_BY_USER = 'redirect-cancelled-by-user',\n  REDIRECT_OPERATION_PENDING = 'redirect-operation-pending',\n  REJECTED_CREDENTIAL = 'rejected-credential',\n  SECOND_FACTOR_ALREADY_ENROLLED = 'second-factor-already-in-use',\n  SECOND_FACTOR_LIMIT_EXCEEDED = 'maximum-second-factor-count-exceeded',\n  TENANT_ID_MISMATCH = 'tenant-id-mismatch',\n  TIMEOUT = 'timeout',\n  TOKEN_EXPIRED = 'user-token-expired',\n  TOO_MANY_ATTEMPTS_TRY_LATER = 'too-many-requests',\n  UNAUTHORIZED_DOMAIN = 'unauthorized-continue-uri',\n  UNSUPPORTED_FIRST_FACTOR = 'unsupported-first-factor',\n  UNSUPPORTED_PERSISTENCE = 'unsupported-persistence-type',\n  UNSUPPORTED_TENANT_OPERATION = 'unsupported-tenant-operation',\n  UNVERIFIED_EMAIL = 'unverified-email',\n  USER_CANCELLED = 'user-cancelled',\n  USER_DELETED = 'user-not-found',\n  USER_DISABLED = 'user-disabled',\n  USER_MISMATCH = 'user-mismatch',\n  USER_SIGNED_OUT = 'user-signed-out',\n  WEAK_PASSWORD = 'weak-password',\n  WEB_STORAGE_UNSUPPORTED = 'web-storage-unsupported',\n  ALREADY_INITIALIZED = 'already-initialized',\n  RECAPTCHA_NOT_ENABLED = 'recaptcha-not-enabled',\n  MISSING_RECAPTCHA_TOKEN = 'missing-recaptcha-token',\n  INVALID_RECAPTCHA_TOKEN = 'invalid-recaptcha-token',\n  INVALID_RECAPTCHA_ACTION = 'invalid-recaptcha-action',\n  MISSING_CLIENT_TYPE = 'missing-client-type',\n  MISSING_RECAPTCHA_VERSION = 'missing-recaptcha-version',\n  INVALID_RECAPTCHA_VERSION = 'invalid-recaptcha-version',\n  INVALID_REQ_TYPE = 'invalid-req-type',\n  UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION = 'unsupported-password-policy-schema-version',\n  PASSWORD_DOES_NOT_MEET_REQUIREMENTS = 'password-does-not-meet-requirements',\n  INVALID_HOSTING_LINK_DOMAIN = 'invalid-hosting-link-domain'\n}\n\nfunction _debugErrorMap(): ErrorMap<AuthErrorCode> {\n  return {\n    [AuthErrorCode.ADMIN_ONLY_OPERATION]:\n      'This operation is restricted to administrators only.',\n    [AuthErrorCode.ARGUMENT_ERROR]: '',\n    [AuthErrorCode.APP_NOT_AUTHORIZED]:\n      \"This app, identified by the domain where it's hosted, is not \" +\n      'authorized to use Firebase Authentication with the provided API key. ' +\n      'Review your key configuration in the Google API console.',\n    [AuthErrorCode.APP_NOT_INSTALLED]:\n      'The requested mobile application corresponding to the identifier (' +\n      'Android package name or iOS bundle ID) provided is not installed on ' +\n      'this device.',\n    [AuthErrorCode.CAPTCHA_CHECK_FAILED]:\n      'The reCAPTCHA response token provided is either invalid, expired, ' +\n      'already used or the domain associated with it does not match the list ' +\n      'of whitelisted domains.',\n    [AuthErrorCode.CODE_EXPIRED]:\n      'The SMS code has expired. Please re-send the verification code to try ' +\n      'again.',\n    [AuthErrorCode.CORDOVA_NOT_READY]: 'Cordova framework is not ready.',\n    [AuthErrorCode.CORS_UNSUPPORTED]: 'This browser is not supported.',\n    [AuthErrorCode.CREDENTIAL_ALREADY_IN_USE]:\n      'This credential is already associated with a different user account.',\n    [AuthErrorCode.CREDENTIAL_MISMATCH]:\n      'The custom token corresponds to a different audience.',\n    [AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN]:\n      'This operation is sensitive and requires recent authentication. Log in ' +\n      'again before retrying this request.',\n    [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]:\n      'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\n      'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\n      'starting any other Firebase SDK.',\n    [AuthErrorCode.DYNAMIC_LINK_NOT_ACTIVATED]:\n      'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' +\n      'conditions.',\n    [AuthErrorCode.EMAIL_CHANGE_NEEDS_VERIFICATION]:\n      'Multi-factor users must always have a verified email.',\n    [AuthErrorCode.EMAIL_EXISTS]:\n      'The email address is already in use by another account.',\n    [AuthErrorCode.EMULATOR_CONFIG_FAILED]:\n      'Auth instance has already been used to make a network call. Auth can ' +\n      'no longer be configured to use the emulator. Try calling ' +\n      '\"connectAuthEmulator()\" sooner.',\n    [AuthErrorCode.EXPIRED_OOB_CODE]: 'The action code has expired.',\n    [AuthErrorCode.EXPIRED_POPUP_REQUEST]:\n      'This operation has been cancelled due to another conflicting popup being opened.',\n    [AuthErrorCode.INTERNAL_ERROR]: 'An internal AuthError has occurred.',\n    [AuthErrorCode.INVALID_APP_CREDENTIAL]:\n      'The phone verification request contains an invalid application verifier.' +\n      ' The reCAPTCHA token response is either invalid or expired.',\n    [AuthErrorCode.INVALID_APP_ID]:\n      'The mobile app identifier is not registered for the current project.',\n    [AuthErrorCode.INVALID_AUTH]:\n      \"This user's credential isn't valid for this project. This can happen \" +\n      \"if the user's token has been tampered with, or if the user isn't for \" +\n      'the project associated with this API key.',\n    [AuthErrorCode.INVALID_AUTH_EVENT]: 'An internal AuthError has occurred.',\n    [AuthErrorCode.INVALID_CODE]:\n      'The SMS verification code used to create the phone auth credential is ' +\n      'invalid. Please resend the verification code sms and be sure to use the ' +\n      'verification code provided by the user.',\n    [AuthErrorCode.INVALID_CONTINUE_URI]:\n      'The continue URL provided in the request is invalid.',\n    [AuthErrorCode.INVALID_CORDOVA_CONFIGURATION]:\n      'The following Cordova plugins must be installed to enable OAuth sign-in: ' +\n      'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' +\n      'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' +\n      'cordova-plugin-customurlscheme.',\n    [AuthErrorCode.INVALID_CUSTOM_TOKEN]:\n      'The custom token format is incorrect. Please check the documentation.',\n    [AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN]:\n      'The provided dynamic link domain is not configured or authorized for the current project.',\n    [AuthErrorCode.INVALID_EMAIL]: 'The email address is badly formatted.',\n    [AuthErrorCode.INVALID_EMULATOR_SCHEME]:\n      'Emulator URL must start with a valid scheme (http:// or https://).',\n    [AuthErrorCode.INVALID_API_KEY]:\n      'Your API key is invalid, please check you have copied it correctly.',\n    [AuthErrorCode.INVALID_CERT_HASH]:\n      'The SHA-1 certificate hash provided is invalid.',\n    [AuthErrorCode.INVALID_CREDENTIAL]:\n      'The supplied auth credential is incorrect, malformed or has expired.',\n    [AuthErrorCode.INVALID_MESSAGE_PAYLOAD]:\n      'The email template corresponding to this action contains invalid characters in its message. ' +\n      'Please fix by going to the Auth email templates section in the Firebase Console.',\n    [AuthErrorCode.INVALID_MFA_SESSION]:\n      'The request does not contain a valid proof of first factor successful sign-in.',\n    [AuthErrorCode.INVALID_OAUTH_PROVIDER]:\n      'EmailAuthProvider is not supported for this operation. This operation ' +\n      'only supports OAuth providers.',\n    [AuthErrorCode.INVALID_OAUTH_CLIENT_ID]:\n      'The OAuth client ID provided is either invalid or does not match the ' +\n      'specified API key.',\n    [AuthErrorCode.INVALID_ORIGIN]:\n      'This domain is not authorized for OAuth operations for your Firebase ' +\n      'project. Edit the list of authorized domains from the Firebase console.',\n    [AuthErrorCode.INVALID_OOB_CODE]:\n      'The action code is invalid. This can happen if the code is malformed, ' +\n      'expired, or has already been used.',\n    [AuthErrorCode.INVALID_PASSWORD]:\n      'The password is invalid or the user does not have a password.',\n    [AuthErrorCode.INVALID_PERSISTENCE]:\n      'The specified persistence type is invalid. It can only be local, session or none.',\n    [AuthErrorCode.INVALID_PHONE_NUMBER]:\n      'The format of the phone number provided is incorrect. Please enter the ' +\n      'phone number in a format that can be parsed into E.164 format. E.164 ' +\n      'phone numbers are written in the format [+][country code][subscriber ' +\n      'number including area code].',\n    [AuthErrorCode.INVALID_PROVIDER_ID]:\n      'The specified provider ID is invalid.',\n    [AuthErrorCode.INVALID_RECIPIENT_EMAIL]:\n      'The email corresponding to this action failed to send as the provided ' +\n      'recipient email address is invalid.',\n    [AuthErrorCode.INVALID_SENDER]:\n      'The email template corresponding to this action contains an invalid sender email or name. ' +\n      'Please fix by going to the Auth email templates section in the Firebase Console.',\n    [AuthErrorCode.INVALID_SESSION_INFO]:\n      'The verification ID used to create the phone auth credential is invalid.',\n    [AuthErrorCode.INVALID_TENANT_ID]:\n      \"The Auth instance's tenant ID is invalid.\",\n    [AuthErrorCode.LOGIN_BLOCKED]:\n      'Login blocked by user-provided method: {$originalMessage}',\n    [AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME]:\n      'An Android Package Name must be provided if the Android App is required to be installed.',\n    [AuthErrorCode.MISSING_AUTH_DOMAIN]:\n      'Be sure to include authDomain when calling firebase.initializeApp(), ' +\n      'by following the instructions in the Firebase console.',\n    [AuthErrorCode.MISSING_APP_CREDENTIAL]:\n      'The phone verification request is missing an application verifier ' +\n      'assertion. A reCAPTCHA response token needs to be provided.',\n    [AuthErrorCode.MISSING_CODE]:\n      'The phone auth credential was created with an empty SMS verification code.',\n    [AuthErrorCode.MISSING_CONTINUE_URI]:\n      'A continue URL must be provided in the request.',\n    [AuthErrorCode.MISSING_IFRAME_START]: 'An internal AuthError has occurred.',\n    [AuthErrorCode.MISSING_IOS_BUNDLE_ID]:\n      'An iOS Bundle ID must be provided if an App Store ID is provided.',\n    [AuthErrorCode.MISSING_OR_INVALID_NONCE]:\n      'The request does not contain a valid nonce. This can occur if the ' +\n      'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' +\n      'in the ID token payload.',\n    [AuthErrorCode.MISSING_PASSWORD]: 'A non-empty password must be provided',\n    [AuthErrorCode.MISSING_MFA_INFO]:\n      'No second factor identifier is provided.',\n    [AuthErrorCode.MISSING_MFA_SESSION]:\n      'The request is missing proof of first factor successful sign-in.',\n    [AuthErrorCode.MISSING_PHONE_NUMBER]:\n      'To send verification codes, provide a phone number for the recipient.',\n    [AuthErrorCode.MISSING_SESSION_INFO]:\n      'The phone auth credential was created with an empty verification ID.',\n    [AuthErrorCode.MODULE_DESTROYED]:\n      'This instance of FirebaseApp has been deleted.',\n    [AuthErrorCode.MFA_INFO_NOT_FOUND]:\n      'The user does not have a second factor matching the identifier provided.',\n    [AuthErrorCode.MFA_REQUIRED]:\n      'Proof of ownership of a second factor is required to complete sign-in.',\n    [AuthErrorCode.NEED_CONFIRMATION]:\n      'An account already exists with the same email address but different ' +\n      'sign-in credentials. Sign in using a provider associated with this ' +\n      'email address.',\n    [AuthErrorCode.NETWORK_REQUEST_FAILED]:\n      'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.',\n    [AuthErrorCode.NO_AUTH_EVENT]: 'An internal AuthError has occurred.',\n    [AuthErrorCode.NO_SUCH_PROVIDER]:\n      'User was not linked to an account with the given provider.',\n    [AuthErrorCode.NULL_USER]:\n      'A null user object was provided as the argument for an operation which ' +\n      'requires a non-null user object.',\n    [AuthErrorCode.OPERATION_NOT_ALLOWED]:\n      'The given sign-in provider is disabled for this Firebase project. ' +\n      'Enable it in the Firebase console, under the sign-in method tab of the ' +\n      'Auth section.',\n    [AuthErrorCode.OPERATION_NOT_SUPPORTED]:\n      'This operation is not supported in the environment this application is ' +\n      'running on. \"location.protocol\" must be http, https or chrome-extension' +\n      ' and web storage must be enabled.',\n    [AuthErrorCode.POPUP_BLOCKED]:\n      'Unable to establish a connection with the popup. It may have been blocked by the browser.',\n    [AuthErrorCode.POPUP_CLOSED_BY_USER]:\n      'The popup has been closed by the user before finalizing the operation.',\n    [AuthErrorCode.PROVIDER_ALREADY_LINKED]:\n      'User can only be linked to one identity for the given provider.',\n    [AuthErrorCode.QUOTA_EXCEEDED]:\n      \"The project's quota for this operation has been exceeded.\",\n    [AuthErrorCode.REDIRECT_CANCELLED_BY_USER]:\n      'The redirect operation has been cancelled by the user before finalizing.',\n    [AuthErrorCode.REDIRECT_OPERATION_PENDING]:\n      'A redirect sign-in operation is already pending.',\n    [AuthErrorCode.REJECTED_CREDENTIAL]:\n      'The request contains malformed or mismatching credentials.',\n    [AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED]:\n      'The second factor is already enrolled on this account.',\n    [AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED]:\n      'The maximum allowed number of second factors on a user has been exceeded.',\n    [AuthErrorCode.TENANT_ID_MISMATCH]:\n      \"The provided tenant ID does not match the Auth instance's tenant ID\",\n    [AuthErrorCode.TIMEOUT]: 'The operation has timed out.',\n    [AuthErrorCode.TOKEN_EXPIRED]:\n      \"The user's credential is no longer valid. The user must sign in again.\",\n    [AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER]:\n      'We have blocked all requests from this device due to unusual activity. ' +\n      'Try again later.',\n    [AuthErrorCode.UNAUTHORIZED_DOMAIN]:\n      'The domain of the continue URL is not whitelisted.  Please whitelist ' +\n      'the domain in the Firebase console.',\n    [AuthErrorCode.UNSUPPORTED_FIRST_FACTOR]:\n      'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.',\n    [AuthErrorCode.UNSUPPORTED_PERSISTENCE]:\n      'The current environment does not support the specified persistence type.',\n    [AuthErrorCode.UNSUPPORTED_TENANT_OPERATION]:\n      'This operation is not supported in a multi-tenant context.',\n    [AuthErrorCode.UNVERIFIED_EMAIL]:\n      'The operation requires a verified email.',\n    [AuthErrorCode.USER_CANCELLED]:\n      'The user did not grant your application the permissions it requested.',\n    [AuthErrorCode.USER_DELETED]:\n      'There is no user record corresponding to this identifier. The user may ' +\n      'have been deleted.',\n    [AuthErrorCode.USER_DISABLED]:\n      'The user account has been disabled by an administrator.',\n    [AuthErrorCode.USER_MISMATCH]:\n      'The supplied credentials do not correspond to the previously signed in user.',\n    [AuthErrorCode.USER_SIGNED_OUT]: '',\n    [AuthErrorCode.WEAK_PASSWORD]:\n      'The password must be 6 characters long or more.',\n    [AuthErrorCode.WEB_STORAGE_UNSUPPORTED]:\n      'This browser is not supported or 3rd party cookies and data may be disabled.',\n    [AuthErrorCode.ALREADY_INITIALIZED]:\n      'initializeAuth() has already been called with ' +\n      'different options. To avoid this error, call initializeAuth() with the ' +\n      'same options as when it was originally called, or call getAuth() to return the' +\n      ' already initialized instance.',\n    [AuthErrorCode.MISSING_RECAPTCHA_TOKEN]:\n      'The reCAPTCHA token is missing when sending request to the backend.',\n    [AuthErrorCode.INVALID_RECAPTCHA_TOKEN]:\n      'The reCAPTCHA token is invalid when sending request to the backend.',\n    [AuthErrorCode.INVALID_RECAPTCHA_ACTION]:\n      'The reCAPTCHA action is invalid when sending request to the backend.',\n    [AuthErrorCode.RECAPTCHA_NOT_ENABLED]:\n      'reCAPTCHA Enterprise integration is not enabled for this project.',\n    [AuthErrorCode.MISSING_CLIENT_TYPE]:\n      'The reCAPTCHA client type is missing when sending request to the backend.',\n    [AuthErrorCode.MISSING_RECAPTCHA_VERSION]:\n      'The reCAPTCHA version is missing when sending request to the backend.',\n    [AuthErrorCode.INVALID_REQ_TYPE]: 'Invalid request parameters.',\n    [AuthErrorCode.INVALID_RECAPTCHA_VERSION]:\n      'The reCAPTCHA version is invalid when sending request to the backend.',\n    [AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION]:\n      'The password policy received from the backend uses a schema version that is not supported by this version of the Firebase SDK.',\n    [AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS]:\n      'The password does not meet the requirements.',\n    [AuthErrorCode.INVALID_HOSTING_LINK_DOMAIN]:\n      'The provided Hosting link domain is not configured in Firebase Hosting or is not owned by ' +\n      'the current project. This cannot be a default Hosting domain (`web.app` or `firebaseapp.com`).'\n  };\n}\n\nexport interface ErrorMapRetriever extends AuthErrorMap {\n  (): ErrorMap<AuthErrorCode>;\n}\n\nfunction _prodErrorMap(): ErrorMap<AuthErrorCode> {\n  // We will include this one message in the prod error map since by the very\n  // nature of this error, developers will never be able to see the message\n  // using the debugErrorMap (which is installed during auth initialization).\n  return {\n    [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]:\n      'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\n      'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\n      'starting any other Firebase SDK.'\n  } as ErrorMap<AuthErrorCode>;\n}\n\n/**\n * A verbose error map with detailed descriptions for most error codes.\n *\n * See discussion at {@link AuthErrorMap}\n *\n * @public\n */\nexport const debugErrorMap: AuthErrorMap = _debugErrorMap;\n\n/**\n * A minimal error map with all verbose error messages stripped.\n *\n * See discussion at {@link AuthErrorMap}\n *\n * @public\n */\nexport const prodErrorMap: AuthErrorMap = _prodErrorMap;\n\nexport interface NamedErrorParams {\n  appName: AppName;\n  credential?: AuthCredential;\n  email?: string;\n  phoneNumber?: string;\n  tenantId?: string;\n  user?: User;\n  _serverResponse?: object;\n}\n\n/**\n * @internal\n */\ntype GenericAuthErrorParams = {\n  [key in Exclude<\n    AuthErrorCode,\n    | AuthErrorCode.ARGUMENT_ERROR\n    | AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH\n    | AuthErrorCode.INTERNAL_ERROR\n    | AuthErrorCode.MFA_REQUIRED\n    | AuthErrorCode.NO_AUTH_EVENT\n    | AuthErrorCode.OPERATION_NOT_SUPPORTED\n  >]: {\n    appName?: AppName;\n    email?: string;\n    phoneNumber?: string;\n    message?: string;\n  };\n};\n\n/**\n * @internal\n */\nexport interface AuthErrorParams extends GenericAuthErrorParams {\n  [AuthErrorCode.ARGUMENT_ERROR]: { appName?: AppName };\n  [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]: { appName?: AppName };\n  [AuthErrorCode.INTERNAL_ERROR]: { appName?: AppName };\n  [AuthErrorCode.LOGIN_BLOCKED]: {\n    appName?: AppName;\n    originalMessage?: string;\n  };\n  [AuthErrorCode.OPERATION_NOT_SUPPORTED]: { appName?: AppName };\n  [AuthErrorCode.NO_AUTH_EVENT]: { appName?: AppName };\n  [AuthErrorCode.MFA_REQUIRED]: {\n    appName: AppName;\n    _serverResponse: IdTokenMfaResponse;\n  };\n  [AuthErrorCode.INVALID_CORDOVA_CONFIGURATION]: {\n    appName: AppName;\n    missingPlugin?: string;\n  };\n}\n\nexport const _DEFAULT_AUTH_ERROR_FACTORY = new ErrorFactory<\n  AuthErrorCode,\n  AuthErrorParams\n>('auth', 'Firebase', _prodErrorMap());\n\n/**\n * A map of potential `Auth` error codes, for easier comparison with errors\n * thrown by the SDK.\n *\n * @remarks\n * Note that you can't tree-shake individual keys\n * in the map, so by using the map you might substantially increase your\n * bundle size.\n *\n * @public\n */\nexport const AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = {\n  ADMIN_ONLY_OPERATION: 'auth/admin-restricted-operation',\n  ARGUMENT_ERROR: 'auth/argument-error',\n  APP_NOT_AUTHORIZED: 'auth/app-not-authorized',\n  APP_NOT_INSTALLED: 'auth/app-not-installed',\n  CAPTCHA_CHECK_FAILED: 'auth/captcha-check-failed',\n  CODE_EXPIRED: 'auth/code-expired',\n  CORDOVA_NOT_READY: 'auth/cordova-not-ready',\n  CORS_UNSUPPORTED: 'auth/cors-unsupported',\n  CREDENTIAL_ALREADY_IN_USE: 'auth/credential-already-in-use',\n  CREDENTIAL_MISMATCH: 'auth/custom-token-mismatch',\n  CREDENTIAL_TOO_OLD_LOGIN_AGAIN: 'auth/requires-recent-login',\n  DEPENDENT_SDK_INIT_BEFORE_AUTH: 'auth/dependent-sdk-initialized-before-auth',\n  DYNAMIC_LINK_NOT_ACTIVATED: 'auth/dynamic-link-not-activated',\n  EMAIL_CHANGE_NEEDS_VERIFICATION: 'auth/email-change-needs-verification',\n  EMAIL_EXISTS: 'auth/email-already-in-use',\n  EMULATOR_CONFIG_FAILED: 'auth/emulator-config-failed',\n  EXPIRED_OOB_CODE: 'auth/expired-action-code',\n  EXPIRED_POPUP_REQUEST: 'auth/cancelled-popup-request',\n  INTERNAL_ERROR: 'auth/internal-error',\n  INVALID_API_KEY: 'auth/invalid-api-key',\n  INVALID_APP_CREDENTIAL: 'auth/invalid-app-credential',\n  INVALID_APP_ID: 'auth/invalid-app-id',\n  INVALID_AUTH: 'auth/invalid-user-token',\n  INVALID_AUTH_EVENT: 'auth/invalid-auth-event',\n  INVALID_CERT_HASH: 'auth/invalid-cert-hash',\n  INVALID_CODE: 'auth/invalid-verification-code',\n  INVALID_CONTINUE_URI: 'auth/invalid-continue-uri',\n  INVALID_CORDOVA_CONFIGURATION: 'auth/invalid-cordova-configuration',\n  INVALID_CUSTOM_TOKEN: 'auth/invalid-custom-token',\n  INVALID_DYNAMIC_LINK_DOMAIN: 'auth/invalid-dynamic-link-domain',\n  INVALID_EMAIL: 'auth/invalid-email',\n  INVALID_EMULATOR_SCHEME: 'auth/invalid-emulator-scheme',\n  INVALID_IDP_RESPONSE: 'auth/invalid-credential',\n  INVALID_LOGIN_CREDENTIALS: 'auth/invalid-credential',\n  INVALID_MESSAGE_PAYLOAD: 'auth/invalid-message-payload',\n  INVALID_MFA_SESSION: 'auth/invalid-multi-factor-session',\n  INVALID_OAUTH_CLIENT_ID: 'auth/invalid-oauth-client-id',\n  INVALID_OAUTH_PROVIDER: 'auth/invalid-oauth-provider',\n  INVALID_OOB_CODE: 'auth/invalid-action-code',\n  INVALID_ORIGIN: 'auth/unauthorized-domain',\n  INVALID_PASSWORD: 'auth/wrong-password',\n  INVALID_PERSISTENCE: 'auth/invalid-persistence-type',\n  INVALID_PHONE_NUMBER: 'auth/invalid-phone-number',\n  INVALID_PROVIDER_ID: 'auth/invalid-provider-id',\n  INVALID_RECIPIENT_EMAIL: 'auth/invalid-recipient-email',\n  INVALID_SENDER: 'auth/invalid-sender',\n  INVALID_SESSION_INFO: 'auth/invalid-verification-id',\n  INVALID_TENANT_ID: 'auth/invalid-tenant-id',\n  MFA_INFO_NOT_FOUND: 'auth/multi-factor-info-not-found',\n  MFA_REQUIRED: 'auth/multi-factor-auth-required',\n  MISSING_ANDROID_PACKAGE_NAME: 'auth/missing-android-pkg-name',\n  MISSING_APP_CREDENTIAL: 'auth/missing-app-credential',\n  MISSING_AUTH_DOMAIN: 'auth/auth-domain-config-required',\n  MISSING_CODE: 'auth/missing-verification-code',\n  MISSING_CONTINUE_URI: 'auth/missing-continue-uri',\n  MISSING_IFRAME_START: 'auth/missing-iframe-start',\n  MISSING_IOS_BUNDLE_ID: 'auth/missing-ios-bundle-id',\n  MISSING_OR_INVALID_NONCE: 'auth/missing-or-invalid-nonce',\n  MISSING_MFA_INFO: 'auth/missing-multi-factor-info',\n  MISSING_MFA_SESSION: 'auth/missing-multi-factor-session',\n  MISSING_PHONE_NUMBER: 'auth/missing-phone-number',\n  MISSING_PASSWORD: 'auth/missing-password',\n  MISSING_SESSION_INFO: 'auth/missing-verification-id',\n  MODULE_DESTROYED: 'auth/app-deleted',\n  NEED_CONFIRMATION: 'auth/account-exists-with-different-credential',\n  NETWORK_REQUEST_FAILED: 'auth/network-request-failed',\n  NULL_USER: 'auth/null-user',\n  NO_AUTH_EVENT: 'auth/no-auth-event',\n  NO_SUCH_PROVIDER: 'auth/no-such-provider',\n  OPERATION_NOT_ALLOWED: 'auth/operation-not-allowed',\n  OPERATION_NOT_SUPPORTED: 'auth/operation-not-supported-in-this-environment',\n  POPUP_BLOCKED: 'auth/popup-blocked',\n  POPUP_CLOSED_BY_USER: 'auth/popup-closed-by-user',\n  PROVIDER_ALREADY_LINKED: 'auth/provider-already-linked',\n  QUOTA_EXCEEDED: 'auth/quota-exceeded',\n  REDIRECT_CANCELLED_BY_USER: 'auth/redirect-cancelled-by-user',\n  REDIRECT_OPERATION_PENDING: 'auth/redirect-operation-pending',\n  REJECTED_CREDENTIAL: 'auth/rejected-credential',\n  SECOND_FACTOR_ALREADY_ENROLLED: 'auth/second-factor-already-in-use',\n  SECOND_FACTOR_LIMIT_EXCEEDED: 'auth/maximum-second-factor-count-exceeded',\n  TENANT_ID_MISMATCH: 'auth/tenant-id-mismatch',\n  TIMEOUT: 'auth/timeout',\n  TOKEN_EXPIRED: 'auth/user-token-expired',\n  TOO_MANY_ATTEMPTS_TRY_LATER: 'auth/too-many-requests',\n  UNAUTHORIZED_DOMAIN: 'auth/unauthorized-continue-uri',\n  UNSUPPORTED_FIRST_FACTOR: 'auth/unsupported-first-factor',\n  UNSUPPORTED_PERSISTENCE: 'auth/unsupported-persistence-type',\n  UNSUPPORTED_TENANT_OPERATION: 'auth/unsupported-tenant-operation',\n  UNVERIFIED_EMAIL: 'auth/unverified-email',\n  USER_CANCELLED: 'auth/user-cancelled',\n  USER_DELETED: 'auth/user-not-found',\n  USER_DISABLED: 'auth/user-disabled',\n  USER_MISMATCH: 'auth/user-mismatch',\n  USER_SIGNED_OUT: 'auth/user-signed-out',\n  WEAK_PASSWORD: 'auth/weak-password',\n  WEB_STORAGE_UNSUPPORTED: 'auth/web-storage-unsupported',\n  ALREADY_INITIALIZED: 'auth/already-initialized',\n  RECAPTCHA_NOT_ENABLED: 'auth/recaptcha-not-enabled',\n  MISSING_RECAPTCHA_TOKEN: 'auth/missing-recaptcha-token',\n  INVALID_RECAPTCHA_TOKEN: 'auth/invalid-recaptcha-token',\n  INVALID_RECAPTCHA_ACTION: 'auth/invalid-recaptcha-action',\n  MISSING_CLIENT_TYPE: 'auth/missing-client-type',\n  MISSING_RECAPTCHA_VERSION: 'auth/missing-recaptcha-version',\n  INVALID_RECAPTCHA_VERSION: 'auth/invalid-recaptcha-version',\n  INVALID_REQ_TYPE: 'auth/invalid-req-type',\n  INVALID_HOSTING_LINK_DOMAIN: 'auth/invalid-hosting-link-domain'\n} as const;\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Logger, LogLevel } from '@firebase/logger';\nimport { SDK_VERSION } from '@firebase/app';\n\nexport { LogLevel };\n\nconst logClient = new Logger('@firebase/auth');\n\n// Helper methods are needed because variables can't be exported as read/write\nexport function _getLogLevel(): LogLevel {\n  return logClient.logLevel;\n}\n\nexport function _setLogLevel(newLevel: LogLevel): void {\n  logClient.logLevel = newLevel;\n}\n\nexport function _logDebug(msg: string, ...args: string[]): void {\n  if (logClient.logLevel <= LogLevel.DEBUG) {\n    logClient.debug(`Auth (${SDK_VERSION}): ${msg}`, ...args);\n  }\n}\n\nexport function _logWarn(msg: string, ...args: string[]): void {\n  if (logClient.logLevel <= LogLevel.WARN) {\n    logClient.warn(`Auth (${SDK_VERSION}): ${msg}`, ...args);\n  }\n}\n\nexport function _logError(msg: string, ...args: string[]): void {\n  if (logClient.logLevel <= LogLevel.ERROR) {\n    logClient.error(`Auth (${SDK_VERSION}): ${msg}`, ...args);\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth } from '../../model/public_types';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { AuthInternal } from '../../model/auth';\nimport {\n  _DEFAULT_AUTH_ERROR_FACTORY,\n  AuthErrorCode,\n  AuthErrorParams,\n  prodErrorMap,\n  ErrorMapRetriever\n} from '../errors';\nimport { _logError } from './log';\n\ntype AuthErrorListParams<K> = K extends keyof AuthErrorParams\n  ? [AuthErrorParams[K]]\n  : [];\ntype LessAppName<K extends AuthErrorCode> = Omit<AuthErrorParams[K], 'appName'>;\n\n/**\n * Unconditionally fails, throwing a developer facing INTERNAL_ERROR\n *\n * @example\n * ```javascript\n * fail(auth, AuthErrorCode.MFA_REQUIRED);  // Error: the MFA_REQUIRED error needs more params than appName\n * fail(auth, AuthErrorCode.MFA_REQUIRED, {serverResponse});  // Compiles\n * fail(AuthErrorCode.INTERNAL_ERROR);  // Compiles; internal error does not need appName\n * fail(AuthErrorCode.USER_DELETED);  // Error: USER_DELETED requires app name\n * fail(auth, AuthErrorCode.USER_DELETED);  // Compiles; USER_DELETED _only_ needs app name\n * ```\n *\n * @param appName App name for tagging the error\n * @throws FirebaseError\n */\nexport function _fail<K extends AuthErrorCode>(\n  code: K,\n  ...data: {} extends AuthErrorParams[K]\n    ? [AuthErrorParams[K]?]\n    : [AuthErrorParams[K]]\n): never;\nexport function _fail<K extends AuthErrorCode>(\n  auth: Auth,\n  code: K,\n  ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): never;\nexport function _fail<K extends AuthErrorCode>(\n  authOrCode: Auth | K,\n  ...rest: unknown[]\n): never {\n  throw createErrorInternal(authOrCode, ...rest);\n}\n\nexport function _createError<K extends AuthErrorCode>(\n  code: K,\n  ...data: {} extends AuthErrorParams[K]\n    ? [AuthErrorParams[K]?]\n    : [AuthErrorParams[K]]\n): FirebaseError;\nexport function _createError<K extends AuthErrorCode>(\n  auth: Auth,\n  code: K,\n  ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): FirebaseError;\nexport function _createError<K extends AuthErrorCode>(\n  authOrCode: Auth | K,\n  ...rest: unknown[]\n): FirebaseError {\n  return createErrorInternal(authOrCode, ...rest);\n}\n\nexport function _errorWithCustomMessage(\n  auth: Auth,\n  code: AuthErrorCode,\n  message: string\n): FirebaseError {\n  const errorMap = {\n    ...(prodErrorMap as ErrorMapRetriever)(),\n    [code]: message\n  };\n  const factory = new ErrorFactory<AuthErrorCode, AuthErrorParams>(\n    'auth',\n    'Firebase',\n    errorMap\n  );\n  return factory.create(code, {\n    appName: auth.name\n  });\n}\n\nexport function _serverAppCurrentUserOperationNotSupportedError(\n  auth: Auth\n): FirebaseError {\n  return _errorWithCustomMessage(\n    auth,\n    AuthErrorCode.OPERATION_NOT_SUPPORTED,\n    'Operations that alter the current user are not supported in conjunction with FirebaseServerApp'\n  );\n}\n\nexport function _assertInstanceOf(\n  auth: Auth,\n  object: object,\n  instance: unknown\n): void {\n  const constructorInstance = instance as { new (...args: unknown[]): unknown };\n  if (!(object instanceof constructorInstance)) {\n    if (constructorInstance.name !== object.constructor.name) {\n      _fail(auth, AuthErrorCode.ARGUMENT_ERROR);\n    }\n\n    throw _errorWithCustomMessage(\n      auth,\n      AuthErrorCode.ARGUMENT_ERROR,\n      `Type of ${object.constructor.name} does not match expected instance.` +\n        `Did you pass a reference from a different Auth SDK?`\n    );\n  }\n}\n\nfunction createErrorInternal<K extends AuthErrorCode>(\n  authOrCode: Auth | K,\n  ...rest: unknown[]\n): FirebaseError {\n  if (typeof authOrCode !== 'string') {\n    const code = rest[0] as K;\n    const fullParams = [...rest.slice(1)] as AuthErrorListParams<K>;\n    if (fullParams[0]) {\n      fullParams[0].appName = authOrCode.name;\n    }\n\n    return (authOrCode as AuthInternal)._errorFactory.create(\n      code,\n      ...fullParams\n    );\n  }\n\n  return _DEFAULT_AUTH_ERROR_FACTORY.create(\n    authOrCode,\n    ...(rest as AuthErrorListParams<K>)\n  );\n}\n\nexport function _assert<K extends AuthErrorCode>(\n  assertion: unknown,\n  code: K,\n  ...data: {} extends AuthErrorParams[K]\n    ? [AuthErrorParams[K]?]\n    : [AuthErrorParams[K]]\n): asserts assertion;\nexport function _assert<K extends AuthErrorCode>(\n  assertion: unknown,\n  auth: Auth,\n  code: K,\n  ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): asserts assertion;\nexport function _assert<K extends AuthErrorCode>(\n  assertion: unknown,\n  authOrCode: Auth | K,\n  ...rest: unknown[]\n): asserts assertion {\n  if (!assertion) {\n    throw createErrorInternal(authOrCode, ...rest);\n  }\n}\n\n// We really do want to accept literally any function type here\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype TypeExpectation = Function | string | MapType;\n\ninterface MapType extends Record<string, TypeExpectation | Optional> {}\n\nclass Optional {\n  constructor(readonly type: TypeExpectation) {}\n}\n\nexport function opt(type: TypeExpectation): Optional {\n  return new Optional(type);\n}\n\n/**\n * Asserts the runtime types of arguments. The 'expected' field can be one of\n * a class, a string (representing a \"typeof\" call), or a record map of name\n * to type. Furthermore, the opt() function can be used to mark a field as\n * optional. For example:\n *\n * function foo(auth: Auth, profile: {displayName?: string}, update = false) {\n *   assertTypes(arguments, [AuthImpl, {displayName: opt('string')}, opt('boolean')]);\n * }\n *\n * opt() can be used for any type:\n * function foo(auth?: Auth) {\n *   assertTypes(arguments, [opt(AuthImpl)]);\n * }\n *\n * The string types can be or'd together, and you can use \"null\" as well (note\n * that typeof null === 'object'; this is an edge case). For example:\n *\n * function foo(profile: {displayName?: string | null}) {\n *   assertTypes(arguments, [{displayName: opt('string|null')}]);\n * }\n *\n * @param args\n * @param expected\n */\nexport function assertTypes(\n  args: Omit<IArguments, 'callee'>,\n  ...expected: Array<TypeExpectation | Optional>\n): void {\n  if (args.length > expected.length) {\n    _fail(AuthErrorCode.ARGUMENT_ERROR, {});\n  }\n\n  for (let i = 0; i < expected.length; i++) {\n    let expect = expected[i];\n    const arg = args[i];\n\n    if (expect instanceof Optional) {\n      // If the arg is undefined, then it matches \"optional\" and we can move to\n      // the next arg\n      if (typeof arg === 'undefined') {\n        continue;\n      }\n      expect = expect.type;\n    }\n\n    if (typeof expect === 'string') {\n      // Handle the edge case for null because typeof null === 'object'\n      if (expect.includes('null') && arg === null) {\n        continue;\n      }\n\n      const required = expect.split('|');\n      _assert(required.includes(typeof arg), AuthErrorCode.ARGUMENT_ERROR, {});\n    } else if (typeof expect === 'object') {\n      // Recursively check record arguments\n      const record = arg as Record<string, unknown>;\n      const map = expect as MapType;\n      const keys = Object.keys(expect);\n\n      assertTypes(\n        keys.map(k => record[k]),\n        ...keys.map(k => map[k])\n      );\n    } else {\n      _assert(arg instanceof expect, AuthErrorCode.ARGUMENT_ERROR, {});\n    }\n  }\n}\n\n/**\n * Unconditionally fails, throwing an internal error with the given message.\n *\n * @param failure type of failure encountered\n * @throws Error\n */\nexport function debugFail(failure: string): never {\n  // Log the failure in addition to throw an exception, just in case the\n  // exception is swallowed.\n  const message = `INTERNAL ASSERTION FAILED: ` + failure;\n  _logError(message);\n\n  // NOTE: We don't use FirebaseError here because these are internal failures\n  // that cannot be handled by the user. (Also it would create a circular\n  // dependency between the error and assert modules which doesn't work.)\n  throw new Error(message);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * @param assertion\n * @param message\n */\nexport function debugAssert(\n  assertion: unknown,\n  message: string\n): asserts assertion {\n  if (!assertion) {\n    debugFail(message);\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function _getCurrentUrl(): string {\n  return (typeof self !== 'undefined' && self.location?.href) || '';\n}\n\nexport function _isHttpOrHttps(): boolean {\n  return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:';\n}\n\nexport function _getCurrentScheme(): string | null {\n  return (typeof self !== 'undefined' && self.location?.protocol) || null;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isBrowserExtension } from '@firebase/util';\nimport { _isHttpOrHttps } from './location';\n\n/**\n * Determine whether the browser is working online\n */\nexport function _isOnline(): boolean {\n  if (\n    typeof navigator !== 'undefined' &&\n    navigator &&\n    'onLine' in navigator &&\n    typeof navigator.onLine === 'boolean' &&\n    // Apply only for traditional web apps and Chrome extensions.\n    // This is especially true for Cordova apps which have unreliable\n    // navigator.onLine behavior unless cordova-plugin-network-information is\n    // installed which overwrites the native navigator.onLine value and\n    // defines navigator.connection.\n    (_isHttpOrHttps() || isBrowserExtension() || 'connection' in navigator)\n  ) {\n    return navigator.onLine;\n  }\n  // If we can't determine the state, assume it is online.\n  return true;\n}\n\nexport function _getUserLanguage(): string | null {\n  if (typeof navigator === 'undefined') {\n    return null;\n  }\n  const navigatorLanguage: NavigatorLanguage = navigator;\n  return (\n    // Most reliable, but only supported in Chrome/Firefox.\n    (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\n    // Supported in most browsers, but returns the language of the browser\n    // UI, not the language set in browser settings.\n    navigatorLanguage.language ||\n    // Couldn't determine language.\n    null\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugFail } from './assert';\n\nexport class FetchProvider {\n  private static fetchImpl: typeof fetch | null;\n  private static headersImpl: typeof Headers | null;\n  private static responseImpl: typeof Response | null;\n\n  static initialize(\n    fetchImpl: typeof fetch,\n    headersImpl?: typeof Headers,\n    responseImpl?: typeof Response\n  ): void {\n    this.fetchImpl = fetchImpl;\n    if (headersImpl) {\n      this.headersImpl = headersImpl;\n    }\n    if (responseImpl) {\n      this.responseImpl = responseImpl;\n    }\n  }\n\n  static fetch(): typeof fetch {\n    if (this.fetchImpl) {\n      return this.fetchImpl;\n    }\n    if (typeof self !== 'undefined' && 'fetch' in self) {\n      return self.fetch;\n    }\n    if (typeof globalThis !== 'undefined' && globalThis.fetch) {\n      return globalThis.fetch;\n    }\n    if (typeof fetch !== 'undefined') {\n      return fetch;\n    }\n    debugFail(\n      'Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n    );\n  }\n\n  static headers(): typeof Headers {\n    if (this.headersImpl) {\n      return this.headersImpl;\n    }\n    if (typeof self !== 'undefined' && 'Headers' in self) {\n      return self.Headers;\n    }\n    if (typeof globalThis !== 'undefined' && globalThis.Headers) {\n      return globalThis.Headers;\n    }\n    if (typeof Headers !== 'undefined') {\n      return Headers;\n    }\n    debugFail(\n      'Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n    );\n  }\n\n  static response(): typeof Response {\n    if (this.responseImpl) {\n      return this.responseImpl;\n    }\n    if (typeof self !== 'undefined' && 'Response' in self) {\n      return self.Response;\n    }\n    if (typeof globalThis !== 'undefined' && globalThis.Response) {\n      return globalThis.Response;\n    }\n    if (typeof Response !== 'undefined') {\n      return Response;\n    }\n    debugFail(\n      'Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n    );\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../core/errors';\n\n/**\n * Errors that can be returned by the backend\n */\nexport const enum ServerError {\n  ADMIN_ONLY_OPERATION = 'ADMIN_ONLY_OPERATION',\n  BLOCKING_FUNCTION_ERROR_RESPONSE = 'BLOCKING_FUNCTION_ERROR_RESPONSE',\n  CAPTCHA_CHECK_FAILED = 'CAPTCHA_CHECK_FAILED',\n  CORS_UNSUPPORTED = 'CORS_UNSUPPORTED',\n  CREDENTIAL_MISMATCH = 'CREDENTIAL_MISMATCH',\n  CREDENTIAL_TOO_OLD_LOGIN_AGAIN = 'CREDENTIAL_TOO_OLD_LOGIN_AGAIN',\n  DYNAMIC_LINK_NOT_ACTIVATED = 'DYNAMIC_LINK_NOT_ACTIVATED',\n  EMAIL_CHANGE_NEEDS_VERIFICATION = 'EMAIL_CHANGE_NEEDS_VERIFICATION',\n  EMAIL_EXISTS = 'EMAIL_EXISTS',\n  EMAIL_NOT_FOUND = 'EMAIL_NOT_FOUND',\n  EXPIRED_OOB_CODE = 'EXPIRED_OOB_CODE',\n  FEDERATED_USER_ID_ALREADY_LINKED = 'FEDERATED_USER_ID_ALREADY_LINKED',\n  INVALID_APP_CREDENTIAL = 'INVALID_APP_CREDENTIAL',\n  INVALID_APP_ID = 'INVALID_APP_ID',\n  INVALID_CERT_HASH = 'INVALID_CERT_HASH',\n  INVALID_CODE = 'INVALID_CODE',\n  INVALID_CONTINUE_URI = 'INVALID_CONTINUE_URI',\n  INVALID_CUSTOM_TOKEN = 'INVALID_CUSTOM_TOKEN',\n  INVALID_DYNAMIC_LINK_DOMAIN = 'INVALID_DYNAMIC_LINK_DOMAIN',\n  INVALID_EMAIL = 'INVALID_EMAIL',\n  INVALID_ID_TOKEN = 'INVALID_ID_TOKEN',\n  INVALID_IDP_RESPONSE = 'INVALID_IDP_RESPONSE',\n  INVALID_IDENTIFIER = 'INVALID_IDENTIFIER',\n  INVALID_LOGIN_CREDENTIALS = 'INVALID_LOGIN_CREDENTIALS',\n  INVALID_MESSAGE_PAYLOAD = 'INVALID_MESSAGE_PAYLOAD',\n  INVALID_MFA_PENDING_CREDENTIAL = 'INVALID_MFA_PENDING_CREDENTIAL',\n  INVALID_OAUTH_CLIENT_ID = 'INVALID_OAUTH_CLIENT_ID',\n  INVALID_OOB_CODE = 'INVALID_OOB_CODE',\n  INVALID_PASSWORD = 'INVALID_PASSWORD',\n  INVALID_PENDING_TOKEN = 'INVALID_PENDING_TOKEN',\n  INVALID_PHONE_NUMBER = 'INVALID_PHONE_NUMBER',\n  INVALID_PROVIDER_ID = 'INVALID_PROVIDER_ID',\n  INVALID_RECIPIENT_EMAIL = 'INVALID_RECIPIENT_EMAIL',\n  INVALID_SENDER = 'INVALID_SENDER',\n  INVALID_SESSION_INFO = 'INVALID_SESSION_INFO',\n  INVALID_TEMPORARY_PROOF = 'INVALID_TEMPORARY_PROOF',\n  INVALID_TENANT_ID = 'INVALID_TENANT_ID',\n  MFA_ENROLLMENT_NOT_FOUND = 'MFA_ENROLLMENT_NOT_FOUND',\n  MISSING_ANDROID_PACKAGE_NAME = 'MISSING_ANDROID_PACKAGE_NAME',\n  MISSING_APP_CREDENTIAL = 'MISSING_APP_CREDENTIAL',\n  MISSING_CODE = 'MISSING_CODE',\n  MISSING_CONTINUE_URI = 'MISSING_CONTINUE_URI',\n  MISSING_CUSTOM_TOKEN = 'MISSING_CUSTOM_TOKEN',\n  MISSING_IOS_BUNDLE_ID = 'MISSING_IOS_BUNDLE_ID',\n  MISSING_MFA_ENROLLMENT_ID = 'MISSING_MFA_ENROLLMENT_ID',\n  MISSING_MFA_PENDING_CREDENTIAL = 'MISSING_MFA_PENDING_CREDENTIAL',\n  MISSING_OOB_CODE = 'MISSING_OOB_CODE',\n  MISSING_OR_INVALID_NONCE = 'MISSING_OR_INVALID_NONCE',\n  MISSING_PASSWORD = 'MISSING_PASSWORD',\n  MISSING_REQ_TYPE = 'MISSING_REQ_TYPE',\n  MISSING_PHONE_NUMBER = 'MISSING_PHONE_NUMBER',\n  MISSING_SESSION_INFO = 'MISSING_SESSION_INFO',\n  OPERATION_NOT_ALLOWED = 'OPERATION_NOT_ALLOWED',\n  PASSWORD_LOGIN_DISABLED = 'PASSWORD_LOGIN_DISABLED',\n  QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\n  RESET_PASSWORD_EXCEED_LIMIT = 'RESET_PASSWORD_EXCEED_LIMIT',\n  REJECTED_CREDENTIAL = 'REJECTED_CREDENTIAL',\n  SECOND_FACTOR_EXISTS = 'SECOND_FACTOR_EXISTS',\n  SECOND_FACTOR_LIMIT_EXCEEDED = 'SECOND_FACTOR_LIMIT_EXCEEDED',\n  SESSION_EXPIRED = 'SESSION_EXPIRED',\n  TENANT_ID_MISMATCH = 'TENANT_ID_MISMATCH',\n  TOKEN_EXPIRED = 'TOKEN_EXPIRED',\n  TOO_MANY_ATTEMPTS_TRY_LATER = 'TOO_MANY_ATTEMPTS_TRY_LATER',\n  UNSUPPORTED_FIRST_FACTOR = 'UNSUPPORTED_FIRST_FACTOR',\n  UNSUPPORTED_TENANT_OPERATION = 'UNSUPPORTED_TENANT_OPERATION',\n  UNAUTHORIZED_DOMAIN = 'UNAUTHORIZED_DOMAIN',\n  UNVERIFIED_EMAIL = 'UNVERIFIED_EMAIL',\n  USER_CANCELLED = 'USER_CANCELLED',\n  USER_DISABLED = 'USER_DISABLED',\n  USER_NOT_FOUND = 'USER_NOT_FOUND',\n  WEAK_PASSWORD = 'WEAK_PASSWORD',\n  RECAPTCHA_NOT_ENABLED = 'RECAPTCHA_NOT_ENABLED',\n  MISSING_RECAPTCHA_TOKEN = 'MISSING_RECAPTCHA_TOKEN',\n  INVALID_RECAPTCHA_TOKEN = 'INVALID_RECAPTCHA_TOKEN',\n  INVALID_RECAPTCHA_ACTION = 'INVALID_RECAPTCHA_ACTION',\n  MISSING_CLIENT_TYPE = 'MISSING_CLIENT_TYPE',\n  MISSING_RECAPTCHA_VERSION = 'MISSING_RECAPTCHA_VERSION',\n  INVALID_RECAPTCHA_VERSION = 'INVALID_RECAPTCHA_VERSION',\n  INVALID_REQ_TYPE = 'INVALID_REQ_TYPE',\n  PASSWORD_DOES_NOT_MEET_REQUIREMENTS = 'PASSWORD_DOES_NOT_MEET_REQUIREMENTS',\n  INVALID_HOSTING_LINK_DOMAIN = 'INVALID_HOSTING_LINK_DOMAIN'\n}\n\n/**\n * API Response in the event of an error\n */\nexport interface JsonError {\n  error: {\n    code: number;\n    message: string;\n    errors?: [\n      {\n        message: ServerError;\n        domain: string;\n        reason: string;\n      }\n    ];\n  };\n}\n\n/**\n * Type definition for a map from server errors to developer visible errors\n */\nexport declare type ServerErrorMap<ApiError extends string> = {\n  readonly [K in ApiError]: AuthErrorCode;\n};\n\n/**\n * Map from errors returned by the server to errors to developer visible errors\n */\nexport const SERVER_ERROR_MAP: Partial<ServerErrorMap<ServerError>> = {\n  // Custom token errors.\n  [ServerError.CREDENTIAL_MISMATCH]: AuthErrorCode.CREDENTIAL_MISMATCH,\n  // This can only happen if the SDK sends a bad request.\n  [ServerError.MISSING_CUSTOM_TOKEN]: AuthErrorCode.INTERNAL_ERROR,\n\n  // Create Auth URI errors.\n  [ServerError.INVALID_IDENTIFIER]: AuthErrorCode.INVALID_EMAIL,\n  // This can only happen if the SDK sends a bad request.\n  [ServerError.MISSING_CONTINUE_URI]: AuthErrorCode.INTERNAL_ERROR,\n\n  // Sign in with email and password errors (some apply to sign up too).\n  [ServerError.INVALID_PASSWORD]: AuthErrorCode.INVALID_PASSWORD,\n  // This can only happen if the SDK sends a bad request.\n  [ServerError.MISSING_PASSWORD]: AuthErrorCode.MISSING_PASSWORD,\n  // Thrown if Email Enumeration Protection is enabled in the project and the email or password is\n  // invalid.\n  [ServerError.INVALID_LOGIN_CREDENTIALS]: AuthErrorCode.INVALID_CREDENTIAL,\n\n  // Sign up with email and password errors.\n  [ServerError.EMAIL_EXISTS]: AuthErrorCode.EMAIL_EXISTS,\n  [ServerError.PASSWORD_LOGIN_DISABLED]: AuthErrorCode.OPERATION_NOT_ALLOWED,\n\n  // Verify assertion for sign in with credential errors:\n  [ServerError.INVALID_IDP_RESPONSE]: AuthErrorCode.INVALID_CREDENTIAL,\n  [ServerError.INVALID_PENDING_TOKEN]: AuthErrorCode.INVALID_CREDENTIAL,\n  [ServerError.FEDERATED_USER_ID_ALREADY_LINKED]:\n    AuthErrorCode.CREDENTIAL_ALREADY_IN_USE,\n\n  // This can only happen if the SDK sends a bad request.\n  [ServerError.MISSING_REQ_TYPE]: AuthErrorCode.INTERNAL_ERROR,\n\n  // Send Password reset email errors:\n  [ServerError.EMAIL_NOT_FOUND]: AuthErrorCode.USER_DELETED,\n  [ServerError.RESET_PASSWORD_EXCEED_LIMIT]:\n    AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER,\n\n  [ServerError.EXPIRED_OOB_CODE]: AuthErrorCode.EXPIRED_OOB_CODE,\n  [ServerError.INVALID_OOB_CODE]: AuthErrorCode.INVALID_OOB_CODE,\n  // This can only happen if the SDK sends a bad request.\n  [ServerError.MISSING_OOB_CODE]: AuthErrorCode.INTERNAL_ERROR,\n\n  // Operations that require ID token in request:\n  [ServerError.CREDENTIAL_TOO_OLD_LOGIN_AGAIN]:\n    AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN,\n  [ServerError.INVALID_ID_TOKEN]: AuthErrorCode.INVALID_AUTH,\n  [ServerError.TOKEN_EXPIRED]: AuthErrorCode.TOKEN_EXPIRED,\n  [ServerError.USER_NOT_FOUND]: AuthErrorCode.TOKEN_EXPIRED,\n\n  // Other errors.\n  [ServerError.TOO_MANY_ATTEMPTS_TRY_LATER]:\n    AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER,\n  [ServerError.PASSWORD_DOES_NOT_MEET_REQUIREMENTS]:\n    AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS,\n\n  // Phone Auth related errors.\n  [ServerError.INVALID_CODE]: AuthErrorCode.INVALID_CODE,\n  [ServerError.INVALID_SESSION_INFO]: AuthErrorCode.INVALID_SESSION_INFO,\n  [ServerError.INVALID_TEMPORARY_PROOF]: AuthErrorCode.INVALID_CREDENTIAL,\n  [ServerError.MISSING_SESSION_INFO]: AuthErrorCode.MISSING_SESSION_INFO,\n  [ServerError.SESSION_EXPIRED]: AuthErrorCode.CODE_EXPIRED,\n\n  // Other action code errors when additional settings passed.\n  // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above.\n  // This is OK as this error will be caught by client side validation.\n  [ServerError.MISSING_ANDROID_PACKAGE_NAME]:\n    AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME,\n  [ServerError.UNAUTHORIZED_DOMAIN]: AuthErrorCode.UNAUTHORIZED_DOMAIN,\n\n  // getProjectConfig errors when clientId is passed.\n  [ServerError.INVALID_OAUTH_CLIENT_ID]: AuthErrorCode.INVALID_OAUTH_CLIENT_ID,\n\n  // User actions (sign-up or deletion) disabled errors.\n  [ServerError.ADMIN_ONLY_OPERATION]: AuthErrorCode.ADMIN_ONLY_OPERATION,\n\n  // Multi factor related errors.\n  [ServerError.INVALID_MFA_PENDING_CREDENTIAL]:\n    AuthErrorCode.INVALID_MFA_SESSION,\n  [ServerError.MFA_ENROLLMENT_NOT_FOUND]: AuthErrorCode.MFA_INFO_NOT_FOUND,\n  [ServerError.MISSING_MFA_ENROLLMENT_ID]: AuthErrorCode.MISSING_MFA_INFO,\n  [ServerError.MISSING_MFA_PENDING_CREDENTIAL]:\n    AuthErrorCode.MISSING_MFA_SESSION,\n  [ServerError.SECOND_FACTOR_EXISTS]:\n    AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED,\n  [ServerError.SECOND_FACTOR_LIMIT_EXCEEDED]:\n    AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED,\n\n  // Blocking functions related errors.\n  [ServerError.BLOCKING_FUNCTION_ERROR_RESPONSE]: AuthErrorCode.INTERNAL_ERROR,\n\n  // Recaptcha related errors.\n  [ServerError.RECAPTCHA_NOT_ENABLED]: AuthErrorCode.RECAPTCHA_NOT_ENABLED,\n  [ServerError.MISSING_RECAPTCHA_TOKEN]: AuthErrorCode.MISSING_RECAPTCHA_TOKEN,\n  [ServerError.INVALID_RECAPTCHA_TOKEN]: AuthErrorCode.INVALID_RECAPTCHA_TOKEN,\n  [ServerError.INVALID_RECAPTCHA_ACTION]:\n    AuthErrorCode.INVALID_RECAPTCHA_ACTION,\n  [ServerError.MISSING_CLIENT_TYPE]: AuthErrorCode.MISSING_CLIENT_TYPE,\n  [ServerError.MISSING_RECAPTCHA_VERSION]:\n    AuthErrorCode.MISSING_RECAPTCHA_VERSION,\n  [ServerError.INVALID_RECAPTCHA_VERSION]:\n    AuthErrorCode.INVALID_RECAPTCHA_VERSION,\n  [ServerError.INVALID_REQ_TYPE]: AuthErrorCode.INVALID_REQ_TYPE\n};\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FirebaseError,\n  isCloudflareWorker,\n  isCloudWorkstation,\n  querystring\n} from '@firebase/util';\n\nimport { AuthErrorCode, NamedErrorParams } from '../core/errors';\nimport {\n  _createError,\n  _errorWithCustomMessage,\n  _fail\n} from '../core/util/assert';\nimport { Delay } from '../core/util/delay';\nimport { _emulatorUrl } from '../core/util/emulator';\nimport { FetchProvider } from '../core/util/fetch_provider';\nimport { Auth } from '../model/public_types';\nimport { AuthInternal, ConfigInternal } from '../model/auth';\nimport { IdTokenResponse, TaggedWithTokenResponse } from '../model/id_token';\nimport { IdTokenMfaResponse } from './authentication/mfa';\nimport { SERVER_ERROR_MAP, ServerError, ServerErrorMap } from './errors';\nimport { PersistenceType } from '../core/persistence';\nimport { CookiePersistence } from '../platform_browser/persistence/cookie_storage';\n\nexport const enum HttpMethod {\n  POST = 'POST',\n  GET = 'GET'\n}\n\nexport const enum HttpHeader {\n  CONTENT_TYPE = 'Content-Type',\n  X_FIREBASE_LOCALE = 'X-Firebase-Locale',\n  X_CLIENT_VERSION = 'X-Client-Version',\n  X_FIREBASE_GMPID = 'X-Firebase-gmpid',\n  X_FIREBASE_CLIENT = 'X-Firebase-Client',\n  X_FIREBASE_APP_CHECK = 'X-Firebase-AppCheck'\n}\n\nexport const enum Endpoint {\n  CREATE_AUTH_URI = '/v1/accounts:createAuthUri',\n  DELETE_ACCOUNT = '/v1/accounts:delete',\n  RESET_PASSWORD = '/v1/accounts:resetPassword',\n  SIGN_UP = '/v1/accounts:signUp',\n  SIGN_IN_WITH_CUSTOM_TOKEN = '/v1/accounts:signInWithCustomToken',\n  SIGN_IN_WITH_EMAIL_LINK = '/v1/accounts:signInWithEmailLink',\n  SIGN_IN_WITH_IDP = '/v1/accounts:signInWithIdp',\n  SIGN_IN_WITH_PASSWORD = '/v1/accounts:signInWithPassword',\n  SIGN_IN_WITH_PHONE_NUMBER = '/v1/accounts:signInWithPhoneNumber',\n  SEND_VERIFICATION_CODE = '/v1/accounts:sendVerificationCode',\n  SEND_OOB_CODE = '/v1/accounts:sendOobCode',\n  SET_ACCOUNT_INFO = '/v1/accounts:update',\n  GET_ACCOUNT_INFO = '/v1/accounts:lookup',\n  GET_RECAPTCHA_PARAM = '/v1/recaptchaParams',\n  START_MFA_ENROLLMENT = '/v2/accounts/mfaEnrollment:start',\n  FINALIZE_MFA_ENROLLMENT = '/v2/accounts/mfaEnrollment:finalize',\n  START_MFA_SIGN_IN = '/v2/accounts/mfaSignIn:start',\n  FINALIZE_MFA_SIGN_IN = '/v2/accounts/mfaSignIn:finalize',\n  WITHDRAW_MFA = '/v2/accounts/mfaEnrollment:withdraw',\n  GET_PROJECT_CONFIG = '/v1/projects',\n  GET_RECAPTCHA_CONFIG = '/v2/recaptchaConfig',\n  GET_PASSWORD_POLICY = '/v2/passwordPolicy',\n  TOKEN = '/v1/token',\n  REVOKE_TOKEN = '/v2/accounts:revokeToken'\n}\n\nconst CookieAuthProxiedEndpoints: string[] = [\n  Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN,\n  Endpoint.SIGN_IN_WITH_EMAIL_LINK,\n  Endpoint.SIGN_IN_WITH_IDP,\n  Endpoint.SIGN_IN_WITH_PASSWORD,\n  Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n  Endpoint.TOKEN\n];\n\nexport const enum RecaptchaClientType {\n  WEB = 'CLIENT_TYPE_WEB',\n  ANDROID = 'CLIENT_TYPE_ANDROID',\n  IOS = 'CLIENT_TYPE_IOS'\n}\n\nexport const enum RecaptchaVersion {\n  ENTERPRISE = 'RECAPTCHA_ENTERPRISE'\n}\n\nexport const enum RecaptchaActionName {\n  SIGN_IN_WITH_PASSWORD = 'signInWithPassword',\n  GET_OOB_CODE = 'getOobCode',\n  SIGN_UP_PASSWORD = 'signUpPassword',\n  SEND_VERIFICATION_CODE = 'sendVerificationCode',\n  MFA_SMS_ENROLLMENT = 'mfaSmsEnrollment',\n  MFA_SMS_SIGNIN = 'mfaSmsSignIn'\n}\n\nexport const enum EnforcementState {\n  ENFORCE = 'ENFORCE',\n  AUDIT = 'AUDIT',\n  OFF = 'OFF',\n  ENFORCEMENT_STATE_UNSPECIFIED = 'ENFORCEMENT_STATE_UNSPECIFIED'\n}\n\n// Providers that have reCAPTCHA Enterprise support.\nexport const enum RecaptchaAuthProvider {\n  EMAIL_PASSWORD_PROVIDER = 'EMAIL_PASSWORD_PROVIDER',\n  PHONE_PROVIDER = 'PHONE_PROVIDER'\n}\n\nexport const DEFAULT_API_TIMEOUT_MS = new Delay(30_000, 60_000);\n\nexport function _addTidIfNecessary<T extends { tenantId?: string }>(\n  auth: Auth,\n  request: T\n): T {\n  if (auth.tenantId && !request.tenantId) {\n    return {\n      ...request,\n      tenantId: auth.tenantId\n    };\n  }\n  return request;\n}\n\nexport async function _performApiRequest<T, V>(\n  auth: Auth,\n  method: HttpMethod,\n  path: Endpoint,\n  request?: T,\n  customErrorMap: Partial<ServerErrorMap<ServerError>> = {}\n): Promise<V> {\n  return _performFetchWithErrorHandling(auth, customErrorMap, async () => {\n    let body = {};\n    let params = {};\n    if (request) {\n      if (method === HttpMethod.GET) {\n        params = request;\n      } else {\n        body = {\n          body: JSON.stringify(request)\n        };\n      }\n    }\n\n    const query = querystring({\n      ...params,\n      key: auth.config.apiKey\n    }).slice(1);\n\n    const headers = await (auth as AuthInternal)._getAdditionalHeaders();\n    headers[HttpHeader.CONTENT_TYPE] = 'application/json';\n\n    if (auth.languageCode) {\n      headers[HttpHeader.X_FIREBASE_LOCALE] = auth.languageCode;\n    }\n\n    const fetchArgs: RequestInit = {\n      method,\n      headers,\n      ...body\n    };\n\n    /* Security-conscious server-side frameworks tend to have built in mitigations for referrer\n       problems\". See the Cloudflare GitHub issue #487: Error: The 'referrerPolicy' field on\n       'RequestInitializerDict' is not implemented.\"\n       https://github.com/cloudflare/next-on-pages/issues/487 */\n    if (!isCloudflareWorker()) {\n      fetchArgs.referrerPolicy = 'strict-origin-when-cross-origin';\n    }\n\n    if (auth.emulatorConfig && isCloudWorkstation(auth.emulatorConfig.host)) {\n      fetchArgs.credentials = 'include';\n    }\n\n    return FetchProvider.fetch()(\n      await _getFinalTarget(auth, auth.config.apiHost, path, query),\n      fetchArgs\n    );\n  });\n}\n\nexport async function _performFetchWithErrorHandling<V>(\n  auth: Auth,\n  customErrorMap: Partial<ServerErrorMap<ServerError>>,\n  fetchFn: () => Promise<Response>\n): Promise<V> {\n  (auth as AuthInternal)._canInitEmulator = false;\n  const errorMap = { ...SERVER_ERROR_MAP, ...customErrorMap };\n  try {\n    const networkTimeout = new NetworkTimeout<Response>(auth);\n    const response: Response = await Promise.race<Promise<Response>>([\n      fetchFn(),\n      networkTimeout.promise\n    ]);\n\n    // If we've reached this point, the fetch succeeded and the networkTimeout\n    // didn't throw; clear the network timeout delay so that Node won't hang\n    networkTimeout.clearNetworkTimeout();\n\n    const json = await response.json();\n    if ('needConfirmation' in json) {\n      throw _makeTaggedError(auth, AuthErrorCode.NEED_CONFIRMATION, json);\n    }\n\n    if (response.ok && !('errorMessage' in json)) {\n      return json;\n    } else {\n      const errorMessage = response.ok ? json.errorMessage : json.error.message;\n      const [serverErrorCode, serverErrorMessage] = errorMessage.split(' : ');\n      if (serverErrorCode === ServerError.FEDERATED_USER_ID_ALREADY_LINKED) {\n        throw _makeTaggedError(\n          auth,\n          AuthErrorCode.CREDENTIAL_ALREADY_IN_USE,\n          json\n        );\n      } else if (serverErrorCode === ServerError.EMAIL_EXISTS) {\n        throw _makeTaggedError(auth, AuthErrorCode.EMAIL_EXISTS, json);\n      } else if (serverErrorCode === ServerError.USER_DISABLED) {\n        throw _makeTaggedError(auth, AuthErrorCode.USER_DISABLED, json);\n      }\n      const authError =\n        errorMap[serverErrorCode as ServerError] ||\n        (serverErrorCode\n          .toLowerCase()\n          .replace(/[_\\s]+/g, '-') as unknown as AuthErrorCode);\n      if (serverErrorMessage) {\n        throw _errorWithCustomMessage(auth, authError, serverErrorMessage);\n      } else {\n        _fail(auth, authError);\n      }\n    }\n  } catch (e) {\n    if (e instanceof FirebaseError) {\n      throw e;\n    }\n    // Changing this to a different error code will log user out when there is a network error\n    // because we treat any error other than NETWORK_REQUEST_FAILED as token is invalid.\n    // https://github.com/firebase/firebase-js-sdk/blob/4fbc73610d70be4e0852e7de63a39cb7897e8546/packages/auth/src/core/auth/auth_impl.ts#L309-L316\n    _fail(auth, AuthErrorCode.NETWORK_REQUEST_FAILED, { 'message': String(e) });\n  }\n}\n\nexport async function _performSignInRequest<T, V extends IdTokenResponse>(\n  auth: Auth,\n  method: HttpMethod,\n  path: Endpoint,\n  request?: T,\n  customErrorMap: Partial<ServerErrorMap<ServerError>> = {}\n): Promise<V> {\n  const serverResponse = await _performApiRequest<T, V | IdTokenMfaResponse>(\n    auth,\n    method,\n    path,\n    request,\n    customErrorMap\n  );\n  if ('mfaPendingCredential' in serverResponse) {\n    _fail(auth, AuthErrorCode.MFA_REQUIRED, {\n      _serverResponse: serverResponse\n    });\n  }\n\n  return serverResponse as V;\n}\n\nexport async function _getFinalTarget(\n  auth: Auth,\n  host: string,\n  path: string,\n  query: string\n): Promise<string> {\n  const base = `${host}${path}?${query}`;\n\n  const authInternal = auth as AuthInternal;\n  const finalTarget = authInternal.config.emulator\n    ? _emulatorUrl(auth.config as ConfigInternal, base)\n    : `${auth.config.apiScheme}://${base}`;\n\n  // Cookie auth works by MiTMing the signIn and token endpoints from the developer's backend,\n  // saving the idToken and refreshToken into cookies, and then redacting the refreshToken\n  // from the response\n  if (CookieAuthProxiedEndpoints.includes(path)) {\n    // Persistence manager is async, we need to await it. We can't just wait for auth initialized\n    // here since auth initialization calls this function.\n    await authInternal._persistenceManagerAvailable;\n    if (authInternal._getPersistenceType() === PersistenceType.COOKIE) {\n      const cookiePersistence =\n        authInternal._getPersistence() as CookiePersistence;\n      return cookiePersistence._getFinalTarget(finalTarget).toString();\n    }\n  }\n\n  return finalTarget;\n}\n\nexport function _parseEnforcementState(\n  enforcementStateStr: string\n): EnforcementState {\n  switch (enforcementStateStr) {\n    case 'ENFORCE':\n      return EnforcementState.ENFORCE;\n    case 'AUDIT':\n      return EnforcementState.AUDIT;\n    case 'OFF':\n      return EnforcementState.OFF;\n    default:\n      return EnforcementState.ENFORCEMENT_STATE_UNSPECIFIED;\n  }\n}\n\nclass NetworkTimeout<T> {\n  // Node timers and browser timers are fundamentally incompatible, but we\n  // don't care about the value here\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private timer: any | null = null;\n  readonly promise = new Promise<T>((_, reject) => {\n    this.timer = setTimeout(() => {\n      return reject(\n        _createError(this.auth, AuthErrorCode.NETWORK_REQUEST_FAILED)\n      );\n    }, DEFAULT_API_TIMEOUT_MS.get());\n  });\n\n  clearNetworkTimeout(): void {\n    clearTimeout(this.timer);\n  }\n\n  constructor(private readonly auth: Auth) {}\n}\n\ninterface PotentialResponse extends IdTokenResponse {\n  email?: string;\n  phoneNumber?: string;\n}\n\nexport function _makeTaggedError(\n  auth: Auth,\n  code: AuthErrorCode,\n  response: PotentialResponse\n): FirebaseError {\n  const errorParams: NamedErrorParams = {\n    appName: auth.name\n  };\n\n  if (response.email) {\n    errorParams.email = response.email;\n  }\n  if (response.phoneNumber) {\n    errorParams.phoneNumber = response.phoneNumber;\n  }\n\n  const error = _createError(auth, code, errorParams);\n\n  // We know customData is defined on error because errorParams is defined\n  (error.customData! as TaggedWithTokenResponse)._tokenResponse = response;\n  return error;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMobileCordova, isReactNative } from '@firebase/util';\nimport { _isOnline } from './navigator';\nimport { debugAssert } from './assert';\n\nexport const enum DelayMin {\n  OFFLINE = 5000\n}\n\n/**\n * A structure to help pick between a range of long and short delay durations\n * depending on the current environment. In general, the long delay is used for\n * mobile environments whereas short delays are used for desktop environments.\n */\nexport class Delay {\n  // The default value for the offline delay timeout in ms.\n\n  private readonly isMobile: boolean;\n  constructor(\n    private readonly shortDelay: number,\n    private readonly longDelay: number\n  ) {\n    // Internal error when improperly initialized.\n    debugAssert(\n      longDelay > shortDelay,\n      'Short delay should be less than long delay!'\n    );\n    this.isMobile = isMobileCordova() || isReactNative();\n  }\n\n  get(): number {\n    if (!_isOnline()) {\n      // Pick the shorter timeout.\n      return Math.min(DelayMin.OFFLINE, this.shortDelay);\n    }\n    // If running in a mobile environment, return the long delay, otherwise\n    // return the short delay.\n    // This could be improved in the future to dynamically change based on other\n    // variables instead of just reading the current environment.\n    return this.isMobile ? this.longDelay : this.shortDelay;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigInternal } from '../../model/auth';\nimport { debugAssert } from './assert';\n\nexport function _emulatorUrl(config: ConfigInternal, path?: string): string {\n  debugAssert(config.emulator, 'Emulator should always be set here');\n  const { url } = config.emulator;\n\n  if (!path) {\n    return url;\n  }\n\n  return `${url}${path.startsWith('/') ? path.slice(1) : path}`;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RecaptchaParameters } from '../../model/public_types';\nimport {\n  GetRecaptchaConfigResponse,\n  RecaptchaEnforcementProviderState\n} from '../../api/authentication/recaptcha';\nimport {\n  EnforcementState,\n  RecaptchaAuthProvider,\n  _parseEnforcementState\n} from '../../api/index';\n\n// reCAPTCHA v2 interface\nexport interface Recaptcha {\n  render: (container: HTMLElement, parameters: RecaptchaParameters) => number;\n  getResponse: (id: number) => string;\n  execute: (id: number) => unknown;\n  reset: (id: number) => unknown;\n}\n\nexport function isV2(\n  grecaptcha: Recaptcha | GreCAPTCHA | undefined\n): grecaptcha is Recaptcha {\n  return (\n    grecaptcha !== undefined &&\n    (grecaptcha as Recaptcha).getResponse !== undefined\n  );\n}\n\n// reCAPTCHA Enterprise & v3 shared interface\nexport interface GreCAPTCHATopLevel extends GreCAPTCHA {\n  enterprise: GreCAPTCHA;\n}\n\n// reCAPTCHA Enterprise interface\nexport interface GreCAPTCHA {\n  ready: (callback: () => void) => void;\n  execute: (siteKey: string, options: { action: string }) => Promise<string>;\n  render: (\n    container: string | HTMLElement,\n    parameters: GreCAPTCHARenderOption\n  ) => string;\n}\n\nexport interface GreCAPTCHARenderOption {\n  sitekey: string;\n  size: 'invisible';\n}\n\nexport function isEnterprise(\n  grecaptcha: Recaptcha | GreCAPTCHA | undefined\n): grecaptcha is GreCAPTCHATopLevel {\n  return (\n    grecaptcha !== undefined &&\n    (grecaptcha as GreCAPTCHATopLevel).enterprise !== undefined\n  );\n}\n\n// TODO(chuanr): Replace this with the AuthWindow after resolving the dependency issue in Node.js env.\ndeclare global {\n  interface Window {\n    grecaptcha?: Recaptcha | GreCAPTCHATopLevel;\n  }\n}\n\nexport class RecaptchaConfig {\n  /**\n   * The reCAPTCHA site key.\n   */\n  siteKey: string = '';\n\n  /**\n   * The list of providers and their enablement status for reCAPTCHA Enterprise.\n   */\n  recaptchaEnforcementState: RecaptchaEnforcementProviderState[] = [];\n\n  constructor(response: GetRecaptchaConfigResponse) {\n    if (response.recaptchaKey === undefined) {\n      throw new Error('recaptchaKey undefined');\n    }\n    // Example response.recaptchaKey: \"projects/proj123/keys/sitekey123\"\n    this.siteKey = response.recaptchaKey.split('/')[3];\n    this.recaptchaEnforcementState = response.recaptchaEnforcementState;\n  }\n\n  /**\n   * Returns the reCAPTCHA Enterprise enforcement state for the given provider.\n   *\n   * @param providerStr - The provider whose enforcement state is to be returned.\n   * @returns The reCAPTCHA Enterprise enforcement state for the given provider.\n   */\n  getProviderEnforcementState(providerStr: string): EnforcementState | null {\n    if (\n      !this.recaptchaEnforcementState ||\n      this.recaptchaEnforcementState.length === 0\n    ) {\n      return null;\n    }\n\n    for (const recaptchaEnforcementState of this.recaptchaEnforcementState) {\n      if (\n        recaptchaEnforcementState.provider &&\n        recaptchaEnforcementState.provider === providerStr\n      ) {\n        return _parseEnforcementState(\n          recaptchaEnforcementState.enforcementState\n        );\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Returns true if the reCAPTCHA Enterprise enforcement state for the provider is set to ENFORCE or AUDIT.\n   *\n   * @param providerStr - The provider whose enablement state is to be returned.\n   * @returns Whether or not reCAPTCHA Enterprise protection is enabled for the given provider.\n   */\n  isProviderEnabled(providerStr: string): boolean {\n    return (\n      this.getProviderEnforcementState(providerStr) ===\n        EnforcementState.ENFORCE ||\n      this.getProviderEnforcementState(providerStr) === EnforcementState.AUDIT\n    );\n  }\n\n  /**\n   * Returns true if reCAPTCHA Enterprise protection is enabled in at least one provider, otherwise\n   * returns false.\n   *\n   * @returns Whether or not reCAPTCHA Enterprise protection is enabled for at least one provider.\n   */\n  isAnyProviderEnabled(): boolean {\n    return (\n      this.isProviderEnabled(RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER) ||\n      this.isProviderEnabled(RecaptchaAuthProvider.PHONE_PROVIDER)\n    );\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _performApiRequest,\n  _addTidIfNecessary\n} from '../index';\nimport { Auth } from '../../model/public_types';\n\ninterface GetRecaptchaParamResponse {\n  recaptchaSiteKey?: string;\n}\n\nexport async function getRecaptchaParams(auth: Auth): Promise<string> {\n  return (\n    (\n      await _performApiRequest<void, GetRecaptchaParamResponse>(\n        auth,\n        HttpMethod.GET,\n        Endpoint.GET_RECAPTCHA_PARAM\n      )\n    ).recaptchaSiteKey || ''\n  );\n}\n\n// The following functions are for reCAPTCHA enterprise integration.\ninterface GetRecaptchaConfigRequest {\n  tenantId?: string;\n  clientType?: RecaptchaClientType;\n  version?: RecaptchaVersion;\n}\n\nexport interface RecaptchaEnforcementProviderState {\n  provider: string;\n  enforcementState: string;\n}\n\nexport interface GetRecaptchaConfigResponse {\n  recaptchaKey: string;\n  recaptchaEnforcementState: RecaptchaEnforcementProviderState[];\n}\n\nexport async function getRecaptchaConfig(\n  auth: Auth,\n  request: GetRecaptchaConfigRequest\n): Promise<GetRecaptchaConfigResponse> {\n  return _performApiRequest<\n    GetRecaptchaConfigRequest,\n    GetRecaptchaConfigResponse\n  >(\n    auth,\n    HttpMethod.GET,\n    Endpoint.GET_RECAPTCHA_CONFIG,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { MfaEnrollment } from './mfa';\nimport { Auth } from '../../model/public_types';\n\nexport interface DeleteAccountRequest {\n  idToken: string;\n}\n\nexport async function deleteAccount(\n  auth: Auth,\n  request: DeleteAccountRequest\n): Promise<void> {\n  return _performApiRequest<DeleteAccountRequest, void>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.DELETE_ACCOUNT,\n    request\n  );\n}\n\nexport interface ProviderUserInfo {\n  providerId: string;\n  rawId?: string;\n  email?: string;\n  displayName?: string;\n  photoUrl?: string;\n  phoneNumber?: string;\n}\n\nexport interface DeleteLinkedAccountsRequest {\n  idToken: string;\n  deleteProvider: string[];\n}\n\nexport interface DeleteLinkedAccountsResponse {\n  providerUserInfo: ProviderUserInfo[];\n}\n\nexport async function deleteLinkedAccounts(\n  auth: Auth,\n  request: DeleteLinkedAccountsRequest\n): Promise<DeleteLinkedAccountsResponse> {\n  return _performApiRequest<\n    DeleteLinkedAccountsRequest,\n    DeleteLinkedAccountsResponse\n  >(auth, HttpMethod.POST, Endpoint.SET_ACCOUNT_INFO, request);\n}\n\nexport interface APIUserInfo {\n  localId?: string;\n  displayName?: string;\n  photoUrl?: string;\n  email?: string;\n  emailVerified?: boolean;\n  phoneNumber?: string;\n  lastLoginAt?: number;\n  createdAt?: number;\n  tenantId?: string;\n  passwordHash?: string;\n  providerUserInfo?: ProviderUserInfo[];\n  mfaInfo?: MfaEnrollment[];\n}\n\nexport interface GetAccountInfoRequest {\n  idToken: string;\n}\n\nexport interface GetAccountInfoResponse {\n  users: APIUserInfo[];\n}\n\nexport async function getAccountInfo(\n  auth: Auth,\n  request: GetAccountInfoRequest\n): Promise<GetAccountInfoResponse> {\n  return _performApiRequest<GetAccountInfoRequest, GetAccountInfoResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.GET_ACCOUNT_INFO,\n    request\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function utcTimestampToDateString(\n  utcTimestamp?: string | number\n): string | undefined {\n  if (!utcTimestamp) {\n    return undefined;\n  }\n  try {\n    // Convert to date object.\n    const date = new Date(Number(utcTimestamp));\n    // Test date is valid.\n    if (!isNaN(date.getTime())) {\n      // Convert to UTC date string.\n      return date.toUTCString();\n    }\n  } catch (e) {\n    // Do nothing. undefined will be returned.\n  }\n  return undefined;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IdTokenResult, ParsedToken, User } from '../../model/public_types';\nimport { base64Decode, getModularInstance } from '@firebase/util';\n\nimport { UserInternal } from '../../model/user';\nimport { _assert } from '../util/assert';\nimport { _logError } from '../util/log';\nimport { utcTimestampToDateString } from '../util/time';\nimport { AuthErrorCode } from '../errors';\n\n/**\n * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service.\n *\n * @remarks\n * Returns the current token if it has not expired or if it will not expire in the next five\n * minutes. Otherwise, this will refresh the token and return a new one.\n *\n * @param user - The user.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nexport function getIdToken(user: User, forceRefresh = false): Promise<string> {\n  return getModularInstance(user).getIdToken(forceRefresh);\n}\n\n/**\n * Returns a deserialized JSON Web Token (JWT) used to identify the user to a Firebase service.\n *\n * @remarks\n * Returns the current token if it has not expired or if it will not expire in the next five\n * minutes. Otherwise, this will refresh the token and return a new one.\n *\n * @param user - The user.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nexport async function getIdTokenResult(\n  user: User,\n  forceRefresh = false\n): Promise<IdTokenResult> {\n  const userInternal = getModularInstance(user) as UserInternal;\n  const token = await userInternal.getIdToken(forceRefresh);\n  const claims = _parseToken(token);\n\n  _assert(\n    claims && claims.exp && claims.auth_time && claims.iat,\n    userInternal.auth,\n    AuthErrorCode.INTERNAL_ERROR\n  );\n  const firebase =\n    typeof claims.firebase === 'object' ? claims.firebase : undefined;\n\n  const signInProvider: string | undefined = firebase?.['sign_in_provider'];\n\n  return {\n    claims,\n    token,\n    authTime: utcTimestampToDateString(\n      secondsStringToMilliseconds(claims.auth_time)\n    )!,\n    issuedAtTime: utcTimestampToDateString(\n      secondsStringToMilliseconds(claims.iat)\n    )!,\n    expirationTime: utcTimestampToDateString(\n      secondsStringToMilliseconds(claims.exp)\n    )!,\n    signInProvider: signInProvider || null,\n    signInSecondFactor: firebase?.['sign_in_second_factor'] || null\n  };\n}\n\nfunction secondsStringToMilliseconds(seconds: string): number {\n  return Number(seconds) * 1000;\n}\n\nexport function _parseToken(token: string): ParsedToken | null {\n  const [algorithm, payload, signature] = token.split('.');\n  if (\n    algorithm === undefined ||\n    payload === undefined ||\n    signature === undefined\n  ) {\n    _logError('JWT malformed, contained fewer than 3 sections');\n    return null;\n  }\n\n  try {\n    const decoded = base64Decode(payload);\n    if (!decoded) {\n      _logError('Failed to decode base64 JWT payload');\n      return null;\n    }\n    return JSON.parse(decoded);\n  } catch (e) {\n    _logError(\n      'Caught error parsing JWT payload as JSON',\n      (e as Error)?.toString()\n    );\n    return null;\n  }\n}\n\n/**\n * Extract expiresIn TTL from a token by subtracting the expiration from the issuance.\n */\nexport function _tokenExpiresIn(token: string): number {\n  const parsedToken = _parseToken(token);\n  _assert(parsedToken, AuthErrorCode.INTERNAL_ERROR);\n  _assert(typeof parsedToken.exp !== 'undefined', AuthErrorCode.INTERNAL_ERROR);\n  _assert(typeof parsedToken.iat !== 'undefined', AuthErrorCode.INTERNAL_ERROR);\n  return Number(parsedToken.exp) - Number(parsedToken.iat);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\n\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\n\nexport async function _logoutIfInvalidated<T>(\n  user: UserInternal,\n  promise: Promise<T>,\n  bypassAuthState = false\n): Promise<T> {\n  if (bypassAuthState) {\n    return promise;\n  }\n  try {\n    return await promise;\n  } catch (e) {\n    if (e instanceof FirebaseError && isUserInvalidated(e)) {\n      if (user.auth.currentUser === user) {\n        await user.auth.signOut();\n      }\n    }\n\n    throw e;\n  }\n}\n\nfunction isUserInvalidated({ code }: FirebaseError): boolean {\n  return (\n    code === `auth/${AuthErrorCode.USER_DISABLED}` ||\n    code === `auth/${AuthErrorCode.TOKEN_EXPIRED}`\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\n\n// Refresh the token five minutes before expiration\nexport const enum Duration {\n  OFFSET = 5 * 1000 * 60,\n  RETRY_BACKOFF_MIN = 30 * 1000,\n  RETRY_BACKOFF_MAX = 16 * 60 * 1000\n}\n\nexport class ProactiveRefresh {\n  private isRunning = false;\n\n  // Node timers and browser timers return fundamentally different types.\n  // We don't actually care what the value is but TS won't accept unknown and\n  // we can't cast properly in both environments.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private timerId: any | null = null;\n  private errorBackoff = Duration.RETRY_BACKOFF_MIN;\n\n  constructor(private readonly user: UserInternal) {}\n\n  _start(): void {\n    if (this.isRunning) {\n      return;\n    }\n\n    this.isRunning = true;\n    this.schedule();\n  }\n\n  _stop(): void {\n    if (!this.isRunning) {\n      return;\n    }\n\n    this.isRunning = false;\n    if (this.timerId !== null) {\n      clearTimeout(this.timerId);\n    }\n  }\n\n  private getInterval(wasError: boolean): number {\n    if (wasError) {\n      const interval = this.errorBackoff;\n      this.errorBackoff = Math.min(\n        this.errorBackoff * 2,\n        Duration.RETRY_BACKOFF_MAX\n      );\n      return interval;\n    } else {\n      // Reset the error backoff\n      this.errorBackoff = Duration.RETRY_BACKOFF_MIN;\n      const expTime = this.user.stsTokenManager.expirationTime ?? 0;\n      const interval = expTime - Date.now() - Duration.OFFSET;\n\n      return Math.max(0, interval);\n    }\n  }\n\n  private schedule(wasError = false): void {\n    if (!this.isRunning) {\n      // Just in case...\n      return;\n    }\n\n    const interval = this.getInterval(wasError);\n    this.timerId = setTimeout(async () => {\n      await this.iteration();\n    }, interval);\n  }\n\n  private async iteration(): Promise<void> {\n    try {\n      await this.user.getIdToken(true);\n    } catch (e) {\n      // Only retry on network errors\n      if (\n        (e as FirebaseError)?.code ===\n        `auth/${AuthErrorCode.NETWORK_REQUEST_FAILED}`\n      ) {\n        this.schedule(/* wasError */ true);\n      }\n\n      return;\n    }\n    this.schedule();\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserMetadata as UserMetadataType } from '../../model/public_types';\n\nimport { utcTimestampToDateString } from '../util/time';\n\nexport class UserMetadata implements UserMetadataType {\n  creationTime?: string;\n  lastSignInTime?: string;\n\n  constructor(\n    private createdAt?: string | number,\n    private lastLoginAt?: string | number\n  ) {\n    this._initializeTime();\n  }\n\n  private _initializeTime(): void {\n    this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt);\n    this.creationTime = utcTimestampToDateString(this.createdAt);\n  }\n\n  _copy(metadata: UserMetadata): void {\n    this.createdAt = metadata.createdAt;\n    this.lastLoginAt = metadata.lastLoginAt;\n    this._initializeTime();\n  }\n\n  toJSON(): object {\n    return {\n      createdAt: this.createdAt,\n      lastLoginAt: this.lastLoginAt\n    };\n  }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User, UserInfo } from '../../model/public_types';\n\nimport {\n  getAccountInfo,\n  ProviderUserInfo\n} from '../../api/account_management/account';\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { UserMetadata } from './user_metadata';\nimport { getModularInstance } from '@firebase/util';\n\nexport async function _reloadWithoutSaving(user: UserInternal): Promise<void> {\n  const auth = user.auth;\n  const idToken = await user.getIdToken();\n  const response = await _logoutIfInvalidated(\n    user,\n    getAccountInfo(auth, { idToken })\n  );\n\n  _assert(response?.users.length, auth, AuthErrorCode.INTERNAL_ERROR);\n\n  const coreAccount = response.users[0];\n\n  user._notifyReloadListener(coreAccount);\n\n  const newProviderData = coreAccount.providerUserInfo?.length\n    ? extractProviderData(coreAccount.providerUserInfo)\n    : [];\n\n  const providerData = mergeProviderData(user.providerData, newProviderData);\n\n  // Preserves the non-nonymous status of the stored user, even if no more\n  // credentials (federated or email/password) are linked to the user. If\n  // the user was previously anonymous, then use provider data to update.\n  // On the other hand, if it was not anonymous before, it should never be\n  // considered anonymous now.\n  const oldIsAnonymous = user.isAnonymous;\n  const newIsAnonymous =\n    !(user.email && coreAccount.passwordHash) && !providerData?.length;\n  const isAnonymous = !oldIsAnonymous ? false : newIsAnonymous;\n\n  const updates: Partial<UserInternal> = {\n    uid: coreAccount.localId,\n    displayName: coreAccount.displayName || null,\n    photoURL: coreAccount.photoUrl || null,\n    email: coreAccount.email || null,\n    emailVerified: coreAccount.emailVerified || false,\n    phoneNumber: coreAccount.phoneNumber || null,\n    tenantId: coreAccount.tenantId || null,\n    providerData,\n    metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\n    isAnonymous\n  };\n\n  Object.assign(user, updates);\n}\n\n/**\n * Reloads user account data, if signed in.\n *\n * @param user - The user.\n *\n * @public\n */\nexport async function reload(user: User): Promise<void> {\n  const userInternal: UserInternal = getModularInstance(user) as UserInternal;\n  await _reloadWithoutSaving(userInternal);\n\n  // Even though the current user hasn't changed, update\n  // current user will trigger a persistence update w/ the\n  // new info.\n  await userInternal.auth._persistUserIfCurrent(userInternal);\n  userInternal.auth._notifyListenersIfCurrent(userInternal);\n}\n\nfunction mergeProviderData(\n  original: UserInfo[],\n  newData: UserInfo[]\n): UserInfo[] {\n  const deduped = original.filter(\n    o => !newData.some(n => n.providerId === o.providerId)\n  );\n  return [...deduped, ...newData];\n}\n\nexport function extractProviderData(providers: ProviderUserInfo[]): UserInfo[] {\n  return providers.map(({ providerId, ...provider }) => {\n    return {\n      providerId,\n      uid: provider.rawId || '',\n      displayName: provider.displayName || null,\n      email: provider.email || null,\n      phoneNumber: provider.phoneNumber || null,\n      photoURL: provider.photoUrl || null\n    };\n  });\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FinalizeMfaResponse } from '../../api/authentication/mfa';\nimport { requestStsToken } from '../../api/authentication/token';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { PersistedBlob } from '../persistence';\nimport { _assert, debugFail } from '../util/assert';\nimport { _tokenExpiresIn } from './id_token_result';\n\n/**\n * The number of milliseconds before the official expiration time of a token\n * to refresh that token, to provide a buffer for RPCs to complete.\n */\nexport const enum Buffer {\n  TOKEN_REFRESH = 30_000\n}\n\n/**\n * We need to mark this class as internal explicitly to exclude it in the public typings, because\n * it references AuthInternal which has a circular dependency with UserInternal.\n *\n * @internal\n */\nexport class StsTokenManager {\n  refreshToken: string | null = null;\n  accessToken: string | null = null;\n  expirationTime: number | null = null;\n\n  get isExpired(): boolean {\n    return (\n      !this.expirationTime ||\n      Date.now() > this.expirationTime - Buffer.TOKEN_REFRESH\n    );\n  }\n\n  updateFromServerResponse(\n    response: IdTokenResponse | FinalizeMfaResponse\n  ): void {\n    _assert(response.idToken, AuthErrorCode.INTERNAL_ERROR);\n    _assert(\n      typeof response.idToken !== 'undefined',\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    _assert(\n      typeof response.refreshToken !== 'undefined',\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    const expiresIn =\n      'expiresIn' in response && typeof response.expiresIn !== 'undefined'\n        ? Number(response.expiresIn)\n        : _tokenExpiresIn(response.idToken);\n    this.updateTokensAndExpiration(\n      response.idToken,\n      response.refreshToken,\n      expiresIn\n    );\n  }\n\n  updateFromIdToken(idToken: string): void {\n    _assert(idToken.length !== 0, AuthErrorCode.INTERNAL_ERROR);\n    const expiresIn = _tokenExpiresIn(idToken);\n    this.updateTokensAndExpiration(idToken, null, expiresIn);\n  }\n\n  async getToken(\n    auth: AuthInternal,\n    forceRefresh = false\n  ): Promise<string | null> {\n    if (!forceRefresh && this.accessToken && !this.isExpired) {\n      return this.accessToken;\n    }\n\n    _assert(this.refreshToken, auth, AuthErrorCode.TOKEN_EXPIRED);\n\n    if (this.refreshToken) {\n      await this.refresh(auth, this.refreshToken!);\n      return this.accessToken;\n    }\n\n    return null;\n  }\n\n  clearRefreshToken(): void {\n    this.refreshToken = null;\n  }\n\n  private async refresh(auth: AuthInternal, oldToken: string): Promise<void> {\n    const { accessToken, refreshToken, expiresIn } = await requestStsToken(\n      auth,\n      oldToken\n    );\n    this.updateTokensAndExpiration(\n      accessToken,\n      refreshToken,\n      Number(expiresIn)\n    );\n  }\n\n  private updateTokensAndExpiration(\n    accessToken: string,\n    refreshToken: string | null,\n    expiresInSec: number\n  ): void {\n    this.refreshToken = refreshToken || null;\n    this.accessToken = accessToken || null;\n    this.expirationTime = Date.now() + expiresInSec * 1000;\n  }\n\n  static fromJSON(appName: string, object: PersistedBlob): StsTokenManager {\n    const { refreshToken, accessToken, expirationTime } = object;\n\n    const manager = new StsTokenManager();\n    if (refreshToken) {\n      _assert(typeof refreshToken === 'string', AuthErrorCode.INTERNAL_ERROR, {\n        appName\n      });\n      manager.refreshToken = refreshToken;\n    }\n    if (accessToken) {\n      _assert(typeof accessToken === 'string', AuthErrorCode.INTERNAL_ERROR, {\n        appName\n      });\n      manager.accessToken = accessToken;\n    }\n    if (expirationTime) {\n      _assert(\n        typeof expirationTime === 'number',\n        AuthErrorCode.INTERNAL_ERROR,\n        {\n          appName\n        }\n      );\n      manager.expirationTime = expirationTime;\n    }\n    return manager;\n  }\n\n  toJSON(): object {\n    return {\n      refreshToken: this.refreshToken,\n      accessToken: this.accessToken,\n      expirationTime: this.expirationTime\n    };\n  }\n\n  _assign(stsTokenManager: StsTokenManager): void {\n    this.accessToken = stsTokenManager.accessToken;\n    this.refreshToken = stsTokenManager.refreshToken;\n    this.expirationTime = stsTokenManager.expirationTime;\n  }\n\n  _clone(): StsTokenManager {\n    return Object.assign(new StsTokenManager(), this.toJSON());\n  }\n\n  _performRefresh(): never {\n    return debugFail('not implemented');\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable camelcase */\n\nimport { isCloudWorkstation, querystring } from '@firebase/util';\n\nimport {\n  _getFinalTarget,\n  _performFetchWithErrorHandling,\n  _performApiRequest,\n  _addTidIfNecessary,\n  HttpMethod,\n  HttpHeader,\n  Endpoint\n} from '../index';\nimport { FetchProvider } from '../../core/util/fetch_provider';\nimport { Auth } from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\n\nexport const enum TokenType {\n  REFRESH_TOKEN = 'REFRESH_TOKEN',\n  ACCESS_TOKEN = 'ACCESS_TOKEN'\n}\n\n/** The server responses with snake_case; we convert to camelCase */\ninterface RequestStsTokenServerResponse {\n  access_token: string;\n  expires_in: string;\n  refresh_token: string;\n}\n\nexport interface RequestStsTokenResponse {\n  accessToken: string;\n  expiresIn: string;\n  refreshToken: string;\n}\n\nexport interface RevokeTokenRequest {\n  providerId: string;\n  tokenType: TokenType;\n  token: string;\n  idToken: string;\n  tenantId?: string;\n}\n\nexport interface RevokeTokenResponse {}\n\nexport async function requestStsToken(\n  auth: Auth,\n  refreshToken: string\n): Promise<RequestStsTokenResponse> {\n  const response =\n    await _performFetchWithErrorHandling<RequestStsTokenServerResponse>(\n      auth,\n      {},\n      async () => {\n        const body = querystring({\n          'grant_type': 'refresh_token',\n          'refresh_token': refreshToken\n        }).slice(1);\n        const { tokenApiHost, apiKey } = auth.config;\n        const url = await _getFinalTarget(\n          auth,\n          tokenApiHost,\n          Endpoint.TOKEN,\n          `key=${apiKey}`\n        );\n\n        const headers = await (auth as AuthInternal)._getAdditionalHeaders();\n        headers[HttpHeader.CONTENT_TYPE] = 'application/x-www-form-urlencoded';\n\n        const options: RequestInit = {\n          method: HttpMethod.POST,\n          headers,\n          body\n        };\n        if (\n          auth.emulatorConfig &&\n          isCloudWorkstation(auth.emulatorConfig.host)\n        ) {\n          options.credentials = 'include';\n        }\n        return FetchProvider.fetch()(url, options);\n      }\n    );\n\n  // The response comes back in snake_case. Convert to camel:\n  return {\n    accessToken: response.access_token,\n    expiresIn: response.expires_in,\n    refreshToken: response.refresh_token\n  };\n}\n\nexport async function revokeToken(\n  auth: Auth,\n  request: RevokeTokenRequest\n): Promise<RevokeTokenResponse> {\n  return _performApiRequest<RevokeTokenRequest, RevokeTokenResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.REVOKE_TOKEN,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IdTokenResult, UserInfo } from '../../model/public_types';\nimport { NextFn } from '@firebase/util';\nimport {\n  APIUserInfo,\n  GetAccountInfoResponse,\n  deleteAccount\n} from '../../api/account_management/account';\nimport { FinalizeMfaResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport {\n  MutableUserInfo,\n  UserInternal,\n  UserParameters\n} from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { PersistedBlob } from '../persistence';\nimport {\n  _assert,\n  _serverAppCurrentUserOperationNotSupportedError\n} from '../util/assert';\nimport { getIdTokenResult } from './id_token_result';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { ProactiveRefresh } from './proactive_refresh';\nimport { extractProviderData, _reloadWithoutSaving, reload } from './reload';\nimport { StsTokenManager } from './token_manager';\nimport { UserMetadata } from './user_metadata';\nimport { ProviderId } from '../../model/enums';\nimport { _isFirebaseServerApp } from '@firebase/app';\n\nfunction assertStringOrUndefined(\n  assertion: unknown,\n  appName: string\n): asserts assertion is string | undefined {\n  _assert(\n    typeof assertion === 'string' || typeof assertion === 'undefined',\n    AuthErrorCode.INTERNAL_ERROR,\n    { appName }\n  );\n}\n\nexport class UserImpl implements UserInternal {\n  // For the user object, provider is always Firebase.\n  readonly providerId = ProviderId.FIREBASE;\n  stsTokenManager: StsTokenManager;\n  // Last known accessToken so we know when it changes\n  private accessToken: string | null;\n\n  uid: string;\n  auth: AuthInternal;\n  emailVerified: boolean;\n  isAnonymous: boolean;\n  tenantId: string | null;\n  readonly metadata: UserMetadata;\n  providerData: MutableUserInfo[];\n\n  // Optional fields from UserInfo\n  displayName: string | null;\n  email: string | null;\n  phoneNumber: string | null;\n  photoURL: string | null;\n\n  _redirectEventId?: string;\n  private readonly proactiveRefresh = new ProactiveRefresh(this);\n\n  constructor({ uid, auth, stsTokenManager, ...opt }: UserParameters) {\n    this.uid = uid;\n    this.auth = auth;\n    this.stsTokenManager = stsTokenManager;\n    this.accessToken = stsTokenManager.accessToken;\n    this.displayName = opt.displayName || null;\n    this.email = opt.email || null;\n    this.emailVerified = opt.emailVerified || false;\n    this.phoneNumber = opt.phoneNumber || null;\n    this.photoURL = opt.photoURL || null;\n    this.isAnonymous = opt.isAnonymous || false;\n    this.tenantId = opt.tenantId || null;\n    this.providerData = opt.providerData ? [...opt.providerData] : [];\n    this.metadata = new UserMetadata(\n      opt.createdAt || undefined,\n      opt.lastLoginAt || undefined\n    );\n  }\n\n  async getIdToken(forceRefresh?: boolean): Promise<string> {\n    const accessToken = await _logoutIfInvalidated(\n      this,\n      this.stsTokenManager.getToken(this.auth, forceRefresh)\n    );\n    _assert(accessToken, this.auth, AuthErrorCode.INTERNAL_ERROR);\n\n    if (this.accessToken !== accessToken) {\n      this.accessToken = accessToken;\n      await this.auth._persistUserIfCurrent(this);\n      this.auth._notifyListenersIfCurrent(this);\n    }\n\n    return accessToken;\n  }\n\n  getIdTokenResult(forceRefresh?: boolean): Promise<IdTokenResult> {\n    return getIdTokenResult(this, forceRefresh);\n  }\n\n  reload(): Promise<void> {\n    return reload(this);\n  }\n\n  private reloadUserInfo: APIUserInfo | null = null;\n  private reloadListener: NextFn<APIUserInfo> | null = null;\n\n  _assign(user: UserInternal): void {\n    if (this === user) {\n      return;\n    }\n    _assert(this.uid === user.uid, this.auth, AuthErrorCode.INTERNAL_ERROR);\n    this.displayName = user.displayName;\n    this.photoURL = user.photoURL;\n    this.email = user.email;\n    this.emailVerified = user.emailVerified;\n    this.phoneNumber = user.phoneNumber;\n    this.isAnonymous = user.isAnonymous;\n    this.tenantId = user.tenantId;\n    this.providerData = user.providerData.map(userInfo => ({ ...userInfo }));\n    this.metadata._copy(user.metadata);\n    this.stsTokenManager._assign(user.stsTokenManager);\n  }\n\n  _clone(auth: AuthInternal): UserInternal {\n    const newUser = new UserImpl({\n      ...this,\n      auth,\n      stsTokenManager: this.stsTokenManager._clone()\n    });\n    newUser.metadata._copy(this.metadata);\n    return newUser;\n  }\n\n  _onReload(callback: NextFn<APIUserInfo>): void {\n    // There should only ever be one listener, and that is a single instance of MultiFactorUser\n    _assert(!this.reloadListener, this.auth, AuthErrorCode.INTERNAL_ERROR);\n    this.reloadListener = callback;\n    if (this.reloadUserInfo) {\n      this._notifyReloadListener(this.reloadUserInfo);\n      this.reloadUserInfo = null;\n    }\n  }\n\n  _notifyReloadListener(userInfo: APIUserInfo): void {\n    if (this.reloadListener) {\n      this.reloadListener(userInfo);\n    } else {\n      // If no listener is subscribed yet, save the result so it's available when they do subscribe\n      this.reloadUserInfo = userInfo;\n    }\n  }\n\n  _startProactiveRefresh(): void {\n    this.proactiveRefresh._start();\n  }\n\n  _stopProactiveRefresh(): void {\n    this.proactiveRefresh._stop();\n  }\n\n  async _updateTokensIfNecessary(\n    response: IdTokenResponse | FinalizeMfaResponse,\n    reload = false\n  ): Promise<void> {\n    let tokensRefreshed = false;\n    if (\n      response.idToken &&\n      response.idToken !== this.stsTokenManager.accessToken\n    ) {\n      this.stsTokenManager.updateFromServerResponse(response);\n      tokensRefreshed = true;\n    }\n\n    if (reload) {\n      await _reloadWithoutSaving(this);\n    }\n\n    await this.auth._persistUserIfCurrent(this);\n    if (tokensRefreshed) {\n      this.auth._notifyListenersIfCurrent(this);\n    }\n  }\n\n  async delete(): Promise<void> {\n    if (_isFirebaseServerApp(this.auth.app)) {\n      return Promise.reject(\n        _serverAppCurrentUserOperationNotSupportedError(this.auth)\n      );\n    }\n    const idToken = await this.getIdToken();\n    await _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken }));\n    this.stsTokenManager.clearRefreshToken();\n\n    // TODO: Determine if cancellable-promises are necessary to use in this class so that delete()\n    //       cancels pending actions...\n\n    return this.auth.signOut();\n  }\n\n  toJSON(): PersistedBlob {\n    return {\n      uid: this.uid,\n      email: this.email || undefined,\n      emailVerified: this.emailVerified,\n      displayName: this.displayName || undefined,\n      isAnonymous: this.isAnonymous,\n      photoURL: this.photoURL || undefined,\n      phoneNumber: this.phoneNumber || undefined,\n      tenantId: this.tenantId || undefined,\n      providerData: this.providerData.map(userInfo => ({ ...userInfo })),\n      stsTokenManager: this.stsTokenManager.toJSON(),\n      // Redirect event ID must be maintained in case there is a pending\n      // redirect event.\n      _redirectEventId: this._redirectEventId,\n      ...this.metadata.toJSON(),\n\n      // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing):\n      apiKey: this.auth.config.apiKey,\n      appName: this.auth.name\n      // Missing authDomain will be tolerated by the legacy SDK.\n      // stsTokenManager.apiKey isn't actually required (despite the legacy SDK persisting it).\n    };\n  }\n\n  get refreshToken(): string {\n    return this.stsTokenManager.refreshToken || '';\n  }\n\n  static _fromJSON(auth: AuthInternal, object: PersistedBlob): UserInternal {\n    const displayName = object.displayName ?? undefined;\n    const email = object.email ?? undefined;\n    const phoneNumber = object.phoneNumber ?? undefined;\n    const photoURL = object.photoURL ?? undefined;\n    const tenantId = object.tenantId ?? undefined;\n    const _redirectEventId = object._redirectEventId ?? undefined;\n    const createdAt = object.createdAt ?? undefined;\n    const lastLoginAt = object.lastLoginAt ?? undefined;\n    const {\n      uid,\n      emailVerified,\n      isAnonymous,\n      providerData,\n      stsTokenManager: plainObjectTokenManager\n    } = object;\n\n    _assert(uid && plainObjectTokenManager, auth, AuthErrorCode.INTERNAL_ERROR);\n\n    const stsTokenManager = StsTokenManager.fromJSON(\n      this.name,\n      plainObjectTokenManager as PersistedBlob\n    );\n\n    _assert(typeof uid === 'string', auth, AuthErrorCode.INTERNAL_ERROR);\n    assertStringOrUndefined(displayName, auth.name);\n    assertStringOrUndefined(email, auth.name);\n    _assert(\n      typeof emailVerified === 'boolean',\n      auth,\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    _assert(\n      typeof isAnonymous === 'boolean',\n      auth,\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    assertStringOrUndefined(phoneNumber, auth.name);\n    assertStringOrUndefined(photoURL, auth.name);\n    assertStringOrUndefined(tenantId, auth.name);\n    assertStringOrUndefined(_redirectEventId, auth.name);\n    assertStringOrUndefined(createdAt, auth.name);\n    assertStringOrUndefined(lastLoginAt, auth.name);\n    const user = new UserImpl({\n      uid,\n      auth,\n      email,\n      emailVerified,\n      displayName,\n      isAnonymous,\n      photoURL,\n      phoneNumber,\n      tenantId,\n      stsTokenManager,\n      createdAt,\n      lastLoginAt\n    });\n\n    if (providerData && Array.isArray(providerData)) {\n      user.providerData = providerData.map(userInfo => ({ ...userInfo }));\n    }\n\n    if (_redirectEventId) {\n      user._redirectEventId = _redirectEventId;\n    }\n\n    return user;\n  }\n\n  /**\n   * Initialize a User from an idToken server response\n   * @param auth\n   * @param idTokenResponse\n   */\n  static async _fromIdTokenResponse(\n    auth: AuthInternal,\n    idTokenResponse: IdTokenResponse,\n    isAnonymous: boolean = false\n  ): Promise<UserInternal> {\n    const stsTokenManager = new StsTokenManager();\n    stsTokenManager.updateFromServerResponse(idTokenResponse);\n\n    // Initialize the Firebase Auth user.\n    const user = new UserImpl({\n      uid: idTokenResponse.localId,\n      auth,\n      stsTokenManager,\n      isAnonymous\n    });\n\n    // Updates the user info and data and resolves with a user instance.\n    await _reloadWithoutSaving(user);\n    return user;\n  }\n\n  /**\n   * Initialize a User from an idToken server response\n   * @param auth\n   * @param idTokenResponse\n   */\n  static async _fromGetAccountInfoResponse(\n    auth: AuthInternal,\n    response: GetAccountInfoResponse,\n    idToken: string\n  ): Promise<UserInternal> {\n    const coreAccount = response.users[0];\n    _assert(coreAccount.localId !== undefined, AuthErrorCode.INTERNAL_ERROR);\n\n    const providerData: UserInfo[] =\n      coreAccount.providerUserInfo !== undefined\n        ? extractProviderData(coreAccount.providerUserInfo)\n        : [];\n\n    const isAnonymous =\n      !(coreAccount.email && coreAccount.passwordHash) && !providerData?.length;\n\n    const stsTokenManager = new StsTokenManager();\n    stsTokenManager.updateFromIdToken(idToken);\n\n    // Initialize the Firebase Auth user.\n    const user = new UserImpl({\n      uid: coreAccount.localId,\n      auth,\n      stsTokenManager,\n      isAnonymous\n    });\n\n    // update the user with data from the GetAccountInfo response.\n    const updates: Partial<UserInternal> = {\n      uid: coreAccount.localId,\n      displayName: coreAccount.displayName || null,\n      photoURL: coreAccount.photoUrl || null,\n      email: coreAccount.email || null,\n      emailVerified: coreAccount.emailVerified || false,\n      phoneNumber: coreAccount.phoneNumber || null,\n      tenantId: coreAccount.tenantId || null,\n      providerData,\n      metadata: new UserMetadata(\n        coreAccount.createdAt,\n        coreAccount.lastLoginAt\n      ),\n      isAnonymous:\n        !(coreAccount.email && coreAccount.passwordHash) &&\n        !providerData?.length\n    };\n\n    Object.assign(user, updates);\n    return user;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from './assert';\n\n/**\n * Our API has a lot of one-off constants that are used to do things.\n * Unfortunately we can't export these as classes instantiated directly since\n * the constructor may side effect and therefore can't be proven to be safely\n * culled. Instead, we export these classes themselves as a lowerCamelCase\n * constant, and instantiate them under the hood.\n */\nexport interface SingletonInstantiator<T> {\n  new (): T;\n}\n\nconst instanceCache: Map<unknown, unknown> = new Map();\n\nexport function _getInstance<T>(cls: unknown): T {\n  debugAssert(cls instanceof Function, 'Expected a class definition');\n  let instance = instanceCache.get(cls) as T | undefined;\n\n  if (instance) {\n    debugAssert(\n      instance instanceof cls,\n      'Instance stored in cache mismatched with class'\n    );\n    return instance;\n  }\n\n  instance = new (cls as SingletonInstantiator<T>)();\n  instanceCache.set(cls, instance);\n  return instance;\n}\n\nexport function _clearInstanceMap(): void {\n  instanceCache.clear();\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\n\nimport {\n  PersistenceInternal,\n  PersistenceType,\n  PersistenceValue,\n  StorageEventListener\n} from '../persistence';\n\nexport class InMemoryPersistence implements PersistenceInternal {\n  static type: 'NONE' = 'NONE';\n  readonly type = PersistenceType.NONE;\n  storage: Record<string, PersistenceValue> = {};\n\n  async _isAvailable(): Promise<boolean> {\n    return true;\n  }\n\n  async _set(key: string, value: PersistenceValue): Promise<void> {\n    this.storage[key] = value;\n  }\n\n  async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n    const value = this.storage[key];\n    return value === undefined ? null : (value as T);\n  }\n\n  async _remove(key: string): Promise<void> {\n    delete this.storage[key];\n  }\n\n  _addListener(_key: string, _listener: StorageEventListener): void {\n    // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\n    return;\n  }\n\n  _removeListener(_key: string, _listener: StorageEventListener): void {\n    // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\n    return;\n  }\n}\n\n/**\n * An implementation of {@link Persistence} of type 'NONE'.\n *\n * @public\n */\nexport const inMemoryPersistence: Persistence = InMemoryPersistence;\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAccountInfo } from '../../api/account_management/account';\nimport { ApiKey, AppName, AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { PersistedBlob, PersistenceInternal } from '../persistence';\nimport { UserImpl } from '../user/user_impl';\nimport { _getInstance } from '../util/instantiator';\nimport { inMemoryPersistence } from './in_memory';\n\nexport const enum KeyName {\n  AUTH_USER = 'authUser',\n  AUTH_EVENT = 'authEvent',\n  REDIRECT_USER = 'redirectUser',\n  PERSISTENCE_USER = 'persistence'\n}\nexport const enum Namespace {\n  PERSISTENCE = 'firebase'\n}\n\nexport function _persistenceKeyName(\n  key: string,\n  apiKey: ApiKey,\n  appName: AppName\n): string {\n  return `${Namespace.PERSISTENCE}:${key}:${apiKey}:${appName}`;\n}\n\nexport class PersistenceUserManager {\n  private readonly fullUserKey: string;\n  private readonly fullPersistenceKey: string;\n  private readonly boundEventHandler: () => void;\n\n  private constructor(\n    public persistence: PersistenceInternal,\n    private readonly auth: AuthInternal,\n    private readonly userKey: string\n  ) {\n    const { config, name } = this.auth;\n    this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name);\n    this.fullPersistenceKey = _persistenceKeyName(\n      KeyName.PERSISTENCE_USER,\n      config.apiKey,\n      name\n    );\n    this.boundEventHandler = auth._onStorageEvent.bind(auth);\n    this.persistence._addListener(this.fullUserKey, this.boundEventHandler);\n  }\n\n  setCurrentUser(user: UserInternal): Promise<void> {\n    return this.persistence._set(this.fullUserKey, user.toJSON());\n  }\n\n  async getCurrentUser(): Promise<UserInternal | null> {\n    const blob = await this.persistence._get<PersistedBlob | string>(\n      this.fullUserKey\n    );\n    if (!blob) {\n      return null;\n    }\n    if (typeof blob === 'string') {\n      const response = await getAccountInfo(this.auth, { idToken: blob }).catch(\n        () => undefined\n      );\n      if (!response) {\n        return null;\n      }\n      return UserImpl._fromGetAccountInfoResponse(this.auth, response, blob);\n    }\n    return UserImpl._fromJSON(this.auth, blob);\n  }\n\n  removeCurrentUser(): Promise<void> {\n    return this.persistence._remove(this.fullUserKey);\n  }\n\n  savePersistenceForRedirect(): Promise<void> {\n    return this.persistence._set(\n      this.fullPersistenceKey,\n      this.persistence.type\n    );\n  }\n\n  async setPersistence(newPersistence: PersistenceInternal): Promise<void> {\n    if (this.persistence === newPersistence) {\n      return;\n    }\n\n    const currentUser = await this.getCurrentUser();\n    await this.removeCurrentUser();\n\n    this.persistence = newPersistence;\n\n    if (currentUser) {\n      return this.setCurrentUser(currentUser);\n    }\n  }\n\n  delete(): void {\n    this.persistence._removeListener(this.fullUserKey, this.boundEventHandler);\n  }\n\n  static async create(\n    auth: AuthInternal,\n    persistenceHierarchy: PersistenceInternal[],\n    userKey = KeyName.AUTH_USER\n  ): Promise<PersistenceUserManager> {\n    if (!persistenceHierarchy.length) {\n      return new PersistenceUserManager(\n        _getInstance(inMemoryPersistence),\n        auth,\n        userKey\n      );\n    }\n\n    // Eliminate any persistences that are not available\n    const availablePersistences = (\n      await Promise.all(\n        persistenceHierarchy.map(async persistence => {\n          if (await persistence._isAvailable()) {\n            return persistence;\n          }\n          return undefined;\n        })\n      )\n    ).filter(persistence => persistence) as PersistenceInternal[];\n\n    // Fall back to the first persistence listed, or in memory if none available\n    let selectedPersistence =\n      availablePersistences[0] ||\n      _getInstance<PersistenceInternal>(inMemoryPersistence);\n\n    const key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name);\n\n    // Pull out the existing user, setting the chosen persistence to that\n    // persistence if the user exists.\n    let userToMigrate: UserInternal | null = null;\n    // Note, here we check for a user in _all_ persistences, not just the\n    // ones deemed available. If we can migrate a user out of a broken\n    // persistence, we will (but only if that persistence supports migration).\n    for (const persistence of persistenceHierarchy) {\n      try {\n        const blob = await persistence._get<PersistedBlob | string>(key);\n        if (blob) {\n          let user: UserInternal;\n          if (typeof blob === 'string') {\n            const response = await getAccountInfo(auth, {\n              idToken: blob\n            }).catch(() => undefined);\n            if (!response) {\n              break;\n            }\n            user = await UserImpl._fromGetAccountInfoResponse(\n              auth,\n              response,\n              blob\n            );\n          } else {\n            user = UserImpl._fromJSON(auth, blob); // throws for unparsable blob (wrong format)\n          }\n          if (persistence !== selectedPersistence) {\n            userToMigrate = user;\n          }\n          selectedPersistence = persistence;\n          break;\n        }\n      } catch {}\n    }\n\n    // If we find the user in a persistence that does support migration, use\n    // that migration path (of only persistences that support migration)\n    const migrationHierarchy = availablePersistences.filter(\n      p => p._shouldAllowMigration\n    );\n\n    // If the persistence does _not_ allow migration, just finish off here\n    if (\n      !selectedPersistence._shouldAllowMigration ||\n      !migrationHierarchy.length\n    ) {\n      return new PersistenceUserManager(selectedPersistence, auth, userKey);\n    }\n\n    selectedPersistence = migrationHierarchy[0];\n    if (userToMigrate) {\n      // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does\n      // we'll just let it bubble to surface the error.\n      await selectedPersistence._set(key, userToMigrate.toJSON());\n    }\n\n    // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues\n    // such as users getting stuck with a previous account after signing out and refreshing the tab.\n    await Promise.all(\n      persistenceHierarchy.map(async persistence => {\n        if (persistence !== selectedPersistence) {\n          try {\n            await persistence._remove(key);\n          } catch {}\n        }\n      })\n    );\n    return new PersistenceUserManager(selectedPersistence, auth, userKey);\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIE, getUA } from '@firebase/util';\n\ninterface NavigatorStandalone extends Navigator {\n  standalone?: unknown;\n}\n\ninterface Document {\n  documentMode?: number;\n}\n\n/**\n * Enums for Browser name.\n */\nexport const enum BrowserName {\n  ANDROID = 'Android',\n  BLACKBERRY = 'Blackberry',\n  EDGE = 'Edge',\n  FIREFOX = 'Firefox',\n  IE = 'IE',\n  IEMOBILE = 'IEMobile',\n  OPERA = 'Opera',\n  OTHER = 'Other',\n  CHROME = 'Chrome',\n  SAFARI = 'Safari',\n  SILK = 'Silk',\n  WEBOS = 'Webos'\n}\n\n/**\n * Determine the browser for the purposes of reporting usage to the API\n */\nexport function _getBrowserName(userAgent: string): BrowserName | string {\n  const ua = userAgent.toLowerCase();\n  if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) {\n    return BrowserName.OPERA;\n  } else if (_isIEMobile(ua)) {\n    // Windows phone IEMobile browser.\n    return BrowserName.IEMOBILE;\n  } else if (ua.includes('msie') || ua.includes('trident/')) {\n    return BrowserName.IE;\n  } else if (ua.includes('edge/')) {\n    return BrowserName.EDGE;\n  } else if (_isFirefox(ua)) {\n    return BrowserName.FIREFOX;\n  } else if (ua.includes('silk/')) {\n    return BrowserName.SILK;\n  } else if (_isBlackBerry(ua)) {\n    // Blackberry browser.\n    return BrowserName.BLACKBERRY;\n  } else if (_isWebOS(ua)) {\n    // WebOS default browser.\n    return BrowserName.WEBOS;\n  } else if (_isSafari(ua)) {\n    return BrowserName.SAFARI;\n  } else if (\n    (ua.includes('chrome/') || _isChromeIOS(ua)) &&\n    !ua.includes('edge/')\n  ) {\n    return BrowserName.CHROME;\n  } else if (_isAndroid(ua)) {\n    // Android stock browser.\n    return BrowserName.ANDROID;\n  } else {\n    // Most modern browsers have name/version at end of user agent string.\n    const re = /([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/;\n    const matches = userAgent.match(re);\n    if (matches?.length === 2) {\n      return matches[1];\n    }\n  }\n  return BrowserName.OTHER;\n}\n\nexport function _isFirefox(ua = getUA()): boolean {\n  return /firefox\\//i.test(ua);\n}\n\nexport function _isSafari(userAgent = getUA()): boolean {\n  const ua = userAgent.toLowerCase();\n  return (\n    ua.includes('safari/') &&\n    !ua.includes('chrome/') &&\n    !ua.includes('crios/') &&\n    !ua.includes('android')\n  );\n}\n\nexport function _isChromeIOS(ua = getUA()): boolean {\n  return /crios\\//i.test(ua);\n}\n\nexport function _isIEMobile(ua = getUA()): boolean {\n  return /iemobile/i.test(ua);\n}\n\nexport function _isAndroid(ua = getUA()): boolean {\n  return /android/i.test(ua);\n}\n\nexport function _isBlackBerry(ua = getUA()): boolean {\n  return /blackberry/i.test(ua);\n}\n\nexport function _isWebOS(ua = getUA()): boolean {\n  return /webos/i.test(ua);\n}\n\nexport function _isIOS(ua = getUA()): boolean {\n  return (\n    /iphone|ipad|ipod/i.test(ua) ||\n    (/macintosh/i.test(ua) && /mobile/i.test(ua))\n  );\n}\n\nexport function _isIOS7Or8(ua = getUA()): boolean {\n  return (\n    /(iPad|iPhone|iPod).*OS 7_\\d/i.test(ua) ||\n    /(iPad|iPhone|iPod).*OS 8_\\d/i.test(ua)\n  );\n}\n\nexport function _isIOSStandalone(ua = getUA()): boolean {\n  return _isIOS(ua) && !!(window.navigator as NavigatorStandalone)?.standalone;\n}\n\nexport function _isIE10(): boolean {\n  return isIE() && (document as Document).documentMode === 10;\n}\n\nexport function _isMobileBrowser(ua: string = getUA()): boolean {\n  // TODO: implement getBrowserName equivalent for OS.\n  return (\n    _isIOS(ua) ||\n    _isAndroid(ua) ||\n    _isWebOS(ua) ||\n    _isBlackBerry(ua) ||\n    /windows phone/i.test(ua) ||\n    _isIEMobile(ua)\n  );\n}\n\nexport function _isIframe(): boolean {\n  try {\n    // Check that the current window is not the top window.\n    // If so, return true.\n    return !!(window && window !== window.top);\n  } catch (e) {\n    return false;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '@firebase/app';\nimport { _getBrowserName } from './browser';\nimport { getUA } from '@firebase/util';\n\nexport const enum ClientImplementation {\n  CORE = 'JsCore'\n}\n\n/**\n * @internal\n */\nexport const enum ClientPlatform {\n  BROWSER = 'Browser',\n  NODE = 'Node',\n  REACT_NATIVE = 'ReactNative',\n  CORDOVA = 'Cordova',\n  WORKER = 'Worker',\n  WEB_EXTENSION = 'WebExtension'\n}\n\n/*\n * Determine the SDK version string\n */\nexport function _getClientVersion(\n  clientPlatform: ClientPlatform,\n  frameworks: readonly string[] = []\n): string {\n  let reportedPlatform: string;\n  switch (clientPlatform) {\n    case ClientPlatform.BROWSER:\n      // In a browser environment, report the browser name.\n      reportedPlatform = _getBrowserName(getUA());\n      break;\n    case ClientPlatform.WORKER:\n      // Technically a worker runs from a browser but we need to differentiate a\n      // worker from a browser.\n      // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web.\n      reportedPlatform = `${_getBrowserName(getUA())}-${clientPlatform}`;\n      break;\n    default:\n      reportedPlatform = clientPlatform;\n  }\n  const reportedFrameworks = frameworks.length\n    ? frameworks.join(',')\n    : 'FirebaseCore-web'; /* default value if no other framework is used */\n  return `${reportedPlatform}/${ClientImplementation.CORE}/${SDK_VERSION}/${reportedFrameworks}`;\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthInternal } from '../../model/auth';\nimport { Unsubscribe, User } from '../../model/public_types';\nimport { AuthErrorCode } from '../errors';\n\ninterface MiddlewareEntry {\n  (user: User | null): Promise<void>;\n  onAbort?: () => void;\n}\n\nexport class AuthMiddlewareQueue {\n  private readonly queue: MiddlewareEntry[] = [];\n\n  constructor(private readonly auth: AuthInternal) {}\n\n  pushCallback(\n    callback: (user: User | null) => void | Promise<void>,\n    onAbort?: () => void\n  ): Unsubscribe {\n    // The callback could be sync or async. Wrap it into a\n    // function that is always async.\n    const wrappedCallback: MiddlewareEntry = (\n      user: User | null\n    ): Promise<void> =>\n      new Promise((resolve, reject) => {\n        try {\n          const result = callback(user);\n          // Either resolve with existing promise or wrap a non-promise\n          // return value into a promise.\n          resolve(result);\n        } catch (e) {\n          // Sync callback throws.\n          reject(e);\n        }\n      });\n    // Attach the onAbort if present\n    wrappedCallback.onAbort = onAbort;\n    this.queue.push(wrappedCallback);\n\n    const index = this.queue.length - 1;\n    return () => {\n      // Unsubscribe. Replace with no-op. Do not remove from array, or it will disturb\n      // indexing of other elements.\n      this.queue[index] = () => Promise.resolve();\n    };\n  }\n\n  async runMiddleware(nextUser: User | null): Promise<void> {\n    if (this.auth.currentUser === nextUser) {\n      return;\n    }\n\n    // While running the middleware, build a temporary stack of onAbort\n    // callbacks to call if one middleware callback rejects.\n\n    const onAbortStack: Array<() => void> = [];\n    try {\n      for (const beforeStateCallback of this.queue) {\n        await beforeStateCallback(nextUser);\n\n        // Only push the onAbort if the callback succeeds\n        if (beforeStateCallback.onAbort) {\n          onAbortStack.push(beforeStateCallback.onAbort);\n        }\n      }\n    } catch (e) {\n      // Run all onAbort, with separate try/catch to ignore any errors and\n      // continue\n      onAbortStack.reverse();\n      for (const onAbort of onAbortStack) {\n        try {\n          onAbort();\n        } catch (_) {\n          /* swallow error */\n        }\n      }\n\n      throw this.auth._errorFactory.create(AuthErrorCode.LOGIN_BLOCKED, {\n        originalMessage: (e as Error)?.message\n      });\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GetPasswordPolicyResponse } from '../../api/password_policy/get_password_policy';\nimport {\n  PasswordPolicyCustomStrengthOptions,\n  PasswordPolicyInternal,\n  PasswordValidationStatusInternal\n} from '../../model/password_policy';\nimport { PasswordValidationStatus } from '../../model/public_types';\n\n// Minimum min password length enforced by the backend, even if no minimum length is set.\nconst MINIMUM_MIN_PASSWORD_LENGTH = 6;\n\n/**\n * Stores password policy requirements and provides password validation against the policy.\n *\n * @internal\n */\nexport class PasswordPolicyImpl implements PasswordPolicyInternal {\n  readonly customStrengthOptions: PasswordPolicyCustomStrengthOptions;\n  readonly allowedNonAlphanumericCharacters: string;\n  readonly enforcementState: string;\n  readonly forceUpgradeOnSignin: boolean;\n  readonly schemaVersion: number;\n\n  constructor(response: GetPasswordPolicyResponse) {\n    // Only include custom strength options defined in the response.\n    const responseOptions = response.customStrengthOptions;\n    this.customStrengthOptions = {};\n    // TODO: Remove once the backend is updated to include the minimum min password length instead of undefined when there is no minimum length set.\n    this.customStrengthOptions.minPasswordLength =\n      responseOptions.minPasswordLength ?? MINIMUM_MIN_PASSWORD_LENGTH;\n    if (responseOptions.maxPasswordLength) {\n      this.customStrengthOptions.maxPasswordLength =\n        responseOptions.maxPasswordLength;\n    }\n    if (responseOptions.containsLowercaseCharacter !== undefined) {\n      this.customStrengthOptions.containsLowercaseLetter =\n        responseOptions.containsLowercaseCharacter;\n    }\n    if (responseOptions.containsUppercaseCharacter !== undefined) {\n      this.customStrengthOptions.containsUppercaseLetter =\n        responseOptions.containsUppercaseCharacter;\n    }\n    if (responseOptions.containsNumericCharacter !== undefined) {\n      this.customStrengthOptions.containsNumericCharacter =\n        responseOptions.containsNumericCharacter;\n    }\n    if (responseOptions.containsNonAlphanumericCharacter !== undefined) {\n      this.customStrengthOptions.containsNonAlphanumericCharacter =\n        responseOptions.containsNonAlphanumericCharacter;\n    }\n\n    this.enforcementState = response.enforcementState;\n    if (this.enforcementState === 'ENFORCEMENT_STATE_UNSPECIFIED') {\n      this.enforcementState = 'OFF';\n    }\n\n    // Use an empty string if no non-alphanumeric characters are specified in the response.\n    this.allowedNonAlphanumericCharacters =\n      response.allowedNonAlphanumericCharacters?.join('') ?? '';\n\n    this.forceUpgradeOnSignin = response.forceUpgradeOnSignin ?? false;\n    this.schemaVersion = response.schemaVersion;\n  }\n\n  validatePassword(password: string): PasswordValidationStatus {\n    const status: PasswordValidationStatusInternal = {\n      isValid: true,\n      passwordPolicy: this\n    };\n\n    // Check the password length and character options.\n    this.validatePasswordLengthOptions(password, status);\n    this.validatePasswordCharacterOptions(password, status);\n\n    // Combine the status into single isValid property.\n    status.isValid &&= status.meetsMinPasswordLength ?? true;\n    status.isValid &&= status.meetsMaxPasswordLength ?? true;\n    status.isValid &&= status.containsLowercaseLetter ?? true;\n    status.isValid &&= status.containsUppercaseLetter ?? true;\n    status.isValid &&= status.containsNumericCharacter ?? true;\n    status.isValid &&= status.containsNonAlphanumericCharacter ?? true;\n\n    return status;\n  }\n\n  /**\n   * Validates that the password meets the length options for the policy.\n   *\n   * @param password Password to validate.\n   * @param status Validation status.\n   */\n  private validatePasswordLengthOptions(\n    password: string,\n    status: PasswordValidationStatusInternal\n  ): void {\n    const minPasswordLength = this.customStrengthOptions.minPasswordLength;\n    const maxPasswordLength = this.customStrengthOptions.maxPasswordLength;\n    if (minPasswordLength) {\n      status.meetsMinPasswordLength = password.length >= minPasswordLength;\n    }\n    if (maxPasswordLength) {\n      status.meetsMaxPasswordLength = password.length <= maxPasswordLength;\n    }\n  }\n\n  /**\n   * Validates that the password meets the character options for the policy.\n   *\n   * @param password Password to validate.\n   * @param status Validation status.\n   */\n  private validatePasswordCharacterOptions(\n    password: string,\n    status: PasswordValidationStatusInternal\n  ): void {\n    // Assign statuses for requirements even if the password is an empty string.\n    this.updatePasswordCharacterOptionsStatuses(\n      status,\n      /* containsLowercaseCharacter= */ false,\n      /* containsUppercaseCharacter= */ false,\n      /* containsNumericCharacter= */ false,\n      /* containsNonAlphanumericCharacter= */ false\n    );\n\n    let passwordChar;\n    for (let i = 0; i < password.length; i++) {\n      passwordChar = password.charAt(i);\n      this.updatePasswordCharacterOptionsStatuses(\n        status,\n        /* containsLowercaseCharacter= */ passwordChar >= 'a' &&\n          passwordChar <= 'z',\n        /* containsUppercaseCharacter= */ passwordChar >= 'A' &&\n          passwordChar <= 'Z',\n        /* containsNumericCharacter= */ passwordChar >= '0' &&\n          passwordChar <= '9',\n        /* containsNonAlphanumericCharacter= */ this.allowedNonAlphanumericCharacters.includes(\n          passwordChar\n        )\n      );\n    }\n  }\n\n  /**\n   * Updates the running validation status with the statuses for the character options.\n   * Expected to be called each time a character is processed to update each option status\n   * based on the current character.\n   *\n   * @param status Validation status.\n   * @param containsLowercaseCharacter Whether the character is a lowercase letter.\n   * @param containsUppercaseCharacter Whether the character is an uppercase letter.\n   * @param containsNumericCharacter Whether the character is a numeric character.\n   * @param containsNonAlphanumericCharacter Whether the character is a non-alphanumeric character.\n   */\n  private updatePasswordCharacterOptionsStatuses(\n    status: PasswordValidationStatusInternal,\n    containsLowercaseCharacter: boolean,\n    containsUppercaseCharacter: boolean,\n    containsNumericCharacter: boolean,\n    containsNonAlphanumericCharacter: boolean\n  ): void {\n    if (this.customStrengthOptions.containsLowercaseLetter) {\n      status.containsLowercaseLetter ||= containsLowercaseCharacter;\n    }\n    if (this.customStrengthOptions.containsUppercaseLetter) {\n      status.containsUppercaseLetter ||= containsUppercaseCharacter;\n    }\n    if (this.customStrengthOptions.containsNumericCharacter) {\n      status.containsNumericCharacter ||= containsNumericCharacter;\n    }\n    if (this.customStrengthOptions.containsNonAlphanumericCharacter) {\n      status.containsNonAlphanumericCharacter ||=\n        containsNonAlphanumericCharacter;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _isFirebaseServerApp,\n  _FirebaseService,\n  FirebaseApp\n} from '@firebase/app';\nimport { Provider } from '@firebase/component';\nimport { AppCheckInternalComponentName } from '@firebase/app-check-interop-types';\nimport {\n  Auth,\n  AuthErrorMap,\n  AuthSettings,\n  EmulatorConfig,\n  NextOrObserver,\n  Persistence,\n  PopupRedirectResolver,\n  User,\n  UserCredential,\n  CompleteFn,\n  ErrorFn,\n  NextFn,\n  Unsubscribe,\n  PasswordValidationStatus\n} from '../../model/public_types';\nimport {\n  createSubscribe,\n  ErrorFactory,\n  FirebaseError,\n  getModularInstance,\n  Observer,\n  Subscribe\n} from '@firebase/util';\n\nimport { AuthInternal, ConfigInternal } from '../../model/auth';\nimport { PopupRedirectResolverInternal } from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport {\n  AuthErrorCode,\n  AuthErrorParams,\n  ErrorMapRetriever,\n  _DEFAULT_AUTH_ERROR_FACTORY\n} from '../errors';\nimport { PersistenceInternal } from '../persistence';\nimport {\n  KeyName,\n  PersistenceUserManager\n} from '../persistence/persistence_user_manager';\nimport { _reloadWithoutSaving } from '../user/reload';\nimport {\n  _assert,\n  _serverAppCurrentUserOperationNotSupportedError\n} from '../util/assert';\nimport { _getInstance } from '../util/instantiator';\nimport { _getUserLanguage } from '../util/navigator';\nimport { _getClientVersion } from '../util/version';\nimport { HttpHeader } from '../../api';\nimport {\n  RevokeTokenRequest,\n  TokenType,\n  revokeToken\n} from '../../api/authentication/token';\nimport { AuthMiddlewareQueue } from './middleware';\nimport { RecaptchaConfig } from '../../platform_browser/recaptcha/recaptcha';\nimport { _logWarn } from '../util/log';\nimport { _getPasswordPolicy } from '../../api/password_policy/get_password_policy';\nimport { PasswordPolicyInternal } from '../../model/password_policy';\nimport { PasswordPolicyImpl } from './password_policy_impl';\nimport { getAccountInfo } from '../../api/account_management/account';\nimport { UserImpl } from '../user/user_impl';\n\ninterface AsyncAction {\n  (): Promise<void>;\n}\n\nexport const enum DefaultConfig {\n  TOKEN_API_HOST = 'securetoken.googleapis.com',\n  API_HOST = 'identitytoolkit.googleapis.com',\n  API_SCHEME = 'https'\n}\n\nexport class AuthImpl implements AuthInternal, _FirebaseService {\n  currentUser: User | null = null;\n  emulatorConfig: EmulatorConfig | null = null;\n  private operations = Promise.resolve();\n  private persistenceManager?: PersistenceUserManager;\n  private redirectPersistenceManager?: PersistenceUserManager;\n  private authStateSubscription = new Subscription<User>(this);\n  private idTokenSubscription = new Subscription<User>(this);\n  private readonly beforeStateQueue = new AuthMiddlewareQueue(this);\n  private redirectUser: UserInternal | null = null;\n  private isProactiveRefreshEnabled = false;\n  private readonly EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION: number = 1;\n\n  // Any network calls will set this to true and prevent subsequent emulator\n  // initialization\n  _canInitEmulator = true;\n  _isInitialized = false;\n  _deleted = false;\n  _initializationPromise: Promise<void> | null = null;\n  _popupRedirectResolver: PopupRedirectResolverInternal | null = null;\n  _errorFactory: ErrorFactory<AuthErrorCode, AuthErrorParams> =\n    _DEFAULT_AUTH_ERROR_FACTORY;\n  _agentRecaptchaConfig: RecaptchaConfig | null = null;\n  _tenantRecaptchaConfigs: Record<string, RecaptchaConfig> = {};\n  _projectPasswordPolicy: PasswordPolicyInternal | null = null;\n  _tenantPasswordPolicies: Record<string, PasswordPolicyInternal> = {};\n  _resolvePersistenceManagerAvailable:\n    | ((value: void | PromiseLike<void>) => void)\n    | undefined = undefined;\n  _persistenceManagerAvailable: Promise<void>;\n  readonly name: string;\n\n  // Tracks the last notified UID for state change listeners to prevent\n  // repeated calls to the callbacks. Undefined means it's never been\n  // called, whereas null means it's been called with a signed out user\n  private lastNotifiedUid: string | null | undefined = undefined;\n\n  languageCode: string | null = null;\n  tenantId: string | null = null;\n  settings: AuthSettings = { appVerificationDisabledForTesting: false };\n\n  constructor(\n    public readonly app: FirebaseApp,\n    private readonly heartbeatServiceProvider: Provider<'heartbeat'>,\n    private readonly appCheckServiceProvider: Provider<AppCheckInternalComponentName>,\n    public readonly config: ConfigInternal\n  ) {\n    this.name = app.name;\n    this.clientVersion = config.sdkClientVersion;\n    // TODO(jamesdaniels) explore less hacky way to do this, cookie authentication needs\n    // persistenceMananger to be available. see _getFinalTarget for more context\n    this._persistenceManagerAvailable = new Promise<void>(\n      resolve => (this._resolvePersistenceManagerAvailable = resolve)\n    );\n  }\n\n  _initializeWithPersistence(\n    persistenceHierarchy: PersistenceInternal[],\n    popupRedirectResolver?: PopupRedirectResolver\n  ): Promise<void> {\n    if (popupRedirectResolver) {\n      this._popupRedirectResolver = _getInstance(popupRedirectResolver);\n    }\n\n    // Have to check for app deletion throughout initialization (after each\n    // promise resolution)\n    this._initializationPromise = this.queue(async () => {\n      if (this._deleted) {\n        return;\n      }\n\n      this.persistenceManager = await PersistenceUserManager.create(\n        this,\n        persistenceHierarchy\n      );\n      this._resolvePersistenceManagerAvailable?.();\n\n      if (this._deleted) {\n        return;\n      }\n\n      // Initialize the resolver early if necessary (only applicable to web:\n      // this will cause the iframe to load immediately in certain cases)\n      if (this._popupRedirectResolver?._shouldInitProactively) {\n        // If this fails, don't halt auth loading\n        try {\n          await this._popupRedirectResolver._initialize(this);\n        } catch (e) {\n          /* Ignore the error */\n        }\n      }\n\n      await this.initializeCurrentUser(popupRedirectResolver);\n\n      this.lastNotifiedUid = this.currentUser?.uid || null;\n\n      if (this._deleted) {\n        return;\n      }\n\n      this._isInitialized = true;\n    });\n\n    return this._initializationPromise;\n  }\n\n  /**\n   * If the persistence is changed in another window, the user manager will let us know\n   */\n  async _onStorageEvent(): Promise<void> {\n    if (this._deleted) {\n      return;\n    }\n\n    const user = await this.assertedPersistence.getCurrentUser();\n\n    if (!this.currentUser && !user) {\n      // No change, do nothing (was signed out and remained signed out).\n      return;\n    }\n\n    // If the same user is to be synchronized.\n    if (this.currentUser && user && this.currentUser.uid === user.uid) {\n      // Data update, simply copy data changes.\n      this._currentUser._assign(user);\n      // If tokens changed from previous user tokens, this will trigger\n      // notifyAuthListeners_.\n      await this.currentUser.getIdToken();\n      return;\n    }\n\n    // Update current Auth state. Either a new login or logout.\n    // Skip blocking callbacks, they should not apply to a change in another tab.\n    await this._updateCurrentUser(user, /* skipBeforeStateCallbacks */ true);\n  }\n\n  private async initializeCurrentUserFromIdToken(\n    idToken: string\n  ): Promise<void> {\n    try {\n      const response = await getAccountInfo(this, { idToken });\n      const user = await UserImpl._fromGetAccountInfoResponse(\n        this,\n        response,\n        idToken\n      );\n      await this.directlySetCurrentUser(user);\n    } catch (err) {\n      console.warn(\n        'FirebaseServerApp could not login user with provided authIdToken: ',\n        err\n      );\n      await this.directlySetCurrentUser(null);\n    }\n  }\n\n  private async initializeCurrentUser(\n    popupRedirectResolver?: PopupRedirectResolver\n  ): Promise<void> {\n    if (_isFirebaseServerApp(this.app)) {\n      const idToken = this.app.settings.authIdToken;\n      if (idToken) {\n        // Start the auth operation in the next tick to allow a moment for the customer's app to\n        // attach an emulator, if desired.\n        return new Promise<void>(resolve => {\n          setTimeout(() =>\n            this.initializeCurrentUserFromIdToken(idToken).then(\n              resolve,\n              resolve\n            )\n          );\n        });\n      } else {\n        return this.directlySetCurrentUser(null);\n      }\n    }\n\n    // First check to see if we have a pending redirect event.\n    const previouslyStoredUser =\n      (await this.assertedPersistence.getCurrentUser()) as UserInternal | null;\n    let futureCurrentUser = previouslyStoredUser;\n    let needsTocheckMiddleware = false;\n    if (popupRedirectResolver && this.config.authDomain) {\n      await this.getOrInitRedirectPersistenceManager();\n      const redirectUserEventId = this.redirectUser?._redirectEventId;\n      const storedUserEventId = futureCurrentUser?._redirectEventId;\n      const result = await this.tryRedirectSignIn(popupRedirectResolver);\n\n      // If the stored user (i.e. the old \"currentUser\") has a redirectId that\n      // matches the redirect user, then we want to initially sign in with the\n      // new user object from result.\n      // TODO(samgho): More thoroughly test all of this\n      if (\n        (!redirectUserEventId || redirectUserEventId === storedUserEventId) &&\n        result?.user\n      ) {\n        futureCurrentUser = result.user as UserInternal;\n        needsTocheckMiddleware = true;\n      }\n    }\n\n    // If no user in persistence, there is no current user. Set to null.\n    if (!futureCurrentUser) {\n      return this.directlySetCurrentUser(null);\n    }\n\n    if (!futureCurrentUser._redirectEventId) {\n      // This isn't a redirect link operation, we can reload and bail.\n      // First though, ensure that we check the middleware is happy.\n      if (needsTocheckMiddleware) {\n        try {\n          await this.beforeStateQueue.runMiddleware(futureCurrentUser);\n        } catch (e) {\n          futureCurrentUser = previouslyStoredUser;\n          // We know this is available since the bit is only set when the\n          // resolver is available\n          this._popupRedirectResolver!._overrideRedirectResult(this, () =>\n            Promise.reject(e)\n          );\n        }\n      }\n\n      if (futureCurrentUser) {\n        return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\n      } else {\n        return this.directlySetCurrentUser(null);\n      }\n    }\n\n    _assert(this._popupRedirectResolver, this, AuthErrorCode.ARGUMENT_ERROR);\n    await this.getOrInitRedirectPersistenceManager();\n\n    // If the redirect user's event ID matches the current user's event ID,\n    // DO NOT reload the current user, otherwise they'll be cleared from storage.\n    // This is important for the reauthenticateWithRedirect() flow.\n    if (\n      this.redirectUser &&\n      this.redirectUser._redirectEventId === futureCurrentUser._redirectEventId\n    ) {\n      return this.directlySetCurrentUser(futureCurrentUser);\n    }\n\n    return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\n  }\n\n  private async tryRedirectSignIn(\n    redirectResolver: PopupRedirectResolver\n  ): Promise<UserCredential | null> {\n    // The redirect user needs to be checked (and signed in if available)\n    // during auth initialization. All of the normal sign in and link/reauth\n    // flows call back into auth and push things onto the promise queue. We\n    // need to await the result of the redirect sign in *inside the promise\n    // queue*. This presents a problem: we run into deadlock. See:\n    //    ┌> [Initialization] ─────┐\n    //    ┌> [<other queue tasks>] │\n    //    └─ [getRedirectResult] <─┘\n    //    where [] are tasks on the queue and arrows denote awaits\n    // Initialization will never complete because it's waiting on something\n    // that's waiting for initialization to complete!\n    //\n    // Instead, this method calls getRedirectResult() (stored in\n    // _completeRedirectFn) with an optional parameter that instructs all of\n    // the underlying auth operations to skip anything that mutates auth state.\n\n    let result: UserCredential | null = null;\n    try {\n      // We know this._popupRedirectResolver is set since redirectResolver\n      // is passed in. The _completeRedirectFn expects the unwrapped extern.\n      result = await this._popupRedirectResolver!._completeRedirectFn(\n        this,\n        redirectResolver,\n        true\n      );\n    } catch (e) {\n      // Swallow any errors here; the code can retrieve them in\n      // getRedirectResult().\n      await this._setRedirectUser(null);\n    }\n\n    return result;\n  }\n\n  private async reloadAndSetCurrentUserOrClear(\n    user: UserInternal\n  ): Promise<void> {\n    try {\n      await _reloadWithoutSaving(user);\n    } catch (e) {\n      if (\n        (e as FirebaseError)?.code !==\n        `auth/${AuthErrorCode.NETWORK_REQUEST_FAILED}`\n      ) {\n        // Something's wrong with the user's token. Log them out and remove\n        // them from storage\n        return this.directlySetCurrentUser(null);\n      }\n    }\n\n    return this.directlySetCurrentUser(user);\n  }\n\n  useDeviceLanguage(): void {\n    this.languageCode = _getUserLanguage();\n  }\n\n  async _delete(): Promise<void> {\n    this._deleted = true;\n  }\n\n  async updateCurrentUser(userExtern: User | null): Promise<void> {\n    if (_isFirebaseServerApp(this.app)) {\n      return Promise.reject(\n        _serverAppCurrentUserOperationNotSupportedError(this)\n      );\n    }\n    // The public updateCurrentUser method needs to make a copy of the user,\n    // and also check that the project matches\n    const user = userExtern\n      ? (getModularInstance(userExtern) as UserInternal)\n      : null;\n    if (user) {\n      _assert(\n        user.auth.config.apiKey === this.config.apiKey,\n        this,\n        AuthErrorCode.INVALID_AUTH\n      );\n    }\n    return this._updateCurrentUser(user && user._clone(this));\n  }\n\n  async _updateCurrentUser(\n    user: User | null,\n    skipBeforeStateCallbacks: boolean = false\n  ): Promise<void> {\n    if (this._deleted) {\n      return;\n    }\n    if (user) {\n      _assert(\n        this.tenantId === user.tenantId,\n        this,\n        AuthErrorCode.TENANT_ID_MISMATCH\n      );\n    }\n\n    if (!skipBeforeStateCallbacks) {\n      await this.beforeStateQueue.runMiddleware(user);\n    }\n\n    return this.queue(async () => {\n      await this.directlySetCurrentUser(user as UserInternal | null);\n      this.notifyAuthListeners();\n    });\n  }\n\n  async signOut(): Promise<void> {\n    if (_isFirebaseServerApp(this.app)) {\n      return Promise.reject(\n        _serverAppCurrentUserOperationNotSupportedError(this)\n      );\n    }\n    // Run first, to block _setRedirectUser() if any callbacks fail.\n    await this.beforeStateQueue.runMiddleware(null);\n    // Clear the redirect user when signOut is called\n    if (this.redirectPersistenceManager || this._popupRedirectResolver) {\n      await this._setRedirectUser(null);\n    }\n\n    // Prevent callbacks from being called again in _updateCurrentUser, as\n    // they were already called in the first line.\n    return this._updateCurrentUser(null, /* skipBeforeStateCallbacks */ true);\n  }\n\n  setPersistence(persistence: Persistence): Promise<void> {\n    if (_isFirebaseServerApp(this.app)) {\n      return Promise.reject(\n        _serverAppCurrentUserOperationNotSupportedError(this)\n      );\n    }\n    return this.queue(async () => {\n      await this.assertedPersistence.setPersistence(_getInstance(persistence));\n    });\n  }\n\n  _getRecaptchaConfig(): RecaptchaConfig | null {\n    if (this.tenantId == null) {\n      return this._agentRecaptchaConfig;\n    } else {\n      return this._tenantRecaptchaConfigs[this.tenantId];\n    }\n  }\n\n  async validatePassword(password: string): Promise<PasswordValidationStatus> {\n    if (!this._getPasswordPolicyInternal()) {\n      await this._updatePasswordPolicy();\n    }\n\n    // Password policy will be defined after fetching.\n    const passwordPolicy: PasswordPolicyInternal =\n      this._getPasswordPolicyInternal()!;\n\n    // Check that the policy schema version is supported by the SDK.\n    // TODO: Update this logic to use a max supported policy schema version once we have multiple schema versions.\n    if (\n      passwordPolicy.schemaVersion !==\n      this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION\n    ) {\n      return Promise.reject(\n        this._errorFactory.create(\n          AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION,\n          {}\n        )\n      );\n    }\n\n    return passwordPolicy.validatePassword(password);\n  }\n\n  _getPasswordPolicyInternal(): PasswordPolicyInternal | null {\n    if (this.tenantId === null) {\n      return this._projectPasswordPolicy;\n    } else {\n      return this._tenantPasswordPolicies[this.tenantId];\n    }\n  }\n\n  async _updatePasswordPolicy(): Promise<void> {\n    const response = await _getPasswordPolicy(this);\n\n    const passwordPolicy: PasswordPolicyInternal = new PasswordPolicyImpl(\n      response\n    );\n\n    if (this.tenantId === null) {\n      this._projectPasswordPolicy = passwordPolicy;\n    } else {\n      this._tenantPasswordPolicies[this.tenantId] = passwordPolicy;\n    }\n  }\n\n  _getPersistenceType(): string {\n    return this.assertedPersistence.persistence.type;\n  }\n\n  _getPersistence(): PersistenceInternal {\n    return this.assertedPersistence.persistence;\n  }\n\n  _updateErrorMap(errorMap: AuthErrorMap): void {\n    this._errorFactory = new ErrorFactory<AuthErrorCode, AuthErrorParams>(\n      'auth',\n      'Firebase',\n      (errorMap as ErrorMapRetriever)()\n    );\n  }\n\n  onAuthStateChanged(\n    nextOrObserver: NextOrObserver<User>,\n    error?: ErrorFn,\n    completed?: CompleteFn\n  ): Unsubscribe {\n    return this.registerStateListener(\n      this.authStateSubscription,\n      nextOrObserver,\n      error,\n      completed\n    );\n  }\n\n  beforeAuthStateChanged(\n    callback: (user: User | null) => void | Promise<void>,\n    onAbort?: () => void\n  ): Unsubscribe {\n    return this.beforeStateQueue.pushCallback(callback, onAbort);\n  }\n\n  onIdTokenChanged(\n    nextOrObserver: NextOrObserver<User>,\n    error?: ErrorFn,\n    completed?: CompleteFn\n  ): Unsubscribe {\n    return this.registerStateListener(\n      this.idTokenSubscription,\n      nextOrObserver,\n      error,\n      completed\n    );\n  }\n\n  authStateReady(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (this.currentUser) {\n        resolve();\n      } else {\n        const unsubscribe = this.onAuthStateChanged(() => {\n          unsubscribe();\n          resolve();\n        }, reject);\n      }\n    });\n  }\n\n  /**\n   * Revokes the given access token. Currently only supports Apple OAuth access tokens.\n   */\n  async revokeAccessToken(token: string): Promise<void> {\n    if (this.currentUser) {\n      const idToken = await this.currentUser.getIdToken();\n      // Generalize this to accept other providers once supported.\n      const request: RevokeTokenRequest = {\n        providerId: 'apple.com',\n        tokenType: TokenType.ACCESS_TOKEN,\n        token,\n        idToken\n      };\n      if (this.tenantId != null) {\n        request.tenantId = this.tenantId;\n      }\n      await revokeToken(this, request);\n    }\n  }\n\n  toJSON(): object {\n    return {\n      apiKey: this.config.apiKey,\n      authDomain: this.config.authDomain,\n      appName: this.name,\n      currentUser: this._currentUser?.toJSON()\n    };\n  }\n\n  async _setRedirectUser(\n    user: UserInternal | null,\n    popupRedirectResolver?: PopupRedirectResolver\n  ): Promise<void> {\n    const redirectManager = await this.getOrInitRedirectPersistenceManager(\n      popupRedirectResolver\n    );\n    return user === null\n      ? redirectManager.removeCurrentUser()\n      : redirectManager.setCurrentUser(user);\n  }\n\n  private async getOrInitRedirectPersistenceManager(\n    popupRedirectResolver?: PopupRedirectResolver\n  ): Promise<PersistenceUserManager> {\n    if (!this.redirectPersistenceManager) {\n      const resolver: PopupRedirectResolverInternal | null =\n        (popupRedirectResolver && _getInstance(popupRedirectResolver)) ||\n        this._popupRedirectResolver;\n      _assert(resolver, this, AuthErrorCode.ARGUMENT_ERROR);\n      this.redirectPersistenceManager = await PersistenceUserManager.create(\n        this,\n        [_getInstance(resolver._redirectPersistence)],\n        KeyName.REDIRECT_USER\n      );\n      this.redirectUser =\n        await this.redirectPersistenceManager.getCurrentUser();\n    }\n\n    return this.redirectPersistenceManager;\n  }\n\n  async _redirectUserForId(id: string): Promise<UserInternal | null> {\n    // Make sure we've cleared any pending persistence actions if we're not in\n    // the initializer\n    if (this._isInitialized) {\n      await this.queue(async () => {});\n    }\n\n    if (this._currentUser?._redirectEventId === id) {\n      return this._currentUser;\n    }\n\n    if (this.redirectUser?._redirectEventId === id) {\n      return this.redirectUser;\n    }\n\n    return null;\n  }\n\n  async _persistUserIfCurrent(user: UserInternal): Promise<void> {\n    if (user === this.currentUser) {\n      return this.queue(async () => this.directlySetCurrentUser(user));\n    }\n  }\n\n  /** Notifies listeners only if the user is current */\n  _notifyListenersIfCurrent(user: UserInternal): void {\n    if (user === this.currentUser) {\n      this.notifyAuthListeners();\n    }\n  }\n\n  _key(): string {\n    return `${this.config.authDomain}:${this.config.apiKey}:${this.name}`;\n  }\n\n  _startProactiveRefresh(): void {\n    this.isProactiveRefreshEnabled = true;\n    if (this.currentUser) {\n      this._currentUser._startProactiveRefresh();\n    }\n  }\n\n  _stopProactiveRefresh(): void {\n    this.isProactiveRefreshEnabled = false;\n    if (this.currentUser) {\n      this._currentUser._stopProactiveRefresh();\n    }\n  }\n\n  /** Returns the current user cast as the internal type */\n  get _currentUser(): UserInternal {\n    return this.currentUser as UserInternal;\n  }\n\n  private notifyAuthListeners(): void {\n    if (!this._isInitialized) {\n      return;\n    }\n\n    this.idTokenSubscription.next(this.currentUser);\n\n    const currentUid = this.currentUser?.uid ?? null;\n    if (this.lastNotifiedUid !== currentUid) {\n      this.lastNotifiedUid = currentUid;\n      this.authStateSubscription.next(this.currentUser);\n    }\n  }\n\n  private registerStateListener(\n    subscription: Subscription<User>,\n    nextOrObserver: NextOrObserver<User>,\n    error?: ErrorFn,\n    completed?: CompleteFn\n  ): Unsubscribe {\n    if (this._deleted) {\n      return () => {};\n    }\n\n    const cb =\n      typeof nextOrObserver === 'function'\n        ? nextOrObserver\n        : nextOrObserver.next.bind(nextOrObserver);\n\n    let isUnsubscribed = false;\n\n    const promise = this._isInitialized\n      ? Promise.resolve()\n      : this._initializationPromise;\n    _assert(promise, this, AuthErrorCode.INTERNAL_ERROR);\n    // The callback needs to be called asynchronously per the spec.\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    promise.then(() => {\n      if (isUnsubscribed) {\n        return;\n      }\n      cb(this.currentUser);\n    });\n\n    if (typeof nextOrObserver === 'function') {\n      const unsubscribe = subscription.addObserver(\n        nextOrObserver,\n        error,\n        completed\n      );\n      return () => {\n        isUnsubscribed = true;\n        unsubscribe();\n      };\n    } else {\n      const unsubscribe = subscription.addObserver(nextOrObserver);\n      return () => {\n        isUnsubscribed = true;\n        unsubscribe();\n      };\n    }\n  }\n\n  /**\n   * Unprotected (from race conditions) method to set the current user. This\n   * should only be called from within a queued callback. This is necessary\n   * because the queue shouldn't rely on another queued callback.\n   */\n  private async directlySetCurrentUser(\n    user: UserInternal | null\n  ): Promise<void> {\n    if (this.currentUser && this.currentUser !== user) {\n      this._currentUser._stopProactiveRefresh();\n    }\n    if (user && this.isProactiveRefreshEnabled) {\n      user._startProactiveRefresh();\n    }\n\n    this.currentUser = user;\n\n    if (user) {\n      await this.assertedPersistence.setCurrentUser(user);\n    } else {\n      await this.assertedPersistence.removeCurrentUser();\n    }\n  }\n\n  private queue(action: AsyncAction): Promise<void> {\n    // In case something errors, the callback still should be called in order\n    // to keep the promise chain alive\n    this.operations = this.operations.then(action, action);\n    return this.operations;\n  }\n\n  private get assertedPersistence(): PersistenceUserManager {\n    _assert(this.persistenceManager, this, AuthErrorCode.INTERNAL_ERROR);\n    return this.persistenceManager;\n  }\n\n  private frameworks: string[] = [];\n  private clientVersion: string;\n  _logFramework(framework: string): void {\n    if (!framework || this.frameworks.includes(framework)) {\n      return;\n    }\n    this.frameworks.push(framework);\n\n    // Sort alphabetically so that \"FirebaseCore-web,FirebaseUI-web\" and\n    // \"FirebaseUI-web,FirebaseCore-web\" aren't viewed as different.\n    this.frameworks.sort();\n    this.clientVersion = _getClientVersion(\n      this.config.clientPlatform,\n      this._getFrameworks()\n    );\n  }\n  _getFrameworks(): readonly string[] {\n    return this.frameworks;\n  }\n  async _getAdditionalHeaders(): Promise<Record<string, string>> {\n    // Additional headers on every request\n    const headers: Record<string, string> = {\n      [HttpHeader.X_CLIENT_VERSION]: this.clientVersion\n    };\n\n    if (this.app.options.appId) {\n      headers[HttpHeader.X_FIREBASE_GMPID] = this.app.options.appId;\n    }\n\n    // If the heartbeat service exists, add the heartbeat string\n    const heartbeatsHeader = await this.heartbeatServiceProvider\n      .getImmediate({\n        optional: true\n      })\n      ?.getHeartbeatsHeader();\n    if (heartbeatsHeader) {\n      headers[HttpHeader.X_FIREBASE_CLIENT] = heartbeatsHeader;\n    }\n\n    // If the App Check service exists, add the App Check token in the headers\n    const appCheckToken = await this._getAppCheckToken();\n    if (appCheckToken) {\n      headers[HttpHeader.X_FIREBASE_APP_CHECK] = appCheckToken;\n    }\n\n    return headers;\n  }\n\n  async _getAppCheckToken(): Promise<string | undefined> {\n    if (_isFirebaseServerApp(this.app) && this.app.settings.appCheckToken) {\n      return this.app.settings.appCheckToken;\n    }\n    const appCheckTokenResult = await this.appCheckServiceProvider\n      .getImmediate({ optional: true })\n      ?.getToken();\n    if (appCheckTokenResult?.error) {\n      // Context: appCheck.getToken() will never throw even if an error happened.\n      // In the error case, a dummy token will be returned along with an error field describing\n      // the error. In general, we shouldn't care about the error condition and just use\n      // the token (actual or dummy) to send requests.\n      _logWarn(\n        `Error while retrieving App Check token: ${appCheckTokenResult.error}`\n      );\n    }\n    return appCheckTokenResult?.token;\n  }\n}\n\n/**\n * Method to be used to cast down to our private implementation of Auth.\n * It will also handle unwrapping from the compat type if necessary\n *\n * @param auth Auth object passed in from developer\n */\nexport function _castAuth(auth: Auth): AuthInternal {\n  return getModularInstance(auth) as AuthInternal;\n}\n\n/** Helper class to wrap subscriber logic */\nclass Subscription<T> {\n  private observer: Observer<T | null> | null = null;\n  readonly addObserver: Subscribe<T | null> = createSubscribe(\n    observer => (this.observer = observer)\n  );\n\n  constructor(readonly auth: AuthInternal) {}\n\n  get next(): NextFn<T | null> {\n    _assert(this.observer, this.auth, AuthErrorCode.INTERNAL_ERROR);\n    return this.observer.next.bind(this.observer);\n  }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _performApiRequest,\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary\n} from '../index';\nimport { Auth } from '../../model/public_types';\n\n/**\n * Request object for fetching the password policy.\n */\nexport interface GetPasswordPolicyRequest {\n  tenantId?: string;\n}\n\n/**\n * Response object for fetching the password policy.\n */\nexport interface GetPasswordPolicyResponse {\n  customStrengthOptions: {\n    minPasswordLength?: number;\n    maxPasswordLength?: number;\n    containsLowercaseCharacter?: boolean;\n    containsUppercaseCharacter?: boolean;\n    containsNumericCharacter?: boolean;\n    containsNonAlphanumericCharacter?: boolean;\n  };\n  allowedNonAlphanumericCharacters?: string[];\n  enforcementState: string;\n  forceUpgradeOnSignin?: boolean;\n  schemaVersion: number;\n}\n\n/**\n * Fetches the password policy for the currently set tenant or the project if no tenant is set.\n *\n * @param auth Auth object.\n * @param request Password policy request.\n * @returns Password policy response.\n */\nexport async function _getPasswordPolicy(\n  auth: Auth,\n  request: GetPasswordPolicyRequest = {}\n): Promise<GetPasswordPolicyResponse> {\n  return _performApiRequest<\n    GetPasswordPolicyRequest,\n    GetPasswordPolicyResponse\n  >(\n    auth,\n    HttpMethod.GET,\n    Endpoint.GET_PASSWORD_POLICY,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface ExternalJSProvider {\n  loadJS(url: string): Promise<Event>;\n  recaptchaV2Script: string;\n  recaptchaEnterpriseScript: string;\n  gapiScript: string;\n}\n\nlet externalJSProvider: ExternalJSProvider = {\n  async loadJS() {\n    throw new Error('Unable to load external scripts');\n  },\n\n  recaptchaV2Script: '',\n  recaptchaEnterpriseScript: '',\n  gapiScript: ''\n};\n\nexport function _setExternalJSProvider(p: ExternalJSProvider): void {\n  externalJSProvider = p;\n}\n\nexport function _loadJS(url: string): Promise<Event> {\n  return externalJSProvider.loadJS(url);\n}\n\nexport function _recaptchaV2ScriptUrl(): string {\n  return externalJSProvider.recaptchaV2Script;\n}\n\nexport function _recaptchaEnterpriseScriptUrl(): string {\n  return externalJSProvider.recaptchaEnterpriseScript;\n}\n\nexport function _gapiScriptUrl(): string {\n  return externalJSProvider.gapiScript;\n}\n\nexport function _generateCallbackName(prefix: string): string {\n  return `__${prefix}${Math.floor(Math.random() * 1000000)}`;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\nimport { AuthInternal } from '../../model/auth';\nimport { RecaptchaParameters } from '../../model/public_types';\nimport {\n  Recaptcha,\n  GreCAPTCHATopLevel,\n  GreCAPTCHARenderOption,\n  GreCAPTCHA\n} from './recaptcha';\n\nexport const _SOLVE_TIME_MS = 500;\nexport const _EXPIRATION_TIME_MS = 60_000;\nexport const _WIDGET_ID_START = 1_000_000_000_000;\n\nexport interface Widget {\n  getResponse: () => string | null;\n  delete: () => void;\n  execute: () => void;\n}\n\nexport class MockReCaptcha implements Recaptcha {\n  private counter = _WIDGET_ID_START;\n  _widgets = new Map<number, Widget>();\n\n  constructor(private readonly auth: AuthInternal) {}\n\n  render(\n    container: string | HTMLElement,\n    parameters?: RecaptchaParameters\n  ): number {\n    const id = this.counter;\n    this._widgets.set(\n      id,\n      new MockWidget(container, this.auth.name, parameters || {})\n    );\n    this.counter++;\n    return id;\n  }\n\n  reset(optWidgetId?: number): void {\n    const id = optWidgetId || _WIDGET_ID_START;\n    void this._widgets.get(id)?.delete();\n    this._widgets.delete(id);\n  }\n\n  getResponse(optWidgetId?: number): string {\n    const id = optWidgetId || _WIDGET_ID_START;\n    return this._widgets.get(id)?.getResponse() || '';\n  }\n\n  async execute(optWidgetId?: number | string): Promise<string> {\n    const id: number = (optWidgetId as number) || _WIDGET_ID_START;\n    void this._widgets.get(id)?.execute();\n    return '';\n  }\n}\n\nexport class MockGreCAPTCHATopLevel implements GreCAPTCHATopLevel {\n  enterprise: GreCAPTCHA = new MockGreCAPTCHA();\n  ready(callback: () => void): void {\n    callback();\n  }\n\n  execute(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _siteKey: string,\n    _options: { action: string }\n  ): Promise<string> {\n    return Promise.resolve('token');\n  }\n  render(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _container: string | HTMLElement,\n    _parameters: GreCAPTCHARenderOption\n  ): string {\n    return '';\n  }\n}\n\nexport class MockGreCAPTCHA implements GreCAPTCHA {\n  ready(callback: () => void): void {\n    callback();\n  }\n\n  execute(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _siteKey: string,\n    _options: { action: string }\n  ): Promise<string> {\n    return Promise.resolve('token');\n  }\n  render(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _container: string | HTMLElement,\n    _parameters: GreCAPTCHARenderOption\n  ): string {\n    return '';\n  }\n}\n\nexport class MockWidget {\n  private readonly container: HTMLElement;\n  private readonly isVisible: boolean;\n  private timerId: number | null = null;\n  private deleted = false;\n  private responseToken: string | null = null;\n  private readonly clickHandler = (): void => {\n    this.execute();\n  };\n\n  constructor(\n    containerOrId: string | HTMLElement,\n    appName: string,\n    private readonly params: RecaptchaParameters\n  ) {\n    const container =\n      typeof containerOrId === 'string'\n        ? document.getElementById(containerOrId)\n        : containerOrId;\n    _assert(container, AuthErrorCode.ARGUMENT_ERROR, { appName });\n\n    this.container = container;\n    this.isVisible = this.params.size !== 'invisible';\n    if (this.isVisible) {\n      this.execute();\n    } else {\n      this.container.addEventListener('click', this.clickHandler);\n    }\n  }\n\n  getResponse(): string | null {\n    this.checkIfDeleted();\n    return this.responseToken;\n  }\n\n  delete(): void {\n    this.checkIfDeleted();\n    this.deleted = true;\n    if (this.timerId) {\n      clearTimeout(this.timerId);\n      this.timerId = null;\n    }\n    this.container.removeEventListener('click', this.clickHandler);\n  }\n\n  execute(): void {\n    this.checkIfDeleted();\n    if (this.timerId) {\n      return;\n    }\n\n    this.timerId = window.setTimeout(() => {\n      this.responseToken = generateRandomAlphaNumericString(50);\n      const { callback, 'expired-callback': expiredCallback } = this.params;\n      if (callback) {\n        try {\n          callback(this.responseToken);\n        } catch (e) {}\n      }\n\n      this.timerId = window.setTimeout(() => {\n        this.timerId = null;\n        this.responseToken = null;\n        if (expiredCallback) {\n          try {\n            expiredCallback();\n          } catch (e) {}\n        }\n\n        if (this.isVisible) {\n          this.execute();\n        }\n      }, _EXPIRATION_TIME_MS);\n    }, _SOLVE_TIME_MS);\n  }\n\n  private checkIfDeleted(): void {\n    if (this.deleted) {\n      throw new Error('reCAPTCHA mock was already deleted!');\n    }\n  }\n}\n\nfunction generateRandomAlphaNumericString(len: number): string {\n  const chars = [];\n  const allowedChars =\n    '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n  for (let i = 0; i < len; i++) {\n    chars.push(\n      allowedChars.charAt(Math.floor(Math.random() * allowedChars.length))\n    );\n  }\n  return chars.join('');\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEnterprise, RecaptchaConfig } from './recaptcha';\nimport { getRecaptchaConfig } from '../../api/authentication/recaptcha';\nimport {\n  RecaptchaClientType,\n  RecaptchaVersion,\n  RecaptchaActionName,\n  RecaptchaAuthProvider,\n  EnforcementState\n} from '../../api';\n\nimport { Auth } from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport * as jsHelpers from '../load_js';\nimport { AuthErrorCode } from '../../core/errors';\nimport { StartPhoneMfaEnrollmentRequest } from '../../api/account_management/mfa';\nimport { StartPhoneMfaSignInRequest } from '../../api/authentication/mfa';\nimport { MockGreCAPTCHATopLevel } from './recaptcha_mock';\nimport { Deferred } from '@firebase/util';\n\nexport const RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise';\nexport const FAKE_TOKEN = 'NO_RECAPTCHA';\n\nexport const RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME =\n  'onFirebaseAuthREInstanceReady';\n\ndeclare global {\n  interface Window {\n    [RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME]: () => void;\n  }\n}\nexport class RecaptchaEnterpriseVerifier {\n  /**\n   * Identifies the type of application verifier (e.g. \"recaptcha-enterprise\").\n   */\n  readonly type = RECAPTCHA_ENTERPRISE_VERIFIER_TYPE;\n\n  private readonly auth: AuthInternal;\n\n  /**\n   * Deferred that resolves when script tag has been injected onto the page\n   * and the script is ready (grecaptcha.ready() and script.onload are not\n   * reliable indicators, so this resolves when the global\n   * `window[RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME]()` callback provided to the recaptcha url param \"onload\"\n   * is triggered).\n   * As a static variable this is applied to all instances of the class.\n   * This will cause an error if users try to create multiple RecaptchaVerifiers\n   * with different Recaptcha Enterprise sitekeys, which should be an\n   * unuspported use case.\n   */\n  private static scriptInjectionDeferred: Deferred<void> | null = null;\n\n  /**\n   *\n   * @param authExtern - The corresponding Firebase {@link Auth} instance.\n   *\n   */\n  constructor(authExtern: Auth) {\n    this.auth = _castAuth(authExtern);\n  }\n\n  /**\n   * Executes the verification process.\n   *\n   * @returns A Promise for a token that can be used to assert the validity of a request.\n   */\n  async verify(\n    action: string = 'verify',\n    forceRefresh = false\n  ): Promise<string> {\n    async function retrieveSiteKey(auth: AuthInternal): Promise<string> {\n      if (!forceRefresh) {\n        if (auth.tenantId == null && auth._agentRecaptchaConfig != null) {\n          return auth._agentRecaptchaConfig.siteKey;\n        }\n        if (\n          auth.tenantId != null &&\n          auth._tenantRecaptchaConfigs[auth.tenantId] !== undefined\n        ) {\n          return auth._tenantRecaptchaConfigs[auth.tenantId].siteKey;\n        }\n      }\n\n      return new Promise<string>(async (resolve, reject) => {\n        getRecaptchaConfig(auth, {\n          clientType: RecaptchaClientType.WEB,\n          version: RecaptchaVersion.ENTERPRISE\n        })\n          .then(response => {\n            if (response.recaptchaKey === undefined) {\n              reject(new Error('recaptcha Enterprise site key undefined'));\n            } else {\n              const config = new RecaptchaConfig(response);\n              if (auth.tenantId == null) {\n                auth._agentRecaptchaConfig = config;\n              } else {\n                auth._tenantRecaptchaConfigs[auth.tenantId] = config;\n              }\n              return resolve(config.siteKey);\n            }\n          })\n          .catch(error => {\n            reject(error);\n          });\n      });\n    }\n\n    function retrieveRecaptchaToken(\n      siteKey: string,\n      resolve: (value: string | PromiseLike<string>) => void,\n      reject: (reason?: unknown) => void\n    ): void {\n      const grecaptcha = window.grecaptcha;\n      if (isEnterprise(grecaptcha)) {\n        grecaptcha.enterprise.ready(() => {\n          grecaptcha.enterprise\n            .execute(siteKey, { action })\n            .then(token => {\n              resolve(token);\n            })\n            .catch(() => {\n              resolve(FAKE_TOKEN);\n            });\n        });\n      } else {\n        reject(Error('No reCAPTCHA enterprise script loaded.'));\n      }\n    }\n\n    // Returns Promise for a mock token when appVerificationDisabledForTesting is true.\n    if (this.auth.settings.appVerificationDisabledForTesting) {\n      const mockRecaptcha = new MockGreCAPTCHATopLevel();\n      return mockRecaptcha.execute('siteKey', { action: 'verify' });\n    }\n\n    return new Promise<string>((resolve, reject) => {\n      retrieveSiteKey(this.auth)\n        .then(async siteKey => {\n          if (\n            !forceRefresh &&\n            isEnterprise(window.grecaptcha) &&\n            // If download has already been initiated, do not trigger another\n            // download, await the promise here.\n            RecaptchaEnterpriseVerifier.scriptInjectionDeferred\n          ) {\n            await RecaptchaEnterpriseVerifier.scriptInjectionDeferred.promise;\n            retrieveRecaptchaToken(siteKey, resolve, reject);\n          } else {\n            if (typeof window === 'undefined') {\n              reject(\n                new Error('RecaptchaVerifier is only supported in browser')\n              );\n              return;\n            }\n            let url = jsHelpers._recaptchaEnterpriseScriptUrl();\n            if (url.length !== 0) {\n              url +=\n                siteKey +\n                `&onload=${RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME}`;\n            }\n            // Existence of deferred indicates download has been initiated.\n            RecaptchaEnterpriseVerifier.scriptInjectionDeferred =\n              new Deferred();\n\n            /**\n             * Script attached to global window object that will be called\n             * when the ReCAPTCHA Enterprise instance is ready.\n             * grecaptcha.ready() is not reliable when there are multiple\n             * scripts on the page, and script.onload only indicates the\n             * script has downloaded, not that it has initialized.\n             */\n            window[RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME] = () => {\n              RecaptchaEnterpriseVerifier.scriptInjectionDeferred?.resolve();\n            };\n            jsHelpers\n              ._loadJS(url)\n              .then(\n                () =>\n                  RecaptchaEnterpriseVerifier.scriptInjectionDeferred?.promise\n              )\n              .then(() => {\n                retrieveRecaptchaToken(siteKey, resolve, reject);\n              })\n              .catch(error => {\n                reject(error);\n              });\n          }\n        })\n        .catch(error => {\n          reject(error);\n        });\n    });\n  }\n}\n\nexport async function injectRecaptchaFields<T extends object>(\n  auth: AuthInternal,\n  request: T,\n  action: RecaptchaActionName,\n  isCaptchaResp = false,\n  isFakeToken = false\n): Promise<T> {\n  const verifier = new RecaptchaEnterpriseVerifier(auth);\n  let captchaResponse;\n\n  if (isFakeToken) {\n    captchaResponse = FAKE_TOKEN;\n  } else {\n    try {\n      captchaResponse = await verifier.verify(action);\n    } catch (error) {\n      captchaResponse = await verifier.verify(action, true);\n    }\n  }\n\n  const newRequest = { ...request };\n  if (\n    action === RecaptchaActionName.MFA_SMS_ENROLLMENT ||\n    action === RecaptchaActionName.MFA_SMS_SIGNIN\n  ) {\n    if ('phoneEnrollmentInfo' in newRequest) {\n      const phoneNumber = (\n        newRequest as unknown as StartPhoneMfaEnrollmentRequest\n      ).phoneEnrollmentInfo.phoneNumber;\n      const recaptchaToken = (\n        newRequest as unknown as StartPhoneMfaEnrollmentRequest\n      ).phoneEnrollmentInfo.recaptchaToken;\n\n      Object.assign(newRequest, {\n        'phoneEnrollmentInfo': {\n          phoneNumber,\n          recaptchaToken,\n          captchaResponse,\n          'clientType': RecaptchaClientType.WEB,\n          'recaptchaVersion': RecaptchaVersion.ENTERPRISE\n        }\n      });\n    } else if ('phoneSignInInfo' in newRequest) {\n      const recaptchaToken = (\n        newRequest as unknown as StartPhoneMfaSignInRequest\n      ).phoneSignInInfo.recaptchaToken;\n\n      Object.assign(newRequest, {\n        'phoneSignInInfo': {\n          recaptchaToken,\n          captchaResponse,\n          'clientType': RecaptchaClientType.WEB,\n          'recaptchaVersion': RecaptchaVersion.ENTERPRISE\n        }\n      });\n    }\n    return newRequest;\n  }\n\n  if (!isCaptchaResp) {\n    Object.assign(newRequest, { captchaResponse });\n  } else {\n    Object.assign(newRequest, { 'captchaResp': captchaResponse });\n  }\n  Object.assign(newRequest, { 'clientType': RecaptchaClientType.WEB });\n  Object.assign(newRequest, {\n    'recaptchaVersion': RecaptchaVersion.ENTERPRISE\n  });\n  return newRequest;\n}\n\ntype ActionMethod<TRequest, TResponse> = (\n  auth: AuthInternal,\n  request: TRequest\n) => Promise<TResponse>;\n\nexport async function handleRecaptchaFlow<TRequest extends object, TResponse>(\n  authInstance: AuthInternal,\n  request: TRequest,\n  actionName: RecaptchaActionName,\n  actionMethod: ActionMethod<TRequest, TResponse>,\n  recaptchaAuthProvider: RecaptchaAuthProvider\n): Promise<TResponse> {\n  if (recaptchaAuthProvider === RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER) {\n    if (\n      authInstance\n        ._getRecaptchaConfig()\n        ?.isProviderEnabled(RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER)\n    ) {\n      const requestWithRecaptcha = await injectRecaptchaFields(\n        authInstance,\n        request,\n        actionName,\n        actionName === RecaptchaActionName.GET_OOB_CODE\n      );\n      return actionMethod(authInstance, requestWithRecaptcha);\n    } else {\n      return actionMethod(authInstance, request).catch(async error => {\n        if (error.code === `auth/${AuthErrorCode.MISSING_RECAPTCHA_TOKEN}`) {\n          console.log(\n            `${actionName} is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.`\n          );\n          const requestWithRecaptcha = await injectRecaptchaFields(\n            authInstance,\n            request,\n            actionName,\n            actionName === RecaptchaActionName.GET_OOB_CODE\n          );\n          return actionMethod(authInstance, requestWithRecaptcha);\n        } else {\n          return Promise.reject(error);\n        }\n      });\n    }\n  } else if (recaptchaAuthProvider === RecaptchaAuthProvider.PHONE_PROVIDER) {\n    if (\n      authInstance\n        ._getRecaptchaConfig()\n        ?.isProviderEnabled(RecaptchaAuthProvider.PHONE_PROVIDER)\n    ) {\n      const requestWithRecaptcha = await injectRecaptchaFields(\n        authInstance,\n        request,\n        actionName\n      );\n\n      return actionMethod(authInstance, requestWithRecaptcha).catch(\n        async error => {\n          if (\n            authInstance\n              ._getRecaptchaConfig()\n              ?.getProviderEnforcementState(\n                RecaptchaAuthProvider.PHONE_PROVIDER\n              ) === EnforcementState.AUDIT\n          ) {\n            // AUDIT mode\n            if (\n              error.code === `auth/${AuthErrorCode.MISSING_RECAPTCHA_TOKEN}` ||\n              error.code === `auth/${AuthErrorCode.INVALID_APP_CREDENTIAL}`\n            ) {\n              console.log(\n                `Failed to verify with reCAPTCHA Enterprise. Automatically triggering the reCAPTCHA v2 flow to complete the ${actionName} flow.`\n              );\n              // reCAPTCHA Enterprise token is missing or reCAPTCHA Enterprise token\n              // check fails.\n              // Fallback to reCAPTCHA v2 flow.\n              const requestWithRecaptchaFields = await injectRecaptchaFields(\n                authInstance,\n                request,\n                actionName,\n                false, // isCaptchaResp\n                true // isFakeToken\n              );\n              // This will call the PhoneApiCaller to fetch and inject reCAPTCHA v2 token.\n              return actionMethod(authInstance, requestWithRecaptchaFields);\n            }\n          }\n          // ENFORCE mode or AUDIT mode with any other error.\n          return Promise.reject(error);\n        }\n      );\n    } else {\n      // Do reCAPTCHA v2 flow.\n      const requestWithRecaptchaFields = await injectRecaptchaFields(\n        authInstance,\n        request,\n        actionName,\n        false, // isCaptchaResp\n        true // isFakeToken\n      );\n\n      // This will call the PhoneApiCaller to fetch and inject v2 token.\n      return actionMethod(authInstance, requestWithRecaptchaFields);\n    }\n  } else {\n    return Promise.reject(\n      recaptchaAuthProvider + ' provider is not supported.'\n    );\n  }\n}\n\nexport async function _initializeRecaptchaConfig(auth: Auth): Promise<void> {\n  const authInternal = _castAuth(auth);\n\n  const response = await getRecaptchaConfig(authInternal, {\n    clientType: RecaptchaClientType.WEB,\n    version: RecaptchaVersion.ENTERPRISE\n  });\n\n  const config = new RecaptchaConfig(response);\n  if (authInternal.tenantId == null) {\n    authInternal._agentRecaptchaConfig = config;\n  } else {\n    authInternal._tenantRecaptchaConfigs[authInternal.tenantId] = config;\n  }\n\n  if (config.isAnyProviderEnabled()) {\n    const verifier = new RecaptchaEnterpriseVerifier(authInternal);\n    void verifier.verify();\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getProvider, FirebaseApp } from '@firebase/app';\nimport { deepEqual } from '@firebase/util';\nimport { Auth, Dependencies } from '../../model/public_types';\n\nimport { AuthErrorCode } from '../errors';\nimport { PersistenceInternal } from '../persistence';\nimport { _fail } from '../util/assert';\nimport { _getInstance } from '../util/instantiator';\nimport { AuthImpl } from './auth_impl';\n\n/**\n * Initializes an {@link Auth} instance with fine-grained control over\n * {@link Dependencies}.\n *\n * @remarks\n *\n * This function allows more control over the {@link Auth} instance than\n * {@link getAuth}. `getAuth` uses platform-specific defaults to supply\n * the {@link Dependencies}. In general, `getAuth` is the easiest way to\n * initialize Auth and works for most use cases. Use `initializeAuth` if you\n * need control over which persistence layer is used, or to minimize bundle\n * size if you're not using either `signInWithPopup` or `signInWithRedirect`.\n *\n * For example, if your app only uses anonymous accounts and you only want\n * accounts saved for the current session, initialize `Auth` with:\n *\n * ```js\n * const auth = initializeAuth(app, {\n *   persistence: browserSessionPersistence,\n *   popupRedirectResolver: undefined,\n * });\n * ```\n *\n * @public\n */\nexport function initializeAuth(app: FirebaseApp, deps?: Dependencies): Auth {\n  const provider = _getProvider(app, 'auth');\n\n  if (provider.isInitialized()) {\n    const auth = provider.getImmediate() as AuthImpl;\n    const initialOptions = provider.getOptions() as Dependencies;\n    if (deepEqual(initialOptions, deps ?? {})) {\n      return auth;\n    } else {\n      _fail(auth, AuthErrorCode.ALREADY_INITIALIZED);\n    }\n  }\n\n  const auth = provider.initialize({ options: deps }) as AuthImpl;\n\n  return auth;\n}\n\nexport function _initializeAuthInstance(\n  auth: AuthImpl,\n  deps?: Dependencies\n): void {\n  const persistence = deps?.persistence || [];\n  const hierarchy = (\n    Array.isArray(persistence) ? persistence : [persistence]\n  ).map<PersistenceInternal>(_getInstance);\n  if (deps?.errorMap) {\n    auth._updateErrorMap(deps.errorMap);\n  }\n\n  // This promise is intended to float; auth initialization happens in the\n  // background, meanwhile the auth object may be used by the app.\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  auth._initializeWithPersistence(hierarchy, deps?.popupRedirectResolver);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Auth } from '../../model/public_types';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _castAuth } from './auth_impl';\nimport { deepEqual, isCloudWorkstation, pingServer } from '@firebase/util';\n\n/**\n * Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production\n * Firebase Auth services.\n *\n * @remarks\n * This must be called synchronously immediately following the first call to\n * {@link initializeAuth}.  Do not use with production credentials as emulator\n * traffic is not encrypted.\n *\n *\n * @example\n * ```javascript\n * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true });\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099').\n * @param options - Optional. `options.disableWarnings` defaults to `false`. Set it to\n * `true` to disable the warning banner attached to the DOM.\n *\n * @public\n */\nexport function connectAuthEmulator(\n  auth: Auth,\n  url: string,\n  options?: { disableWarnings: boolean }\n): void {\n  const authInternal = _castAuth(auth);\n  _assert(\n    /^https?:\\/\\//.test(url),\n    authInternal,\n    AuthErrorCode.INVALID_EMULATOR_SCHEME\n  );\n\n  const disableWarnings = !!options?.disableWarnings;\n\n  const protocol = extractProtocol(url);\n  const { host, port } = extractHostAndPort(url);\n  const portStr = port === null ? '' : `:${port}`;\n\n  // Always replace path with \"/\" (even if input url had no path at all, or had a different one).\n  const emulator = { url: `${protocol}//${host}${portStr}/` };\n  const emulatorConfig = Object.freeze({\n    host,\n    port,\n    protocol: protocol.replace(':', ''),\n    options: Object.freeze({ disableWarnings })\n  });\n\n  // There are a few scenarios to guard against if the Auth instance has already started:\n  if (!authInternal._canInitEmulator) {\n    // Applications may not initialize the emulator for the first time if Auth has already started\n    // to make network requests.\n    _assert(\n      authInternal.config.emulator && authInternal.emulatorConfig,\n      authInternal,\n      AuthErrorCode.EMULATOR_CONFIG_FAILED\n    );\n\n    // Applications may not alter the configuration of the emulator (aka pass a different config)\n    // once Auth has started to make network requests.\n    _assert(\n      deepEqual(emulator, authInternal.config.emulator) &&\n        deepEqual(emulatorConfig, authInternal.emulatorConfig),\n      authInternal,\n      AuthErrorCode.EMULATOR_CONFIG_FAILED\n    );\n\n    // It's valid, however, to invoke connectAuthEmulator() after Auth has started making\n    // connections, so long as the config matches the existing config. This results in a no-op.\n    return;\n  }\n\n  authInternal.config.emulator = emulator;\n  authInternal.emulatorConfig = emulatorConfig;\n  authInternal.settings.appVerificationDisabledForTesting = true;\n\n  // Workaround to get cookies in Firebase Studio\n  if (isCloudWorkstation(host)) {\n    void pingServer(`${protocol}//${host}${portStr}`);\n  } else if (!disableWarnings) {\n    emitEmulatorWarning();\n  }\n}\n\nfunction extractProtocol(url: string): string {\n  const protocolEnd = url.indexOf(':');\n  return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1);\n}\n\nfunction extractHostAndPort(url: string): {\n  host: string;\n  port: number | null;\n} {\n  const protocol = extractProtocol(url);\n  const authority = /(\\/\\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #.\n  if (!authority) {\n    return { host: '', port: null };\n  }\n  const hostAndPort = authority[2].split('@').pop() || ''; // Strip out \"username:password@\".\n  const bracketedIPv6 = /^(\\[[^\\]]+\\])(:|$)/.exec(hostAndPort);\n  if (bracketedIPv6) {\n    const host = bracketedIPv6[1];\n    return { host, port: parsePort(hostAndPort.substr(host.length + 1)) };\n  } else {\n    const [host, port] = hostAndPort.split(':');\n    return { host, port: parsePort(port) };\n  }\n}\n\nfunction parsePort(portStr: string): number | null {\n  if (!portStr) {\n    return null;\n  }\n  const port = Number(portStr);\n  if (isNaN(port)) {\n    return null;\n  }\n  return port;\n}\n\nfunction emitEmulatorWarning(): void {\n  function attachBanner(): void {\n    const el = document.createElement('p');\n    const sty = el.style;\n    el.innerText =\n      'Running in emulator mode. Do not use with production credentials.';\n    sty.position = 'fixed';\n    sty.width = '100%';\n    sty.backgroundColor = '#ffffff';\n    sty.border = '.1em solid #000000';\n    sty.color = '#b50000';\n    sty.bottom = '0px';\n    sty.left = '0px';\n    sty.margin = '0px';\n    sty.zIndex = '10000';\n    sty.textAlign = 'center';\n    el.classList.add('firebase-emulator-warning');\n    document.body.appendChild(el);\n  }\n\n  if (typeof console !== 'undefined' && typeof console.info === 'function') {\n    console.info(\n      'WARNING: You are using the Auth Emulator,' +\n        ' which is intended for local testing only.  Do not use with' +\n        ' production credentials.'\n    );\n  }\n  if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n    if (document.readyState === 'loading') {\n      window.addEventListener('DOMContentLoaded', attachBanner);\n    } else {\n      attachBanner();\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { debugFail } from '../util/assert';\n\n/**\n * Interface that represents the credentials returned by an {@link AuthProvider}.\n *\n * @remarks\n * Implementations specify the details about each auth provider's credential requirements.\n *\n * @public\n */\nexport class AuthCredential {\n  /** @internal */\n  protected constructor(\n    /**\n     * The authentication provider ID for the credential.\n     *\n     * @remarks\n     * For example, 'facebook.com', or 'google.com'.\n     */\n    readonly providerId: string,\n    /**\n     * The authentication sign in method for the credential.\n     *\n     * @remarks\n     * For example, {@link SignInMethod}.EMAIL_PASSWORD, or\n     * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method\n     * identifier as returned in {@link fetchSignInMethodsForEmail}.\n     */\n    readonly signInMethod: string\n  ) {}\n\n  /**\n   * Returns a JSON-serializable representation of this object.\n   *\n   * @returns a JSON-serializable representation of this object.\n   */\n  toJSON(): object {\n    return debugFail('not implemented');\n  }\n\n  /** @internal */\n  _getIdTokenResponse(_auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n    return debugFail('not implemented');\n  }\n  /** @internal */\n  _linkToIdToken(\n    _auth: AuthInternal,\n    _idToken: string\n  ): Promise<IdTokenResponse> {\n    return debugFail('not implemented');\n  }\n  /** @internal */\n  _getReauthenticationResolver(_auth: AuthInternal): Promise<IdTokenResponse> {\n    return debugFail('not implemented');\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeOperation, Auth } from '../../model/public_types';\n\nimport {\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary,\n  _performApiRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { MfaEnrollment } from './mfa';\nimport { SignUpRequest, SignUpResponse } from '../authentication/sign_up';\n\nexport interface ResetPasswordRequest {\n  oobCode: string;\n  newPassword?: string;\n  tenantId?: string;\n}\n\nexport interface ResetPasswordResponse {\n  email: string;\n  newEmail?: string;\n  requestType?: ActionCodeOperation;\n  mfaInfo?: MfaEnrollment;\n}\n\nexport async function resetPassword(\n  auth: Auth,\n  request: ResetPasswordRequest\n): Promise<ResetPasswordResponse> {\n  return _performApiRequest<ResetPasswordRequest, ResetPasswordResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.RESET_PASSWORD,\n    _addTidIfNecessary(auth, request)\n  );\n}\nexport interface UpdateEmailPasswordRequest {\n  idToken: string;\n  returnSecureToken?: boolean;\n  email?: string;\n  password?: string;\n}\n\nexport interface UpdateEmailPasswordResponse extends IdTokenResponse {}\n\nexport async function updateEmailPassword(\n  auth: Auth,\n  request: UpdateEmailPasswordRequest\n): Promise<UpdateEmailPasswordResponse> {\n  return _performApiRequest<\n    UpdateEmailPasswordRequest,\n    UpdateEmailPasswordResponse\n  >(auth, HttpMethod.POST, Endpoint.SET_ACCOUNT_INFO, request);\n}\n\n// Used for linking an email/password account to an existing idToken. Uses the same request/response\n// format as updateEmailPassword.\nexport async function linkEmailPassword(\n  auth: Auth,\n  request: SignUpRequest\n): Promise<SignUpResponse> {\n  return _performApiRequest<SignUpRequest, SignUpResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_UP,\n    request\n  );\n}\n\nexport interface ApplyActionCodeRequest {\n  oobCode: string;\n  tenantId?: string;\n}\n\nexport interface ApplyActionCodeResponse {}\n\nexport async function applyActionCode(\n  auth: Auth,\n  request: ApplyActionCodeRequest\n): Promise<ApplyActionCodeResponse> {\n  return _performApiRequest<ApplyActionCodeRequest, ApplyActionCodeResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SET_ACCOUNT_INFO,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeOperation, Auth } from '../../model/public_types';\n\nimport {\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _addTidIfNecessary,\n  _performApiRequest,\n  _performSignInRequest\n} from '../index';\nimport { IdToken, IdTokenResponse } from '../../model/id_token';\n\nexport interface SignInWithPasswordRequest {\n  returnSecureToken?: boolean;\n  email: string;\n  password: string;\n  tenantId?: string;\n  captchaResponse?: string;\n  clientType?: RecaptchaClientType;\n  recaptchaVersion?: RecaptchaVersion;\n}\n\nexport interface SignInWithPasswordResponse extends IdTokenResponse {\n  email: string;\n  displayName: string;\n}\n\nexport async function signInWithPassword(\n  auth: Auth,\n  request: SignInWithPasswordRequest\n): Promise<SignInWithPasswordResponse> {\n  return _performSignInRequest<\n    SignInWithPasswordRequest,\n    SignInWithPasswordResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_PASSWORD,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface GetOobCodeRequest {\n  email?: string; // Everything except VERIFY_AND_CHANGE_EMAIL\n  continueUrl?: string;\n  iOSBundleId?: string;\n  iosAppStoreId?: string;\n  androidPackageName?: string;\n  androidInstallApp?: boolean;\n  androidMinimumVersionCode?: string;\n  canHandleCodeInApp?: boolean;\n  dynamicLinkDomain?: string;\n  tenantId?: string;\n  targetProjectid?: string;\n  linkDomain?: string;\n}\n\nexport interface VerifyEmailRequest extends GetOobCodeRequest {\n  requestType: ActionCodeOperation.VERIFY_EMAIL;\n  idToken: IdToken;\n}\n\nexport interface PasswordResetRequest extends GetOobCodeRequest {\n  requestType: ActionCodeOperation.PASSWORD_RESET;\n  email: string;\n  captchaResp?: string;\n  clientType?: RecaptchaClientType;\n  recaptchaVersion?: RecaptchaVersion;\n}\n\nexport interface EmailSignInRequest extends GetOobCodeRequest {\n  requestType: ActionCodeOperation.EMAIL_SIGNIN;\n  email: string;\n  captchaResp?: string;\n  clientType?: RecaptchaClientType;\n  recaptchaVersion?: RecaptchaVersion;\n}\n\nexport interface VerifyAndChangeEmailRequest extends GetOobCodeRequest {\n  requestType: ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL;\n  idToken: IdToken;\n  newEmail: string;\n}\n\ninterface GetOobCodeResponse {\n  email: string;\n}\n\nexport interface VerifyEmailResponse extends GetOobCodeResponse {}\nexport interface PasswordResetResponse extends GetOobCodeResponse {}\nexport interface EmailSignInResponse extends GetOobCodeResponse {}\nexport interface VerifyAndChangeEmailResponse extends GetOobCodeRequest {}\n\nasync function sendOobCode(\n  auth: Auth,\n  request: GetOobCodeRequest\n): Promise<GetOobCodeResponse> {\n  return _performApiRequest<GetOobCodeRequest, GetOobCodeResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SEND_OOB_CODE,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport async function sendEmailVerification(\n  auth: Auth,\n  request: VerifyEmailRequest\n): Promise<VerifyEmailResponse> {\n  return sendOobCode(auth, request);\n}\n\nexport async function sendPasswordResetEmail(\n  auth: Auth,\n  request: PasswordResetRequest\n): Promise<PasswordResetResponse> {\n  return sendOobCode(auth, request);\n}\n\nexport async function sendSignInLinkToEmail(\n  auth: Auth,\n  request: EmailSignInRequest\n): Promise<EmailSignInResponse> {\n  return sendOobCode(auth, request);\n}\n\nexport async function verifyAndChangeEmail(\n  auth: Auth,\n  request: VerifyAndChangeEmailRequest\n): Promise<VerifyAndChangeEmailResponse> {\n  return sendOobCode(auth, request);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\nimport { linkEmailPassword } from '../../api/account_management/email_and_password';\nimport {\n  signInWithPassword,\n  SignInWithPasswordRequest\n} from '../../api/authentication/email_and_password';\nimport {\n  signInWithEmailLink,\n  signInWithEmailLinkForLinking\n} from '../../api/authentication/email_link';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from '../util/assert';\nimport { AuthCredential } from './auth_credential';\nimport { handleRecaptchaFlow } from '../../platform_browser/recaptcha/recaptcha_enterprise_verifier';\nimport {\n  RecaptchaActionName,\n  RecaptchaClientType,\n  RecaptchaAuthProvider\n} from '../../api';\nimport { SignUpRequest } from '../../api/authentication/sign_up';\n/**\n * Interface that represents the credentials returned by {@link EmailAuthProvider} for\n * {@link ProviderId}.PASSWORD\n *\n * @remarks\n * Covers both {@link SignInMethod}.EMAIL_PASSWORD and\n * {@link SignInMethod}.EMAIL_LINK.\n *\n * @public\n */\nexport class EmailAuthCredential extends AuthCredential {\n  /** @internal */\n  private constructor(\n    /** @internal */\n    readonly _email: string,\n    /** @internal */\n    readonly _password: string,\n    signInMethod: SignInMethod,\n    /** @internal */\n    readonly _tenantId: string | null = null\n  ) {\n    super(ProviderId.PASSWORD, signInMethod);\n  }\n\n  /** @internal */\n  static _fromEmailAndPassword(\n    email: string,\n    password: string\n  ): EmailAuthCredential {\n    return new EmailAuthCredential(\n      email,\n      password,\n      SignInMethod.EMAIL_PASSWORD\n    );\n  }\n\n  /** @internal */\n  static _fromEmailAndCode(\n    email: string,\n    oobCode: string,\n    tenantId: string | null = null\n  ): EmailAuthCredential {\n    return new EmailAuthCredential(\n      email,\n      oobCode,\n      SignInMethod.EMAIL_LINK,\n      tenantId\n    );\n  }\n\n  /** {@inheritdoc AuthCredential.toJSON} */\n  toJSON(): object {\n    return {\n      email: this._email,\n      password: this._password,\n      signInMethod: this.signInMethod,\n      tenantId: this._tenantId\n    };\n  }\n\n  /**\n   * Static method to deserialize a JSON representation of an object into an {@link  AuthCredential}.\n   *\n   * @param json - Either `object` or the stringified representation of the object. When string is\n   * provided, `JSON.parse` would be called first.\n   *\n   * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\n   */\n  static fromJSON(json: object | string): EmailAuthCredential | null {\n    const obj = typeof json === 'string' ? JSON.parse(json) : json;\n    if (obj?.email && obj?.password) {\n      if (obj.signInMethod === SignInMethod.EMAIL_PASSWORD) {\n        return this._fromEmailAndPassword(obj.email, obj.password);\n      } else if (obj.signInMethod === SignInMethod.EMAIL_LINK) {\n        return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId);\n      }\n    }\n    return null;\n  }\n\n  /** @internal */\n  async _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n    switch (this.signInMethod) {\n      case SignInMethod.EMAIL_PASSWORD:\n        const request: SignInWithPasswordRequest = {\n          returnSecureToken: true,\n          email: this._email,\n          password: this._password,\n          clientType: RecaptchaClientType.WEB\n        };\n        return handleRecaptchaFlow(\n          auth,\n          request,\n          RecaptchaActionName.SIGN_IN_WITH_PASSWORD,\n          signInWithPassword,\n          RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER\n        );\n      case SignInMethod.EMAIL_LINK:\n        return signInWithEmailLink(auth, {\n          email: this._email,\n          oobCode: this._password\n        });\n      default:\n        _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n    }\n  }\n\n  /** @internal */\n  async _linkToIdToken(\n    auth: AuthInternal,\n    idToken: string\n  ): Promise<IdTokenResponse> {\n    switch (this.signInMethod) {\n      case SignInMethod.EMAIL_PASSWORD:\n        const request: SignUpRequest = {\n          idToken,\n          returnSecureToken: true,\n          email: this._email,\n          password: this._password,\n          clientType: RecaptchaClientType.WEB\n        };\n        return handleRecaptchaFlow(\n          auth,\n          request,\n          RecaptchaActionName.SIGN_UP_PASSWORD,\n          linkEmailPassword,\n          RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER\n        );\n      case SignInMethod.EMAIL_LINK:\n        return signInWithEmailLinkForLinking(auth, {\n          idToken,\n          email: this._email,\n          oobCode: this._password\n        });\n      default:\n        _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n    }\n  }\n\n  /** @internal */\n  _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n    return this._getIdTokenResponse(auth);\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _performSignInRequest,\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithEmailLinkRequest {\n  email: string;\n  oobCode: string;\n  tenantId?: string;\n}\n\nexport interface SignInWithEmailLinkResponse extends IdTokenResponse {\n  email: string;\n  isNewUser: boolean;\n}\n\nexport async function signInWithEmailLink(\n  auth: Auth,\n  request: SignInWithEmailLinkRequest\n): Promise<SignInWithEmailLinkResponse> {\n  return _performSignInRequest<\n    SignInWithEmailLinkRequest,\n    SignInWithEmailLinkResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_EMAIL_LINK,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface SignInWithEmailLinkForLinkingRequest\n  extends SignInWithEmailLinkRequest {\n  idToken: string;\n}\n\nexport async function signInWithEmailLinkForLinking(\n  auth: Auth,\n  request: SignInWithEmailLinkForLinkingRequest\n): Promise<SignInWithEmailLinkResponse> {\n  return _performSignInRequest<\n    SignInWithEmailLinkForLinkingRequest,\n    SignInWithEmailLinkResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_EMAIL_LINK,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary,\n  _performSignInRequest\n} from '../index';\nimport { IdToken, IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithIdpRequest {\n  requestUri: string;\n  postBody?: string;\n  sessionId?: string;\n  tenantId?: string;\n  returnSecureToken: boolean;\n  returnIdpCredential?: boolean;\n  idToken?: IdToken;\n  autoCreate?: boolean;\n  pendingToken?: string;\n}\n\n/**\n * @internal\n */\nexport interface SignInWithIdpResponse extends IdTokenResponse {\n  oauthAccessToken?: string;\n  oauthTokenSecret?: string;\n  nonce?: string;\n  oauthIdToken?: string;\n  pendingToken?: string;\n}\n\nexport async function signInWithIdp(\n  auth: Auth,\n  request: SignInWithIdpRequest\n): Promise<SignInWithIdpResponse> {\n  return _performSignInRequest<SignInWithIdpRequest, SignInWithIdpResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_IDP,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { querystring } from '@firebase/util';\n\nimport {\n  signInWithIdp,\n  SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from '../util/assert';\nimport { AuthCredential } from './auth_credential';\n\nconst IDP_REQUEST_URI = 'http://localhost';\n\nexport interface OAuthCredentialParams {\n  // OAuth 2 uses either id token or access token\n  idToken?: string | null;\n  accessToken?: string | null;\n\n  // These fields are used with OAuth 1\n  oauthToken?: string;\n  secret?: string;\n  oauthTokenSecret?: string;\n\n  // Nonce is only set if pendingToken is not present\n  nonce?: string;\n  pendingToken?: string;\n\n  // Utilities\n  providerId: string;\n  signInMethod: string;\n}\n\n/**\n * Represents the OAuth credentials returned by an {@link OAuthProvider}.\n *\n * @remarks\n * Implementations specify the details about each auth provider's credential requirements.\n *\n * @public\n */\nexport class OAuthCredential extends AuthCredential {\n  /**\n   * The OAuth ID token associated with the credential if it belongs to an OIDC provider,\n   * such as `google.com`.\n   * @readonly\n   */\n  idToken?: string;\n  /**\n   * The OAuth access token associated with the credential if it belongs to an\n   * {@link OAuthProvider}, such as `facebook.com`, `twitter.com`, etc.\n   * @readonly\n   */\n  accessToken?: string;\n  /**\n   * The OAuth access token secret associated with the credential if it belongs to an OAuth 1.0\n   * provider, such as `twitter.com`.\n   * @readonly\n   */\n  secret?: string;\n\n  private nonce?: string;\n  private pendingToken: string | null = null;\n\n  /** @internal */\n  static _fromParams(params: OAuthCredentialParams): OAuthCredential {\n    const cred = new OAuthCredential(params.providerId, params.signInMethod);\n\n    if (params.idToken || params.accessToken) {\n      // OAuth 2 and either ID token or access token.\n      if (params.idToken) {\n        cred.idToken = params.idToken;\n      }\n\n      if (params.accessToken) {\n        cred.accessToken = params.accessToken;\n      }\n\n      // Add nonce if available and no pendingToken is present.\n      if (params.nonce && !params.pendingToken) {\n        cred.nonce = params.nonce;\n      }\n\n      if (params.pendingToken) {\n        cred.pendingToken = params.pendingToken;\n      }\n    } else if (params.oauthToken && params.oauthTokenSecret) {\n      // OAuth 1 and OAuth token with token secret\n      cred.accessToken = params.oauthToken;\n      cred.secret = params.oauthTokenSecret;\n    } else {\n      _fail(AuthErrorCode.ARGUMENT_ERROR);\n    }\n\n    return cred;\n  }\n\n  /** {@inheritdoc AuthCredential.toJSON}  */\n  toJSON(): object {\n    return {\n      idToken: this.idToken,\n      accessToken: this.accessToken,\n      secret: this.secret,\n      nonce: this.nonce,\n      pendingToken: this.pendingToken,\n      providerId: this.providerId,\n      signInMethod: this.signInMethod\n    };\n  }\n\n  /**\n   * Static method to deserialize a JSON representation of an object into an\n   * {@link  AuthCredential}.\n   *\n   * @param json - Input can be either Object or the stringified representation of the object.\n   * When string is provided, JSON.parse would be called first.\n   *\n   * @returns If the JSON input does not represent an {@link  AuthCredential}, null is returned.\n   */\n  static fromJSON(json: string | object): OAuthCredential | null {\n    const obj = typeof json === 'string' ? JSON.parse(json) : json;\n    const { providerId, signInMethod, ...rest }: OAuthCredentialParams = obj;\n    if (!providerId || !signInMethod) {\n      return null;\n    }\n\n    const cred = new OAuthCredential(providerId, signInMethod);\n    cred.idToken = rest.idToken || undefined;\n    cred.accessToken = rest.accessToken || undefined;\n    cred.secret = rest.secret;\n    cred.nonce = rest.nonce;\n    cred.pendingToken = rest.pendingToken || null;\n    return cred;\n  }\n\n  /** @internal */\n  _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    return signInWithIdp(auth, request);\n  }\n\n  /** @internal */\n  _linkToIdToken(\n    auth: AuthInternal,\n    idToken: string\n  ): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    request.idToken = idToken;\n    return signInWithIdp(auth, request);\n  }\n\n  /** @internal */\n  _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    request.autoCreate = false;\n    return signInWithIdp(auth, request);\n  }\n\n  private buildRequest(): SignInWithIdpRequest {\n    const request: SignInWithIdpRequest = {\n      requestUri: IDP_REQUEST_URI,\n      returnSecureToken: true\n    };\n\n    if (this.pendingToken) {\n      request.pendingToken = this.pendingToken;\n    } else {\n      const postBody: Record<string, string> = {};\n      if (this.idToken) {\n        postBody['id_token'] = this.idToken;\n      }\n      if (this.accessToken) {\n        postBody['access_token'] = this.accessToken;\n      }\n      if (this.secret) {\n        postBody['oauth_token_secret'] = this.secret;\n      }\n\n      postBody['providerId'] = this.providerId;\n      if (this.nonce && !this.pendingToken) {\n        postBody['nonce'] = this.nonce;\n      }\n\n      request.postBody = querystring(postBody);\n    }\n\n    return request;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _addTidIfNecessary,\n  _makeTaggedError,\n  _performApiRequest,\n  _performSignInRequest\n} from '../index';\nimport { AuthErrorCode } from '../../core/errors';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { ServerError, ServerErrorMap } from '../errors';\nimport { Auth } from '../../model/public_types';\n\nexport interface SendPhoneVerificationCodeRequest {\n  phoneNumber: string;\n  // reCAPTCHA v2 token\n  recaptchaToken?: string;\n  tenantId?: string;\n  // reCAPTCHA Enterprise token\n  captchaResponse?: string;\n  clientType?: RecaptchaClientType;\n  recaptchaVersion?: RecaptchaVersion;\n}\n\nexport interface SendPhoneVerificationCodeResponse {\n  sessionInfo: string;\n}\n\nexport async function sendPhoneVerificationCode(\n  auth: Auth,\n  request: SendPhoneVerificationCodeRequest\n): Promise<SendPhoneVerificationCodeResponse> {\n  return _performApiRequest<\n    SendPhoneVerificationCodeRequest,\n    SendPhoneVerificationCodeResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SEND_VERIFICATION_CODE,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\n/**\n * @internal\n */\nexport interface SignInWithPhoneNumberRequest {\n  temporaryProof?: string;\n  phoneNumber?: string;\n  sessionInfo?: string;\n  code?: string;\n  tenantId?: string;\n}\n\nexport interface LinkWithPhoneNumberRequest\n  extends SignInWithPhoneNumberRequest {\n  idToken: string;\n}\n\n/**\n * @internal\n */\nexport interface SignInWithPhoneNumberResponse extends IdTokenResponse {\n  temporaryProof?: string;\n  phoneNumber?: string;\n}\n\nexport async function signInWithPhoneNumber(\n  auth: Auth,\n  request: SignInWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n  return _performSignInRequest<\n    SignInWithPhoneNumberRequest,\n    SignInWithPhoneNumberResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport async function linkWithPhoneNumber(\n  auth: Auth,\n  request: LinkWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n  const response = await _performSignInRequest<\n    LinkWithPhoneNumberRequest,\n    SignInWithPhoneNumberResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n    _addTidIfNecessary(auth, request)\n  );\n  if (response.temporaryProof) {\n    throw _makeTaggedError(auth, AuthErrorCode.NEED_CONFIRMATION, response);\n  }\n  return response;\n}\n\ninterface VerifyPhoneNumberForExistingRequest\n  extends SignInWithPhoneNumberRequest {\n  operation: 'REAUTH';\n}\n\nconst VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_: Partial<\n  ServerErrorMap<ServerError>\n> = {\n  [ServerError.USER_NOT_FOUND]: AuthErrorCode.USER_DELETED\n};\n\nexport async function verifyPhoneNumberForExisting(\n  auth: Auth,\n  request: SignInWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n  const apiRequest: VerifyPhoneNumberForExistingRequest = {\n    ...request,\n    operation: 'REAUTH'\n  };\n  return _performSignInRequest<\n    VerifyPhoneNumberForExistingRequest,\n    SignInWithPhoneNumberResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n    _addTidIfNecessary(auth, apiRequest),\n    VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport {\n  linkWithPhoneNumber,\n  signInWithPhoneNumber,\n  SignInWithPhoneNumberRequest,\n  verifyPhoneNumberForExisting\n} from '../../api/authentication/sms';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthCredential } from './auth_credential';\n\nexport interface PhoneAuthCredentialParameters {\n  verificationId?: string;\n  verificationCode?: string;\n  phoneNumber?: string;\n  temporaryProof?: string;\n}\n\n/**\n * Represents the credentials returned by {@link PhoneAuthProvider}.\n *\n * @public\n */\nexport class PhoneAuthCredential extends AuthCredential {\n  private constructor(private readonly params: PhoneAuthCredentialParameters) {\n    super(ProviderId.PHONE, SignInMethod.PHONE);\n  }\n\n  /** @internal */\n  static _fromVerification(\n    verificationId: string,\n    verificationCode: string\n  ): PhoneAuthCredential {\n    return new PhoneAuthCredential({ verificationId, verificationCode });\n  }\n\n  /** @internal */\n  static _fromTokenResponse(\n    phoneNumber: string,\n    temporaryProof: string\n  ): PhoneAuthCredential {\n    return new PhoneAuthCredential({ phoneNumber, temporaryProof });\n  }\n\n  /** @internal */\n  _getIdTokenResponse(auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n    return signInWithPhoneNumber(auth, this._makeVerificationRequest());\n  }\n\n  /** @internal */\n  _linkToIdToken(\n    auth: AuthInternal,\n    idToken: string\n  ): Promise<IdTokenResponse> {\n    return linkWithPhoneNumber(auth, {\n      idToken,\n      ...this._makeVerificationRequest()\n    });\n  }\n\n  /** @internal */\n  _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n    return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest());\n  }\n\n  /** @internal */\n  _makeVerificationRequest(): SignInWithPhoneNumberRequest {\n    const { temporaryProof, phoneNumber, verificationId, verificationCode } =\n      this.params;\n    if (temporaryProof && phoneNumber) {\n      return { temporaryProof, phoneNumber };\n    }\n\n    return {\n      sessionInfo: verificationId,\n      code: verificationCode\n    };\n  }\n\n  /** {@inheritdoc AuthCredential.toJSON} */\n  toJSON(): object {\n    const obj: Record<string, string> = {\n      providerId: this.providerId\n    };\n    if (this.params.phoneNumber) {\n      obj.phoneNumber = this.params.phoneNumber;\n    }\n    if (this.params.temporaryProof) {\n      obj.temporaryProof = this.params.temporaryProof;\n    }\n    if (this.params.verificationCode) {\n      obj.verificationCode = this.params.verificationCode;\n    }\n    if (this.params.verificationId) {\n      obj.verificationId = this.params.verificationId;\n    }\n\n    return obj;\n  }\n\n  /** Generates a phone credential based on a plain object or a JSON string. */\n  static fromJSON(json: object | string): PhoneAuthCredential | null {\n    if (typeof json === 'string') {\n      json = JSON.parse(json);\n    }\n\n    const { verificationId, verificationCode, phoneNumber, temporaryProof } =\n      json as { [key: string]: string };\n    if (\n      !verificationCode &&\n      !verificationId &&\n      !phoneNumber &&\n      !temporaryProof\n    ) {\n      return null;\n    }\n\n    return new PhoneAuthCredential({\n      verificationId,\n      verificationCode,\n      phoneNumber,\n      temporaryProof\n    });\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { extractQuerystring, querystringDecode } from '@firebase/util';\nimport { ActionCodeOperation } from '../model/public_types';\nimport { AuthErrorCode } from './errors';\nimport { _assert } from './util/assert';\n\n/**\n * Enums for fields in URL query string.\n *\n * @enum {string}\n */\nconst enum QueryField {\n  API_KEY = 'apiKey',\n  CODE = 'oobCode',\n  CONTINUE_URL = 'continueUrl',\n  LANGUAGE_CODE = 'lang',\n  MODE = 'mode',\n  TENANT_ID = 'tenantId'\n}\n\n/**\n * Maps the mode string in action code URL to Action Code Info operation.\n *\n * @param mode\n */\nfunction parseMode(mode: string | null): ActionCodeOperation | null {\n  switch (mode) {\n    case 'recoverEmail':\n      return ActionCodeOperation.RECOVER_EMAIL;\n    case 'resetPassword':\n      return ActionCodeOperation.PASSWORD_RESET;\n    case 'signIn':\n      return ActionCodeOperation.EMAIL_SIGNIN;\n    case 'verifyEmail':\n      return ActionCodeOperation.VERIFY_EMAIL;\n    case 'verifyAndChangeEmail':\n      return ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL;\n    case 'revertSecondFactorAddition':\n      return ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION;\n    default:\n      return null;\n  }\n}\n\n/**\n * Helper to parse FDL links\n *\n * @param url\n */\nfunction parseDeepLink(url: string): string {\n  const link = querystringDecode(extractQuerystring(url))['link'];\n\n  // Double link case (automatic redirect).\n  const doubleDeepLink = link\n    ? querystringDecode(extractQuerystring(link))['deep_link_id']\n    : null;\n  // iOS custom scheme links.\n  const iOSDeepLink = querystringDecode(extractQuerystring(url))[\n    'deep_link_id'\n  ];\n  const iOSDoubleDeepLink = iOSDeepLink\n    ? querystringDecode(extractQuerystring(iOSDeepLink))['link']\n    : null;\n  return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url;\n}\n\n/**\n * A utility class to parse email action URLs such as password reset, email verification,\n * email link sign in, etc.\n *\n * @public\n */\nexport class ActionCodeURL {\n  /**\n   * The API key of the email action link.\n   */\n  readonly apiKey: string;\n  /**\n   * The action code of the email action link.\n   */\n  readonly code: string;\n  /**\n   * The continue URL of the email action link. Null if not provided.\n   */\n  readonly continueUrl: string | null;\n  /**\n   * The language code of the email action link. Null if not provided.\n   */\n  readonly languageCode: string | null;\n  /**\n   * The action performed by the email action link. It returns from one of the types from\n   * {@link ActionCodeInfo}\n   */\n  readonly operation: string;\n  /**\n   * The tenant ID of the email action link. Null if the email action is from the parent project.\n   */\n  readonly tenantId: string | null;\n\n  /**\n   * @param actionLink - The link from which to extract the URL.\n   * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\n   *\n   * @internal\n   */\n  constructor(actionLink: string) {\n    const searchParams = querystringDecode(extractQuerystring(actionLink));\n    const apiKey = searchParams[QueryField.API_KEY] ?? null;\n    const code = searchParams[QueryField.CODE] ?? null;\n    const operation = parseMode(searchParams[QueryField.MODE] ?? null);\n    // Validate API key, code and mode.\n    _assert(apiKey && code && operation, AuthErrorCode.ARGUMENT_ERROR);\n    this.apiKey = apiKey;\n    this.operation = operation;\n    this.code = code;\n    this.continueUrl = searchParams[QueryField.CONTINUE_URL] ?? null;\n    this.languageCode = searchParams[QueryField.LANGUAGE_CODE] ?? null;\n    this.tenantId = searchParams[QueryField.TENANT_ID] ?? null;\n  }\n\n  /**\n   * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid,\n   * otherwise returns null.\n   *\n   * @param link  - The email action link string.\n   * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\n   *\n   * @public\n   */\n  static parseLink(link: string): ActionCodeURL | null {\n    const actionLink = parseDeepLink(link);\n    try {\n      return new ActionCodeURL(actionLink);\n    } catch {\n      return null;\n    }\n  }\n}\n\n/**\n * Parses the email action link string and returns an {@link ActionCodeURL} if\n * the link is valid, otherwise returns null.\n *\n * @public\n */\nexport function parseActionCodeURL(link: string): ActionCodeURL | null {\n  return ActionCodeURL.parseLink(link);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, SignInMethod } from '../../model/enums';\nimport { AuthProvider } from '../../model/public_types';\n\nimport { ActionCodeURL } from '../action_code_url';\nimport { EmailAuthCredential } from '../credentials/email';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\n\n/**\n * Provider for generating {@link EmailAuthCredential}.\n *\n * @public\n */\nexport class EmailAuthProvider implements AuthProvider {\n  /**\n   * Always set to {@link ProviderId}.PASSWORD, even for email link.\n   */\n  static readonly PROVIDER_ID: 'password' = ProviderId.PASSWORD;\n  /**\n   * Always set to {@link SignInMethod}.EMAIL_PASSWORD.\n   */\n  static readonly EMAIL_PASSWORD_SIGN_IN_METHOD: 'password' =\n    SignInMethod.EMAIL_PASSWORD;\n  /**\n   * Always set to {@link SignInMethod}.EMAIL_LINK.\n   */\n  static readonly EMAIL_LINK_SIGN_IN_METHOD: 'emailLink' =\n    SignInMethod.EMAIL_LINK;\n  /**\n   * Always set to {@link ProviderId}.PASSWORD, even for email link.\n   */\n  readonly providerId = EmailAuthProvider.PROVIDER_ID;\n\n  /**\n   * Initialize an {@link AuthCredential} using an email and password.\n   *\n   * @example\n   * ```javascript\n   * const authCredential = EmailAuthProvider.credential(email, password);\n   * const userCredential = await signInWithCredential(auth, authCredential);\n   * ```\n   *\n   * @example\n   * ```javascript\n   * const userCredential = await signInWithEmailAndPassword(auth, email, password);\n   * ```\n   *\n   * @param email - Email address.\n   * @param password - User account password.\n   * @returns The auth provider credential.\n   */\n  static credential(email: string, password: string): EmailAuthCredential {\n    return EmailAuthCredential._fromEmailAndPassword(email, password);\n  }\n\n  /**\n   * Initialize an {@link AuthCredential} using an email and an email link after a sign in with\n   * email link operation.\n   *\n   * @example\n   * ```javascript\n   * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink);\n   * const userCredential = await signInWithCredential(auth, authCredential);\n   * ```\n   *\n   * @example\n   * ```javascript\n   * await sendSignInLinkToEmail(auth, email);\n   * // Obtain emailLink from user.\n   * const userCredential = await signInWithEmailLink(auth, email, emailLink);\n   * ```\n   *\n   * @param auth - The {@link Auth} instance used to verify the link.\n   * @param email - Email address.\n   * @param emailLink - Sign-in email link.\n   * @returns - The auth provider credential.\n   */\n  static credentialWithLink(\n    email: string,\n    emailLink: string\n  ): EmailAuthCredential {\n    const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\n    _assert(actionCodeUrl, AuthErrorCode.ARGUMENT_ERROR);\n\n    return EmailAuthCredential._fromEmailAndCode(\n      email,\n      actionCodeUrl.code,\n      actionCodeUrl.tenantId\n    );\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthProvider } from '../../model/public_types';\n\n/**\n * Map of OAuth Custom Parameters.\n *\n * @public\n */\nexport type CustomParameters = Record<string, string>;\n\n/**\n * The base class for all Federated providers (OAuth (including OIDC), SAML).\n *\n * This class is not meant to be instantiated directly.\n *\n * @public\n */\nexport abstract class FederatedAuthProvider implements AuthProvider {\n  /** @internal */\n  defaultLanguageCode: string | null = null;\n  /** @internal */\n  private customParameters: CustomParameters = {};\n\n  /**\n   * Constructor for generic OAuth providers.\n   *\n   * @param providerId - Provider for which credentials should be generated.\n   */\n  constructor(readonly providerId: string) {}\n\n  /**\n   * Set the language gode.\n   *\n   * @param languageCode - language code\n   */\n  setDefaultLanguage(languageCode: string | null): void {\n    this.defaultLanguageCode = languageCode;\n  }\n\n  /**\n   * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in\n   * operations.\n   *\n   * @remarks\n   * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`,\n   * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored.\n   *\n   * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request.\n   */\n  setCustomParameters(customOAuthParameters: CustomParameters): AuthProvider {\n    this.customParameters = customOAuthParameters;\n    return this;\n  }\n\n  /**\n   * Retrieve the current list of {@link CustomParameters}.\n   */\n  getCustomParameters(): CustomParameters {\n    return this.customParameters;\n  }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthProvider, UserCredential } from '../../model/public_types';\n\nimport { _assert } from '../util/assert';\nimport { AuthErrorCode } from '../errors';\n\nimport { OAuthCredential, OAuthCredentialParams } from '../credentials/oauth';\nimport { UserCredentialInternal } from '../../model/user';\nimport { FirebaseError } from '@firebase/util';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { SignInWithIdpResponse } from '../../../internal';\nimport { FederatedAuthProvider } from './federated';\n\n/**\n * Defines the options for initializing an {@link OAuthCredential}.\n *\n * @remarks\n * For ID tokens with nonce claim, the raw nonce has to also be provided.\n *\n * @public\n */\nexport interface OAuthCredentialOptions {\n  /**\n   * The OAuth ID token used to initialize the {@link OAuthCredential}.\n   */\n  idToken?: string;\n  /**\n   * The OAuth access token used to initialize the {@link OAuthCredential}.\n   */\n  accessToken?: string;\n  /**\n   * The raw nonce associated with the ID token.\n   *\n   * @remarks\n   * It is required when an ID token with a nonce field is provided. The SHA-256 hash of the\n   * raw nonce must match the nonce field in the ID token.\n   */\n  rawNonce?: string;\n}\n\n/**\n * Common code to all OAuth providers. This is separate from the\n * {@link OAuthProvider} so that child providers (like\n * {@link GoogleAuthProvider}) don't inherit the `credential` instance method.\n * Instead, they rely on a static `credential` method.\n */\nexport abstract class BaseOAuthProvider\n  extends FederatedAuthProvider\n  implements AuthProvider\n{\n  /** @internal */\n  private scopes: string[] = [];\n\n  /**\n   * Add an OAuth scope to the credential.\n   *\n   * @param scope - Provider OAuth scope to add.\n   */\n  addScope(scope: string): AuthProvider {\n    // If not already added, add scope to list.\n    if (!this.scopes.includes(scope)) {\n      this.scopes.push(scope);\n    }\n    return this;\n  }\n\n  /**\n   * Retrieve the current list of OAuth scopes.\n   */\n  getScopes(): string[] {\n    return [...this.scopes];\n  }\n}\n\n/**\n * Provider for generating generic {@link OAuthCredential}.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new OAuthProvider('google.com');\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('profile');\n * provider.addScope('email');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n *   // This is the signed-in user\n *   const user = result.user;\n *   // This gives you a OAuth Access Token for the provider.\n *   const credential = provider.credentialFromResult(auth, result);\n *   const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new OAuthProvider('google.com');\n * provider.addScope('profile');\n * provider.addScope('email');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a OAuth Access Token for the provider.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n * @public\n */\nexport class OAuthProvider extends BaseOAuthProvider {\n  /**\n   * Creates an {@link OAuthCredential} from a JSON string or a plain object.\n   * @param json - A plain object or a JSON string\n   */\n  static credentialFromJSON(json: object | string): OAuthCredential {\n    const obj = typeof json === 'string' ? JSON.parse(json) : json;\n    _assert(\n      'providerId' in obj && 'signInMethod' in obj,\n      AuthErrorCode.ARGUMENT_ERROR\n    );\n    return OAuthCredential._fromParams(obj);\n  }\n\n  /**\n   * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token.\n   *\n   * @remarks\n   * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of\n   * the raw nonce must match the nonce field in the ID token.\n   *\n   * @example\n   * ```javascript\n   * // `googleUser` from the onsuccess Google Sign In callback.\n   * // Initialize a generate OAuth provider with a `google.com` providerId.\n   * const provider = new OAuthProvider('google.com');\n   * const credential = provider.credential({\n   *   idToken: googleUser.getAuthResponse().id_token,\n   * });\n   * const result = await signInWithCredential(credential);\n   * ```\n   *\n   * @param params - Either the options object containing the ID token, access token and raw nonce\n   * or the ID token string.\n   */\n  credential(params: OAuthCredentialOptions): OAuthCredential {\n    return this._credential({ ...params, nonce: params.rawNonce });\n  }\n\n  /** An internal credential method that accepts more permissive options */\n  private _credential(\n    params: Omit<OAuthCredentialParams, 'signInMethod' | 'providerId'>\n  ): OAuthCredential {\n    _assert(params.idToken || params.accessToken, AuthErrorCode.ARGUMENT_ERROR);\n    // For OAuthCredential, sign in method is same as providerId.\n    return OAuthCredential._fromParams({\n      ...params,\n      providerId: this.providerId,\n      signInMethod: this.providerId\n    });\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): OAuthCredential | null {\n    return OAuthProvider.oauthCredentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): OAuthCredential | null {\n    return OAuthProvider.oauthCredentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  private static oauthCredentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): OAuthCredential | null {\n    if (!tokenResponse) {\n      return null;\n    }\n\n    const {\n      oauthIdToken,\n      oauthAccessToken,\n      oauthTokenSecret,\n      pendingToken,\n      nonce,\n      providerId\n    } = tokenResponse as SignInWithIdpResponse;\n    if (\n      !oauthAccessToken &&\n      !oauthTokenSecret &&\n      !oauthIdToken &&\n      !pendingToken\n    ) {\n      return null;\n    }\n\n    if (!providerId) {\n      return null;\n    }\n\n    try {\n      return new OAuthProvider(providerId)._credential({\n        idToken: oauthIdToken,\n        accessToken: oauthAccessToken,\n        nonce,\n        pendingToken\n      });\n    } catch (e) {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserCredential } from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('user_birthday');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n *   // This is the signed-in user\n *   const user = result.user;\n *   // This gives you a Facebook Access Token.\n *   const credential = FacebookAuthProvider.credentialFromResult(result);\n *   const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * provider.addScope('user_birthday');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = FacebookAuthProvider.credentialFromResult(result);\n * const token = credential.accessToken;\n * ```\n *\n * @public\n */\nexport class FacebookAuthProvider extends BaseOAuthProvider {\n  /** Always set to {@link SignInMethod}.FACEBOOK. */\n  static readonly FACEBOOK_SIGN_IN_METHOD: 'facebook.com' =\n    SignInMethod.FACEBOOK;\n  /** Always set to {@link ProviderId}.FACEBOOK. */\n  static readonly PROVIDER_ID: 'facebook.com' = ProviderId.FACEBOOK;\n\n  constructor() {\n    super(ProviderId.FACEBOOK);\n  }\n\n  /**\n   * Creates a credential for Facebook.\n   *\n   * @example\n   * ```javascript\n   * // `event` from the Facebook auth.authResponseChange callback.\n   * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken);\n   * const result = await signInWithCredential(credential);\n   * ```\n   *\n   * @param accessToken - Facebook access token.\n   */\n  static credential(accessToken: string): OAuthCredential {\n    return OAuthCredential._fromParams({\n      providerId: FacebookAuthProvider.PROVIDER_ID,\n      signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD,\n      accessToken\n    });\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): OAuthCredential | null {\n    return FacebookAuthProvider.credentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): OAuthCredential | null {\n    return FacebookAuthProvider.credentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  private static credentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): OAuthCredential | null {\n    if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\n      return null;\n    }\n\n    if (!tokenResponse.oauthAccessToken) {\n      return null;\n    }\n\n    try {\n      return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken);\n    } catch {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserCredential } from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GOOGLE.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new GoogleAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('profile');\n * provider.addScope('email');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n *   // This is the signed-in user\n *   const user = result.user;\n *   // This gives you a Google Access Token.\n *   const credential = GoogleAuthProvider.credentialFromResult(result);\n *   const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new GoogleAuthProvider();\n * provider.addScope('profile');\n * provider.addScope('email');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Google Access Token.\n * const credential = GoogleAuthProvider.credentialFromResult(result);\n * const token = credential.accessToken;\n * ```\n *\n * @public\n */\nexport class GoogleAuthProvider extends BaseOAuthProvider {\n  /** Always set to {@link SignInMethod}.GOOGLE. */\n  static readonly GOOGLE_SIGN_IN_METHOD: 'google.com' = SignInMethod.GOOGLE;\n  /** Always set to {@link ProviderId}.GOOGLE. */\n  static readonly PROVIDER_ID: 'google.com' = ProviderId.GOOGLE;\n\n  constructor() {\n    super(ProviderId.GOOGLE);\n    this.addScope('profile');\n  }\n\n  /**\n   * Creates a credential for Google. At least one of ID token and access token is required.\n   *\n   * @example\n   * ```javascript\n   * // \\`googleUser\\` from the onsuccess Google Sign In callback.\n   * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);\n   * const result = await signInWithCredential(credential);\n   * ```\n   *\n   * @param idToken - Google ID token.\n   * @param accessToken - Google access token.\n   */\n  static credential(\n    idToken?: string | null,\n    accessToken?: string | null\n  ): OAuthCredential {\n    return OAuthCredential._fromParams({\n      providerId: GoogleAuthProvider.PROVIDER_ID,\n      signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD,\n      idToken,\n      accessToken\n    });\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): OAuthCredential | null {\n    return GoogleAuthProvider.credentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): OAuthCredential | null {\n    return GoogleAuthProvider.credentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  private static credentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): OAuthCredential | null {\n    if (!tokenResponse) {\n      return null;\n    }\n\n    const { oauthIdToken, oauthAccessToken } =\n      tokenResponse as SignInWithIdpResponse;\n    if (!oauthIdToken && !oauthAccessToken) {\n      // This could be an oauth 1 credential or a phone credential\n      return null;\n    }\n\n    try {\n      return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken);\n    } catch {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserCredential } from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB.\n *\n * @remarks\n * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use\n * the {@link signInWithPopup} handler:\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new GithubAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('repo');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n *   // This is the signed-in user\n *   const user = result.user;\n *   // This gives you a GitHub Access Token.\n *   const credential = GithubAuthProvider.credentialFromResult(result);\n *   const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new GithubAuthProvider();\n * provider.addScope('repo');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a GitHub Access Token.\n * const credential = GithubAuthProvider.credentialFromResult(result);\n * const token = credential.accessToken;\n * ```\n * @public\n */\nexport class GithubAuthProvider extends BaseOAuthProvider {\n  /** Always set to {@link SignInMethod}.GITHUB. */\n  static readonly GITHUB_SIGN_IN_METHOD: 'github.com' = SignInMethod.GITHUB;\n  /** Always set to {@link ProviderId}.GITHUB. */\n  static readonly PROVIDER_ID: 'github.com' = ProviderId.GITHUB;\n\n  constructor() {\n    super(ProviderId.GITHUB);\n  }\n\n  /**\n   * Creates a credential for GitHub.\n   *\n   * @param accessToken - GitHub access token.\n   */\n  static credential(accessToken: string): OAuthCredential {\n    return OAuthCredential._fromParams({\n      providerId: GithubAuthProvider.PROVIDER_ID,\n      signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD,\n      accessToken\n    });\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): OAuthCredential | null {\n    return GithubAuthProvider.credentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): OAuthCredential | null {\n    return GithubAuthProvider.credentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  private static credentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): OAuthCredential | null {\n    if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\n      return null;\n    }\n\n    if (!tokenResponse.oauthAccessToken) {\n      return null;\n    }\n\n    try {\n      return GithubAuthProvider.credential(tokenResponse.oauthAccessToken);\n    } catch {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Represents the SAML credentials returned by an {@link SAMLAuthProvider}.\n *\n * @public\n */\n\nimport {\n  signInWithIdp,\n  SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthCredential } from './auth_credential';\n\nconst IDP_REQUEST_URI = 'http://localhost';\n\n/**\n * @public\n */\nexport class SAMLAuthCredential extends AuthCredential {\n  /** @internal */\n  private constructor(\n    providerId: string,\n    private readonly pendingToken: string\n  ) {\n    super(providerId, providerId);\n  }\n\n  /** @internal */\n  _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    return signInWithIdp(auth, request);\n  }\n\n  /** @internal */\n  _linkToIdToken(\n    auth: AuthInternal,\n    idToken: string\n  ): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    request.idToken = idToken;\n    return signInWithIdp(auth, request);\n  }\n\n  /** @internal */\n  _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n    const request = this.buildRequest();\n    request.autoCreate = false;\n    return signInWithIdp(auth, request);\n  }\n\n  /** {@inheritdoc AuthCredential.toJSON}  */\n  toJSON(): object {\n    return {\n      signInMethod: this.signInMethod,\n      providerId: this.providerId,\n      pendingToken: this.pendingToken\n    };\n  }\n\n  /**\n   * Static method to deserialize a JSON representation of an object into an\n   * {@link  AuthCredential}.\n   *\n   * @param json - Input can be either Object or the stringified representation of the object.\n   * When string is provided, JSON.parse would be called first.\n   *\n   * @returns If the JSON input does not represent an {@link  AuthCredential}, null is returned.\n   */\n  static fromJSON(json: string | object): SAMLAuthCredential | null {\n    const obj = typeof json === 'string' ? JSON.parse(json) : json;\n    const { providerId, signInMethod, pendingToken }: Record<string, string> =\n      obj;\n    if (\n      !providerId ||\n      !signInMethod ||\n      !pendingToken ||\n      providerId !== signInMethod\n    ) {\n      return null;\n    }\n\n    return new SAMLAuthCredential(providerId, pendingToken);\n  }\n\n  /**\n   * Helper static method to avoid exposing the constructor to end users.\n   *\n   * @internal\n   */\n  static _create(providerId: string, pendingToken: string): SAMLAuthCredential {\n    return new SAMLAuthCredential(providerId, pendingToken);\n  }\n\n  private buildRequest(): SignInWithIdpRequest {\n    return {\n      requestUri: IDP_REQUEST_URI,\n      returnSecureToken: true,\n      pendingToken: this.pendingToken\n    };\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredential } from '../../model/public_types';\nimport { UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { SAMLAuthCredential } from '../credentials/saml';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { FederatedAuthProvider } from './federated';\n\nconst SAML_PROVIDER_PREFIX = 'saml.';\n\n/**\n * An {@link AuthProvider} for SAML.\n *\n * @public\n */\nexport class SAMLAuthProvider extends FederatedAuthProvider {\n  /**\n   * Constructor. The providerId must start with \"saml.\"\n   * @param providerId - SAML provider ID.\n   */\n  constructor(providerId: string) {\n    _assert(\n      providerId.startsWith(SAML_PROVIDER_PREFIX),\n      AuthErrorCode.ARGUMENT_ERROR\n    );\n    super(providerId);\n  }\n\n  /**\n   * Generates an {@link AuthCredential} from a {@link UserCredential} after a\n   * successful SAML flow completes.\n   *\n   * @remarks\n   *\n   * For example, to get an {@link AuthCredential}, you could write the\n   * following code:\n   *\n   * ```js\n   * const userCredential = await signInWithPopup(auth, samlProvider);\n   * const credential = SAMLAuthProvider.credentialFromResult(userCredential);\n   * ```\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): AuthCredential | null {\n    return SAMLAuthProvider.samlCredentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): AuthCredential | null {\n    return SAMLAuthProvider.samlCredentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  /**\n   * Creates an {@link AuthCredential} from a JSON string or a plain object.\n   * @param json - A plain object or a JSON string\n   */\n  static credentialFromJSON(json: string | object): AuthCredential {\n    const credential = SAMLAuthCredential.fromJSON(json);\n    _assert(credential, AuthErrorCode.ARGUMENT_ERROR);\n    return credential;\n  }\n\n  private static samlCredentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): SAMLAuthCredential | null {\n    if (!tokenResponse) {\n      return null;\n    }\n\n    const { pendingToken, providerId } = tokenResponse as SignInWithIdpResponse;\n\n    if (!pendingToken || !providerId) {\n      return null;\n    }\n\n    try {\n      return SAMLAuthCredential._create(providerId, pendingToken);\n    } catch (e) {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @license\n * Copyright 2020 Twitter LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserCredential } from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\nimport { ProviderId, SignInMethod } from '../../model/enums';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new TwitterAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n *   // This is the signed-in user\n *   const user = result.user;\n *   // This gives you a Twitter Access Token and Secret.\n *   const credential = TwitterAuthProvider.credentialFromResult(result);\n *   const token = credential.accessToken;\n *   const secret = credential.secret;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new TwitterAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Twitter Access Token and Secret.\n * const credential = TwitterAuthProvider.credentialFromResult(result);\n * const token = credential.accessToken;\n * const secret = credential.secret;\n * ```\n *\n * @public\n */\nexport class TwitterAuthProvider extends BaseOAuthProvider {\n  /** Always set to {@link SignInMethod}.TWITTER. */\n  static readonly TWITTER_SIGN_IN_METHOD: 'twitter.com' = SignInMethod.TWITTER;\n  /** Always set to {@link ProviderId}.TWITTER. */\n  static readonly PROVIDER_ID: 'twitter.com' = ProviderId.TWITTER;\n\n  constructor() {\n    super(ProviderId.TWITTER);\n  }\n\n  /**\n   * Creates a credential for Twitter.\n   *\n   * @param token - Twitter access token.\n   * @param secret - Twitter secret.\n   */\n  static credential(token: string, secret: string): OAuthCredential {\n    return OAuthCredential._fromParams({\n      providerId: TwitterAuthProvider.PROVIDER_ID,\n      signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD,\n      oauthToken: token,\n      oauthTokenSecret: secret\n    });\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromResult(\n    userCredential: UserCredential\n  ): OAuthCredential | null {\n    return TwitterAuthProvider.credentialFromTaggedObject(\n      userCredential as UserCredentialInternal\n    );\n  }\n\n  /**\n   * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n   * thrown during a sign-in, link, or reauthenticate operation.\n   *\n   * @param userCredential - The user credential.\n   */\n  static credentialFromError(error: FirebaseError): OAuthCredential | null {\n    return TwitterAuthProvider.credentialFromTaggedObject(\n      (error.customData || {}) as TaggedWithTokenResponse\n    );\n  }\n\n  private static credentialFromTaggedObject({\n    _tokenResponse: tokenResponse\n  }: TaggedWithTokenResponse): OAuthCredential | null {\n    if (!tokenResponse) {\n      return null;\n    }\n    const { oauthAccessToken, oauthTokenSecret } =\n      tokenResponse as SignInWithIdpResponse;\n    if (!oauthAccessToken || !oauthTokenSecret) {\n      return null;\n    }\n\n    try {\n      return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret);\n    } catch {\n      return null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _addTidIfNecessary,\n  _performSignInRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignUpRequest {\n  idToken?: string;\n  returnSecureToken?: boolean;\n  email?: string;\n  password?: string;\n  tenantId?: string;\n  captchaResponse?: string;\n  clientType?: RecaptchaClientType;\n  recaptchaVersion?: RecaptchaVersion;\n}\n\nexport interface SignUpResponse extends IdTokenResponse {\n  displayName?: string;\n  email?: string;\n}\n\nexport async function signUp(\n  auth: Auth,\n  request: SignUpRequest\n): Promise<SignUpResponse> {\n  return _performSignInRequest<SignUpRequest, SignUpResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_UP,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { UserImpl } from './user_impl';\nimport { AuthInternal } from '../../model/auth';\nimport { OperationType, ProviderId } from '../../model/enums';\n\ninterface UserCredentialParams {\n  readonly user: UserInternal;\n  readonly providerId: ProviderId | string | null;\n  readonly _tokenResponse?: PhoneOrOauthTokenResponse;\n  readonly operationType: OperationType;\n}\n\nexport class UserCredentialImpl\n  implements UserCredentialInternal, UserCredentialParams\n{\n  readonly user: UserInternal;\n  readonly providerId: ProviderId | string | null;\n  readonly _tokenResponse: PhoneOrOauthTokenResponse | undefined;\n  readonly operationType: OperationType;\n\n  constructor(params: UserCredentialParams) {\n    this.user = params.user;\n    this.providerId = params.providerId;\n    this._tokenResponse = params._tokenResponse;\n    this.operationType = params.operationType;\n  }\n\n  static async _fromIdTokenResponse(\n    auth: AuthInternal,\n    operationType: OperationType,\n    idTokenResponse: IdTokenResponse,\n    isAnonymous: boolean = false\n  ): Promise<UserCredentialInternal> {\n    const user = await UserImpl._fromIdTokenResponse(\n      auth,\n      idTokenResponse,\n      isAnonymous\n    );\n    const providerId = providerIdForResponse(idTokenResponse);\n    const userCred = new UserCredentialImpl({\n      user,\n      providerId,\n      _tokenResponse: idTokenResponse,\n      operationType\n    });\n    return userCred;\n  }\n\n  static async _forOperation(\n    user: UserInternal,\n    operationType: OperationType,\n    response: PhoneOrOauthTokenResponse\n  ): Promise<UserCredentialImpl> {\n    await user._updateTokensIfNecessary(response, /* reload */ true);\n    const providerId = providerIdForResponse(response);\n    return new UserCredentialImpl({\n      user,\n      providerId,\n      _tokenResponse: response,\n      operationType\n    });\n  }\n}\n\nfunction providerIdForResponse(\n  response: IdTokenResponse\n): ProviderId | string | null {\n  if (response.providerId) {\n    return response.providerId;\n  }\n\n  if ('phoneNumber' in response) {\n    return ProviderId.PHONE;\n  }\n\n  return null;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth, UserCredential } from '../../model/public_types';\nimport { signUp } from '../../api/authentication/sign_up';\nimport { UserInternal } from '../../model/user';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\nimport { OperationType } from '../../model/enums';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n\n/**\n * Asynchronously signs in as an anonymous user.\n *\n * @remarks\n * If there is already an anonymous user signed in, that user will be returned; otherwise, a\n * new anonymous user identity will be created and returned.\n *\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @param auth - The {@link Auth} instance.\n *\n * @public\n */\nexport async function signInAnonymously(auth: Auth): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const authInternal = _castAuth(auth);\n  await authInternal._initializationPromise;\n  if (authInternal.currentUser?.isAnonymous) {\n    // If an anonymous user is already signed in, no need to sign them in again.\n    return new UserCredentialImpl({\n      user: authInternal.currentUser as UserInternal,\n      providerId: null,\n      operationType: OperationType.SIGN_IN\n    });\n  }\n  const response = await signUp(authInternal, {\n    returnSecureToken: true\n  });\n  const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n    authInternal,\n    OperationType.SIGN_IN,\n    response,\n    true\n  );\n  await authInternal._updateCurrentUser(userCredential.user);\n  return userCredential;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MultiFactorError as MultiFactorErrorPublic } from '../model/public_types';\nimport { FirebaseError } from '@firebase/util';\nimport { AuthInternal } from '../model/auth';\nimport { IdTokenResponse } from '../model/id_token';\nimport { AuthErrorCode } from '../core/errors';\nimport { UserInternal } from '../model/user';\nimport { AuthCredential } from '../core/credentials';\nimport { IdTokenMfaResponse } from '../api/authentication/mfa';\nimport { OperationType } from '../model/enums';\n\nexport type MultiFactorErrorData = MultiFactorErrorPublic['customData'] & {\n  _serverResponse: IdTokenMfaResponse;\n};\n\nexport class MultiFactorError\n  extends FirebaseError\n  implements MultiFactorErrorPublic\n{\n  readonly customData: MultiFactorErrorData;\n\n  private constructor(\n    auth: AuthInternal,\n    error: FirebaseError,\n    readonly operationType: OperationType,\n    readonly user?: UserInternal\n  ) {\n    super(error.code, error.message);\n    // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n    Object.setPrototypeOf(this, MultiFactorError.prototype);\n    this.customData = {\n      appName: auth.name,\n      tenantId: auth.tenantId ?? undefined,\n      _serverResponse: error.customData!._serverResponse as IdTokenMfaResponse,\n      operationType\n    };\n  }\n\n  static _fromErrorAndOperation(\n    auth: AuthInternal,\n    error: FirebaseError,\n    operationType: OperationType,\n    user?: UserInternal\n  ): MultiFactorError {\n    return new MultiFactorError(auth, error, operationType, user);\n  }\n}\n\nexport function _processCredentialSavingMfaContextIfNecessary(\n  auth: AuthInternal,\n  operationType: OperationType,\n  credential: AuthCredential,\n  user?: UserInternal\n): Promise<IdTokenResponse> {\n  const idTokenProvider =\n    operationType === OperationType.REAUTHENTICATE\n      ? credential._getReauthenticationResolver(auth)\n      : credential._getIdTokenResponse(auth);\n\n  return idTokenProvider.catch(error => {\n    if (error.code === `auth/${AuthErrorCode.MFA_REQUIRED}`) {\n      throw MultiFactorError._fromErrorAndOperation(\n        auth,\n        error,\n        operationType,\n        user\n      );\n    }\n\n    throw error;\n  });\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ProviderAssociatedObject {\n  providerId?: string;\n}\n\n/**\n * Takes a set of UserInfo provider data and converts it to a set of names\n */\nexport function providerDataAsNames<T extends ProviderAssociatedObject>(\n  providerData: T[]\n): Set<string> {\n  return new Set(\n    providerData\n      .map(({ providerId }) => providerId)\n      .filter(pid => !!pid) as string[]\n  );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../../model/public_types';\n\nimport { deleteLinkedAccounts } from '../../api/account_management/account';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { providerDataAsNames } from '../util/providers';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { _reloadWithoutSaving } from './reload';\nimport { UserCredentialImpl } from './user_credential_impl';\nimport { getModularInstance } from '@firebase/util';\nimport { OperationType, ProviderId } from '../../model/enums';\n\n/**\n * Unlinks a provider from a user account.\n *\n * @param user - The user.\n * @param providerId - The provider to unlink.\n *\n * @public\n */\nexport async function unlink(user: User, providerId: string): Promise<User> {\n  const userInternal = getModularInstance(user) as UserInternal;\n  await _assertLinkedStatus(true, userInternal, providerId);\n  const { providerUserInfo } = await deleteLinkedAccounts(userInternal.auth, {\n    idToken: await userInternal.getIdToken(),\n    deleteProvider: [providerId]\n  });\n\n  const providersLeft = providerDataAsNames(providerUserInfo || []);\n\n  userInternal.providerData = userInternal.providerData.filter(pd =>\n    providersLeft.has(pd.providerId)\n  );\n  if (!providersLeft.has(ProviderId.PHONE)) {\n    userInternal.phoneNumber = null;\n  }\n\n  await userInternal.auth._persistUserIfCurrent(userInternal);\n  return userInternal;\n}\n\nexport async function _link(\n  user: UserInternal,\n  credential: AuthCredential,\n  bypassAuthState = false\n): Promise<UserCredentialInternal> {\n  const response = await _logoutIfInvalidated(\n    user,\n    credential._linkToIdToken(user.auth, await user.getIdToken()),\n    bypassAuthState\n  );\n  return UserCredentialImpl._forOperation(user, OperationType.LINK, response);\n}\n\nexport async function _assertLinkedStatus(\n  expected: boolean,\n  user: UserInternal,\n  provider: string\n): Promise<void> {\n  await _reloadWithoutSaving(user);\n  const providerIds = providerDataAsNames(user.providerData);\n\n  const code =\n    expected === false\n      ? AuthErrorCode.PROVIDER_ALREADY_LINKED\n      : AuthErrorCode.NO_SUCH_PROVIDER;\n  _assert(providerIds.has(provider) === expected, user.auth, code);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserCredential, Auth, User } from '../../model/public_types';\n\nimport { _processCredentialSavingMfaContextIfNecessary } from '../../mfa/mfa_error';\nimport { AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { _assertLinkedStatus, _link } from '../user/link_unlink';\nimport { _reauthenticate } from '../user/reauthenticate';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\nimport { getModularInstance } from '@firebase/util';\nimport { OperationType } from '../../model/enums';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n\nexport async function _signInWithCredential(\n  auth: AuthInternal,\n  credential: AuthCredential,\n  bypassAuthState = false\n): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const operationType = OperationType.SIGN_IN;\n  const response = await _processCredentialSavingMfaContextIfNecessary(\n    auth,\n    operationType,\n    credential\n  );\n  const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n    auth,\n    operationType,\n    response\n  );\n\n  if (!bypassAuthState) {\n    await auth._updateCurrentUser(userCredential.user);\n  }\n  return userCredential;\n}\n\n/**\n * Asynchronously signs in with the given credentials.\n *\n * @remarks\n * An {@link AuthProvider} can be used to generate the credential.\n *\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @param auth - The {@link Auth} instance.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function signInWithCredential(\n  auth: Auth,\n  credential: AuthCredential\n): Promise<UserCredential> {\n  return _signInWithCredential(_castAuth(auth), credential);\n}\n\n/**\n * Links the user account with the given credentials.\n *\n * @remarks\n * An {@link AuthProvider} can be used to generate the credential.\n *\n * @param user - The user.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function linkWithCredential(\n  user: User,\n  credential: AuthCredential\n): Promise<UserCredential> {\n  const userInternal = getModularInstance(user) as UserInternal;\n\n  await _assertLinkedStatus(false, userInternal, credential.providerId);\n\n  return _link(userInternal, credential);\n}\n\n/**\n * Re-authenticates a user using a fresh credential.\n *\n * @remarks\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in\n * attempts. This method can be used to recover from a `CREDENTIAL_TOO_OLD_LOGIN_AGAIN` error\n * or a `TOKEN_EXPIRED` error.\n *\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\n * created with a {@link @firebase/app#FirebaseServerApp}.\n *\n * @param user - The user.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function reauthenticateWithCredential(\n  user: User,\n  credential: AuthCredential\n): Promise<UserCredential> {\n  return _reauthenticate(getModularInstance(user) as UserInternal, credential);\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { _processCredentialSavingMfaContextIfNecessary } from '../../mfa/mfa_error';\nimport { OperationType } from '../../model/enums';\nimport { UserInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { AuthErrorCode } from '../errors';\nimport { _assert, _fail } from '../util/assert';\nimport { _parseToken } from './id_token_result';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { UserCredentialImpl } from './user_credential_impl';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n\nexport async function _reauthenticate(\n  user: UserInternal,\n  credential: AuthCredential,\n  bypassAuthState = false\n): Promise<UserCredentialImpl> {\n  const { auth } = user;\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const operationType = OperationType.REAUTHENTICATE;\n\n  try {\n    const response = await _logoutIfInvalidated(\n      user,\n      _processCredentialSavingMfaContextIfNecessary(\n        auth,\n        operationType,\n        credential,\n        user\n      ),\n      bypassAuthState\n    );\n    _assert(response.idToken, auth, AuthErrorCode.INTERNAL_ERROR);\n    const parsed = _parseToken(response.idToken);\n    _assert(parsed, auth, AuthErrorCode.INTERNAL_ERROR);\n\n    const { sub: localId } = parsed;\n    _assert(user.uid === localId, auth, AuthErrorCode.USER_MISMATCH);\n\n    return UserCredentialImpl._forOperation(user, operationType, response);\n  } catch (e) {\n    // Convert user deleted error into user mismatch\n    if ((e as FirebaseError)?.code === `auth/${AuthErrorCode.USER_DELETED}`) {\n      _fail(auth, AuthErrorCode.USER_MISMATCH);\n    }\n    throw e;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth, UserCredential } from '../../model/public_types';\n\nimport { signInWithCustomToken as getIdTokenResponse } from '../../api/authentication/custom_token';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\nimport { OperationType } from '../../model/enums';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n/**\n * Asynchronously signs in using a custom token.\n *\n * @remarks\n * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must\n * be generated by an auth backend using the\n * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken}\n * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} .\n *\n * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service.\n *\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @param auth - The {@link Auth} instance.\n * @param customToken - The custom token to sign in with.\n *\n * @public\n */\nexport async function signInWithCustomToken(\n  auth: Auth,\n  customToken: string\n): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const authInternal = _castAuth(auth);\n  const response: IdTokenResponse = await getIdTokenResponse(authInternal, {\n    token: customToken,\n    returnSecureToken: true\n  });\n  const cred = await UserCredentialImpl._fromIdTokenResponse(\n    authInternal,\n    OperationType.SIGN_IN,\n    response\n  );\n  await authInternal._updateCurrentUser(cred.user);\n  return cred;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary,\n  _performSignInRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithCustomTokenRequest {\n  token: string;\n  returnSecureToken: boolean;\n  tenantId?: string;\n}\n\nexport interface SignInWithCustomTokenResponse extends IdTokenResponse {}\n\nexport async function signInWithCustomToken(\n  auth: Auth,\n  request: SignInWithCustomTokenRequest\n): Promise<SignInWithCustomTokenResponse> {\n  return _performSignInRequest<\n    SignInWithCustomTokenRequest,\n    SignInWithCustomTokenResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FactorId,\n  MultiFactorInfo,\n  PhoneMultiFactorInfo,\n  TotpMultiFactorInfo\n} from '../model/public_types';\nimport {\n  PhoneMfaEnrollment,\n  MfaEnrollment,\n  TotpMfaEnrollment\n} from '../api/account_management/mfa';\nimport { AuthErrorCode } from '../core/errors';\nimport { _fail } from '../core/util/assert';\nimport { AuthInternal } from '../model/auth';\n\nexport abstract class MultiFactorInfoImpl implements MultiFactorInfo {\n  readonly uid: string;\n  readonly displayName?: string | null;\n  readonly enrollmentTime: string;\n\n  protected constructor(readonly factorId: FactorId, response: MfaEnrollment) {\n    this.uid = response.mfaEnrollmentId;\n    this.enrollmentTime = new Date(response.enrolledAt).toUTCString();\n    this.displayName = response.displayName;\n  }\n\n  static _fromServerResponse(\n    auth: AuthInternal,\n    enrollment: MfaEnrollment\n  ): MultiFactorInfoImpl {\n    if ('phoneInfo' in enrollment) {\n      return PhoneMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\n    } else if ('totpInfo' in enrollment) {\n      return TotpMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\n    }\n    return _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n  }\n}\n\nexport class PhoneMultiFactorInfoImpl\n  extends MultiFactorInfoImpl\n  implements PhoneMultiFactorInfo\n{\n  readonly phoneNumber: string;\n\n  private constructor(response: PhoneMfaEnrollment) {\n    super(FactorId.PHONE, response);\n    this.phoneNumber = response.phoneInfo;\n  }\n\n  static _fromServerResponse(\n    _auth: AuthInternal,\n    enrollment: MfaEnrollment\n  ): PhoneMultiFactorInfoImpl {\n    return new PhoneMultiFactorInfoImpl(enrollment as PhoneMfaEnrollment);\n  }\n}\nexport class TotpMultiFactorInfoImpl\n  extends MultiFactorInfoImpl\n  implements TotpMultiFactorInfo\n{\n  private constructor(response: TotpMfaEnrollment) {\n    super(FactorId.TOTP, response);\n  }\n\n  static _fromServerResponse(\n    _auth: AuthInternal,\n    enrollment: MfaEnrollment\n  ): TotpMultiFactorInfoImpl {\n    return new TotpMultiFactorInfoImpl(enrollment as TotpMfaEnrollment);\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeSettings, Auth } from '../../model/public_types';\n\nimport { GetOobCodeRequest } from '../../api/authentication/email_and_password';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\n\nexport function _setActionCodeSettingsOnRequest(\n  auth: Auth,\n  request: GetOobCodeRequest,\n  actionCodeSettings: ActionCodeSettings\n): void {\n  _assert(\n    actionCodeSettings.url?.length > 0,\n    auth,\n    AuthErrorCode.INVALID_CONTINUE_URI\n  );\n  _assert(\n    typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||\n      actionCodeSettings.dynamicLinkDomain.length > 0,\n    auth,\n    AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN\n  );\n  _assert(\n    typeof actionCodeSettings.linkDomain === 'undefined' ||\n      actionCodeSettings.linkDomain.length > 0,\n    auth,\n    AuthErrorCode.INVALID_HOSTING_LINK_DOMAIN\n  );\n\n  request.continueUrl = actionCodeSettings.url;\n  request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;\n  request.linkDomain = actionCodeSettings.linkDomain;\n  request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;\n\n  if (actionCodeSettings.iOS) {\n    _assert(\n      actionCodeSettings.iOS.bundleId.length > 0,\n      auth,\n      AuthErrorCode.MISSING_IOS_BUNDLE_ID\n    );\n    request.iOSBundleId = actionCodeSettings.iOS.bundleId;\n  }\n\n  if (actionCodeSettings.android) {\n    _assert(\n      actionCodeSettings.android.packageName.length > 0,\n      auth,\n      AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME\n    );\n    request.androidInstallApp = actionCodeSettings.android.installApp;\n    request.androidMinimumVersionCode =\n      actionCodeSettings.android.minimumVersion;\n    request.androidPackageName = actionCodeSettings.android.packageName;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  ActionCodeInfo,\n  ActionCodeOperation,\n  ActionCodeSettings,\n  Auth,\n  UserCredential\n} from '../../model/public_types';\n\nimport * as account from '../../api/account_management/email_and_password';\nimport * as authentication from '../../api/authentication/email_and_password';\nimport { signUp, SignUpRequest } from '../../api/authentication/sign_up';\nimport { MultiFactorInfoImpl } from '../../mfa/mfa_info';\nimport { EmailAuthProvider } from '../providers/email';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport {\n  _assert,\n  _serverAppCurrentUserOperationNotSupportedError\n} from '../util/assert';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { signInWithCredential } from './credential';\nimport { _castAuth } from '../auth/auth_impl';\nimport { AuthErrorCode } from '../errors';\nimport { getModularInstance } from '@firebase/util';\nimport { OperationType } from '../../model/enums';\nimport { handleRecaptchaFlow } from '../../platform_browser/recaptcha/recaptcha_enterprise_verifier';\nimport { IdTokenResponse } from '../../model/id_token';\nimport {\n  RecaptchaActionName,\n  RecaptchaClientType,\n  RecaptchaAuthProvider\n} from '../../api';\nimport { _isFirebaseServerApp } from '@firebase/app';\n\n/**\n * Updates the password policy cached in the {@link Auth} instance if a policy is already\n * cached for the project or tenant.\n *\n * @remarks\n * We only fetch the password policy if the password did not meet policy requirements and\n * there is an existing policy cached. A developer must call validatePassword at least\n * once for the cache to be automatically updated.\n *\n * @param auth - The {@link Auth} instance.\n *\n * @private\n */\nasync function recachePasswordPolicy(auth: Auth): Promise<void> {\n  const authInternal = _castAuth(auth);\n  if (authInternal._getPasswordPolicyInternal()) {\n    await authInternal._updatePasswordPolicy();\n  }\n}\n\n/**\n * Sends a password reset email to the given email address. This method does not throw an error when\n * there's no user account with the given email address and\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\n * is enabled.\n *\n * @remarks\n * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in\n * the email sent to the user, along with the new password specified by the user.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n *   url: 'https://www.example.com/?email=user@example.com',\n *   iOS: {\n *      bundleId: 'com.example.ios'\n *   },\n *   android: {\n *     packageName: 'com.example.android',\n *     installApp: true,\n *     minimumVersion: '12'\n *   },\n *   handleCodeInApp: true\n * };\n * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain code from user.\n * await confirmPasswordReset('user@example.com', code);\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param email - The user's email address.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendPasswordResetEmail(\n  auth: Auth,\n  email: string,\n  actionCodeSettings?: ActionCodeSettings\n): Promise<void> {\n  const authInternal = _castAuth(auth);\n  const request: authentication.PasswordResetRequest = {\n    requestType: ActionCodeOperation.PASSWORD_RESET,\n    email,\n    clientType: RecaptchaClientType.WEB\n  };\n  if (actionCodeSettings) {\n    _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);\n  }\n  await handleRecaptchaFlow(\n    authInternal,\n    request,\n    RecaptchaActionName.GET_OOB_CODE,\n    authentication.sendPasswordResetEmail,\n    RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER\n  );\n}\n\n/**\n * Completes the password reset process, given a confirmation code and new password.\n *\n * @param auth - The {@link Auth} instance.\n * @param oobCode - A confirmation code sent to the user.\n * @param newPassword - The new password.\n *\n * @public\n */\nexport async function confirmPasswordReset(\n  auth: Auth,\n  oobCode: string,\n  newPassword: string\n): Promise<void> {\n  await account\n    .resetPassword(getModularInstance(auth), {\n      oobCode,\n      newPassword\n    })\n    .catch(async error => {\n      if (\n        error.code ===\n        `auth/${AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS}`\n      ) {\n        void recachePasswordPolicy(auth);\n      }\n\n      throw error;\n    });\n  // Do not return the email.\n}\n\n/**\n * Applies a verification code sent to the user by email or other out-of-band mechanism.\n *\n * @param auth - The {@link Auth} instance.\n * @param oobCode - A verification code sent to the user.\n *\n * @public\n */\nexport async function applyActionCode(\n  auth: Auth,\n  oobCode: string\n): Promise<void> {\n  await account.applyActionCode(getModularInstance(auth), { oobCode });\n}\n\n/**\n * Checks a verification code sent to the user by email or other out-of-band mechanism.\n *\n * @returns metadata about the code.\n *\n * @param auth - The {@link Auth} instance.\n * @param oobCode - A verification code sent to the user.\n *\n * @public\n */\nexport async function checkActionCode(\n  auth: Auth,\n  oobCode: string\n): Promise<ActionCodeInfo> {\n  const authModular = getModularInstance(auth);\n  const response = await account.resetPassword(authModular, { oobCode });\n\n  // Email could be empty only if the request type is EMAIL_SIGNIN or\n  // VERIFY_AND_CHANGE_EMAIL.\n  // New email should not be empty if the request type is\n  // VERIFY_AND_CHANGE_EMAIL.\n  // Multi-factor info could not be empty if the request type is\n  // REVERT_SECOND_FACTOR_ADDITION.\n  const operation = response.requestType;\n  _assert(operation, authModular, AuthErrorCode.INTERNAL_ERROR);\n  switch (operation) {\n    case ActionCodeOperation.EMAIL_SIGNIN:\n      break;\n    case ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL:\n      _assert(response.newEmail, authModular, AuthErrorCode.INTERNAL_ERROR);\n      break;\n    case ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION:\n      _assert(response.mfaInfo, authModular, AuthErrorCode.INTERNAL_ERROR);\n    // fall through\n    default:\n      _assert(response.email, authModular, AuthErrorCode.INTERNAL_ERROR);\n  }\n\n  // The multi-factor info for revert second factor addition\n  let multiFactorInfo: MultiFactorInfoImpl | null = null;\n  if (response.mfaInfo) {\n    multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(\n      _castAuth(authModular),\n      response.mfaInfo\n    );\n  }\n\n  return {\n    data: {\n      email:\n        (response.requestType === ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL\n          ? response.newEmail\n          : response.email) || null,\n      previousEmail:\n        (response.requestType === ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL\n          ? response.email\n          : response.newEmail) || null,\n      multiFactorInfo\n    },\n    operation\n  };\n}\n\n/**\n * Checks a password reset code sent to the user by email or other out-of-band mechanism.\n *\n * @returns the user's email address if valid.\n *\n * @param auth - The {@link Auth} instance.\n * @param code - A verification code sent to the user.\n *\n * @public\n */\nexport async function verifyPasswordResetCode(\n  auth: Auth,\n  code: string\n): Promise<string> {\n  const { data } = await checkActionCode(getModularInstance(auth), code);\n  // Email should always be present since a code was sent to it\n  return data.email!;\n}\n\n/**\n * Creates a new user account associated with the specified email address and password.\n *\n * @remarks\n * On successful creation of the user account, this user will also be signed in to your application.\n *\n * User account creation can fail if the account already exists or the password is invalid.\n *\n * This method is not supported on {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * Note: The email address acts as a unique identifier for the user and enables an email-based\n * password reset. This function will create a new user account and set the initial user password.\n *\n * @param auth - The {@link Auth} instance.\n * @param email - The user's email address.\n * @param password - The user's chosen password.\n *\n * @public\n */\nexport async function createUserWithEmailAndPassword(\n  auth: Auth,\n  email: string,\n  password: string\n): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const authInternal = _castAuth(auth);\n  const request: SignUpRequest = {\n    returnSecureToken: true,\n    email,\n    password,\n    clientType: RecaptchaClientType.WEB\n  };\n  const signUpResponse: Promise<IdTokenResponse> = handleRecaptchaFlow(\n    authInternal,\n    request,\n    RecaptchaActionName.SIGN_UP_PASSWORD,\n    signUp,\n    RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER\n  );\n  const response = await signUpResponse.catch(error => {\n    if (\n      error.code === `auth/${AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS}`\n    ) {\n      void recachePasswordPolicy(auth);\n    }\n\n    throw error;\n  });\n\n  const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n    authInternal,\n    OperationType.SIGN_IN,\n    response\n  );\n  await authInternal._updateCurrentUser(userCredential.user);\n\n  return userCredential;\n}\n\n/**\n * Asynchronously signs in using an email and password.\n *\n * @remarks\n * Fails with an error if the email address and password do not match. When\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\n * is enabled, this method fails with \"auth/invalid-credential\" in case of an invalid\n * email/password.\n *\n * This method is not supported on {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * Note: The user's password is NOT the password used to access the user's email account. The\n * email address serves as a unique identifier for the user, and the password is used to access\n * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}.\n *\n *\n * @param auth - The {@link Auth} instance.\n * @param email - The users email address.\n * @param password - The users password.\n *\n * @public\n */\nexport function signInWithEmailAndPassword(\n  auth: Auth,\n  email: string,\n  password: string\n): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  return signInWithCredential(\n    getModularInstance(auth),\n    EmailAuthProvider.credential(email, password)\n  ).catch(async error => {\n    if (\n      error.code === `auth/${AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS}`\n    ) {\n      void recachePasswordPolicy(auth);\n    }\n\n    throw error;\n  });\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  ActionCodeOperation,\n  ActionCodeSettings,\n  Auth,\n  UserCredential\n} from '../../model/public_types';\n\nimport * as api from '../../api/authentication/email_and_password';\nimport { ActionCodeURL } from '../action_code_url';\nimport { EmailAuthProvider } from '../providers/email';\nimport { _getCurrentUrl } from '../util/location';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { signInWithCredential } from './credential';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { getModularInstance } from '@firebase/util';\nimport { _castAuth } from '../auth/auth_impl';\nimport { handleRecaptchaFlow } from '../../platform_browser/recaptcha/recaptcha_enterprise_verifier';\nimport {\n  RecaptchaActionName,\n  RecaptchaClientType,\n  RecaptchaAuthProvider\n} from '../../api';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n\n/**\n * Sends a sign-in email link to the user with the specified email.\n *\n * @remarks\n * The sign-in operation has to always be completed in the app unlike other out of band email\n * actions (password reset and email verifications). This is because, at the end of the flow,\n * the user is expected to be signed in and their Auth state persisted within the app.\n *\n * To complete sign in with the email link, call {@link signInWithEmailLink} with the email\n * address and the email link supplied in the email sent to the user.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n *   url: 'https://www.example.com/?email=user@example.com',\n *   iOS: {\n *      bundleId: 'com.example.ios'\n *   },\n *   android: {\n *     packageName: 'com.example.android',\n *     installApp: true,\n *     minimumVersion: '12'\n *   },\n *   handleCodeInApp: true\n * };\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain emailLink from the user.\n * if(isSignInWithEmailLink(auth, emailLink)) {\n *   await signInWithEmailLink(auth, 'user@example.com', emailLink);\n * }\n * ```\n *\n * @param authInternal - The {@link Auth} instance.\n * @param email - The user's email address.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendSignInLinkToEmail(\n  auth: Auth,\n  email: string,\n  actionCodeSettings: ActionCodeSettings\n): Promise<void> {\n  const authInternal = _castAuth(auth);\n  const request: api.EmailSignInRequest = {\n    requestType: ActionCodeOperation.EMAIL_SIGNIN,\n    email,\n    clientType: RecaptchaClientType.WEB\n  };\n  function setActionCodeSettings(\n    request: api.EmailSignInRequest,\n    actionCodeSettings: ActionCodeSettings\n  ): void {\n    _assert(\n      actionCodeSettings.handleCodeInApp,\n      authInternal,\n      AuthErrorCode.ARGUMENT_ERROR\n    );\n    if (actionCodeSettings) {\n      _setActionCodeSettingsOnRequest(\n        authInternal,\n        request,\n        actionCodeSettings\n      );\n    }\n  }\n  setActionCodeSettings(request, actionCodeSettings);\n  await handleRecaptchaFlow(\n    authInternal,\n    request,\n    RecaptchaActionName.GET_OOB_CODE,\n    api.sendSignInLinkToEmail,\n    RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER\n  );\n}\n\n/**\n * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}.\n *\n * @param auth - The {@link Auth} instance.\n * @param emailLink - The link sent to the user's email address.\n *\n * @public\n */\nexport function isSignInWithEmailLink(auth: Auth, emailLink: string): boolean {\n  const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\n  return actionCodeUrl?.operation === ActionCodeOperation.EMAIL_SIGNIN;\n}\n\n/**\n * Asynchronously signs in using an email and sign-in email link.\n *\n * @remarks\n * If no link is passed, the link is inferred from the current URL.\n *\n * Fails with an error if the email address is invalid or OTP in email link expires.\n *\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n *   url: 'https://www.example.com/?email=user@example.com',\n *   iOS: {\n *      bundleId: 'com.example.ios'\n *   },\n *   android: {\n *     packageName: 'com.example.android',\n *     installApp: true,\n *     minimumVersion: '12'\n *   },\n *   handleCodeInApp: true\n * };\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain emailLink from the user.\n * if(isSignInWithEmailLink(auth, emailLink)) {\n *   await signInWithEmailLink(auth, 'user@example.com', emailLink);\n * }\n * ```\n *\n *\n * @param auth - The {@link Auth} instance.\n * @param email - The user's email address.\n * @param emailLink - The link sent to the user's email address.\n *\n * @public\n */\nexport async function signInWithEmailLink(\n  auth: Auth,\n  email: string,\n  emailLink?: string\n): Promise<UserCredential> {\n  if (_isFirebaseServerApp(auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(auth)\n    );\n  }\n  const authModular = getModularInstance(auth);\n  const credential = EmailAuthProvider.credentialWithLink(\n    email,\n    emailLink || _getCurrentUrl()\n  );\n  // Check if the tenant ID in the email link matches the tenant ID on Auth\n  // instance.\n  _assert(\n    credential._tenantId === (authModular.tenantId || null),\n    authModular,\n    AuthErrorCode.TENANT_ID_MISMATCH\n  );\n  return signInWithCredential(authModular, credential);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  ActionCodeOperation,\n  ActionCodeSettings,\n  Auth,\n  User\n} from '../../model/public_types';\n\nimport {\n  createAuthUri,\n  CreateAuthUriRequest\n} from '../../api/authentication/create_auth_uri';\nimport * as api from '../../api/authentication/email_and_password';\nimport { UserInternal } from '../../model/user';\nimport { _getCurrentUrl, _isHttpOrHttps } from '../util/location';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Gets the list of possible sign in methods for the given email address. This method returns an\n * empty list when\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\n * is enabled, irrespective of the number of authentication methods available for the given email.\n *\n * @remarks\n * This is useful to differentiate methods of sign-in for the same provider, eg.\n * {@link EmailAuthProvider} which has 2 methods of sign-in,\n * {@link SignInMethod}.EMAIL_PASSWORD and\n * {@link SignInMethod}.EMAIL_LINK.\n *\n * @param auth - The {@link Auth} instance.\n * @param email - The user's email address.\n *\n * Deprecated. Migrating off of this method is recommended as a security best-practice.\n * Learn more in the Identity Platform documentation for\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}.\n * @public\n */\nexport async function fetchSignInMethodsForEmail(\n  auth: Auth,\n  email: string\n): Promise<string[]> {\n  // createAuthUri returns an error if continue URI is not http or https.\n  // For environments like Cordova, Chrome extensions, native frameworks, file\n  // systems, etc, use http://localhost as continue URL.\n  const continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost';\n  const request: CreateAuthUriRequest = {\n    identifier: email,\n    continueUri\n  };\n\n  const { signinMethods } = await createAuthUri(\n    getModularInstance(auth),\n    request\n  );\n\n  return signinMethods || [];\n}\n\n/**\n * Sends a verification email to a user.\n *\n * @remarks\n * The verification process is completed by calling {@link applyActionCode}.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n *   url: 'https://www.example.com/?email=user@example.com',\n *   iOS: {\n *      bundleId: 'com.example.ios'\n *   },\n *   android: {\n *     packageName: 'com.example.android',\n *     installApp: true,\n *     minimumVersion: '12'\n *   },\n *   handleCodeInApp: true\n * };\n * await sendEmailVerification(user, actionCodeSettings);\n * // Obtain code from the user.\n * await applyActionCode(auth, code);\n * ```\n *\n * @param user - The user.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendEmailVerification(\n  user: User,\n  actionCodeSettings?: ActionCodeSettings | null\n): Promise<void> {\n  const userInternal = getModularInstance(user) as UserInternal;\n  const idToken = await user.getIdToken();\n  const request: api.VerifyEmailRequest = {\n    requestType: ActionCodeOperation.VERIFY_EMAIL,\n    idToken\n  };\n  if (actionCodeSettings) {\n    _setActionCodeSettingsOnRequest(\n      userInternal.auth,\n      request,\n      actionCodeSettings\n    );\n  }\n\n  const { email } = await api.sendEmailVerification(userInternal.auth, request);\n\n  if (email !== user.email) {\n    await user.reload();\n  }\n}\n\n/**\n * Sends a verification email to a new email address.\n *\n * @remarks\n * The user's email will be updated to the new one after being verified.\n *\n * If you have a custom email action handler, you can complete the verification process by calling\n * {@link applyActionCode}.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n *   url: 'https://www.example.com/?email=user@example.com',\n *   iOS: {\n *      bundleId: 'com.example.ios'\n *   },\n *   android: {\n *     packageName: 'com.example.android',\n *     installApp: true,\n *     minimumVersion: '12'\n *   },\n *   handleCodeInApp: true\n * };\n * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings);\n * // Obtain code from the user.\n * await applyActionCode(auth, code);\n * ```\n *\n * @param user - The user.\n * @param newEmail - The new email address to be verified before update.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function verifyBeforeUpdateEmail(\n  user: User,\n  newEmail: string,\n  actionCodeSettings?: ActionCodeSettings | null\n): Promise<void> {\n  const userInternal = getModularInstance(user) as UserInternal;\n  const idToken = await user.getIdToken();\n  const request: api.VerifyAndChangeEmailRequest = {\n    requestType: ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL,\n    idToken,\n    newEmail\n  };\n  if (actionCodeSettings) {\n    _setActionCodeSettingsOnRequest(\n      userInternal.auth,\n      request,\n      actionCodeSettings\n    );\n  }\n\n  const { email } = await api.verifyAndChangeEmail(userInternal.auth, request);\n\n  if (email !== user.email) {\n    // If the local copy of the email on user is outdated, reload the\n    // user.\n    await user.reload();\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  _addTidIfNecessary,\n  _performApiRequest\n} from '../index';\nimport { Auth } from '../../model/public_types';\n\nexport interface CreateAuthUriRequest {\n  identifier: string;\n  continueUri: string;\n  tenantId?: string;\n}\n\nexport interface CreateAuthUriResponse {\n  signinMethods: string[];\n}\n\nexport async function createAuthUri(\n  auth: Auth,\n  request: CreateAuthUriRequest\n): Promise<CreateAuthUriResponse> {\n  return _performApiRequest<CreateAuthUriRequest, CreateAuthUriResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.CREATE_AUTH_URI,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../../model/public_types';\n\nimport {\n  updateEmailPassword as apiUpdateEmailPassword,\n  UpdateEmailPasswordRequest\n} from '../../api/account_management/email_and_password';\nimport { updateProfile as apiUpdateProfile } from '../../api/account_management/profile';\nimport { UserInternal } from '../../model/user';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { getModularInstance } from '@firebase/util';\nimport { ProviderId } from '../../model/enums';\nimport { _isFirebaseServerApp } from '@firebase/app';\nimport { _serverAppCurrentUserOperationNotSupportedError } from '../../core/util/assert';\n\n/**\n * Updates a user's profile data.\n *\n * @param user - The user.\n * @param profile - The profile's `displayName` and `photoURL` to update.\n *\n * @public\n */\nexport async function updateProfile(\n  user: User,\n  {\n    displayName,\n    photoURL: photoUrl\n  }: { displayName?: string | null; photoURL?: string | null }\n): Promise<void> {\n  if (displayName === undefined && photoUrl === undefined) {\n    return;\n  }\n\n  const userInternal = getModularInstance(user) as UserInternal;\n  const idToken = await userInternal.getIdToken();\n  const profileRequest = {\n    idToken,\n    displayName,\n    photoUrl,\n    returnSecureToken: true\n  };\n  const response = await _logoutIfInvalidated(\n    userInternal,\n    apiUpdateProfile(userInternal.auth, profileRequest)\n  );\n\n  userInternal.displayName = response.displayName || null;\n  userInternal.photoURL = response.photoUrl || null;\n\n  // Update the password provider as well\n  const passwordProvider = userInternal.providerData.find(\n    ({ providerId }) => providerId === ProviderId.PASSWORD\n  );\n  if (passwordProvider) {\n    passwordProvider.displayName = userInternal.displayName;\n    passwordProvider.photoURL = userInternal.photoURL;\n  }\n\n  await userInternal._updateTokensIfNecessary(response);\n}\n\n/**\n * Updates the user's email address.\n *\n * @remarks\n * An email will be sent to the original email address (if it was set) that allows to revoke the\n * email address change, in order to protect them from account hijacking.\n *\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\n * created with a {@link @firebase/app#FirebaseServerApp}.\n *\n * Important: this is a security sensitive operation that requires the user to have recently signed\n * in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n * @param newEmail - The new email address.\n *\n * Throws \"auth/operation-not-allowed\" error when\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\n * is enabled.\n * Deprecated - Use {@link verifyBeforeUpdateEmail} instead.\n *\n * @public\n */\nexport function updateEmail(user: User, newEmail: string): Promise<void> {\n  const userInternal = getModularInstance(user) as UserInternal;\n  if (_isFirebaseServerApp(userInternal.auth.app)) {\n    return Promise.reject(\n      _serverAppCurrentUserOperationNotSupportedError(userInternal.auth)\n    );\n  }\n  return updateEmailOrPassword(userInternal, newEmail, null);\n}\n\n/**\n * Updates the user's password.\n *\n * @remarks\n * Important: this is a security sensitive operation that requires the user to have recently signed\n * in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n * @param newPassword - The new password.\n *\n * @public\n */\nexport function updatePassword(user: User, newPassword: string): Promise<void> {\n  return updateEmailOrPassword(\n    getModularInstance(user) as UserInternal,\n    null,\n    newPassword\n  );\n}\n\nasync function updateEmailOrPassword(\n  user: UserInternal,\n  email: string | null,\n  password: string | null\n): Promise<void> {\n  const { auth } = user;\n  const idToken = await user.getIdToken();\n  const request: UpdateEmailPasswordRequest = {\n    idToken,\n    returnSecureToken: true\n  };\n\n  if (email) {\n    request.email = email;\n  }\n\n  if (password) {\n    request.password = password;\n  }\n\n  const response = await _logoutIfInvalidated(\n    user,\n    apiUpdateEmailPassword(auth, request)\n  );\n  await user._updateTokensIfNecessary(response, /* reload */ true);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface UpdateProfileRequest {\n  idToken: string;\n  displayName?: string | null;\n  photoUrl?: string | null;\n  returnSecureToken: boolean;\n}\n\nexport interface UpdateProfileResponse extends IdTokenResponse {\n  displayName?: string | null;\n  photoUrl?: string | null;\n}\n\nexport async function updateProfile(\n  auth: Auth,\n  request: UpdateProfileRequest\n): Promise<UpdateProfileResponse> {\n  return _performApiRequest<UpdateProfileRequest, UpdateProfileResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.SET_ACCOUNT_INFO,\n    request\n  );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AdditionalUserInfo, UserCredential } from '../../model/public_types';\nimport { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';\nimport { _parseToken } from './id_token_result';\nimport { UserCredentialInternal } from '../../model/user';\nimport { ProviderId } from '../../model/enums';\n\n/**\n * Parse the `AdditionalUserInfo` from the ID token response.\n *\n */\nexport function _fromIdTokenResponse(\n  idTokenResponse?: IdTokenResponse\n): AdditionalUserInfo | null {\n  if (!idTokenResponse) {\n    return null;\n  }\n  const { providerId } = idTokenResponse;\n  const profile = idTokenResponse.rawUserInfo\n    ? JSON.parse(idTokenResponse.rawUserInfo)\n    : {};\n  const isNewUser =\n    idTokenResponse.isNewUser ||\n    idTokenResponse.kind === IdTokenResponseKind.SignupNewUser;\n  if (!providerId && idTokenResponse?.idToken) {\n    const signInProvider = _parseToken(idTokenResponse.idToken)?.firebase?.[\n      'sign_in_provider'\n    ];\n    if (signInProvider) {\n      const filteredProviderId =\n        signInProvider !== ProviderId.ANONYMOUS &&\n        signInProvider !== ProviderId.CUSTOM\n          ? (signInProvider as ProviderId)\n          : null;\n      // Uses generic class in accordance with the legacy SDK.\n      return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);\n    }\n  }\n  if (!providerId) {\n    return null;\n  }\n  switch (providerId) {\n    case ProviderId.FACEBOOK:\n      return new FacebookAdditionalUserInfo(isNewUser, profile);\n    case ProviderId.GITHUB:\n      return new GithubAdditionalUserInfo(isNewUser, profile);\n    case ProviderId.GOOGLE:\n      return new GoogleAdditionalUserInfo(isNewUser, profile);\n    case ProviderId.TWITTER:\n      return new TwitterAdditionalUserInfo(\n        isNewUser,\n        profile,\n        idTokenResponse.screenName || null\n      );\n    case ProviderId.CUSTOM:\n    case ProviderId.ANONYMOUS:\n      return new GenericAdditionalUserInfo(isNewUser, null);\n    default:\n      return new GenericAdditionalUserInfo(isNewUser, providerId, profile);\n  }\n}\n\nclass GenericAdditionalUserInfo implements AdditionalUserInfo {\n  constructor(\n    readonly isNewUser: boolean,\n    readonly providerId: ProviderId | string | null,\n    readonly profile: Record<string, unknown> = {}\n  ) {}\n}\n\nclass FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {\n  constructor(\n    isNewUser: boolean,\n    providerId: ProviderId,\n    profile: Record<string, unknown>,\n    readonly username: string | null\n  ) {\n    super(isNewUser, providerId, profile);\n  }\n}\n\nclass FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {\n  constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n    super(isNewUser, ProviderId.FACEBOOK, profile);\n  }\n}\n\nclass GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\n  constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n    super(\n      isNewUser,\n      ProviderId.GITHUB,\n      profile,\n      typeof profile?.login === 'string' ? profile?.login : null\n    );\n  }\n}\n\nclass GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {\n  constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n    super(isNewUser, ProviderId.GOOGLE, profile);\n  }\n}\n\nclass TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\n  constructor(\n    isNewUser: boolean,\n    profile: Record<string, unknown>,\n    screenName: string | null\n  ) {\n    super(isNewUser, ProviderId.TWITTER, profile, screenName);\n  }\n}\n\n/**\n * Extracts provider specific {@link AdditionalUserInfo} for the given credential.\n *\n * @param userCredential - The user credential.\n *\n * @public\n */\nexport function getAdditionalUserInfo(\n  userCredential: UserCredential\n): AdditionalUserInfo | null {\n  const { user, _tokenResponse } = userCredential as UserCredentialInternal;\n  if (user.isAnonymous && !_tokenResponse) {\n    // Handle the special case where signInAnonymously() gets called twice.\n    // No network call is made so there's nothing to actually fill this in\n    return {\n      providerId: null,\n      isNewUser: false,\n      profile: null\n    };\n  }\n\n  return _fromIdTokenResponse(_tokenResponse);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\nimport {\n  Auth,\n  NextOrObserver,\n  Persistence,\n  User,\n  CompleteFn,\n  ErrorFn,\n  Unsubscribe,\n  PasswordValidationStatus\n} from '../model/public_types';\nimport { _initializeRecaptchaConfig } from '../platform_browser/recaptcha/recaptcha_enterprise_verifier';\nimport { _castAuth } from '../core/auth/auth_impl';\n\nexport {\n  debugErrorMap,\n  prodErrorMap,\n  AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as AuthErrorCodes\n} from './errors';\n\n// Non-optional auth methods.\n/**\n * Changes the type of persistence on the {@link Auth} instance for the currently saved\n * `Auth` session and applies this type of persistence for future sign-in requests, including\n * sign-in with redirect requests.\n *\n * @remarks\n * This makes it easy for a user signing in to specify whether their session should be\n * remembered or not. It also makes it easier to never persist the `Auth` state for applications\n * that are shared by other users or have sensitive data.\n *\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @example\n * ```javascript\n * setPersistence(auth, browserSessionPersistence);\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param persistence - The {@link Persistence} to use.\n * @returns A `Promise` that resolves once the persistence change has completed\n *\n * @public\n */\nexport function setPersistence(\n  auth: Auth,\n  persistence: Persistence\n): Promise<void> {\n  return getModularInstance(auth).setPersistence(persistence);\n}\n\n/**\n * Loads the reCAPTCHA configuration into the `Auth` instance.\n *\n * @remarks\n * This will load the reCAPTCHA config, which indicates whether the reCAPTCHA\n * verification flow should be triggered for each auth provider, into the\n * current Auth session.\n *\n * If initializeRecaptchaConfig() is not invoked, the auth flow will always start\n * without reCAPTCHA verification. If the provider is configured to require reCAPTCHA\n * verification, the SDK will transparently load the reCAPTCHA config and restart the\n * auth flows.\n *\n * Thus, by calling this optional method, you will reduce the latency of future auth flows.\n * Loading the reCAPTCHA config early will also enhance the signal collected by reCAPTCHA.\n *\n * This method does not work in a Node.js environment.\n *\n * @example\n * ```javascript\n * initializeRecaptchaConfig(auth);\n * ```\n *\n * @param auth - The {@link Auth} instance.\n *\n * @public\n */\nexport function initializeRecaptchaConfig(auth: Auth): Promise<void> {\n  return _initializeRecaptchaConfig(auth);\n}\n\n/**\n * Validates the password against the password policy configured for the project or tenant.\n *\n * @remarks\n * If no tenant ID is set on the `Auth` instance, then this method will use the password\n * policy configured for the project. Otherwise, this method will use the policy configured\n * for the tenant. If a password policy has not been configured, then the default policy\n * configured for all projects will be used.\n *\n * If an auth flow fails because a submitted password does not meet the password policy\n * requirements and this method has previously been called, then this method will use the\n * most recent policy available when called again.\n *\n * @example\n * ```javascript\n * validatePassword(auth, 'some-password');\n * ```\n *\n * @param auth The {@link Auth} instance.\n * @param password The password to validate.\n *\n * @public\n */\nexport async function validatePassword(\n  auth: Auth,\n  password: string\n): Promise<PasswordValidationStatus> {\n  const authInternal = _castAuth(auth);\n  return authInternal.validatePassword(password);\n}\n\n/**\n * Adds an observer for changes to the signed-in user's ID token.\n *\n * @remarks\n * This includes sign-in, sign-out, and token refresh events.\n * This will not be triggered automatically upon ID token expiration. Use {@link User.getIdToken} to refresh the ID token.\n *\n * @param auth - The {@link Auth} instance.\n * @param nextOrObserver - callback triggered on change.\n * @param error - Deprecated. This callback is never triggered. Errors\n * on signing in/out can be caught in promises returned from\n * sign-in/sign-out functions.\n * @param completed - Deprecated. This callback is never triggered.\n *\n * @public\n */\nexport function onIdTokenChanged(\n  auth: Auth,\n  nextOrObserver: NextOrObserver<User>,\n  error?: ErrorFn,\n  completed?: CompleteFn\n): Unsubscribe {\n  return getModularInstance(auth).onIdTokenChanged(\n    nextOrObserver,\n    error,\n    completed\n  );\n}\n/**\n * Adds a blocking callback that runs before an auth state change\n * sets a new user.\n *\n * @param auth - The {@link Auth} instance.\n * @param callback - callback triggered before new user value is set.\n *   If this throws, it blocks the user from being set.\n * @param onAbort - callback triggered if a later `beforeAuthStateChanged()`\n *   callback throws, allowing you to undo any side effects.\n */\nexport function beforeAuthStateChanged(\n  auth: Auth,\n  callback: (user: User | null) => void | Promise<void>,\n  onAbort?: () => void\n): Unsubscribe {\n  return getModularInstance(auth).beforeAuthStateChanged(callback, onAbort);\n}\n/**\n * Adds an observer for changes to the user's sign-in state.\n *\n * @remarks\n * To keep the old behavior, see {@link onIdTokenChanged}.\n *\n * @param auth - The {@link Auth} instance.\n * @param nextOrObserver - callback triggered on change.\n * @param error - Deprecated. This callback is never triggered. Errors\n * on signing in/out can be caught in promises returned from\n * sign-in/sign-out functions.\n * @param completed - Deprecated. This callback is never triggered.\n *\n * @public\n */\nexport function onAuthStateChanged(\n  auth: Auth,\n  nextOrObserver: NextOrObserver<User>,\n  error?: ErrorFn,\n  completed?: CompleteFn\n): Unsubscribe {\n  return getModularInstance(auth).onAuthStateChanged(\n    nextOrObserver,\n    error,\n    completed\n  );\n}\n/**\n * Sets the current language to the default device/browser preference.\n *\n * @param auth - The {@link Auth} instance.\n *\n * @public\n */\nexport function useDeviceLanguage(auth: Auth): void {\n  getModularInstance(auth).useDeviceLanguage();\n}\n/**\n * Asynchronously sets the provided user as {@link Auth.currentUser} on the\n * {@link Auth} instance.\n *\n * @remarks\n * A new instance copy of the user provided will be made and set as currentUser.\n *\n * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners\n * like other sign in methods.\n *\n * The operation fails with an error if the user to be updated belongs to a different Firebase\n * project.\n *\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @param auth - The {@link Auth} instance.\n * @param user - The new {@link User}.\n *\n * @public\n */\nexport function updateCurrentUser(\n  auth: Auth,\n  user: User | null\n): Promise<void> {\n  return getModularInstance(auth).updateCurrentUser(user);\n}\n/**\n * Signs out the current user.\n *\n * @remarks\n * This method is not supported by {@link Auth} instances created with a\n * {@link @firebase/app#FirebaseServerApp}.\n *\n * @param auth - The {@link Auth} instance.\n *\n * @public\n */\nexport function signOut(auth: Auth): Promise<void> {\n  return getModularInstance(auth).signOut();\n}\n\n/**\n * Revokes the given access token. Currently only supports Apple OAuth access tokens.\n *\n * @param auth - The {@link Auth} instance.\n * @param token - The Apple OAuth access token.\n *\n * @public\n */\nexport function revokeAccessToken(auth: Auth, token: string): Promise<void> {\n  const authInternal = _castAuth(auth);\n  return authInternal.revokeAccessToken(token);\n}\n\nexport { initializeAuth } from './auth/initialize';\nexport { connectAuthEmulator } from './auth/emulator';\n\n// credentials\nexport { AuthCredential } from './credentials';\nexport { EmailAuthCredential } from './credentials/email';\nexport { OAuthCredential } from './credentials/oauth';\nexport { PhoneAuthCredential } from './credentials/phone';\n\n// persistence\nexport { inMemoryPersistence } from './persistence/in_memory';\n\n// providers\nexport { EmailAuthProvider } from './providers/email';\nexport { FacebookAuthProvider } from './providers/facebook';\nexport { CustomParameters } from './providers/federated';\nexport { GoogleAuthProvider } from './providers/google';\nexport { GithubAuthProvider } from './providers/github';\nexport { OAuthProvider, OAuthCredentialOptions } from './providers/oauth';\nexport { SAMLAuthProvider } from './providers/saml';\nexport { TwitterAuthProvider } from './providers/twitter';\n\n// strategies\nexport { signInAnonymously } from './strategies/anonymous';\nexport {\n  signInWithCredential,\n  linkWithCredential,\n  reauthenticateWithCredential\n} from './strategies/credential';\nexport { signInWithCustomToken } from './strategies/custom_token';\nexport {\n  sendPasswordResetEmail,\n  confirmPasswordReset,\n  applyActionCode,\n  checkActionCode,\n  verifyPasswordResetCode,\n  createUserWithEmailAndPassword,\n  signInWithEmailAndPassword\n} from './strategies/email_and_password';\nexport {\n  sendSignInLinkToEmail,\n  isSignInWithEmailLink,\n  signInWithEmailLink\n} from './strategies/email_link';\nexport {\n  fetchSignInMethodsForEmail,\n  sendEmailVerification,\n  verifyBeforeUpdateEmail\n} from './strategies/email';\n\n// core\nexport { ActionCodeURL, parseActionCodeURL } from './action_code_url';\n\n// user\nexport {\n  updateProfile,\n  updateEmail,\n  updatePassword\n} from './user/account_info';\nexport { getIdToken, getIdTokenResult } from './user/id_token_result';\nexport { unlink } from './user/link_unlink';\nexport { getAdditionalUserInfo } from './user/additional_user_info';\n\n// Non-optional user methods.\nexport { reload } from './user/reload';\n/**\n * Deletes and signs out the user.\n *\n * @remarks\n * Important: this is a security-sensitive operation that requires the user to have recently\n * signed in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n *\n * @public\n */\nexport async function deleteUser(user: User): Promise<void> {\n  return getModularInstance(user).delete();\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserInternal } from '../model/user';\nimport { MultiFactorSession } from '../model/public_types';\n\nexport const enum MultiFactorSessionType {\n  ENROLL = 'enroll',\n  SIGN_IN = 'signin'\n}\n\ninterface SerializedMultiFactorSession {\n  multiFactorSession: {\n    idToken?: string;\n    pendingCredential?: string;\n  };\n}\n\nexport class MultiFactorSessionImpl implements MultiFactorSession {\n  private constructor(\n    readonly type: MultiFactorSessionType,\n    readonly credential: string,\n    readonly user?: UserInternal\n  ) {}\n\n  static _fromIdtoken(\n    idToken: string,\n    user?: UserInternal\n  ): MultiFactorSessionImpl {\n    return new MultiFactorSessionImpl(\n      MultiFactorSessionType.ENROLL,\n      idToken,\n      user\n    );\n  }\n\n  static _fromMfaPendingCredential(\n    mfaPendingCredential: string\n  ): MultiFactorSessionImpl {\n    return new MultiFactorSessionImpl(\n      MultiFactorSessionType.SIGN_IN,\n      mfaPendingCredential\n    );\n  }\n\n  toJSON(): SerializedMultiFactorSession {\n    const key =\n      this.type === MultiFactorSessionType.ENROLL\n        ? 'idToken'\n        : 'pendingCredential';\n    return {\n      multiFactorSession: {\n        [key]: this.credential\n      }\n    };\n  }\n\n  static fromJSON(\n    obj: Partial<SerializedMultiFactorSession>\n  ): MultiFactorSessionImpl | null {\n    if (obj?.multiFactorSession) {\n      if (obj.multiFactorSession?.pendingCredential) {\n        return MultiFactorSessionImpl._fromMfaPendingCredential(\n          obj.multiFactorSession.pendingCredential\n        );\n      } else if (obj.multiFactorSession?.idToken) {\n        return MultiFactorSessionImpl._fromIdtoken(\n          obj.multiFactorSession.idToken\n        );\n      }\n    }\n    return null;\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Auth,\n  MultiFactorResolver,\n  UserCredential,\n  MultiFactorError\n} from '../model/public_types';\n\nimport { _castAuth } from '../core/auth/auth_impl';\nimport { AuthErrorCode } from '../core/errors';\nimport { UserCredentialImpl } from '../core/user/user_credential_impl';\nimport { _assert, _fail } from '../core/util/assert';\nimport { UserCredentialInternal } from '../model/user';\nimport { MultiFactorAssertionImpl } from './mfa_assertion';\nimport { MultiFactorError as MultiFactorErrorInternal } from './mfa_error';\nimport { MultiFactorInfoImpl } from './mfa_info';\nimport { MultiFactorSessionImpl } from './mfa_session';\nimport { getModularInstance } from '@firebase/util';\nimport { OperationType } from '../model/enums';\n\nexport class MultiFactorResolverImpl implements MultiFactorResolver {\n  private constructor(\n    readonly session: MultiFactorSessionImpl,\n    readonly hints: MultiFactorInfoImpl[],\n    private readonly signInResolver: (\n      assertion: MultiFactorAssertionImpl\n    ) => Promise<UserCredentialInternal>\n  ) {}\n\n  /** @internal */\n  static _fromError(\n    authExtern: Auth,\n    error: MultiFactorErrorInternal\n  ): MultiFactorResolverImpl {\n    const auth = _castAuth(authExtern);\n    const serverResponse = error.customData._serverResponse;\n    const hints = (serverResponse.mfaInfo || []).map(enrollment =>\n      MultiFactorInfoImpl._fromServerResponse(auth, enrollment)\n    );\n\n    _assert(\n      serverResponse.mfaPendingCredential,\n      auth,\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    const session = MultiFactorSessionImpl._fromMfaPendingCredential(\n      serverResponse.mfaPendingCredential\n    );\n\n    return new MultiFactorResolverImpl(\n      session,\n      hints,\n      async (\n        assertion: MultiFactorAssertionImpl\n      ): Promise<UserCredentialInternal> => {\n        const mfaResponse = await assertion._process(auth, session);\n        // Clear out the unneeded fields from the old login response\n        delete serverResponse.mfaInfo;\n        delete serverResponse.mfaPendingCredential;\n\n        // Use in the new token & refresh token in the old response\n        const idTokenResponse = {\n          ...serverResponse,\n          idToken: mfaResponse.idToken,\n          refreshToken: mfaResponse.refreshToken\n        };\n\n        // TODO: we should collapse this switch statement into UserCredentialImpl._forOperation and have it support the SIGN_IN case\n        switch (error.operationType) {\n          case OperationType.SIGN_IN:\n            const userCredential =\n              await UserCredentialImpl._fromIdTokenResponse(\n                auth,\n                error.operationType,\n                idTokenResponse\n              );\n            await auth._updateCurrentUser(userCredential.user);\n            return userCredential;\n          case OperationType.REAUTHENTICATE:\n            _assert(error.user, auth, AuthErrorCode.INTERNAL_ERROR);\n            return UserCredentialImpl._forOperation(\n              error.user,\n              error.operationType,\n              idTokenResponse\n            );\n          default:\n            _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n        }\n      }\n    );\n  }\n\n  async resolveSignIn(\n    assertionExtern: MultiFactorAssertionImpl\n  ): Promise<UserCredential> {\n    const assertion = assertionExtern as MultiFactorAssertionImpl;\n    return this.signInResolver(assertion);\n  }\n}\n\n/**\n * Provides a {@link MultiFactorResolver} suitable for completion of a\n * multi-factor flow.\n *\n * @param auth - The {@link Auth} instance.\n * @param error - The {@link MultiFactorError} raised during a sign-in, or\n * reauthentication operation.\n *\n * @public\n */\nexport function getMultiFactorResolver(\n  auth: Auth,\n  error: MultiFactorError\n): MultiFactorResolver {\n  const authModular = getModularInstance(auth);\n  const errorInternal = error as MultiFactorErrorInternal;\n  _assert(\n    error.customData.operationType,\n    authModular,\n    AuthErrorCode.ARGUMENT_ERROR\n  );\n  _assert(\n    errorInternal.customData._serverResponse?.mfaPendingCredential,\n    authModular,\n    AuthErrorCode.ARGUMENT_ERROR\n  );\n\n  return MultiFactorResolverImpl._fromError(authModular, errorInternal);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n  MultiFactorAssertion,\n  MultiFactorInfo,\n  MultiFactorSession,\n  MultiFactorUser,\n  User\n} from '../model/public_types';\n\nimport { withdrawMfa } from '../api/account_management/mfa';\nimport { _logoutIfInvalidated } from '../core/user/invalidation';\nimport { UserInternal } from '../model/user';\nimport { MultiFactorAssertionImpl } from './mfa_assertion';\nimport { MultiFactorInfoImpl } from './mfa_info';\nimport { MultiFactorSessionImpl } from './mfa_session';\nimport { getModularInstance } from '@firebase/util';\n\nexport class MultiFactorUserImpl implements MultiFactorUser {\n  enrolledFactors: MultiFactorInfo[] = [];\n\n  private constructor(readonly user: UserInternal) {\n    user._onReload(userInfo => {\n      if (userInfo.mfaInfo) {\n        this.enrolledFactors = userInfo.mfaInfo.map(enrollment =>\n          MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment)\n        );\n      }\n    });\n  }\n\n  static _fromUser(user: UserInternal): MultiFactorUserImpl {\n    return new MultiFactorUserImpl(user);\n  }\n\n  async getSession(): Promise<MultiFactorSession> {\n    return MultiFactorSessionImpl._fromIdtoken(\n      await this.user.getIdToken(),\n      this.user\n    );\n  }\n\n  async enroll(\n    assertionExtern: MultiFactorAssertion,\n    displayName?: string | null\n  ): Promise<void> {\n    const assertion = assertionExtern as MultiFactorAssertionImpl;\n    const session = (await this.getSession()) as MultiFactorSessionImpl;\n    const finalizeMfaResponse = await _logoutIfInvalidated(\n      this.user,\n      assertion._process(this.user.auth, session, displayName)\n    );\n    // New tokens will be issued after enrollment of the new second factors.\n    // They need to be updated on the user.\n    await this.user._updateTokensIfNecessary(finalizeMfaResponse);\n    // The user needs to be reloaded to get the new multi-factor information\n    // from server. USER_RELOADED event will be triggered and `enrolledFactors`\n    // will be updated.\n    return this.user.reload();\n  }\n\n  async unenroll(infoOrUid: MultiFactorInfo | string): Promise<void> {\n    const mfaEnrollmentId =\n      typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid;\n    const idToken = await this.user.getIdToken();\n    try {\n      const idTokenResponse = await _logoutIfInvalidated(\n        this.user,\n        withdrawMfa(this.user.auth, {\n          idToken,\n          mfaEnrollmentId\n        })\n      );\n      // Remove the second factor from the user's list.\n      this.enrolledFactors = this.enrolledFactors.filter(\n        ({ uid }) => uid !== mfaEnrollmentId\n      );\n      // Depending on whether the backend decided to revoke the user's session,\n      // the tokenResponse may be empty. If the tokens were not updated (and they\n      // are now invalid), reloading the user will discover this and invalidate\n      // the user's state accordingly.\n      await this.user._updateTokensIfNecessary(idTokenResponse);\n      await this.user.reload();\n    } catch (e) {\n      throw e;\n    }\n  }\n}\n\nconst multiFactorUserCache = new WeakMap<User, MultiFactorUser>();\n\n/**\n * The {@link MultiFactorUser} corresponding to the user.\n *\n * @remarks\n * This is used to access all multi-factor properties and operations related to the user.\n *\n * @param user - The user.\n *\n * @public\n */\nexport function multiFactor(user: User): MultiFactorUser {\n  const userModular = getModularInstance(user);\n  if (!multiFactorUserCache.has(userModular)) {\n    multiFactorUserCache.set(\n      userModular,\n      MultiFactorUserImpl._fromUser(userModular as UserInternal)\n    );\n  }\n  return multiFactorUserCache.get(userModular)!;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _addTidIfNecessary,\n  _performApiRequest\n} from '../index';\nimport { SignInWithPhoneNumberRequest } from '../authentication/sms';\nimport { FinalizeMfaResponse } from '../authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\n\n/**\n * MFA Info as returned by the API.\n */\ninterface BaseMfaEnrollment {\n  mfaEnrollmentId: string;\n  enrolledAt: number;\n  displayName?: string;\n}\n\n/**\n * An MFA provided by SMS verification.\n */\nexport interface PhoneMfaEnrollment extends BaseMfaEnrollment {\n  phoneInfo: string;\n}\n\n/**\n * An MFA provided by TOTP (Time-based One Time Password).\n */\nexport interface TotpMfaEnrollment extends BaseMfaEnrollment {}\n\n/**\n * MfaEnrollment can be any subtype of BaseMfaEnrollment, currently only PhoneMfaEnrollment and TotpMfaEnrollment are supported.\n */\nexport type MfaEnrollment = PhoneMfaEnrollment | TotpMfaEnrollment;\n\nexport interface StartPhoneMfaEnrollmentRequest {\n  idToken: string;\n  phoneEnrollmentInfo: {\n    phoneNumber: string;\n    // reCAPTCHA v2 token\n    recaptchaToken?: string;\n    // reCAPTCHA Enterprise token\n    captchaResponse?: string;\n    clientType?: RecaptchaClientType;\n    recaptchaVersion?: RecaptchaVersion;\n  };\n  tenantId?: string;\n}\n\nexport interface StartPhoneMfaEnrollmentResponse {\n  phoneSessionInfo: {\n    sessionInfo: string;\n  };\n}\n\nexport function startEnrollPhoneMfa(\n  auth: AuthInternal,\n  request: StartPhoneMfaEnrollmentRequest\n): Promise<StartPhoneMfaEnrollmentResponse> {\n  return _performApiRequest<\n    StartPhoneMfaEnrollmentRequest,\n    StartPhoneMfaEnrollmentResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.START_MFA_ENROLLMENT,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface FinalizePhoneMfaEnrollmentRequest {\n  idToken: string;\n  phoneVerificationInfo: SignInWithPhoneNumberRequest;\n  displayName?: string | null;\n  tenantId?: string;\n}\n\nexport interface FinalizePhoneMfaEnrollmentResponse\n  extends FinalizeMfaResponse {}\n\nexport function finalizeEnrollPhoneMfa(\n  auth: AuthInternal,\n  request: FinalizePhoneMfaEnrollmentRequest\n): Promise<FinalizePhoneMfaEnrollmentResponse> {\n  return _performApiRequest<\n    FinalizePhoneMfaEnrollmentRequest,\n    FinalizePhoneMfaEnrollmentResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.FINALIZE_MFA_ENROLLMENT,\n    _addTidIfNecessary(auth, request)\n  );\n}\nexport interface StartTotpMfaEnrollmentRequest {\n  idToken: string;\n  totpEnrollmentInfo: {};\n  tenantId?: string;\n}\n\nexport interface StartTotpMfaEnrollmentResponse {\n  totpSessionInfo: {\n    sharedSecretKey: string;\n    verificationCodeLength: number;\n    hashingAlgorithm: string;\n    periodSec: number;\n    sessionInfo: string;\n    finalizeEnrollmentTime: number;\n  };\n}\n\nexport function startEnrollTotpMfa(\n  auth: AuthInternal,\n  request: StartTotpMfaEnrollmentRequest\n): Promise<StartTotpMfaEnrollmentResponse> {\n  return _performApiRequest<\n    StartTotpMfaEnrollmentRequest,\n    StartTotpMfaEnrollmentResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.START_MFA_ENROLLMENT,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface TotpVerificationInfo {\n  sessionInfo: string;\n  verificationCode: string;\n}\nexport interface FinalizeTotpMfaEnrollmentRequest {\n  idToken: string;\n  totpVerificationInfo: TotpVerificationInfo;\n  displayName?: string | null;\n  tenantId?: string;\n}\n\nexport interface FinalizeTotpMfaEnrollmentResponse\n  extends FinalizeMfaResponse {}\n\nexport function finalizeEnrollTotpMfa(\n  auth: AuthInternal,\n  request: FinalizeTotpMfaEnrollmentRequest\n): Promise<FinalizeTotpMfaEnrollmentResponse> {\n  return _performApiRequest<\n    FinalizeTotpMfaEnrollmentRequest,\n    FinalizeTotpMfaEnrollmentResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.FINALIZE_MFA_ENROLLMENT,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface WithdrawMfaRequest {\n  idToken: string;\n  mfaEnrollmentId: string;\n  tenantId?: string;\n}\n\nexport interface WithdrawMfaResponse extends FinalizeMfaResponse {}\n\nexport function withdrawMfa(\n  auth: AuthInternal,\n  request: WithdrawMfaRequest\n): Promise<WithdrawMfaResponse> {\n  return _performApiRequest<WithdrawMfaRequest, WithdrawMfaResponse>(\n    auth,\n    HttpMethod.POST,\n    Endpoint.WITHDRAW_MFA,\n    _addTidIfNecessary(auth, request)\n  );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Persistence } from '../../model/public_types';\n\nexport const enum PersistenceType {\n  SESSION = 'SESSION',\n  LOCAL = 'LOCAL',\n  NONE = 'NONE',\n  COOKIE = 'COOKIE'\n}\n\nexport type PersistedBlob = Record<string, unknown>;\n\nexport interface Instantiator<T> {\n  (blob: PersistedBlob): T;\n}\n\nexport type PersistenceValue = PersistedBlob | string;\n\nexport const STORAGE_AVAILABLE_KEY = '__sak';\n\nexport interface StorageEventListener {\n  (value: PersistenceValue | null): void;\n}\n\nexport interface PersistenceInternal extends Persistence {\n  type: PersistenceType;\n  _isAvailable(): Promise<boolean>;\n  _set(key: string, value: PersistenceValue): Promise<void>;\n  _get<T extends PersistenceValue>(key: string): Promise<T | null>;\n  _remove(key: string): Promise<void>;\n  _addListener(key: string, listener: StorageEventListener): void;\n  _removeListener(key: string, listener: StorageEventListener): void;\n  // Should this persistence allow migration up the chosen hierarchy?\n  _shouldAllowMigration?: boolean;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  ReceiverHandler,\n  _EventType,\n  _ReceiverResponse,\n  SenderMessageEvent,\n  _Status,\n  _SenderRequest\n} from './index';\nimport { _allSettled } from './promise';\n\n/**\n * Interface class for receiving messages.\n *\n */\nexport class Receiver {\n  private static readonly receivers: Receiver[] = [];\n  private readonly boundEventHandler: EventListener;\n\n  private readonly handlersMap: {\n    // TypeScript doesn't have existential types :(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    [eventType: string]: Set<ReceiverHandler<any, any>>;\n  } = {};\n\n  constructor(private readonly eventTarget: EventTarget) {\n    this.boundEventHandler = this.handleEvent.bind(this);\n  }\n\n  /**\n   * Obtain an instance of a Receiver for a given event target, if none exists it will be created.\n   *\n   * @param eventTarget - An event target (such as window or self) through which the underlying\n   * messages will be received.\n   */\n  static _getInstance(eventTarget: EventTarget): Receiver {\n    // The results are stored in an array since objects can't be keys for other\n    // objects. In addition, setting a unique property on an event target as a\n    // hash map key may not be allowed due to CORS restrictions.\n    const existingInstance = this.receivers.find(receiver =>\n      receiver.isListeningto(eventTarget)\n    );\n    if (existingInstance) {\n      return existingInstance;\n    }\n    const newInstance = new Receiver(eventTarget);\n    this.receivers.push(newInstance);\n    return newInstance;\n  }\n\n  private isListeningto(eventTarget: EventTarget): boolean {\n    return this.eventTarget === eventTarget;\n  }\n\n  /**\n   * Fans out a MessageEvent to the appropriate listeners.\n   *\n   * @remarks\n   * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have\n   * finished processing.\n   *\n   * @param event - The MessageEvent.\n   *\n   */\n  private async handleEvent<\n    T extends _ReceiverResponse,\n    S extends _SenderRequest\n  >(event: Event): Promise<void> {\n    const messageEvent = event as MessageEvent<SenderMessageEvent<S>>;\n    const { eventId, eventType, data } = messageEvent.data;\n\n    const handlers: Set<ReceiverHandler<T, S>> | undefined =\n      this.handlersMap[eventType];\n    if (!handlers?.size) {\n      return;\n    }\n\n    messageEvent.ports[0].postMessage({\n      status: _Status.ACK,\n      eventId,\n      eventType\n    });\n\n    const promises = Array.from(handlers).map(async handler =>\n      handler(messageEvent.origin, data)\n    );\n    const response = await _allSettled(promises);\n    messageEvent.ports[0].postMessage({\n      status: _Status.DONE,\n      eventId,\n      eventType,\n      response\n    });\n  }\n\n  /**\n   * Subscribe an event handler for a particular event.\n   *\n   * @param eventType - Event name to subscribe to.\n   * @param eventHandler - The event handler which should receive the events.\n   *\n   */\n  _subscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n    eventType: _EventType,\n    eventHandler: ReceiverHandler<T, S>\n  ): void {\n    if (Object.keys(this.handlersMap).length === 0) {\n      this.eventTarget.addEventListener('message', this.boundEventHandler);\n    }\n\n    if (!this.handlersMap[eventType]) {\n      this.handlersMap[eventType] = new Set();\n    }\n\n    this.handlersMap[eventType].add(eventHandler);\n  }\n\n  /**\n   * Unsubscribe an event handler from a particular event.\n   *\n   * @param eventType - Event name to unsubscribe from.\n   * @param eventHandler - Optional event handler, if none provided, unsubscribe all handlers on this event.\n   *\n   */\n  _unsubscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n    eventType: _EventType,\n    eventHandler?: ReceiverHandler<T, S>\n  ): void {\n    if (this.handlersMap[eventType] && eventHandler) {\n      this.handlersMap[eventType].delete(eventHandler);\n    }\n    if (!eventHandler || this.handlersMap[eventType].size === 0) {\n      delete this.handlersMap[eventType];\n    }\n\n    if (Object.keys(this.handlersMap).length === 0) {\n      this.eventTarget.removeEventListener('message', this.boundEventHandler);\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** TODO: remove this once tslib has a polyfill for Promise.allSettled */\ninterface PromiseFulfilledResult<T> {\n  fulfilled: true;\n  value: T;\n}\n\ninterface PromiseRejectedResult {\n  fulfilled: false;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  reason: any;\n}\n\nexport type PromiseSettledResult<T> =\n  | PromiseFulfilledResult<T>\n  | PromiseRejectedResult;\n\n/**\n * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`.\n *\n * @param promises - Array of promises to wait on.\n */\nexport function _allSettled<T>(\n  promises: Array<Promise<T>>\n): Promise<Array<PromiseSettledResult<T>>> {\n  return Promise.all(\n    promises.map(async promise => {\n      try {\n        const value = await promise;\n        return {\n          fulfilled: true,\n          value\n        } as PromiseFulfilledResult<T>;\n      } catch (reason) {\n        return {\n          fulfilled: false,\n          reason\n        } as PromiseRejectedResult;\n      }\n    })\n  );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _generateEventId } from '../../core/util/event_id';\nimport {\n  _SenderRequest,\n  _EventType,\n  ReceiverMessageEvent,\n  _MessageError,\n  SenderMessageEvent,\n  _Status,\n  _ReceiverMessageResponse,\n  _ReceiverResponse,\n  _TimeoutDuration\n} from './index';\n\ninterface MessageHandler {\n  messageChannel: MessageChannel;\n  onMessage: EventListenerOrEventListenerObject;\n}\n\n/**\n * Interface for sending messages and waiting for a completion response.\n *\n */\nexport class Sender {\n  private readonly handlers = new Set<MessageHandler>();\n\n  constructor(private readonly target: ServiceWorker) {}\n\n  /**\n   * Unsubscribe the handler and remove it from our tracking Set.\n   *\n   * @param handler - The handler to unsubscribe.\n   */\n  private removeMessageHandler(handler: MessageHandler): void {\n    if (handler.messageChannel) {\n      handler.messageChannel.port1.removeEventListener(\n        'message',\n        handler.onMessage\n      );\n      handler.messageChannel.port1.close();\n    }\n    this.handlers.delete(handler);\n  }\n\n  /**\n   * Send a message to the Receiver located at {@link target}.\n   *\n   * @remarks\n   * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the\n   * receiver has had a chance to fully process the event.\n   *\n   * @param eventType - Type of event to send.\n   * @param data - The payload of the event.\n   * @param timeout - Timeout for waiting on an ACK from the receiver.\n   *\n   * @returns An array of settled promises from all the handlers that were listening on the receiver.\n   */\n  async _send<T extends _ReceiverResponse, S extends _SenderRequest>(\n    eventType: _EventType,\n    data: S,\n    timeout = _TimeoutDuration.ACK\n  ): Promise<_ReceiverMessageResponse<T>> {\n    const messageChannel =\n      typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;\n    if (!messageChannel) {\n      throw new Error(_MessageError.CONNECTION_UNAVAILABLE);\n    }\n    // Node timers and browser timers return fundamentally different types.\n    // We don't actually care what the value is but TS won't accept unknown and\n    // we can't cast properly in both environments.\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let completionTimer: any;\n    let handler: MessageHandler;\n    return new Promise<_ReceiverMessageResponse<T>>((resolve, reject) => {\n      const eventId = _generateEventId('', 20);\n      messageChannel.port1.start();\n      const ackTimer = setTimeout(() => {\n        reject(new Error(_MessageError.UNSUPPORTED_EVENT));\n      }, timeout);\n      handler = {\n        messageChannel,\n        onMessage(event: Event): void {\n          const messageEvent = event as MessageEvent<ReceiverMessageEvent<T>>;\n          if (messageEvent.data.eventId !== eventId) {\n            return;\n          }\n          switch (messageEvent.data.status) {\n            case _Status.ACK:\n              // The receiver should ACK first.\n              clearTimeout(ackTimer);\n              completionTimer = setTimeout(() => {\n                reject(new Error(_MessageError.TIMEOUT));\n              }, _TimeoutDuration.COMPLETION);\n              break;\n            case _Status.DONE:\n              // Once the receiver's handlers are finished we will get the results.\n              clearTimeout(completionTimer);\n              resolve(messageEvent.data.response);\n              break;\n            default:\n              clearTimeout(ackTimer);\n              clearTimeout(completionTimer);\n              reject(new Error(_MessageError.INVALID_RESPONSE));\n              break;\n          }\n        }\n      };\n      this.handlers.add(handler);\n      messageChannel.port1.addEventListener('message', handler.onMessage);\n      this.target.postMessage(\n        {\n          eventType,\n          eventId,\n          data\n        } as SenderMessageEvent<S>,\n        [messageChannel.port2]\n      );\n    }).finally(() => {\n      if (handler) {\n        this.removeMessageHandler(handler);\n      }\n    });\n  }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function _generateEventId(prefix = '', digits = 10): string {\n  let random = '';\n  for (let i = 0; i < digits; i++) {\n    random += Math.floor(Math.random() * 10);\n  }\n  return prefix + random;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Recaptcha, GreCAPTCHATopLevel } from './recaptcha/recaptcha';\n\n/**\n * A specialized window type that melds the normal window type plus the\n * various bits we need. The three different blocks that are &'d together\n * cant be defined in the same block together.\n */\nexport type AuthWindow = {\n  // Standard window types\n  [T in keyof Window]: Window[T];\n} & {\n  // Any known / named properties we want to add\n  grecaptcha?: Recaptcha | GreCAPTCHATopLevel;\n  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n  ___jsl?: Record<string, any>;\n  gapi?: typeof gapi;\n} & {\n  // A final catch-all for callbacks (which will have random names) that\n  // we will stick on the window.\n  [callback: string]: (...args: unknown[]) => void;\n};\n\n/**\n * Lazy accessor for window, since the compat layer won't tree shake this out,\n * we need to make sure not to mess with window unless we have to\n */\nexport function _window(): AuthWindow {\n  return window as unknown as AuthWindow;\n}\n\nexport function _setWindowLocation(url: string): void {\n  _window().location.href = url;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _window } from '../auth_window';\n\nexport function _isWorker(): boolean {\n  return (\n    typeof _window()['WorkerGlobalScope'] !== 'undefined' &&\n    typeof _window()['importScripts'] === 'function'\n  );\n}\n\nexport async function _getActiveServiceWorker(): Promise<ServiceWorker | null> {\n  if (!navigator?.serviceWorker) {\n    return null;\n  }\n  try {\n    const registration = await navigator.serviceWorker.ready;\n    return registration.active;\n  } catch {\n    return null;\n  }\n}\n\nexport function _getServiceWorkerController(): ServiceWorker | null {\n  return navigator?.serviceWorker?.controller || null;\n}\n\nexport function _getWorkerGlobalScope(): ServiceWorker | null {\n  return _isWorker() ? (self as unknown as ServiceWorker) : null;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\nimport {\n  PersistedBlob,\n  PersistenceInternal as InternalPersistence,\n  PersistenceType,\n  PersistenceValue,\n  StorageEventListener,\n  STORAGE_AVAILABLE_KEY\n} from '../../core/persistence/';\nimport {\n  _EventType,\n  _PingResponse,\n  KeyChangedResponse,\n  KeyChangedRequest,\n  PingRequest,\n  _TimeoutDuration\n} from '../messagechannel/index';\nimport { Receiver } from '../messagechannel/receiver';\nimport { Sender } from '../messagechannel/sender';\nimport {\n  _isWorker,\n  _getActiveServiceWorker,\n  _getServiceWorkerController,\n  _getWorkerGlobalScope\n} from '../util/worker';\nimport { _logWarn } from '../../core/util/log';\n\nexport const DB_NAME = 'firebaseLocalStorageDb';\nconst DB_VERSION = 1;\nconst DB_OBJECTSTORE_NAME = 'firebaseLocalStorage';\nconst DB_DATA_KEYPATH = 'fbase_key';\n\ninterface DBObject {\n  [DB_DATA_KEYPATH]: string;\n  value: PersistedBlob;\n}\n\n/**\n * Promise wrapper for IDBRequest\n *\n * Unfortunately we can't cleanly extend Promise<T> since promises are not callable in ES6\n *\n */\nclass DBPromise<T> {\n  constructor(private readonly request: IDBRequest) {}\n\n  toPromise(): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      this.request.addEventListener('success', () => {\n        resolve(this.request.result);\n      });\n      this.request.addEventListener('error', () => {\n        reject(this.request.error);\n      });\n    });\n  }\n}\n\nfunction getObjectStore(db: IDBDatabase, isReadWrite: boolean): IDBObjectStore {\n  return db\n    .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly')\n    .objectStore(DB_OBJECTSTORE_NAME);\n}\n\nexport async function _clearDatabase(db: IDBDatabase): Promise<void> {\n  const objectStore = getObjectStore(db, true);\n  return new DBPromise<void>(objectStore.clear()).toPromise();\n}\n\nexport function _deleteDatabase(): Promise<void> {\n  const request = indexedDB.deleteDatabase(DB_NAME);\n  return new DBPromise<void>(request).toPromise();\n}\n\nexport function _openDatabase(): Promise<IDBDatabase> {\n  const request = indexedDB.open(DB_NAME, DB_VERSION);\n  return new Promise((resolve, reject) => {\n    request.addEventListener('error', () => {\n      reject(request.error);\n    });\n\n    request.addEventListener('upgradeneeded', () => {\n      const db = request.result;\n\n      try {\n        db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });\n      } catch (e) {\n        reject(e);\n      }\n    });\n\n    request.addEventListener('success', async () => {\n      const db: IDBDatabase = request.result;\n      // Strange bug that occurs in Firefox when multiple tabs are opened at the\n      // same time. The only way to recover seems to be deleting the database\n      // and re-initializing it.\n      // https://github.com/firebase/firebase-js-sdk/issues/634\n\n      if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) {\n        // Need to close the database or else you get a `blocked` event\n        db.close();\n        await _deleteDatabase();\n        resolve(await _openDatabase());\n      } else {\n        resolve(db);\n      }\n    });\n  });\n}\n\nexport async function _putObject(\n  db: IDBDatabase,\n  key: string,\n  value: PersistenceValue | string\n): Promise<void> {\n  const request = getObjectStore(db, true).put({\n    [DB_DATA_KEYPATH]: key,\n    value\n  });\n  return new DBPromise<void>(request).toPromise();\n}\n\nasync function getObject(\n  db: IDBDatabase,\n  key: string\n): Promise<PersistedBlob | null> {\n  const request = getObjectStore(db, false).get(key);\n  const data = await new DBPromise<DBObject | undefined>(request).toPromise();\n  return data === undefined ? null : data.value;\n}\n\nexport function _deleteObject(db: IDBDatabase, key: string): Promise<void> {\n  const request = getObjectStore(db, true).delete(key);\n  return new DBPromise<void>(request).toPromise();\n}\n\nexport const _POLLING_INTERVAL_MS = 800;\nexport const _TRANSACTION_RETRY_COUNT = 3;\n\nclass IndexedDBLocalPersistence implements InternalPersistence {\n  static type: 'LOCAL' = 'LOCAL';\n\n  type = PersistenceType.LOCAL;\n  private dbPromise: Promise<IDBDatabase> | null = null;\n  readonly _shouldAllowMigration = true;\n\n  private readonly listeners: Record<string, Set<StorageEventListener>> = {};\n  private readonly localCache: Record<string, PersistenceValue | null> = {};\n  // setTimeout return value is platform specific\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private pollTimer: any | null = null;\n  private isHiding = false;\n  private pendingWrites = 0;\n\n  private receiver: Receiver | null = null;\n  private sender: Sender | null = null;\n  private serviceWorkerReceiverAvailable = false;\n  private activeServiceWorker: ServiceWorker | null = null;\n  // Visible for testing only\n  readonly _workerInitializationPromise: Promise<void>;\n\n  private readonly onPageHide = (): void => {\n    this.isHiding = true;\n    this.stopPolling();\n    if (this.dbPromise) {\n      this.dbPromise.then(db => db.close()).catch(() => {});\n      this.dbPromise = null;\n    }\n  };\n\n  private readonly onPageShow = (): void => {\n    if (this.isHiding) {\n      this.isHiding = false;\n      if (Object.keys(this.listeners).length > 0) {\n        this.startPolling();\n      }\n    }\n  };\n\n  private readonly onVisibilityChange = (): void => {\n    if (typeof document !== 'undefined') {\n      if (document.visibilityState === 'hidden') {\n        this.onPageHide();\n      } else if (document.visibilityState === 'visible') {\n        this.onPageShow();\n      }\n    }\n  };\n\n  private registerLifecycleListeners(): void {\n    if (\n      typeof window !== 'undefined' &&\n      typeof window.addEventListener === 'function'\n    ) {\n      window.addEventListener('pagehide', this.onPageHide);\n      window.addEventListener('pageshow', this.onPageShow);\n    }\n    if (\n      typeof document !== 'undefined' &&\n      typeof document.addEventListener === 'function'\n    ) {\n      document.addEventListener('visibilitychange', this.onVisibilityChange);\n    }\n  }\n\n  private unregisterLifecycleListeners(): void {\n    if (\n      typeof window !== 'undefined' &&\n      typeof window.removeEventListener === 'function'\n    ) {\n      window.removeEventListener('pagehide', this.onPageHide);\n      window.removeEventListener('pageshow', this.onPageShow);\n    }\n    if (\n      typeof document !== 'undefined' &&\n      typeof document.removeEventListener === 'function'\n    ) {\n      document.removeEventListener('visibilitychange', this.onVisibilityChange);\n    }\n  }\n\n  constructor() {\n    // Fire & forget the service worker registration as it may never resolve\n    this._workerInitializationPromise =\n      this.initializeServiceWorkerMessaging().then(\n        () => {},\n        () => {}\n      );\n  }\n\n  async _openDb(): Promise<IDBDatabase> {\n    if (this.isHiding) {\n      throw new Error('Database is closing/hidden');\n    }\n    if (this.dbPromise) {\n      return this.dbPromise;\n    }\n    this.dbPromise = _openDatabase();\n    this.dbPromise.catch(() => {\n      this.dbPromise = null;\n    });\n    return this.dbPromise;\n  }\n\n  async _withRetries<T>(op: (db: IDBDatabase) => Promise<T>): Promise<T> {\n    let numAttempts = 0;\n\n    while (true) {\n      try {\n        const db = await this._openDb();\n        return await op(db);\n      } catch (e) {\n        if (this.isHiding) {\n          throw e;\n        }\n        if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {\n          throw e;\n        }\n        if (this.dbPromise) {\n          const db = await this.dbPromise;\n          db.close();\n          this.dbPromise = null;\n        }\n        // TODO: consider adding exponential backoff\n      }\n    }\n  }\n\n  /**\n   * IndexedDB events do not propagate from the main window to the worker context.  We rely on a\n   * postMessage interface to send these events to the worker ourselves.\n   */\n  private async initializeServiceWorkerMessaging(): Promise<void> {\n    return _isWorker() ? this.initializeReceiver() : this.initializeSender();\n  }\n\n  /**\n   * As the worker we should listen to events from the main window.\n   */\n  private async initializeReceiver(): Promise<void> {\n    this.receiver = Receiver._getInstance(_getWorkerGlobalScope()!);\n    // Refresh from persistence if we receive a KeyChanged message.\n    this.receiver._subscribe(\n      _EventType.KEY_CHANGED,\n      async (_origin: string, data: KeyChangedRequest) => {\n        const keys = await this._poll();\n        return {\n          keyProcessed: keys.includes(data.key)\n        };\n      }\n    );\n    // Let the sender know that we are listening so they give us more timeout.\n    this.receiver._subscribe(\n      _EventType.PING,\n      async (_origin: string, _data: PingRequest) => {\n        return [_EventType.KEY_CHANGED];\n      }\n    );\n  }\n\n  /**\n   * As the main window, we should let the worker know when keys change (set and remove).\n   *\n   * @remarks\n   * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready}\n   * may not resolve.\n   */\n  private async initializeSender(): Promise<void> {\n    // Check to see if there's an active service worker.\n    this.activeServiceWorker = await _getActiveServiceWorker();\n    if (!this.activeServiceWorker) {\n      return;\n    }\n    this.sender = new Sender(this.activeServiceWorker);\n    // Ping the service worker to check what events they can handle.\n    const results = await this.sender._send<_PingResponse, PingRequest>(\n      _EventType.PING,\n      {},\n      _TimeoutDuration.LONG_ACK\n    );\n    if (!results) {\n      return;\n    }\n    if (\n      results[0]?.fulfilled &&\n      results[0]?.value.includes(_EventType.KEY_CHANGED)\n    ) {\n      this.serviceWorkerReceiverAvailable = true;\n    }\n  }\n\n  /**\n   * Let the worker know about a changed key, the exact key doesn't technically matter since the\n   * worker will just trigger a full sync anyway.\n   *\n   * @remarks\n   * For now, we only support one service worker per page.\n   *\n   * @param key - Storage key which changed.\n   */\n  private async notifyServiceWorker(key: string): Promise<void> {\n    if (\n      !this.sender ||\n      !this.activeServiceWorker ||\n      _getServiceWorkerController() !== this.activeServiceWorker\n    ) {\n      return;\n    }\n    try {\n      await this.sender._send<KeyChangedResponse, KeyChangedRequest>(\n        _EventType.KEY_CHANGED,\n        { key },\n        // Use long timeout if receiver has previously responded to a ping from us.\n        this.serviceWorkerReceiverAvailable\n          ? _TimeoutDuration.LONG_ACK\n          : _TimeoutDuration.ACK\n      );\n    } catch {\n      // This is a best effort approach. Ignore errors.\n    }\n  }\n\n  async _isAvailable(): Promise<boolean> {\n    try {\n      if (!indexedDB) {\n        return false;\n      }\n      await this._withRetries(async (db: IDBDatabase) => {\n        await _putObject(db, STORAGE_AVAILABLE_KEY, '1');\n        await _deleteObject(db, STORAGE_AVAILABLE_KEY);\n      });\n      return true;\n    } catch {}\n    return false;\n  }\n\n  private async _withPendingWrite(write: () => Promise<void>): Promise<void> {\n    this.pendingWrites++;\n    try {\n      await write();\n    } finally {\n      this.pendingWrites--;\n    }\n  }\n\n  async _set(key: string, value: PersistenceValue): Promise<void> {\n    return this._withPendingWrite(async () => {\n      await this._withRetries((db: IDBDatabase) => _putObject(db, key, value));\n      this.localCache[key] = value;\n      return this.notifyServiceWorker(key);\n    });\n  }\n\n  async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n    const obj = (await this._withRetries((db: IDBDatabase) =>\n      getObject(db, key)\n    )) as T;\n    this.localCache[key] = obj;\n    return obj;\n  }\n\n  async _remove(key: string): Promise<void> {\n    return this._withPendingWrite(async () => {\n      await this._withRetries((db: IDBDatabase) => _deleteObject(db, key));\n      delete this.localCache[key];\n      return this.notifyServiceWorker(key);\n    });\n  }\n\n  private async _poll(): Promise<string[]> {\n    if (this.isHiding) {\n      return [];\n    }\n    try {\n      // TODO: check if we need to fallback if getAll is not supported\n      const result = await this._withRetries((db: IDBDatabase) => {\n        const getAllRequest = getObjectStore(db, false).getAll();\n        return new DBPromise<DBObject[] | null>(getAllRequest).toPromise();\n      });\n\n      if (this.isHiding) {\n        return [];\n      }\n\n      if (!result) {\n        return [];\n      }\n\n      // If we have pending writes in progress abort, we'll get picked up on the next poll\n      if (this.pendingWrites !== 0) {\n        return [];\n      }\n\n      const keys = [];\n      const keysInResult = new Set();\n      if (result.length !== 0) {\n        for (const { fbase_key: key, value } of result) {\n          keysInResult.add(key);\n          if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) {\n            this.notifyListeners(key, value as PersistenceValue);\n            keys.push(key);\n          }\n        }\n      }\n\n      for (const localKey of Object.keys(this.localCache)) {\n        if (this.localCache[localKey] && !keysInResult.has(localKey)) {\n          // Deleted\n          this.notifyListeners(localKey, null);\n          keys.push(localKey);\n        }\n      }\n      return keys;\n    } catch (e) {\n      if (!this.isHiding) {\n        _logWarn(`Firebase Auth cross-tab polling failed with error: ${e}`);\n      }\n      return [];\n    }\n  }\n\n  private notifyListeners(\n    key: string,\n    newValue: PersistenceValue | null\n  ): void {\n    this.localCache[key] = newValue;\n    const listeners = this.listeners[key];\n    if (listeners) {\n      for (const listener of Array.from(listeners)) {\n        listener(newValue);\n      }\n    }\n  }\n\n  private startPolling(): void {\n    this.stopPolling();\n\n    this.pollTimer = setInterval(\n      async () => this._poll(),\n      _POLLING_INTERVAL_MS\n    );\n  }\n\n  private stopPolling(): void {\n    if (this.pollTimer) {\n      clearInterval(this.pollTimer);\n      this.pollTimer = null;\n    }\n  }\n\n  _addListener(key: string, listener: StorageEventListener): void {\n    if (Object.keys(this.listeners).length === 0) {\n      this.startPolling();\n      this.registerLifecycleListeners();\n    }\n    if (!this.listeners[key]) {\n      this.listeners[key] = new Set();\n      // Populate the cache to avoid spuriously triggering on first poll.\n      void this._get(key); // This can happen in the background async and we can return immediately.\n    }\n    this.listeners[key].add(listener);\n  }\n\n  _removeListener(key: string, listener: StorageEventListener): void {\n    if (this.listeners[key]) {\n      this.listeners[key].delete(listener);\n\n      if (this.listeners[key].size === 0) {\n        delete this.listeners[key];\n      }\n    }\n\n    if (Object.keys(this.listeners).length === 0) {\n      this.stopPolling();\n      this.unregisterLifecycleListeners();\n    }\n  }\n}\n\n/**\n * An implementation of {@link Persistence} of type `LOCAL` using `indexedDB`\n * for the underlying storage.\n *\n * @public\n */\nexport const indexedDBLocalPersistence: Persistence = IndexedDBLocalPersistence;\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { FactorId, MultiFactorAssertion } from '../model/public_types';\nimport { debugFail } from '../core/util/assert';\nimport { MultiFactorSessionImpl, MultiFactorSessionType } from './mfa_session';\nimport { FinalizeMfaResponse } from '../api/authentication/mfa';\nimport { AuthInternal } from '../model/auth';\n\nexport abstract class MultiFactorAssertionImpl implements MultiFactorAssertion {\n  protected constructor(readonly factorId: FactorId) {}\n\n  _process(\n    auth: AuthInternal,\n    session: MultiFactorSessionImpl,\n    displayName?: string | null\n  ): Promise<FinalizeMfaResponse> {\n    switch (session.type) {\n      case MultiFactorSessionType.ENROLL:\n        return this._finalizeEnroll(auth, session.credential, displayName);\n      case MultiFactorSessionType.SIGN_IN:\n        return this._finalizeSignIn(auth, session.credential);\n      default:\n        return debugFail('unexpected MultiFactorSessionType');\n    }\n  }\n\n  abstract _finalizeEnroll(\n    auth: AuthInternal,\n    idToken: string,\n    displayName?: string | null\n  ): Promise<FinalizeMfaResponse>;\n  abstract _finalizeSignIn(\n    auth: AuthInternal,\n    mfaPendingCredential: string\n  ): Promise<FinalizeMfaResponse>;\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n  TotpMultiFactorAssertion,\n  MultiFactorSession,\n  FactorId\n} from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\nimport {\n  finalizeEnrollTotpMfa,\n  startEnrollTotpMfa,\n  StartTotpMfaEnrollmentResponse,\n  TotpVerificationInfo\n} from '../../api/account_management/mfa';\nimport {\n  FinalizeMfaResponse,\n  finalizeSignInTotpMfa\n} from '../../api/authentication/mfa';\nimport { MultiFactorAssertionImpl } from '../../mfa/mfa_assertion';\nimport { MultiFactorSessionImpl } from '../mfa_session';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\n\n/**\n * Provider for generating a {@link TotpMultiFactorAssertion}.\n *\n * @public\n */\nexport class TotpMultiFactorGenerator {\n  /**\n   * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of\n   * the TOTP (time-based one-time password) second factor.\n   * This assertion is used to complete enrollment in TOTP second factor.\n   *\n   * @param secret A {@link TotpSecret} containing the shared secret key and other TOTP parameters.\n   * @param oneTimePassword One-time password from TOTP App.\n   * @returns A {@link TotpMultiFactorAssertion} which can be used with\n   * {@link MultiFactorUser.enroll}.\n   */\n  static assertionForEnrollment(\n    secret: TotpSecret,\n    oneTimePassword: string\n  ): TotpMultiFactorAssertion {\n    return TotpMultiFactorAssertionImpl._fromSecret(secret, oneTimePassword);\n  }\n\n  /**\n   * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of the TOTP second factor.\n   * This assertion is used to complete signIn with TOTP as the second factor.\n   *\n   * @param enrollmentId identifies the enrolled TOTP second factor.\n   * @param oneTimePassword One-time password from TOTP App.\n   * @returns A {@link TotpMultiFactorAssertion} which can be used with\n   * {@link MultiFactorResolver.resolveSignIn}.\n   */\n  static assertionForSignIn(\n    enrollmentId: string,\n    oneTimePassword: string\n  ): TotpMultiFactorAssertion {\n    return TotpMultiFactorAssertionImpl._fromEnrollmentId(\n      enrollmentId,\n      oneTimePassword\n    );\n  }\n\n  /**\n   * Returns a promise to {@link TotpSecret} which contains the TOTP shared secret key and other parameters.\n   * Creates a TOTP secret as part of enrolling a TOTP second factor.\n   * Used for generating a QR code URL or inputting into a TOTP app.\n   * This method uses the auth instance corresponding to the user in the multiFactorSession.\n   *\n   * @param session The {@link MultiFactorSession} that the user is part of.\n   * @returns A promise to {@link TotpSecret}.\n   */\n  static async generateSecret(\n    session: MultiFactorSession\n  ): Promise<TotpSecret> {\n    const mfaSession = session as MultiFactorSessionImpl;\n    _assert(\n      typeof mfaSession.user?.auth !== 'undefined',\n      AuthErrorCode.INTERNAL_ERROR\n    );\n    const response = await startEnrollTotpMfa(mfaSession.user.auth, {\n      idToken: mfaSession.credential,\n      totpEnrollmentInfo: {}\n    });\n    return TotpSecret._fromStartTotpMfaEnrollmentResponse(\n      response,\n      mfaSession.user.auth\n    );\n  }\n\n  /**\n   * The identifier of the TOTP second factor: `totp`.\n   */\n  static FACTOR_ID: 'totp' = FactorId.TOTP;\n}\n\nexport class TotpMultiFactorAssertionImpl\n  extends MultiFactorAssertionImpl\n  implements TotpMultiFactorAssertion\n{\n  constructor(\n    readonly otp: string,\n    readonly enrollmentId?: string,\n    readonly secret?: TotpSecret\n  ) {\n    super(FactorId.TOTP);\n  }\n\n  /** @internal */\n  static _fromSecret(\n    secret: TotpSecret,\n    otp: string\n  ): TotpMultiFactorAssertionImpl {\n    return new TotpMultiFactorAssertionImpl(otp, undefined, secret);\n  }\n\n  /** @internal */\n  static _fromEnrollmentId(\n    enrollmentId: string,\n    otp: string\n  ): TotpMultiFactorAssertionImpl {\n    return new TotpMultiFactorAssertionImpl(otp, enrollmentId);\n  }\n\n  /** @internal */\n  async _finalizeEnroll(\n    auth: AuthInternal,\n    idToken: string,\n    displayName?: string | null\n  ): Promise<FinalizeMfaResponse> {\n    _assert(\n      typeof this.secret !== 'undefined',\n      auth,\n      AuthErrorCode.ARGUMENT_ERROR\n    );\n    return finalizeEnrollTotpMfa(auth, {\n      idToken,\n      displayName,\n      totpVerificationInfo: this.secret._makeTotpVerificationInfo(this.otp)\n    });\n  }\n\n  /** @internal */\n  async _finalizeSignIn(\n    auth: AuthInternal,\n    mfaPendingCredential: string\n  ): Promise<FinalizeMfaResponse> {\n    _assert(\n      this.enrollmentId !== undefined && this.otp !== undefined,\n      auth,\n      AuthErrorCode.ARGUMENT_ERROR\n    );\n    const totpVerificationInfo = { verificationCode: this.otp };\n    return finalizeSignInTotpMfa(auth, {\n      mfaPendingCredential,\n      mfaEnrollmentId: this.enrollmentId,\n      totpVerificationInfo\n    });\n  }\n}\n\n/**\n * Provider for generating a {@link TotpMultiFactorAssertion}.\n *\n * Stores the shared secret key and other parameters to generate time-based OTPs.\n * Implements methods to retrieve the shared secret key and generate a QR code URL.\n * @public\n */\nexport class TotpSecret {\n  /**\n   * Shared secret key/seed used for enrolling in TOTP MFA and generating OTPs.\n   */\n  readonly secretKey: string;\n  /**\n   * Hashing algorithm used.\n   */\n  readonly hashingAlgorithm: string;\n  /**\n   * Length of the one-time passwords to be generated.\n   */\n  readonly codeLength: number;\n  /**\n   * The interval (in seconds) when the OTP codes should change.\n   */\n  readonly codeIntervalSeconds: number;\n  /**\n   * The timestamp (UTC string) by which TOTP enrollment should be completed.\n   */\n  // This can be used by callers to show a countdown of when to enter OTP code by.\n  readonly enrollmentCompletionDeadline: string;\n\n  // The public members are declared outside the constructor so the docs can be generated.\n  private constructor(\n    secretKey: string,\n    hashingAlgorithm: string,\n    codeLength: number,\n    codeIntervalSeconds: number,\n    enrollmentCompletionDeadline: string,\n    private readonly sessionInfo: string,\n    private readonly auth: AuthInternal\n  ) {\n    this.secretKey = secretKey;\n    this.hashingAlgorithm = hashingAlgorithm;\n    this.codeLength = codeLength;\n    this.codeIntervalSeconds = codeIntervalSeconds;\n    this.enrollmentCompletionDeadline = enrollmentCompletionDeadline;\n  }\n\n  /** @internal */\n  static _fromStartTotpMfaEnrollmentResponse(\n    response: StartTotpMfaEnrollmentResponse,\n    auth: AuthInternal\n  ): TotpSecret {\n    return new TotpSecret(\n      response.totpSessionInfo.sharedSecretKey,\n      response.totpSessionInfo.hashingAlgorithm,\n      response.totpSessionInfo.verificationCodeLength,\n      response.totpSessionInfo.periodSec,\n      new Date(response.totpSessionInfo.finalizeEnrollmentTime).toUTCString(),\n      response.totpSessionInfo.sessionInfo,\n      auth\n    );\n  }\n\n  /** @internal */\n  _makeTotpVerificationInfo(otp: string): TotpVerificationInfo {\n    return { sessionInfo: this.sessionInfo, verificationCode: otp };\n  }\n\n  /**\n   * Returns a QR code URL as described in\n   * https://github.com/google/google-authenticator/wiki/Key-Uri-Format\n   * This can be displayed to the user as a QR code to be scanned into a TOTP app like Google Authenticator.\n   * If the optional parameters are unspecified, an accountName of <userEmail> and issuer of <firebaseAppName> are used.\n   *\n   * @param accountName the name of the account/app along with a user identifier.\n   * @param issuer issuer of the TOTP (likely the app name).\n   * @returns A QR code URL string.\n   */\n  generateQrCodeUrl(accountName?: string, issuer?: string): string {\n    let useDefaults = false;\n    if (_isEmptyString(accountName) || _isEmptyString(issuer)) {\n      useDefaults = true;\n    }\n    if (useDefaults) {\n      if (_isEmptyString(accountName)) {\n        accountName = this.auth.currentUser?.email || 'unknownuser';\n      }\n      if (_isEmptyString(issuer)) {\n        issuer = this.auth.name;\n      }\n    }\n    return `otpauth://totp/${issuer}:${accountName}?secret=${this.secretKey}&issuer=${issuer}&algorithm=${this.hashingAlgorithm}&digits=${this.codeLength}`;\n  }\n}\n\n/** @internal */\nfunction _isEmptyString(input?: string): boolean {\n  return typeof input === 'undefined' || input?.length === 0;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _performApiRequest,\n  Endpoint,\n  HttpMethod,\n  RecaptchaClientType,\n  RecaptchaVersion,\n  _addTidIfNecessary\n} from '../index';\nimport { Auth } from '../../model/public_types';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { MfaEnrollment } from '../account_management/mfa';\nimport { SignInWithIdpResponse } from './idp';\nimport {\n  SignInWithPhoneNumberRequest,\n  SignInWithPhoneNumberResponse\n} from './sms';\n\nexport interface FinalizeMfaResponse {\n  idToken: string;\n  refreshToken: string;\n}\n\n/**\n * @internal\n */\nexport interface IdTokenMfaResponse extends IdTokenResponse {\n  mfaPendingCredential?: string;\n  mfaInfo?: MfaEnrollment[];\n}\n\nexport interface StartPhoneMfaSignInRequest {\n  mfaPendingCredential: string;\n  mfaEnrollmentId: string;\n  phoneSignInInfo: {\n    // reCAPTCHA v2 token\n    recaptchaToken?: string;\n    // reCAPTCHA Enterprise token\n    captchaResponse?: string;\n    clientType?: RecaptchaClientType;\n    recaptchaVersion?: RecaptchaVersion;\n  };\n  tenantId?: string;\n}\n\nexport interface StartPhoneMfaSignInResponse {\n  phoneResponseInfo: {\n    sessionInfo: string;\n  };\n}\n\nexport function startSignInPhoneMfa(\n  auth: Auth,\n  request: StartPhoneMfaSignInRequest\n): Promise<StartPhoneMfaSignInResponse> {\n  return _performApiRequest<\n    StartPhoneMfaSignInRequest,\n    StartPhoneMfaSignInResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.START_MFA_SIGN_IN,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport interface FinalizePhoneMfaSignInRequest {\n  mfaPendingCredential: string;\n  phoneVerificationInfo: SignInWithPhoneNumberRequest;\n  tenantId?: string;\n}\n\n// TOTP MFA Sign in only has a finalize phase. Phone MFA has a start phase to initiate sending an\n// SMS and a finalize phase to complete sign in. With TOTP, the user already has the OTP in the\n// TOTP/Authenticator app.\nexport interface FinalizeTotpMfaSignInRequest {\n  mfaPendingCredential: string;\n  totpVerificationInfo: { verificationCode: string };\n  tenantId?: string;\n  mfaEnrollmentId: string;\n}\n\nexport interface FinalizePhoneMfaSignInResponse extends FinalizeMfaResponse {}\n\nexport interface FinalizeTotpMfaSignInResponse extends FinalizeMfaResponse {}\n\nexport function finalizeSignInPhoneMfa(\n  auth: Auth,\n  request: FinalizePhoneMfaSignInRequest\n): Promise<FinalizePhoneMfaSignInResponse> {\n  return _performApiRequest<\n    FinalizePhoneMfaSignInRequest,\n    FinalizePhoneMfaSignInResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.FINALIZE_MFA_SIGN_IN,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\nexport function finalizeSignInTotpMfa(\n  auth: Auth,\n  request: FinalizeTotpMfaSignInRequest\n): Promise<FinalizeTotpMfaSignInResponse> {\n  return _performApiRequest<\n    FinalizeTotpMfaSignInRequest,\n    FinalizeTotpMfaSignInResponse\n  >(\n    auth,\n    HttpMethod.POST,\n    Endpoint.FINALIZE_MFA_SIGN_IN,\n    _addTidIfNecessary(auth, request)\n  );\n}\n\n/**\n * @internal\n */\nexport type PhoneOrOauthTokenResponse =\n  | SignInWithPhoneNumberResponse\n  | SignInWithIdpResponse\n  | IdTokenResponse;\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Unsubscribe } from '@firebase/util';\nimport { FirebaseAuthInternal } from '@firebase/auth-interop-types';\n\nimport { AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { _assert } from '../util/assert';\nimport { AuthErrorCode } from '../errors';\n\ninterface TokenListener {\n  (tok: string | null): unknown;\n}\n\nexport class AuthInterop implements FirebaseAuthInternal {\n  private readonly internalListeners: Map<TokenListener, Unsubscribe> =\n    new Map();\n\n  constructor(private readonly auth: AuthInternal) {}\n\n  getUid(): string | null {\n    this.assertAuthConfigured();\n    return this.auth.currentUser?.uid || null;\n  }\n\n  async getToken(\n    forceRefresh?: boolean\n  ): Promise<{ accessToken: string } | null> {\n    this.assertAuthConfigured();\n    await this.auth._initializationPromise;\n    if (!this.auth.currentUser) {\n      return null;\n    }\n\n    const accessToken = await this.auth.currentUser.getIdToken(forceRefresh);\n    return { accessToken };\n  }\n\n  addAuthTokenListener(listener: TokenListener): void {\n    this.assertAuthConfigured();\n    if (this.internalListeners.has(listener)) {\n      return;\n    }\n\n    const unsubscribe = this.auth.onIdTokenChanged(user => {\n      listener(\n        (user as UserInternal | null)?.stsTokenManager.accessToken || null\n      );\n    });\n    this.internalListeners.set(listener, unsubscribe);\n    this.updateProactiveRefresh();\n  }\n\n  removeAuthTokenListener(listener: TokenListener): void {\n    this.assertAuthConfigured();\n    const unsubscribe = this.internalListeners.get(listener);\n    if (!unsubscribe) {\n      return;\n    }\n\n    this.internalListeners.delete(listener);\n    unsubscribe();\n    this.updateProactiveRefresh();\n  }\n\n  private assertAuthConfigured(): void {\n    _assert(\n      this.auth._initializationPromise,\n      AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH\n    );\n  }\n\n  private updateProactiveRefresh(): void {\n    if (this.internalListeners.size > 0) {\n      this.auth._startProactiveRefresh();\n    } else {\n      this.auth._stopProactiveRefresh();\n    }\n  }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Core functionality shared by all clients\nexport * from './src';\n\nimport { ClientPlatform } from './src/core/util/version';\n\nimport { indexedDBLocalPersistence } from './src/platform_browser/persistence/indexed_db';\n\nimport {\n  TotpMultiFactorGenerator,\n  TotpSecret\n} from './src/mfa/assertions/totp';\nimport { FirebaseApp, getApp, _getProvider } from '@firebase/app';\nimport { Auth, connectAuthEmulator, initializeAuth } from './index.shared';\nimport { getDefaultEmulatorHost } from '@firebase/util';\nimport { registerAuth } from './src/core/auth/register';\n\n/**\n * Returns the Auth instance associated with the provided {@link @firebase/app#FirebaseApp}.\n * If no instance exists, initializes an Auth instance with platform-specific default dependencies.\n *\n * @param app - The Firebase App.\n *\n * @public\n */\nfunction getAuth(app: FirebaseApp = getApp()): Auth {\n  const provider = _getProvider(app, 'auth');\n\n  if (provider.isInitialized()) {\n    return provider.getImmediate();\n  }\n\n  const auth = initializeAuth(app, {\n    persistence: [indexedDBLocalPersistence]\n  });\n\n  const authEmulatorHost = getDefaultEmulatorHost('auth');\n  if (authEmulatorHost) {\n    connectAuthEmulator(auth, `http://${authEmulatorHost}`);\n  }\n\n  return auth;\n}\n\nregisterAuth(ClientPlatform.WEB_EXTENSION);\n\nexport {\n  indexedDBLocalPersistence,\n  TotpMultiFactorGenerator,\n  TotpSecret,\n  getAuth\n};\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _registerComponent, registerVersion } from '@firebase/app';\nimport {\n  Component,\n  ComponentType,\n  InstantiationMode\n} from '@firebase/component';\n\nimport { name, version } from '../../../package.json';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _getClientVersion, ClientPlatform } from '../util/version';\nimport { _castAuth, AuthImpl, DefaultConfig } from './auth_impl';\nimport { AuthInterop } from './firebase_internal';\nimport { ConfigInternal } from '../../model/auth';\nimport { Dependencies } from '../../model/public_types';\nimport { _initializeAuthInstance } from './initialize';\n\nexport const enum _ComponentName {\n  AUTH = 'auth',\n  AUTH_INTERNAL = 'auth-internal'\n}\n\nfunction getVersionForPlatform(\n  clientPlatform: ClientPlatform\n): string | undefined {\n  switch (clientPlatform) {\n    case ClientPlatform.NODE:\n      return 'node';\n    case ClientPlatform.REACT_NATIVE:\n      return 'rn';\n    case ClientPlatform.WORKER:\n      return 'webworker';\n    case ClientPlatform.CORDOVA:\n      return 'cordova';\n    case ClientPlatform.WEB_EXTENSION:\n      return 'web-extension';\n    default:\n      return undefined;\n  }\n}\n\n/** @internal */\nexport function registerAuth(clientPlatform: ClientPlatform): void {\n  _registerComponent(\n    new Component(\n      _ComponentName.AUTH,\n      (container, { options: deps }: { options?: Dependencies }) => {\n        const app = container.getProvider('app').getImmediate()!;\n        const heartbeatServiceProvider =\n          container.getProvider<'heartbeat'>('heartbeat');\n        const appCheckServiceProvider =\n          container.getProvider<'app-check-internal'>('app-check-internal');\n        const { apiKey, authDomain } = app.options;\n\n        _assert(\n          apiKey && !apiKey.includes(':'),\n          AuthErrorCode.INVALID_API_KEY,\n          { appName: app.name }\n        );\n\n        const config: ConfigInternal = {\n          apiKey,\n          authDomain,\n          clientPlatform,\n          apiHost: DefaultConfig.API_HOST,\n          tokenApiHost: DefaultConfig.TOKEN_API_HOST,\n          apiScheme: DefaultConfig.API_SCHEME,\n          sdkClientVersion: _getClientVersion(clientPlatform)\n        };\n\n        const authInstance = new AuthImpl(\n          app,\n          heartbeatServiceProvider,\n          appCheckServiceProvider,\n          config\n        );\n        _initializeAuthInstance(authInstance, deps);\n\n        return authInstance;\n      },\n      ComponentType.PUBLIC\n    )\n      /**\n       * Auth can only be initialized by explicitly calling getAuth() or initializeAuth()\n       * For why we do this, See go/firebase-next-auth-init\n       */\n      .setInstantiationMode(InstantiationMode.EXPLICIT)\n      /**\n       * Because all firebase products that depend on auth depend on auth-internal directly,\n       * we need to initialize auth-internal after auth is initialized to make it available to other firebase products.\n       */\n      .setInstanceCreatedCallback(\n        (container, _instanceIdentifier, _instance) => {\n          const authInternalProvider = container.getProvider(\n            _ComponentName.AUTH_INTERNAL\n          );\n          authInternalProvider.initialize();\n        }\n      )\n  );\n\n  _registerComponent(\n    new Component(\n      _ComponentName.AUTH_INTERNAL,\n      container => {\n        const auth = _castAuth(\n          container.getProvider(_ComponentName.AUTH).getImmediate()!\n        );\n        return (auth => new AuthInterop(auth))(auth);\n      },\n      ComponentType.PRIVATE\n    ).setInstantiationMode(InstantiationMode.EXPLICIT)\n  );\n\n  registerVersion(name, version, getVersionForPlatform(clientPlatform));\n  // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n  registerVersion(name, version, '__BUILD_TARGET__');\n}\n"],"names":["base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","this","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","atob","encodeByteArray","input","webSafe","Array","isArray","Error","init_","byteToCharMap","output","i","length","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","push","join","encodeString","btoa","str","out","p","c","charCodeAt","stringToByteArray","decodeString","bytes","pos","c1","String","fromCharCode","c2","u","c3","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","DecodeBase64StringError","constructor","name","base64Decode","e","console","error","getDefaultsFromGlobal","getGlobal","self","window","global","__FIREBASE_DEFAULTS__","getDefaults","process","env","defaultsJsonString","JSON","parse","getDefaultsFromEnvVariable","document","match","cookie","decoded","getDefaultsFromCookie","info","Deferred","reject","resolve","promise","Promise","wrapCallback","callback","value","catch","getUA","navigator","FirebaseError","code","message","customData","super","Object","setPrototypeOf","prototype","captureStackTrace","ErrorFactory","create","service","serviceName","errors","data","fullCode","template","replaceTemplate","ptr","result","start","indexOf","substring","end","key","fullMessage","deepEqual","a","b","aKeys","keys","bKeys","k","includes","aProp","bProp","isObject","thing","querystring","querystringParams","params","entries","forEach","arrayVal","encodeURIComponent","querystringDecode","obj","replace","split","token","decodeURIComponent","extractQuerystring","url","queryStart","fragmentStart","undefined","ObserverProxy","executor","onNoObservers","observers","unsubscribes","observerCount","task","finalized","then","next","forEachObserver","observer","close","complete","subscribe","nextOrObserver","implementsAnyMethods","methods","method","noop","unsub","unsubscribeOne","bind","finalError","fn","sendOne","err","getModularInstance","_delegate","isCloudWorkstation","startsWith","URL","hostname","endsWith","Component","instanceFactory","type","multipleInstances","serviceProps","instantiationMode","onInstanceCreated","setInstantiationMode","mode","setMultipleInstances","setServiceProps","props","setInstanceCreatedCallback","LogLevel","levelStringToEnum","debug","DEBUG","verbose","VERBOSE","INFO","warn","WARN","ERROR","silent","SILENT","defaultLogLevel","ConsoleMethod","defaultLogHandler","instance","logType","args","logLevel","now","Date","toISOString","_prodErrorMap","debugErrorMap","_debugErrorMap","timeout","prodErrorMap","_DEFAULT_AUTH_ERROR_FACTORY","AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY","ADMIN_ONLY_OPERATION","ARGUMENT_ERROR","APP_NOT_AUTHORIZED","APP_NOT_INSTALLED","CAPTCHA_CHECK_FAILED","CODE_EXPIRED","CORDOVA_NOT_READY","CORS_UNSUPPORTED","CREDENTIAL_ALREADY_IN_USE","CREDENTIAL_MISMATCH","CREDENTIAL_TOO_OLD_LOGIN_AGAIN","DEPENDENT_SDK_INIT_BEFORE_AUTH","DYNAMIC_LINK_NOT_ACTIVATED","EMAIL_CHANGE_NEEDS_VERIFICATION","EMAIL_EXISTS","EMULATOR_CONFIG_FAILED","EXPIRED_OOB_CODE","EXPIRED_POPUP_REQUEST","INTERNAL_ERROR","INVALID_API_KEY","INVALID_APP_CREDENTIAL","INVALID_APP_ID","INVALID_AUTH","INVALID_AUTH_EVENT","INVALID_CERT_HASH","INVALID_CODE","INVALID_CONTINUE_URI","INVALID_CORDOVA_CONFIGURATION","INVALID_CUSTOM_TOKEN","INVALID_DYNAMIC_LINK_DOMAIN","INVALID_EMAIL","INVALID_EMULATOR_SCHEME","INVALID_IDP_RESPONSE","INVALID_LOGIN_CREDENTIALS","INVALID_MESSAGE_PAYLOAD","INVALID_MFA_SESSION","INVALID_OAUTH_CLIENT_ID","INVALID_OAUTH_PROVIDER","INVALID_OOB_CODE","INVALID_ORIGIN","INVALID_PASSWORD","INVALID_PERSISTENCE","INVALID_PHONE_NUMBER","INVALID_PROVIDER_ID","INVALID_RECIPIENT_EMAIL","INVALID_SENDER","INVALID_SESSION_INFO","INVALID_TENANT_ID","MFA_INFO_NOT_FOUND","MFA_REQUIRED","MISSING_ANDROID_PACKAGE_NAME","MISSING_APP_CREDENTIAL","MISSING_AUTH_DOMAIN","MISSING_CODE","MISSING_CONTINUE_URI","MISSING_IFRAME_START","MISSING_IOS_BUNDLE_ID","MISSING_OR_INVALID_NONCE","MISSING_MFA_INFO","MISSING_MFA_SESSION","MISSING_PHONE_NUMBER","MISSING_PASSWORD","MISSING_SESSION_INFO","MODULE_DESTROYED","NEED_CONFIRMATION","NETWORK_REQUEST_FAILED","NULL_USER","NO_AUTH_EVENT","NO_SUCH_PROVIDER","OPERATION_NOT_ALLOWED","OPERATION_NOT_SUPPORTED","POPUP_BLOCKED","POPUP_CLOSED_BY_USER","PROVIDER_ALREADY_LINKED","QUOTA_EXCEEDED","REDIRECT_CANCELLED_BY_USER","REDIRECT_OPERATION_PENDING","REJECTED_CREDENTIAL","SECOND_FACTOR_ALREADY_ENROLLED","SECOND_FACTOR_LIMIT_EXCEEDED","TENANT_ID_MISMATCH","TIMEOUT","TOKEN_EXPIRED","TOO_MANY_ATTEMPTS_TRY_LATER","UNAUTHORIZED_DOMAIN","UNSUPPORTED_FIRST_FACTOR","UNSUPPORTED_PERSISTENCE","UNSUPPORTED_TENANT_OPERATION","UNVERIFIED_EMAIL","USER_CANCELLED","USER_DELETED","USER_DISABLED","USER_MISMATCH","USER_SIGNED_OUT","WEAK_PASSWORD","WEB_STORAGE_UNSUPPORTED","ALREADY_INITIALIZED","RECAPTCHA_NOT_ENABLED","MISSING_RECAPTCHA_TOKEN","INVALID_RECAPTCHA_TOKEN","INVALID_RECAPTCHA_ACTION","MISSING_CLIENT_TYPE","MISSING_RECAPTCHA_VERSION","INVALID_RECAPTCHA_VERSION","INVALID_REQ_TYPE","INVALID_HOSTING_LINK_DOMAIN","logClient","Logger","_logLevel","_logHandler","_userLogHandler","val","TypeError","setLogLevel","logHandler","userLogHandler","log","_logWarn","msg","SDK_VERSION","_logError","_fail","authOrCode","rest","createErrorInternal","_createError","_errorWithCustomMessage","auth","errorMap","appName","_serverAppCurrentUserOperationNotSupportedError","fullParams","slice","_errorFactory","_assert","assertion","debugFail","failure","debugAssert","_getCurrentUrl","location","href","_isHttpOrHttps","_getCurrentScheme","protocol","_isOnline","onLine","isBrowserExtension","runtime","chrome","browser","id","FetchProvider","initialize","fetchImpl","headersImpl","responseImpl","fetch","globalThis","headers","Headers","response","Response","SERVER_ERROR_MAP","MISSING_CUSTOM_TOKEN","INVALID_IDENTIFIER","PASSWORD_LOGIN_DISABLED","INVALID_PENDING_TOKEN","FEDERATED_USER_ID_ALREADY_LINKED","MISSING_REQ_TYPE","EMAIL_NOT_FOUND","RESET_PASSWORD_EXCEED_LIMIT","MISSING_OOB_CODE","INVALID_ID_TOKEN","USER_NOT_FOUND","PASSWORD_DOES_NOT_MEET_REQUIREMENTS","INVALID_TEMPORARY_PROOF","SESSION_EXPIRED","INVALID_MFA_PENDING_CREDENTIAL","MFA_ENROLLMENT_NOT_FOUND","MISSING_MFA_ENROLLMENT_ID","MISSING_MFA_PENDING_CREDENTIAL","SECOND_FACTOR_EXISTS","BLOCKING_FUNCTION_ERROR_RESPONSE","CookieAuthProxiedEndpoints","DEFAULT_API_TIMEOUT_MS","Delay","shortDelay","longDelay","isMobile","isMobileCordova","test","isReactNative","get","Math","min","_addTidIfNecessary","request","tenantId","async","_performApiRequest","path","customErrorMap","_performFetchWithErrorHandling","body","stringify","query","config","apiKey","_getAdditionalHeaders","languageCode","fetchArgs","isCloudflareWorker","userAgent","referrerPolicy","emulatorConfig","host","credentials","_getFinalTarget","apiHost","fetchFn","_canInitEmulator","networkTimeout","NetworkTimeout","race","clearNetworkTimeout","json","_makeTaggedError","ok","errorMessage","serverErrorCode","serverErrorMessage","authError","toLowerCase","_performSignInRequest","serverResponse","_serverResponse","base","authInternal","finalTarget","emulator","_emulatorUrl","apiScheme","_persistenceManagerAvailable","_getPersistenceType","_getPersistence","toString","_parseEnforcementState","enforcementStateStr","clearTimeout","timer","_","setTimeout","errorParams","email","phoneNumber","_tokenResponse","isEnterprise","grecaptcha","enterprise","RecaptchaConfig","siteKey","recaptchaEnforcementState","recaptchaKey","getProviderEnforcementState","providerStr","provider","enforcementState","isProviderEnabled","isAnyProviderEnabled","getRecaptchaConfig","getAccountInfo","utcTimestampToDateString","utcTimestamp","date","Number","isNaN","getTime","toUTCString","getIdToken","user","forceRefresh","getIdTokenResult","userInternal","claims","_parseToken","exp","auth_time","iat","firebase","signInProvider","authTime","secondsStringToMilliseconds","issuedAtTime","expirationTime","signInSecondFactor","seconds","algorithm","payload","signature","_tokenExpiresIn","parsedToken","_logoutIfInvalidated","bypassAuthState","isUserInvalidated","currentUser","signOut","ProactiveRefresh","isRunning","timerId","errorBackoff","_start","schedule","_stop","getInterval","wasError","interval","stsTokenManager","max","iteration","UserMetadata","createdAt","lastLoginAt","_initializeTime","lastSignInTime","creationTime","_copy","metadata","toJSON","_reloadWithoutSaving","idToken","users","coreAccount","_notifyReloadListener","newProviderData","providerUserInfo","extractProviderData","providerData","mergeProviderData","original","newData","filter","o","some","n","providerId","oldIsAnonymous","isAnonymous","newIsAnonymous","passwordHash","updates","uid","localId","displayName","photoURL","photoUrl","emailVerified","assign","reload","_persistUserIfCurrent","_notifyListenersIfCurrent","providers","map","rawId","StsTokenManager","refreshToken","accessToken","isExpired","updateFromServerResponse","expiresIn","updateTokensAndExpiration","updateFromIdToken","getToken","refresh","clearRefreshToken","oldToken","requestStsToken","grant_type","refresh_token","tokenApiHost","options","access_token","expires_in","expiresInSec","fromJSON","object","manager","_assign","_clone","_performRefresh","assertStringOrUndefined","UserImpl","opt","proactiveRefresh","reloadUserInfo","reloadListener","userInfo","newUser","_onReload","_startProactiveRefresh","_stopProactiveRefresh","_updateTokensIfNecessary","tokensRefreshed","_isFirebaseServerApp","app","deleteAccount","_redirectEventId","_fromJSON","plainObjectTokenManager","_fromIdTokenResponse","idTokenResponse","_fromGetAccountInfoResponse","instanceCache","Map","_getInstance","cls","Function","set","InMemoryPersistence","storage","_isAvailable","_set","_get","_remove","_addListener","_key","_listener","_removeListener","inMemoryPersistence","_persistenceKeyName","PersistenceUserManager","persistence","userKey","fullUserKey","fullPersistenceKey","boundEventHandler","_onStorageEvent","setCurrentUser","getCurrentUser","blob","removeCurrentUser","savePersistenceForRedirect","setPersistence","newPersistence","persistenceHierarchy","availablePersistences","all","selectedPersistence","userToMigrate","migrationHierarchy","_shouldAllowMigration","_getBrowserName","ua","_isIEMobile","_isFirefox","_isBlackBerry","_isWebOS","_isSafari","_isChromeIOS","_isAndroid","re","matches","_getClientVersion","clientPlatform","frameworks","reportedPlatform","reportedFrameworks","AuthMiddlewareQueue","queue","pushCallback","onAbort","wrappedCallback","index","runMiddleware","nextUser","onAbortStack","beforeStateCallback","reverse","originalMessage","PasswordPolicyImpl","responseOptions","customStrengthOptions","minPasswordLength","maxPasswordLength","containsLowercaseCharacter","containsLowercaseLetter","containsUppercaseCharacter","containsUppercaseLetter","containsNumericCharacter","containsNonAlphanumericCharacter","allowedNonAlphanumericCharacters","forceUpgradeOnSignin","schemaVersion","validatePassword","password","status","isValid","passwordPolicy","validatePasswordLengthOptions","validatePasswordCharacterOptions","meetsMinPasswordLength","meetsMaxPasswordLength","passwordChar","updatePasswordCharacterOptionsStatuses","AuthImpl","heartbeatServiceProvider","appCheckServiceProvider","operations","authStateSubscription","Subscription","idTokenSubscription","beforeStateQueue","redirectUser","isProactiveRefreshEnabled","EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION","_isInitialized","_deleted","_initializationPromise","_popupRedirectResolver","_agentRecaptchaConfig","_tenantRecaptchaConfigs","_projectPasswordPolicy","_tenantPasswordPolicies","_resolvePersistenceManagerAvailable","lastNotifiedUid","settings","appVerificationDisabledForTesting","clientVersion","sdkClientVersion","_initializeWithPersistence","popupRedirectResolver","persistenceManager","_shouldInitProactively","_initialize","initializeCurrentUser","assertedPersistence","_currentUser","_updateCurrentUser","initializeCurrentUserFromIdToken","directlySetCurrentUser","authIdToken","previouslyStoredUser","futureCurrentUser","needsTocheckMiddleware","authDomain","getOrInitRedirectPersistenceManager","redirectUserEventId","storedUserEventId","tryRedirectSignIn","_overrideRedirectResult","reloadAndSetCurrentUserOrClear","redirectResolver","_completeRedirectFn","_setRedirectUser","useDeviceLanguage","_getUserLanguage","navigatorLanguage","languages","language","_delete","updateCurrentUser","userExtern","skipBeforeStateCallbacks","notifyAuthListeners","redirectPersistenceManager","_getRecaptchaConfig","_getPasswordPolicyInternal","_updatePasswordPolicy","_getPasswordPolicy","_updateErrorMap","onAuthStateChanged","completed","registerStateListener","beforeAuthStateChanged","onIdTokenChanged","authStateReady","unsubscribe","revokeAccessToken","tokenType","revokeToken","redirectManager","resolver","_redirectPersistence","_redirectUserForId","currentUid","subscription","cb","isUnsubscribed","addObserver","action","_logFramework","framework","sort","_getFrameworks","appId","heartbeatsHeader","getImmediate","optional","getHeartbeatsHeader","appCheckToken","_getAppCheckToken","appCheckTokenResult","_castAuth","createSubscribe","proxy","externalJSProvider","loadJS","recaptchaV2Script","recaptchaEnterpriseScript","gapiScript","MockGreCAPTCHATopLevel","MockGreCAPTCHA","ready","execute","_siteKey","_options","render","_container","_parameters","FAKE_TOKEN","RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME","RecaptchaEnterpriseVerifier","authExtern","verify","retrieveRecaptchaToken","retrieveSiteKey","clientType","version","scriptInjectionDeferred","_recaptchaEnterpriseScriptUrl","jsHelpers._recaptchaEnterpriseScriptUrl","_loadJS","jsHelpers\n                        ._loadJS","injectRecaptchaFields","isCaptchaResp","isFakeToken","verifier","captchaResponse","newRequest","phoneEnrollmentInfo","recaptchaToken","recaptchaVersion","phoneSignInInfo","captchaResp","handleRecaptchaFlow","authInstance","actionName","actionMethod","recaptchaAuthProvider","requestWithRecaptcha","initializeAuth","deps","_getProvider","isInitialized","getOptions","connectAuthEmulator","disableWarnings","extractProtocol","port","extractHostAndPort","authority","exec","substr","hostAndPort","pop","bracketedIPv6","parsePort","portStr","freeze","pingServer","endpoint","emitEmulatorWarning","attachBanner","el","createElement","sty","style","innerText","position","width","backgroundColor","border","color","bottom","left","margin","zIndex","textAlign","classList","add","appendChild","readyState","addEventListener","protocolEnd","AuthCredential","signInMethod","_getIdTokenResponse","_auth","_linkToIdToken","_idToken","_getReauthenticationResolver","resetPassword","linkEmailPassword","signInWithPassword","sendOobCode","sendPasswordResetEmail","sendSignInLinkToEmail","EmailAuthCredential","_email","_password","_tenantId","_fromEmailAndPassword","_fromEmailAndCode","oobCode","returnSecureToken","signInWithEmailLink","signInWithEmailLinkForLinking","signInWithIdp","OAuthCredential","pendingToken","_fromParams","cred","nonce","oauthToken","oauthTokenSecret","secret","buildRequest","autoCreate","requestUri","postBody","VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_","PhoneAuthCredential","_fromVerification","verificationId","verificationCode","_fromTokenResponse","temporaryProof","signInWithPhoneNumber","_makeVerificationRequest","linkWithPhoneNumber","verifyPhoneNumberForExisting","operation","sessionInfo","ActionCodeURL","actionLink","searchParams","parseMode","continueUrl","parseLink","link","parseDeepLink","doubleDeepLink","iOSDeepLink","parseActionCodeURL","EmailAuthProvider","PROVIDER_ID","credential","credentialWithLink","emailLink","actionCodeUrl","EMAIL_PASSWORD_SIGN_IN_METHOD","EMAIL_LINK_SIGN_IN_METHOD","FederatedAuthProvider","defaultLanguageCode","customParameters","setDefaultLanguage","setCustomParameters","customOAuthParameters","getCustomParameters","BaseOAuthProvider","scopes","addScope","scope","getScopes","OAuthProvider","credentialFromJSON","_credential","rawNonce","credentialFromResult","userCredential","oauthCredentialFromTaggedObject","credentialFromError","tokenResponse","oauthIdToken","oauthAccessToken","FacebookAuthProvider","FACEBOOK_SIGN_IN_METHOD","credentialFromTaggedObject","GoogleAuthProvider","GOOGLE_SIGN_IN_METHOD","GithubAuthProvider","GITHUB_SIGN_IN_METHOD","SAMLAuthCredential","_create","SAMLAuthProvider","samlCredentialFromTaggedObject","TwitterAuthProvider","TWITTER_SIGN_IN_METHOD","signUp","UserCredentialImpl","operationType","providerIdForResponse","_forOperation","signInAnonymously","MultiFactorError","_fromErrorAndOperation","_processCredentialSavingMfaContextIfNecessary","providerDataAsNames","Set","pid","unlink","_assertLinkedStatus","deleteLinkedAccounts","deleteProvider","providersLeft","pd","has","expected","signInWithCredential","_signInWithCredential","linkWithCredential","_link","reauthenticateWithCredential","_reauthenticate","parsed","sub","signInWithCustomToken","customToken","getIdTokenResponse","MultiFactorInfoImpl","factorId","mfaEnrollmentId","enrollmentTime","enrolledAt","_fromServerResponse","enrollment","PhoneMultiFactorInfoImpl","TotpMultiFactorInfoImpl","phoneInfo","_setActionCodeSettingsOnRequest","actionCodeSettings","dynamicLinkDomain","linkDomain","canHandleCodeInApp","handleCodeInApp","iOS","bundleId","iOSBundleId","android","packageName","androidInstallApp","installApp","androidMinimumVersionCode","minimumVersion","androidPackageName","recachePasswordPolicy","requestType","authentication.sendPasswordResetEmail","confirmPasswordReset","newPassword","account\n        .resetPassword","applyActionCode","account.applyActionCode","checkActionCode","authModular","account.resetPassword","newEmail","mfaInfo","multiFactorInfo","previousEmail","verifyPasswordResetCode","createUserWithEmailAndPassword","signUpResponse","signInWithEmailAndPassword","setActionCodeSettings","api.sendSignInLinkToEmail","isSignInWithEmailLink","fetchSignInMethodsForEmail","identifier","continueUri","signinMethods","createAuthUri","sendEmailVerification","api.sendEmailVerification","verifyBeforeUpdateEmail","verifyAndChangeEmail","api.verifyAndChangeEmail","updateProfile","profileRequest","apiUpdateProfile","passwordProvider","find","updateEmail","updateEmailOrPassword","updatePassword","updateEmailPassword","apiUpdateEmailPassword","GenericAdditionalUserInfo","isNewUser","profile","FederatedAdditionalUserInfoWithUsername","username","FacebookAdditionalUserInfo","GithubAdditionalUserInfo","login","GoogleAdditionalUserInfo","TwitterAdditionalUserInfo","screenName","getAdditionalUserInfo","rawUserInfo","kind","initializeRecaptchaConfig","_initializeRecaptchaConfig","deleteUser","delete","MultiFactorSessionImpl","_fromIdtoken","_fromMfaPendingCredential","mfaPendingCredential","multiFactorSession","pendingCredential","MultiFactorResolverImpl","session","hints","signInResolver","_fromError","mfaResponse","_process","resolveSignIn","assertionExtern","getMultiFactorResolver","errorInternal","MultiFactorUserImpl","enrolledFactors","_fromUser","getSession","enroll","finalizeMfaResponse","unenroll","infoOrUid","withdrawMfa","multiFactorUserCache","WeakMap","multiFactor","userModular","STORAGE_AVAILABLE_KEY","Receiver","eventTarget","handlersMap","handleEvent","existingInstance","receivers","receiver","isListeningto","newInstance","event","messageEvent","eventId","eventType","handlers","size","ports","postMessage","promises","from","handler","origin","_allSettled","fulfilled","reason","_subscribe","eventHandler","_unsubscribe","removeEventListener","Sender","target","removeMessageHandler","messageChannel","port1","onMessage","_send","MessageChannel","completionTimer","_generateEventId","prefix","digits","random","floor","ackTimer","port2","finally","_window","_isWorker","DB_NAME","DB_OBJECTSTORE_NAME","DB_DATA_KEYPATH","DBPromise","toPromise","getObjectStore","db","isReadWrite","transaction","objectStore","_openDatabase","indexedDB","open","createObjectStore","keyPath","objectStoreNames","contains","_deleteDatabase","deleteDatabase","_putObject","put","_deleteObject","IndexedDBLocalPersistence","registerLifecycleListeners","onPageHide","onPageShow","onVisibilityChange","unregisterLifecycleListeners","dbPromise","listeners","localCache","pollTimer","isHiding","pendingWrites","sender","serviceWorkerReceiverAvailable","activeServiceWorker","stopPolling","startPolling","visibilityState","_workerInitializationPromise","initializeServiceWorkerMessaging","_openDb","_withRetries","op","numAttempts","initializeReceiver","initializeSender","_getWorkerGlobalScope","_origin","keyProcessed","_poll","_data","_getActiveServiceWorker","serviceWorker","active","results","notifyServiceWorker","_getServiceWorkerController","controller","_withPendingWrite","write","getObject","getAllRequest","getAll","keysInResult","fbase_key","notifyListeners","localKey","newValue","listener","setInterval","clearInterval","indexedDBLocalPersistence","MultiFactorAssertionImpl","_finalizeEnroll","_finalizeSignIn","TotpMultiFactorGenerator","assertionForEnrollment","oneTimePassword","TotpMultiFactorAssertionImpl","_fromSecret","assertionForSignIn","enrollmentId","_fromEnrollmentId","generateSecret","mfaSession","startEnrollTotpMfa","totpEnrollmentInfo","TotpSecret","_fromStartTotpMfaEnrollmentResponse","FACTOR_ID","otp","finalizeEnrollTotpMfa","totpVerificationInfo","_makeTotpVerificationInfo","finalizeSignInTotpMfa","secretKey","hashingAlgorithm","codeLength","codeIntervalSeconds","enrollmentCompletionDeadline","totpSessionInfo","sharedSecretKey","verificationCodeLength","periodSec","finalizeEnrollmentTime","generateQrCodeUrl","accountName","issuer","useDefaults","_isEmptyString","AuthInterop","internalListeners","getUid","assertAuthConfigured","addAuthTokenListener","updateProactiveRefresh","removeAuthTokenListener","getAuth","getApp","authEmulatorHost","productName","emulatorHosts","registerAuth","_registerComponent","container","getProvider","_initializeAuthInstance","hierarchy","_instanceIdentifier","_instance","registerVersion","getVersionForPlatform"],"mappings":"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EAASM,KACjBC,KAAQP,EAASQ,KACjB9I,MAASsI,EAASS,MAClBC,OAAUV,EAASW,QAMfC,EAA4BZ,EAASM,KAmBrCO,EAAgB,CACpB,CAACb,EAASG,OAAQ,MAClB,CAACH,EAASK,SAAU,MACpB,CAACL,EAASM,MAAO,OACjB,CAACN,EAASQ,MAAO,OACjB,CAACR,EAASS,OAAQ,SAQdK,kBAAgC,CAACC,EAAUC,KAAYC,KAC3D,GAAID,EAAUD,EAASG,SACrB,OAEF,MAAMC,GAAM,IAAIC,MAAOC,cACjBlD,EAAS0C,EAAcG,GAC7B,IAAI7C,EAMF,MAAM,IAAItJ,MACR,8DAA8DmM,MANhEvJ,QAAQ0G,GACN,IAAIgD,OAASJ,EAASzJ,WACnB2J,EAMP,ECuRF,SAASK,gBAIP,MAAO,CACL,wCACE,0LAIN,CASO,MAAMC,EAxRb,SAASC,iBACP,MAAO,CACL,6BACE,uDACF,iBAAgC,GAChC,qBACE,6LAGF,oBACE,qJAGF,uBACE,kKAGF,eACE,+EAEF,oBAAmC,kCACnC,mBAAkC,iCAClC,4BACE,uEACF,wBACE,wDACF,wBACE,6GAEF,wCACE,0LAGF,6BACE,+FAEF,kCACE,wDACF,uBACE,0DACF,yBACE,gKAGF,sBAAkC,+BAClC,0BACE,mFACF,iBAAgC,sCAChC,yBACE,sIAEF,iBACE,uEACF,qBACE,sLAGF,qBAAoC,sCACpC,4BACE,wLAGF,uBACE,uDACF,gCACE,gOAIF,uBACE,wEACF,8BACE,4FACF,gBAA+B,wCAC/B,0BACE,qEACF,kBACE,sEACF,oBACE,kDACF,qBACE,uEACF,0BACE,+KAEF,+BACE,iFACF,yBACE,uGAEF,0BACE,0FAEF,sBACE,+IAEF,sBACE,2GAEF,iBACE,gEACF,2BACE,oFACF,uBACE,gPAIF,sBACE,wCACF,0BACE,4GAEF,iBACE,6KAEF,0BACE,2EACF,oBACE,4CACF,gBACE,4DACF,2BACE,2FACF,8BACE,8HAEF,yBACE,gIAEF,4BACE,6EACF,uBACE,kDACF,uBAAsC,sCACtC,wBACE,oEACF,2BACE,oKAGF,mBAAkC,wCAClC,4BACE,2CACF,+BACE,mEACF,uBACE,wEACF,0BACE,uEACF,cACE,iDACF,8BACE,2EACF,6BACE,yEACF,2CACE,wJAGF,yBACE,kGACF,gBAA+B,sCAC/B,mBACE,6DACF,YACE,0GAEF,wBACE,yJAGF,8CACE,kLAGF,gBACE,4FACF,uBACE,yEACF,0BACE,kEACF,iBACE,4DACF,6BACE,2EACF,6BACE,mDACF,sBACE,6DACF,+BACE,yDACF,uCACE,4EACF,qBACE,sEACFC,QAAyB,+BACzB,qBACE,yEACF,oBACE,0FAEF,4BACE,2GAEF,2BACE,sHACF,+BACE,2EACF,+BACE,6DACF,mBACE,2CACF,iBACE,wEACF,iBACE,4FAEF,gBACE,0DACF,gBACE,+EACF,kBAAiC,GACjC,gBACE,kDACF,0BACE,+EACF,sBACE,oOAIF,0BACE,sEACF,0BACE,sEACF,2BACE,uEACF,wBACE,oEACF,sBACE,4EACF,4BACE,wEACF,mBAAkC,8BAClC,4BACE,wEACF,6CACE,iIACF,sCACE,+CACF,8BACE,2LAGN,EAkCaC,EAA6BJ,cAuD7BK,EAA8B,IAAIzH,aAG7C,OAAQ,WAlFD,CACL,wCACE,4LA6FO0H,EAA6C,CACxDC,qBAAsB,kCACtBC,eAAgB,sBAChBC,mBAAoB,0BACpBC,kBAAmB,yBACnBC,qBAAsB,4BACtBC,aAAc,oBACdC,kBAAmB,yBACnBC,iBAAkB,wBAClBC,0BAA2B,iCAC3BC,oBAAqB,6BACrBC,+BAAgC,6BAChCC,+BAAgC,6CAChCC,2BAA4B,kCAC5BC,gCAAiC,uCACjCC,aAAc,4BACdC,uBAAwB,8BACxBC,iBAAkB,2BAClBC,sBAAuB,+BACvBC,eAAgB,sBAChBC,gBAAiB,uBACjBC,uBAAwB,8BACxBC,eAAgB,sBAChBC,aAAc,0BACdC,mBAAoB,0BACpBC,kBAAmB,yBACnBC,aAAc,iCACdC,qBAAsB,4BACtBC,8BAA+B,qCAC/BC,qBAAsB,4BACtBC,4BAA6B,mCAC7BC,cAAe,qBACfC,wBAAyB,+BACzBC,qBAAsB,0BACtBC,0BAA2B,0BAC3BC,wBAAyB,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","preExistingComment":"firebase-auth-web-extension.js.map"}