code: def _recursively_merge_frozen_dicts(
      target: FrozenDict,
      source: FrozenDict,
  ) -> tuple[FrozenDict, Iterable[str], Iterable[str]]:
      """Recursively merges the source dict into the target one."""
      target = traverse_util.flatten_dict(target)
      source = traverse_util.flatten_dict(source)
  
      missing_keys = []
      for k in target:
          if k in source:
              target[k] = source[k]
          else:
              # Don't use the '/' directly as the `flatten_dict` `sep` argument because
              # there could be params that contain this string (or others).
              missing_keys.append("/".join(k))
  
      unexpected_keys = ["/".join(k) for k in set(source) - set(target)]
  
      target = flax.core.freeze(traverse_util.unflatten_dict(target))
  
      return target, missing_keys, unexpected_keys
  
imports: import collections
  from collections.abc import Callable
  from collections.abc import Iterable
  from collections.abc import Mapping
  import functools
  from typing import Any
  from typing import Hashable
  from typing import Literal
  from typing import Optional
  from typing import Sequence
  from typing import TypeVar
  from typing import Union
  from absl import logging
  from clu import metric_writers
  import flax
  from flax import jax_utils
  from flax import traverse_util
  from flax.core.frozen_dict import FrozenDict
  import jax
  import jax.numpy
  import ml_collections
  import numpy
  from scenic.dataset_lib import dataset_utils
  from scenic.projects.lang4video import util
  from scenic.projects.lang4video.model.base_encoders import ImageTextEncoder
  from scenic.train_lib import train_utils
label_desc: Use image node_id 1 for calling a global function with example usage: _recursively_merge_frozen_dicts(target, source) and returns: target,  missing_keys,  unexpected_keys