code: def _expand(self, line: str) -> str:
          
  
          # expand aliases
          # make a copy of aliases so we can edit it
          tmp_aliases = list(self.aliases.keys())
          keep_expanding = bool(tmp_aliases)
          while keep_expanding:
              for cur_alias in tmp_aliases:
                  keep_expanding = False
                  # apply our regex to line
                  match = self._command_pattern.search(line)
                  if match:
                      # we got a match, extract the command
                      command = match.group(1)
                      if command and command == cur_alias:
                          # rebuild line with the expanded alias
                          line = self.aliases[cur_alias] + match.group(2) + line[match.end(2):]
                          tmp_aliases.remove(cur_alias)
                          keep_expanding = bool(tmp_aliases)
                          break
  
          # expand shortcuts
          for (shortcut, expansion) in self.shortcuts:
              if line.startswith(shortcut):
                  # If the next character after the shortcut isn't a space, then insert one
                  shortcut_len = len(shortcut)
                  if len(line) == shortcut_len or line[shortcut_len] != ' ':
                      expansion += ' '
  
                  # Expand the shortcut
                  line = line.replace(shortcut, expansion, 1)
                  break
          return line
docs: Expand shortcuts and aliases