{
  "version": 3,
  "sources": ["../../src/localize/utils/src/constants.ts", "../../src/localize/digest.ts", "../../src/localize/utils/src/messages.ts", "../../src/localize/utils/src/translations.ts", "../../src/localize/localize/src/localize.ts", "../../src/localize/translate.ts"],
  "sourcesContent": ["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * The character used to mark the start and end of a \"block\" in a `$localize` tagged string.\n * A block can indicate metadata about the message or specify a name of a placeholder for a\n * substitution expressions.\n *\n * For example:\n *\n * ```ts\n * $localize`Hello, ${title}:title:!`;\n * $localize`:meaning|description@@id:source message text`;\n * ```\n */\nexport const BLOCK_MARKER = ':';\n\n/**\n * The marker used to separate a message's \"meaning\" from its \"description\" in a metadata block.\n *\n * For example:\n *\n * ```ts\n * $localize `:correct|Indicates that the user got the answer correct: Right!`;\n * $localize `:movement|Button label for moving to the right: Right!`;\n * ```\n */\nexport const MEANING_SEPARATOR = '|';\n\n/**\n * The marker used to separate a message's custom \"id\" from its \"description\" in a metadata block.\n *\n * For example:\n *\n * ```ts\n * $localize `:A welcome message on the home page@@myApp-homepage-welcome: Welcome!`;\n * ```\n */\nexport const ID_SEPARATOR = '@@';\n\n/**\n * The marker used to separate legacy message ids from the rest of a metadata block.\n *\n * For example:\n *\n * ```ts\n * $localize `:@@custom-id␟2df64767cd895a8fabe3e18b94b5b6b6f9e2e3f0: Welcome!`;\n * ```\n *\n * Note that this character is the \"symbol for the unit separator\" (␟) not the \"unit separator\n * character\" itself, since that has no visual representation. See https://graphemica.com/%E2%90%9F.\n *\n * Here is some background for the original \"unit separator character\":\n * https://stackoverflow.com/questions/8695118/whats-the-file-group-record-unit-separator-control-characters-and-its-usage\n */\nexport const LEGACY_ID_INDICATOR = '\\u241F';\n", "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n\n\n\n\n/**\n * A lazily created TextEncoder instance for converting strings into UTF-8 bytes\n */\nlet textEncoder: TextEncoder | undefined;\n\n/**\n * Return the message id or compute it using the XLIFF1 digest.\n */\n\n\n/**\n * Compute the message id using the XLIFF1 digest.\n */\n\n\n/**\n * Return the message id or compute it using the XLIFF2/XMB/$localize digest.\n */\n\n\n/**\n * Compute the message id using the XLIFF2/XMB/$localize digest.\n */\n\n\n/**\n * Serialize the i18n ast to something xml-like in order to generate an UID.\n *\n * The visitor is also used in the i18n parser tests\n *\n * @internal\n */\n\n\n\n\n\n\n/**\n * Serialize the i18n ast to something xml-like in order to generate an UID.\n *\n * Ignore the ICU expressions so that message IDs stays identical if only the expression changes.\n *\n * @internal\n */\n\n\n/**\n * Compute the SHA1 of the given string\n *\n * see https://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n *\n * WARNING: this function has not been designed not tested with security in mind.\n *          DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.\n */\n\n\n/**\n * Convert and format a number as a string representing a 32-bit unsigned hexadecimal number.\n * @param value The value to format as a string.\n * @returns A hexadecimal string representing the value.\n */\nfunction toHexU32(value: number): string {\n  // unsigned right shift of zero ensures an unsigned 32-bit number\n  return (value >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction fk(index: number, b: number, c: number, d: number): [number, number] {\n  if (index < 20) {\n    return [(b & c) | (~b & d), 0x5a827999];\n  }\n\n  if (index < 40) {\n    return [b ^ c ^ d, 0x6ed9eba1];\n  }\n\n  if (index < 60) {\n    return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];\n  }\n\n  return [b ^ c ^ d, 0xca62c1d6];\n}\n\n/**\n * Compute the fingerprint of the given string\n *\n * The output is 64 bit number encoded as a decimal string\n *\n * based on:\n * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java\n */\nexport function fingerprint(str: string): bigint {\n  textEncoder ??= new TextEncoder();\n  const utf8 = textEncoder.encode(str);\n  const view = new DataView(utf8.buffer, utf8.byteOffset, utf8.byteLength);\n\n  let hi = hash32(view, utf8.length, 0);\n  let lo = hash32(view, utf8.length, 102072);\n\n  if (hi == 0 && (lo == 0 || lo == 1)) {\n    hi = hi ^ 0x130f9bef;\n    lo = lo ^ -0x6b5f56d8;\n  }\n\n  return (BigInt.asUintN(32, BigInt(hi)) << BigInt(32)) | BigInt.asUintN(32, BigInt(lo));\n}\n\nexport function computeMsgId(msg: string, meaning: string = ''): string {\n  let msgFingerprint = fingerprint(msg);\n\n  if (meaning) {\n    // Rotate the 64-bit message fingerprint one bit to the left and then add the meaning\n    // fingerprint.\n    msgFingerprint =\n      BigInt.asUintN(64, msgFingerprint << BigInt(1)) |\n      ((msgFingerprint >> BigInt(63)) & BigInt(1));\n    msgFingerprint += fingerprint(meaning);\n  }\n\n  return BigInt.asUintN(63, msgFingerprint).toString();\n}\n\nfunction hash32(view: DataView, length: number, c: number): number {\n  let a = 0x9e3779b9,\n    b = 0x9e3779b9;\n  let index = 0;\n\n  const end = length - 12;\n  for (; index <= end; index += 12) {\n    a += view.getUint32(index, true);\n    b += view.getUint32(index + 4, true);\n    c += view.getUint32(index + 8, true);\n    const res = mix(a, b, c);\n    (a = res[0]), (b = res[1]), (c = res[2]);\n  }\n\n  const remainder = length - index;\n\n  // the first byte of c is reserved for the length\n  c += length;\n\n  if (remainder >= 4) {\n    a += view.getUint32(index, true);\n    index += 4;\n\n    if (remainder >= 8) {\n      b += view.getUint32(index, true);\n      index += 4;\n\n      // Partial 32-bit word for c\n      if (remainder >= 9) {\n        c += view.getUint8(index++) << 8;\n      }\n      if (remainder >= 10) {\n        c += view.getUint8(index++) << 16;\n      }\n      if (remainder === 11) {\n        c += view.getUint8(index++) << 24;\n      }\n    } else {\n      // Partial 32-bit word for b\n      if (remainder >= 5) {\n        b += view.getUint8(index++);\n      }\n      if (remainder >= 6) {\n        b += view.getUint8(index++) << 8;\n      }\n      if (remainder === 7) {\n        b += view.getUint8(index++) << 16;\n      }\n    }\n  } else {\n    // Partial 32-bit word for a\n    if (remainder >= 1) {\n      a += view.getUint8(index++);\n    }\n    if (remainder >= 2) {\n      a += view.getUint8(index++) << 8;\n    }\n    if (remainder === 3) {\n      a += view.getUint8(index++) << 16;\n    }\n  }\n\n  return mix(a, b, c)[2];\n}\n\nfunction mix(a: number, b: number, c: number): [number, number, number] {\n  a -= b;\n  a -= c;\n  a ^= c >>> 13;\n  b -= c;\n  b -= a;\n  b ^= a << 8;\n  c -= a;\n  c -= b;\n  c ^= b >>> 13;\n  a -= b;\n  a -= c;\n  a ^= c >>> 12;\n  b -= c;\n  b -= a;\n  b ^= a << 16;\n  c -= a;\n  c -= b;\n  c ^= b >>> 5;\n  a -= b;\n  a -= c;\n  a ^= c >>> 3;\n  b -= c;\n  b -= a;\n  b ^= a << 10;\n  c -= a;\n  c -= b;\n  c ^= b >>> 15;\n  return [a, b, c];\n}\n\n// Utils\n\nenum Endian {\n  Little,\n  Big,\n}\n\n\n\n\n\n// Rotate a 32b number left `count` position\n\n\n\n\n\n\n\n", "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n// This module specifier is intentionally a relative path to allow bundling the code directly\n// into the package.\n// @ng_package: ignore-cross-repo-import\nimport {computeMsgId} from '../../digest';\n\nimport {BLOCK_MARKER, ID_SEPARATOR, LEGACY_ID_INDICATOR, MEANING_SEPARATOR} from './constants';\n\n/**\n * Re-export this helper function so that users of `@angular/localize` don't need to actively import\n * from `@angular/compiler`.\n */\nexport {computeMsgId};\n\n/**\n * A string containing a translation source message.\n *\n * I.E. the message that indicates what will be translated from.\n *\n * Uses `{$placeholder-name}` to indicate a placeholder.\n */\nexport type SourceMessage = string;\n\n/**\n * A string containing a translation target message.\n *\n * I.E. the message that indicates what will be translated to.\n *\n * Uses `{$placeholder-name}` to indicate a placeholder.\n *\n * @publicApi\n */\nexport type TargetMessage = string;\n\n/**\n * A string that uniquely identifies a message, to be used for matching translations.\n *\n * @publicApi\n */\nexport type MessageId = string;\n\n/**\n * Declares a copy of the `AbsoluteFsPath` branded type in `@angular/compiler-cli` to avoid an\n * import into `@angular/compiler-cli`. The compiler-cli's declaration files are not necessarily\n * compatible with web environments that use `@angular/localize`, and would inadvertently include\n * `typescript` declaration files in any compilation unit that uses `@angular/localize` (which\n * increases parsing time and memory usage during builds) using a default import that only\n * type-checks when `allowSyntheticDefaultImports` is enabled.\n *\n * @see https://github.com/angular/angular/issues/45179\n */\ntype AbsoluteFsPathLocalizeCopy = string & {_brand: 'AbsoluteFsPath'};\n\n/**\n * The location of the message in the source file.\n *\n * The `line` and `column` values for the `start` and `end` properties are zero-based.\n */\nexport interface SourceLocation {\n  start: {line: number; column: number};\n  end: {line: number; column: number};\n  file: AbsoluteFsPathLocalizeCopy;\n  text?: string;\n}\n\n/**\n * Additional information that can be associated with a message.\n */\nexport interface MessageMetadata {\n  /**\n   * A human readable rendering of the message\n   */\n  text: string;\n  /**\n   * Legacy message ids, if provided.\n   *\n   * In legacy message formats the message id can only be computed directly from the original\n   * template source.\n   *\n   * Since this information is not available in `$localize` calls, the legacy message ids may be\n   * attached by the compiler to the `$localize` metablock so it can be used if needed at the point\n   * of translation if the translations are encoded using the legacy message id.\n   */\n  legacyIds?: string[];\n  /**\n   * The id of the `message` if a custom one was specified explicitly.\n   *\n   * This id overrides any computed or legacy ids.\n   */\n  customId?: string;\n  /**\n   * The meaning of the `message`, used to distinguish identical `messageString`s.\n   */\n  meaning?: string;\n  /**\n   * The description of the `message`, used to aid translation.\n   */\n  description?: string;\n  /**\n   * The location of the message in the source.\n   */\n  location?: SourceLocation;\n}\n\n/**\n * Information parsed from a `$localize` tagged string that is used to translate it.\n *\n * For example:\n *\n * ```ts\n * const name = 'Jo Bloggs';\n * $localize`Hello ${name}:title@@ID:!`;\n * ```\n *\n * May be parsed into:\n *\n * ```ts\n * {\n *   id: '6998194507597730591',\n *   substitutions: { title: 'Jo Bloggs' },\n *   messageString: 'Hello {$title}!',\n *   placeholderNames: ['title'],\n *   associatedMessageIds: { title: 'ID' },\n * }\n * ```\n */\nexport interface ParsedMessage extends MessageMetadata {\n  /**\n   * The key used to look up the appropriate translation target.\n   */\n  id: MessageId;\n  /**\n   * A mapping of placeholder names to substitution values.\n   */\n  substitutions: Record<string, any>;\n  /**\n   * An optional mapping of placeholder names to associated MessageIds.\n   * This can be used to match ICU placeholders to the message that contains the ICU.\n   */\n  associatedMessageIds?: Record<string, MessageId>;\n  /**\n   * An optional mapping of placeholder names to source locations\n   */\n  substitutionLocations?: Record<string, SourceLocation | undefined>;\n  /**\n   * The static parts of the message.\n   */\n  messageParts: string[];\n  /**\n   * An optional mapping of message parts to source locations\n   */\n  messagePartLocations?: (SourceLocation | undefined)[];\n  /**\n   * The names of the placeholders that will be replaced with substitutions.\n   */\n  placeholderNames: string[];\n}\n\n/**\n * Parse a `$localize` tagged string into a structure that can be used for translation or\n * extraction.\n *\n * See `ParsedMessage` for an example.\n */\nexport function parseMessage(\n  messageParts: TemplateStringsArray,\n  expressions?: readonly any[],\n  location?: SourceLocation,\n  messagePartLocations?: (SourceLocation | undefined)[],\n  expressionLocations: (SourceLocation | undefined)[] = [],\n): ParsedMessage {\n  const substitutions: {[placeholderName: string]: any} = {};\n  const substitutionLocations: {[placeholderName: string]: SourceLocation | undefined} = {};\n  const associatedMessageIds: {[placeholderName: string]: MessageId} = {};\n  const metadata = parseMetadata(messageParts[0], messageParts.raw[0]);\n  const cleanedMessageParts: string[] = [metadata.text];\n  const placeholderNames: string[] = [];\n  let messageString = metadata.text;\n  for (let i = 1; i < messageParts.length; i++) {\n    const {\n      messagePart,\n      placeholderName = computePlaceholderName(i),\n      associatedMessageId,\n    } = parsePlaceholder(messageParts[i], messageParts.raw[i]);\n    messageString += `{$${placeholderName}}${messagePart}`;\n    if (expressions !== undefined) {\n      substitutions[placeholderName] = expressions[i - 1];\n      substitutionLocations[placeholderName] = expressionLocations[i - 1];\n    }\n    placeholderNames.push(placeholderName);\n    if (associatedMessageId !== undefined) {\n      associatedMessageIds[placeholderName] = associatedMessageId;\n    }\n    cleanedMessageParts.push(messagePart);\n  }\n  const messageId = metadata.customId || computeMsgId(messageString, metadata.meaning || '');\n  const legacyIds = metadata.legacyIds ? metadata.legacyIds.filter((id) => id !== messageId) : [];\n  return {\n    id: messageId,\n    legacyIds,\n    substitutions,\n    substitutionLocations,\n    text: messageString,\n    customId: metadata.customId,\n    meaning: metadata.meaning || '',\n    description: metadata.description || '',\n    messageParts: cleanedMessageParts,\n    messagePartLocations,\n    placeholderNames,\n    associatedMessageIds,\n    location,\n  };\n}\n\n/**\n * Parse the given message part (`cooked` + `raw`) to extract the message metadata from the text.\n *\n * If the message part has a metadata block this function will extract the `meaning`,\n * `description`, `customId` and `legacyId` (if provided) from the block. These metadata properties\n * are serialized in the string delimited by `|`, `@@` and `␟` respectively.\n *\n * (Note that `␟` is the `LEGACY_ID_INDICATOR` - see `constants.ts`.)\n *\n * For example:\n *\n * ```ts\n * `:meaning|description@@custom-id:`\n * `:meaning|@@custom-id:`\n * `:meaning|description:`\n * `:description@@custom-id:`\n * `:meaning|:`\n * `:description:`\n * `:@@custom-id:`\n * `:meaning|description@@custom-id␟legacy-id-1␟legacy-id-2:`\n * ```\n *\n * @param cooked The cooked version of the message part to parse.\n * @param raw The raw version of the message part to parse.\n * @returns A object containing any metadata that was parsed from the message part.\n */\nexport function parseMetadata(cooked: string, raw: string): MessageMetadata {\n  const {text: messageString, block} = splitBlock(cooked, raw);\n  if (block === undefined) {\n    return {text: messageString};\n  } else {\n    const [meaningDescAndId, ...legacyIds] = block.split(LEGACY_ID_INDICATOR);\n    const [meaningAndDesc, customId] = meaningDescAndId.split(ID_SEPARATOR, 2);\n    let [meaning, description]: (string | undefined)[] = meaningAndDesc.split(MEANING_SEPARATOR, 2);\n    if (description === undefined) {\n      description = meaning;\n      meaning = undefined;\n    }\n    if (description === '') {\n      description = undefined;\n    }\n    return {text: messageString, meaning, description, customId, legacyIds};\n  }\n}\n\n/**\n * Parse the given message part (`cooked` + `raw`) to extract any placeholder metadata from the\n * text.\n *\n * If the message part has a metadata block this function will extract the `placeholderName` and\n * `associatedMessageId` (if provided) from the block.\n *\n * These metadata properties are serialized in the string delimited by `@@`.\n *\n * For example:\n *\n * ```ts\n * `:placeholder-name@@associated-id:`\n * ```\n *\n * @param cooked The cooked version of the message part to parse.\n * @param raw The raw version of the message part to parse.\n * @returns A object containing the metadata (`placeholderName` and `associatedMessageId`) of the\n *     preceding placeholder, along with the static text that follows.\n */\nexport function parsePlaceholder(\n  cooked: string,\n  raw: string,\n): {messagePart: string; placeholderName?: string; associatedMessageId?: string} {\n  const {text: messagePart, block} = splitBlock(cooked, raw);\n  if (block === undefined) {\n    return {messagePart};\n  } else {\n    const [placeholderName, associatedMessageId] = block.split(ID_SEPARATOR);\n    return {messagePart, placeholderName, associatedMessageId};\n  }\n}\n\n/**\n * Split a message part (`cooked` + `raw`) into an optional delimited \"block\" off the front and the\n * rest of the text of the message part.\n *\n * Blocks appear at the start of message parts. They are delimited by a colon `:` character at the\n * start and end of the block.\n *\n * If the block is in the first message part then it will be metadata about the whole message:\n * meaning, description, id.  Otherwise it will be metadata about the immediately preceding\n * substitution: placeholder name.\n *\n * Since blocks are optional, it is possible that the content of a message block actually starts\n * with a block marker. In this case the marker must be escaped `\\:`.\n *\n * @param cooked The cooked version of the message part to parse.\n * @param raw The raw version of the message part to parse.\n * @returns An object containing the `text` of the message part and the text of the `block`, if it\n * exists.\n * @throws an error if the `block` is unterminated\n */\nexport function splitBlock(cooked: string, raw: string): {text: string; block?: string} {\n  if (raw.charAt(0) !== BLOCK_MARKER) {\n    return {text: cooked};\n  } else {\n    const endOfBlock = findEndOfBlock(cooked, raw);\n    return {\n      block: cooked.substring(1, endOfBlock),\n      text: cooked.substring(endOfBlock + 1),\n    };\n  }\n}\n\nfunction computePlaceholderName(index: number) {\n  return index === 1 ? 'PH' : `PH_${index - 1}`;\n}\n\n/**\n * Find the end of a \"marked block\" indicated by the first non-escaped colon.\n *\n * @param cooked The cooked string (where escaped chars have been processed)\n * @param raw The raw string (where escape sequences are still in place)\n *\n * @returns the index of the end of block marker\n * @throws an error if the block is unterminated\n */\nexport function findEndOfBlock(cooked: string, raw: string): number {\n  for (let cookedIndex = 1, rawIndex = 1; cookedIndex < cooked.length; cookedIndex++, rawIndex++) {\n    if (raw[rawIndex] === '\\\\') {\n      rawIndex++;\n    } else if (cooked[cookedIndex] === BLOCK_MARKER) {\n      return cookedIndex;\n    }\n  }\n  throw new Error(`Unterminated $localize metadata block in \"${raw}\".`);\n}\n", "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {BLOCK_MARKER} from './constants';\nimport {MessageId, MessageMetadata, ParsedMessage, parseMessage, TargetMessage} from './messages';\n\n/**\n * A translation message that has been processed to extract the message parts and placeholders.\n */\nexport interface ParsedTranslation extends MessageMetadata {\n  messageParts: TemplateStringsArray;\n  placeholderNames: string[];\n}\n\n/**\n * The internal structure used by the runtime localization to translate messages.\n */\nexport type ParsedTranslations = Record<MessageId, ParsedTranslation>;\n\nexport class MissingTranslationError extends Error {\n  private readonly type = 'MissingTranslationError';\n  constructor(readonly parsedMessage: ParsedMessage) {\n    super(`No translation found for ${describeMessage(parsedMessage)}.`);\n  }\n}\n\nexport function isMissingTranslationError(e: any): e is MissingTranslationError {\n  return e.type === 'MissingTranslationError';\n}\n\n/**\n * Translate the text of the `$localize` tagged-string (i.e. `messageParts` and\n * `substitutions`) using the given `translations`.\n *\n * The tagged-string is parsed to extract its `messageId` which is used to find an appropriate\n * `ParsedTranslation`. If this doesn't match and there are legacy ids then try matching a\n * translation using those.\n *\n * If one is found then it is used to translate the message into a new set of `messageParts` and\n * `substitutions`.\n * The translation may reorder (or remove) substitutions as appropriate.\n *\n * If there is no translation with a matching message id then an error is thrown.\n * If a translation contains a placeholder that is not found in the message being translated then an\n * error is thrown.\n */\nexport function translate(\n  translations: Record<string, ParsedTranslation>,\n  messageParts: TemplateStringsArray,\n  substitutions: readonly any[],\n): [TemplateStringsArray, readonly any[]] {\n  const message = parseMessage(messageParts, substitutions);\n  // Look up the translation using the messageId, and then the legacyId if available.\n  let translation = translations[message.id];\n  // If the messageId did not match a translation, try matching the legacy ids instead\n  if (message.legacyIds !== undefined) {\n    for (let i = 0; i < message.legacyIds.length && translation === undefined; i++) {\n      translation = translations[message.legacyIds[i]];\n    }\n  }\n  if (translation === undefined) {\n    throw new MissingTranslationError(message);\n  }\n  return [\n    translation.messageParts,\n    translation.placeholderNames.map((placeholder) => {\n      if (message.substitutions.hasOwnProperty(placeholder)) {\n        return message.substitutions[placeholder];\n      } else {\n        throw new Error(\n          `There is a placeholder name mismatch with the translation provided for the message ${describeMessage(\n            message,\n          )}.\\n` +\n            `The translation contains a placeholder with name ${placeholder}, which does not exist in the message.`,\n        );\n      }\n    }),\n  ];\n}\n\n/**\n * Parse the `messageParts` and `placeholderNames` out of a target `message`.\n *\n * Used by `loadTranslations()` to convert target message strings into a structure that is more\n * appropriate for doing translation.\n *\n * @param message the message to be parsed.\n */\nexport function parseTranslation(messageString: TargetMessage): ParsedTranslation {\n  const parts = messageString.split(/{\\$([^}]*)}/);\n  const messageParts = [parts[0]];\n  const placeholderNames: string[] = [];\n  for (let i = 1; i < parts.length - 1; i += 2) {\n    placeholderNames.push(parts[i]);\n    messageParts.push(`${parts[i + 1]}`);\n  }\n  const rawMessageParts = messageParts.map((part) =>\n    part.charAt(0) === BLOCK_MARKER ? '\\\\' + part : part,\n  );\n  return {\n    text: messageString,\n    messageParts: makeTemplateObject(messageParts, rawMessageParts),\n    placeholderNames,\n  };\n}\n\n/**\n * Create a `ParsedTranslation` from a set of `messageParts` and `placeholderNames`.\n *\n * @param messageParts The message parts to appear in the ParsedTranslation.\n * @param placeholderNames The names of the placeholders to intersperse between the `messageParts`.\n */\nexport function makeParsedTranslation(\n  messageParts: string[],\n  placeholderNames: string[] = [],\n): ParsedTranslation {\n  let messageString = messageParts[0];\n  for (let i = 0; i < placeholderNames.length; i++) {\n    messageString += `{$${placeholderNames[i]}}${messageParts[i + 1]}`;\n  }\n  return {\n    text: messageString,\n    messageParts: makeTemplateObject(messageParts, messageParts),\n    placeholderNames,\n  };\n}\n\n/**\n * Create the specialized array that is passed to tagged-string tag functions.\n *\n * @param cooked The message parts with their escape codes processed.\n * @param raw The message parts with their escaped codes as-is.\n */\nexport function makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray {\n  Object.defineProperty(cooked, 'raw', {value: raw});\n  return cooked as any;\n}\n\nfunction describeMessage(message: ParsedMessage): string {\n  const meaningString = message.meaning && ` - \"${message.meaning}\"`;\n  const legacy =\n    message.legacyIds && message.legacyIds.length > 0\n      ? ` [${message.legacyIds.map((l) => `\"${l}\"`).join(', ')}]`\n      : '';\n  return `\"${message.id}\"${legacy} (\"${message.text}\"${meaningString})`;\n}\n", "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {findEndOfBlock} from '../../utils';\n\n/** @docs-private */\nexport interface LocalizeFn {\n  (messageParts: TemplateStringsArray, ...expressions: readonly any[]): string;\n\n  /**\n   * A function that converts an input \"message with expressions\" into a translated \"message with\n   * expressions\".\n   *\n   * The conversion may be done in place, modifying the array passed to the function, so\n   * don't assume that this has no side-effects.\n   *\n   * The expressions must be passed in since it might be they need to be reordered for\n   * different translations.\n   */\n  translate?: TranslateFn;\n  /**\n   * The current locale of the translated messages.\n   *\n   * The compile-time translation inliner is able to replace the following code:\n   *\n   * ```ts\n   * typeof $localize !== \"undefined\" && $localize.locale\n   * ```\n   *\n   * with a string literal of the current locale. E.g.\n   *\n   * ```\n   * \"fr\"\n   * ```\n   */\n  locale?: string;\n}\n\n/** @docs-private */\nexport interface TranslateFn {\n  (\n    messageParts: TemplateStringsArray,\n    expressions: readonly any[],\n  ): [TemplateStringsArray, readonly any[]];\n}\n\n/**\n * Tag a template literal string for localization.\n *\n * For example:\n *\n * ```ts\n * $localize `some string to localize`\n * ```\n *\n * **Providing meaning, description and id**\n *\n * You can optionally specify one or more of `meaning`, `description` and `id` for a localized\n * string by pre-pending it with a colon delimited block of the form:\n *\n * ```ts\n * $localize`:meaning|description@@id:source message text`;\n *\n * $localize`:meaning|:source message text`;\n * $localize`:description:source message text`;\n * $localize`:@@id:source message text`;\n * ```\n *\n * This format is the same as that used for `i18n` markers in Angular templates. See the\n * [Angular i18n guide](guide/i18n/prepare#mark-text-in-component-template).\n *\n * **Naming placeholders**\n *\n * If the template literal string contains expressions, then the expressions will be automatically\n * associated with placeholder names for you.\n *\n * For example:\n *\n * ```ts\n * $localize `Hi ${name}! There are ${items.length} items.`;\n * ```\n *\n * will generate a message-source of `Hi {$PH}! There are {$PH_1} items`.\n *\n * The recommended practice is to name the placeholder associated with each expression though.\n *\n * Do this by providing the placeholder name wrapped in `:` characters directly after the\n * expression. These placeholder names are stripped out of the rendered localized string.\n *\n * For example, to name the `items.length` expression placeholder `itemCount` you write:\n *\n * ```ts\n * $localize `There are ${items.length}:itemCount: items`;\n * ```\n *\n * **Escaping colon markers**\n *\n * If you need to use a `:` character directly at the start of a tagged string that has no\n * metadata block, or directly after a substitution expression that has no name you must escape\n * the `:` by preceding it with a backslash:\n *\n * For example:\n *\n * ```ts\n * // message has a metadata block so no need to escape colon\n * $localize `:some description::this message starts with a colon (:)`;\n * // no metadata block so the colon must be escaped\n * $localize `\\:this message starts with a colon (:)`;\n * ```\n *\n * ```ts\n * // named substitution so no need to escape colon\n * $localize `${label}:label:: ${}`\n * // anonymous substitution so colon must be escaped\n * $localize `${label}\\: ${}`\n * ```\n *\n * **Processing localized strings:**\n *\n * There are three scenarios:\n *\n * * **compile-time inlining**: the `$localize` tag is transformed at compile time by a\n * transpiler, removing the tag and replacing the template literal string with a translated\n * literal string from a collection of translations provided to the transpilation tool.\n *\n * * **run-time evaluation**: the `$localize` tag is a run-time function that replaces and\n * reorders the parts (static strings and expressions) of the template literal string with strings\n * from a collection of translations loaded at run-time.\n *\n * * **pass-through evaluation**: the `$localize` tag is a run-time function that simply evaluates\n * the original template literal string without applying any translations to the parts. This\n * version is used during development or where there is no need to translate the localized\n * template literals.\n *\n * @param messageParts a collection of the static parts of the template string.\n * @param expressions a collection of the values of each placeholder in the template string.\n * @returns the translated string, with the `messageParts` and `expressions` interleaved together.\n *\n * @publicApi\n */\nexport const $localize: LocalizeFn = function (\n  messageParts: TemplateStringsArray,\n  ...expressions: readonly any[]\n) {\n  if ($localize.translate) {\n    // Don't use array expansion here to avoid the compiler adding `__read()` helper unnecessarily.\n    const translation = $localize.translate(messageParts, expressions);\n    messageParts = translation[0];\n    expressions = translation[1];\n  }\n  let message = stripBlock(messageParts[0], messageParts.raw[0]);\n  for (let i = 1; i < messageParts.length; i++) {\n    message += expressions[i - 1] + stripBlock(messageParts[i], messageParts.raw[i]);\n  }\n  return message;\n};\n\nconst BLOCK_MARKER = ':';\n\n/**\n * Strip a delimited \"block\" from the start of the `messagePart`, if it is found.\n *\n * If a marker character (:) actually appears in the content at the start of a tagged string or\n * after a substitution expression, where a block has not been provided the character must be\n * escaped with a backslash, `\\:`. This function checks for this by looking at the `raw`\n * messagePart, which should still contain the backslash.\n *\n * @param messagePart The cooked message part to process.\n * @param rawMessagePart The raw message part to check.\n * @returns the message part with the placeholder name stripped, if found.\n * @throws an error if the block is unterminated\n */\nfunction stripBlock(messagePart: string, rawMessagePart: string) {\n  return rawMessagePart.charAt(0) === BLOCK_MARKER\n    ? messagePart.substring(findEndOfBlock(messagePart, rawMessagePart) + 1)\n    : messagePart;\n}\n", "import { $localize as _$localize } from './localize';/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {LocalizeFn} from './localize';\nimport {\n  MessageId,\n  ParsedTranslation,\n  parseTranslation,\n  TargetMessage,\n  translate as _translate,\n} from './utils';\n\n/**\n * We augment the `$localize` object to also store the translations.\n *\n * Note that because the TRANSLATIONS are attached to a global object, they will be shared between\n * all applications that are running in a single page of the browser.\n */\n const $localize: LocalizeFn & {TRANSLATIONS: Record<MessageId, ParsedTranslation>}=_$localize as any;\n\n/**\n * Load translations for use by `$localize`, if doing runtime translation.\n *\n * If the `$localize` tagged strings are not going to be replaced at compiled time, it is possible\n * to load a set of translations that will be applied to the `$localize` tagged strings at runtime,\n * in the browser.\n *\n * Loading a new translation will overwrite a previous translation if it has the same `MessageId`.\n *\n * Note that `$localize` messages are only processed once, when the tagged string is first\n * encountered, and does not provide dynamic language changing without refreshing the browser.\n * Loading new translations later in the application life-cycle will not change the translated text\n * of messages that have already been translated.\n *\n * The message IDs and translations are in the same format as that rendered to \"simple JSON\"\n * translation files when extracting messages. In particular, placeholders in messages are rendered\n * using the `{$PLACEHOLDER_NAME}` syntax. For example the message from the following template:\n *\n * ```html\n * <div i18n>pre<span>inner-pre<b>bold</b>inner-post</span>post</div>\n * ```\n *\n * would have the following form in the `translations` map:\n *\n * ```ts\n * {\n *   \"2932901491976224757\":\n *      \"pre{$START_TAG_SPAN}inner-pre{$START_BOLD_TEXT}bold{$CLOSE_BOLD_TEXT}inner-post{$CLOSE_TAG_SPAN}post\"\n * }\n * ```\n *\n * @param translations A map from message ID to translated message.\n *\n * These messages are processed and added to a lookup based on their `MessageId`.\n *\n * @see {@link clearTranslations} for removing translations loaded using this function.\n * @see {@link /api/localize/init/$localize $localize} for tagging messages as needing to be translated.\n * @publicApi\n */\nexport function loadTranslations(translations: Record<MessageId, TargetMessage>) {\n  // Ensure the translate function exists\n  if (!$localize.translate) {\n    $localize.translate = translate;\n  }\n  if (!$localize.TRANSLATIONS) {\n    $localize.TRANSLATIONS = {};\n  }\n  Object.keys(translations).forEach((key) => {\n    $localize.TRANSLATIONS[key] = parseTranslation(translations[key]);\n  });\n}\n\n/**\n * Remove all translations for `$localize`, if doing runtime translation.\n *\n * All translations that had been loading into memory using `loadTranslations()` will be removed.\n *\n * @see {@link loadTranslations} for loading translations at runtime.\n * @see {@link /api/localize/init/$localize $localize} for tagging messages as needing to be translated.\n *\n * @publicApi\n */\nexport function clearTranslations() {\n  $localize.translate = undefined;\n  $localize.TRANSLATIONS = {};\n}\n\n/**\n * Translate the text of the given message, using the loaded translations.\n *\n * This function may reorder (or remove) substitutions as indicated in the matching translation.\n */\nexport function translate(\n  messageParts: TemplateStringsArray,\n  substitutions: readonly any[],\n): [TemplateStringsArray, readonly any[]] {\n  try {\n    return _translate($localize.TRANSLATIONS, messageParts, substitutions);\n  } catch (e) {\n    console.warn((e as Error).message);\n    return [messageParts, substitutions];\n  }\n}\n"],
  "mappings": "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",
  "names": ["Endian", "BLOCK_MARKER", "$localize", "translate"]
}
