code: def next_variables(self, tx):
      assert self.mutable_local
  
      if self.iterator is not None:
          try:
              new_item, _ = self.iterator.next_variables(tx)
              if len(self.saved) > MAX_CYCLE:
                  unimplemented(
                      "input iterator to itertools.cycle has too many items"
                  )
              tx.output.side_effects.mutation(self)
              self.saved.append(new_item)
              self.item = new_item
              if self.item is None:
                  return self.next_variables(tx)
              return self.item, self
          except StopIteration:
              self.iterator = None
              return self.next_variables(tx)
      elif len(self.saved) > 0:
          tx.output.side_effects.mutation(self)
          self.saved_index = (self.saved_index + 1) % len(self.saved)
          return self.item, self
      else:
          raise StopIteration
  
imports: import itertools
  import operator
  from typing import Dict, List, Optional
  from ..None import polyfill, variables
  from ..exc import unimplemented
  from .base import MutableLocal, VariableTracker
  from .constant import ConstantVariable
label_desc: Use image node_id 2 for calling the CycleIteratorVariable obj's underlying member method code with example usage: obj.next_variables(tx) and returns: self,  self, self,  self, self, self