

'''simple docstring'''



# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

__snake_case			:     Dict										=      TypeVar('T')



class lowerCamelCase			(  Generic[T]						):



			'''simple docstring'''






			def __init__(				self	:						Any		,      lowerCAmelCase_	:						bool = True			)      ->		None:





									'''simple docstring'''
									A__					:       dict[T, list[T]]     ={}  # dictionary of lists
									A__					:       Optional[Any]     =directed


			def lowercase__						(				self	:						Dict		,      lowerCAmelCase_	:						T		,      lowerCAmelCase_	:						T			)      ->		GraphAdjacencyList[T]:





									'''simple docstring'''

									if not self.directed:  # For undirected graphs
															# if both source vertex and destination vertex are both present in the
															# adjacency list, add destination vertex to source vertex list of adjacent
															# vertices and add source vertex to destination vertex list of adjacent
															# vertices.
															if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																					self.adj_list[source_vertex].append(lowerCAmelCase_			)
																					self.adj_list[destination_vertex].append(lowerCAmelCase_			)
															# if only source vertex is present in adjacency list, add destination vertex
															# to source vertex list of adjacent vertices, then create a new vertex with
															# destination vertex as key and assign a list containing the source vertex
															# as it's first adjacent vertex.
															elif source_vertex in self.adj_list:
																					self.adj_list[source_vertex].append(lowerCAmelCase_			)
																					A__					:       str     =[source_vertex]
															# if only destination vertex is present in adjacency list, add source vertex
															# to destination vertex list of adjacent vertices, then create a new vertex
															# with source vertex as key and assign a list containing the source vertex
															# as it's first adjacent vertex.
															elif destination_vertex in self.adj_list:
																					self.adj_list[destination_vertex].append(lowerCAmelCase_			)
																					A__					:       int     =[destination_vertex]
															# if both source vertex and destination vertex are not present in adjacency
															# list, create a new vertex with source vertex as key and assign a list
															# containing the destination vertex as it's first adjacent vertex also
															# create a new vertex with destination vertex as key and assign a list
															# containing the source vertex as it's first adjacent vertex.
															else:
																					A__					:       Dict     =[destination_vertex]
																					A__					:       Tuple     =[source_vertex]
									else:  # For directed graphs
															# if both source vertex and destination vertex are present in adjacency
															# list, add destination vertex to source vertex list of adjacent vertices.
															if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																					self.adj_list[source_vertex].append(lowerCAmelCase_			)
															# if only source vertex is present in adjacency list, add destination
															# vertex to source vertex list of adjacent vertices and create a new vertex
															# with destination vertex as key, which has no adjacent vertex
															elif source_vertex in self.adj_list:
																					self.adj_list[source_vertex].append(lowerCAmelCase_			)
																					A__					:       Any     =[]
															# if only destination vertex is present in adjacency list, create a new
															# vertex with source vertex as key and assign a list containing destination
															# vertex as first adjacent vertex
															elif destination_vertex in self.adj_list:
																					A__					:       Any     =[destination_vertex]
															# if both source vertex and destination vertex are not present in adjacency
															# list, create a new vertex with source vertex as key and a list containing
															# destination vertex as it's first adjacent vertex. Then create a new vertex
															# with destination vertex as key, which has no adjacent vertex
															else:
																					A__					:       Optional[Any]     =[destination_vertex]
																					A__					:       Union[str, Any]     =[]

									return self



			def __repr__(				self	:						List[str]			)      ->		str:





									'''simple docstring'''
									return pformat(self.adj_list			)




'''simple docstring'''



from maths.is_square_free import is_square_free
from maths.prime_factors import prime_factors
def 						__lowerCamelCase	(       __snake_case					:		int	)	->							int:






						"""simple docstring"""





						A__					:       List[Any]     =prime_factors(__snake_case	)
						if is_square_free(__snake_case	):
												return -1 if len(__snake_case	) % 2 else 1
						return 0


if __name__ == "__main__":
		import doctest

		doctest.testmod()

