docs: def get_variables(self, *keys):
          """
          Iterate over all variables for which their tracking key is a prefix of the values provided.
  
          Elements are a tuple, the first element is the full tracking key, the second is the symbol.
  
          >>> list(s.solver.get_variables('mem'))
          [(('mem', 0x1000), <BV64 mem_1000_4_64>), (('mem', 0x1008), <BV64 mem_1008_5_64>)]
  
          >>> list(s.solver.get_variables('file'))
          [(('file', 1, 0), <BV8 file_1_0_6_8>), (('file', 1, 1), <BV8 file_1_1_7_8>), (('file', 2, 0), <BV8 file_2_0_8_8>)]
  
          >>> list(s.solver.get_variables('file', 2))
          [(('file', 2, 0), <BV8 file_2_0_8_8>)]
  
          >>> list(s.solver.get_variables())
          [(('mem', 0x1000), <BV64 mem_1000_4_64>), (('mem', 0x1008), <BV64 mem_1008_5_64>), (('file', 1, 0), <BV8 file_1_0_6_8>), (('file', 1, 1), <BV8 file_1_1_7_8>), (('file', 2, 0), <BV8 file_2_0_8_8>)]
          """
          for k, v in self.eternal_tracked_variables.items():
              if len(k) >= len(keys) and all(x == y for x, y in zip(keys, k)):
                  yield k, v
          for k, v in self.temporal_tracked_variables.items():
              if k[-1] is None:
                  continue
              if len(k) >= len(keys) and all(x == y for x, y in zip(keys, k)):
                  yield k, v