text: from Strategy import *
  from Validation import *
  from Observer import Observer
  from Logger import Logger
  from Event import Event
  import random
  
  def findLeftAndRightBorders():
      while True:
          print("Введіть ліву та праву межі генерування.")
          a = intInput("Ліва: ")
          b = intInput("Права: ")
          if a >= b: print("Ліва межа має бути меншою за праву!")
          else: break
      return a, b
  
  def generateRandom(n, a, b):
      mas = LinkedList()
      for i in range(n):
          mas.push_back(random.randint(a, b))
      return mas
  
  def method(arrayX):
      n = nInput()
      a, b = findLeftAndRightBorders()
      arrayY = generateRandom(n, a, b)
      print("Linked list X: ", end = " ")
      print(arrayX)
      print("Linked list Y: ", end = " ")
      print(arrayY)
  
      count, max_mult, min_mult = arrayX.findCountMaxMin(arrayY)
      if count == 0:
          print("Шуканих добутків немає.")
      else:
          print("Кількість Xi*Yj < 0 - ", count, "\nМаксимальне значення Xi*Yj < 0 - ", max_mult,
                "\nМінімальне значення Xi*Yj < 0 - ", min_mult)
  
      arrayX.findAndChangesMinMax()
      arrayY.findAndChangesMinMax()
      print("Після заміни мінімального та максимального елемента:\nLinked list X: ", arrayX, "\nLinked list Y: ", arrayY)
  
  
  def menu():
      list = LinkedList()
      strategy = Strategy()
      observer = Observer()
      observer.pin("add", Logger.recording)
      observer.pin("remove", Logger.recording)
      observer.pin("method", Logger.recording)
      event = Event()
      while True:
          print("Введіть 1, щоб вибрати стратегію 1.")
          print("Введіть 2, щоб вибрати стратегію 2.")
          print("Введіть 3, щоб генерувати дані.")
          print("Введіть 4, щоб видалити елемент за вказаною позицією.")
          print("Введіть 5, щоб видалити декілька елементів в межах початкової та кінцевої позиції.")
          print("Введіть 6, щоб використати метод для роботи зі списками.")
          print("Введіть 7, щоб вивести список.")
          print("Введіть 8, щоб вийти.")
          count = input()
          if count == "1":
              strategy.set_strategy(StrategyIteratorGeneration())
          elif count == "2":
              strategy.set_strategy(StrategyReadFromFile())
          elif count == "3":
              if strategy.get_strategy():
                  pos = positionInput("Введіть позицію ставки(0 <= pos <= " + str(len(list)) + "): ", len(list))
                  size = intInput("Введіть розмір генерування: ")
                  changesNumber = strategy.generate(size, list, pos)
                  if len(changesNumber):
                      # Event("add", observer, "LoggerTextFile", list, changesNumber, pos)
                      event.upgrade("add", observer, "LoggerTextFile", list, changesNumber, pos)
              else: print("Виберіть спочатку стратегію!")
          elif count == "4":
              pos = positionInput("Введіть позицію для видалення(0 <= pos < " + str(len(list)) + "): ", len(list) - 1)
              changesNumber = list.erase(pos)
              #Event("remove", observer, "LoggerTextFile", list, changesNumber)
              event.upgrade("remove", observer, "LoggerTextFile", list, changesNumber)
          elif count == "5":
              first, second = inputTwoPosition(len(list))
              changesNumber = list.erase_first_second(first, second)
              #Event("remove", observer, "LoggerTextFile", list, changesNumber)
              event.upgrade("remove", observer, "LoggerTextFile", list, changesNumber)
          elif count == "6":
              method(list)
              #Event("method", observer, "LoggerTextFile", list)
              event.upgrade("method", observer, "LoggerTextFile", list)
          elif count == "7":
              print(list)
          elif count == "8":
              break
          else: print("Enter 1-8!")
  
  if __name__ == "__main__":
      menu()