[
  {
    "path": ".classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" output=\"target/classes\" path=\"src/main/java\">\n\t\t<attributes>\n\t\t\t<attribute name=\"optional\" value=\"true\"/>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"src\" output=\"target/test-classes\" path=\"src/test/java\">\n\t\t<attributes>\n\t\t\t<attribute name=\"optional\" value=\"true\"/>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t\t<attribute name=\"test\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11\">\n\t\t<attributes>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER\">\n\t\t<attributes>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"src\" path=\"target/generated-sources/annotations\">\n\t\t<attributes>\n\t\t\t<attribute name=\"optional\" value=\"true\"/>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t\t<attribute name=\"ignore_optional_problems\" value=\"true\"/>\n\t\t\t<attribute name=\"m2e-apt\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"src\" output=\"target/test-classes\" path=\"target/generated-test-sources/test-annotations\">\n\t\t<attributes>\n\t\t\t<attribute name=\"optional\" value=\"true\"/>\n\t\t\t<attribute name=\"maven.pomderived\" value=\"true\"/>\n\t\t\t<attribute name=\"ignore_optional_problems\" value=\"true\"/>\n\t\t\t<attribute name=\"m2e-apt\" value=\"true\"/>\n\t\t\t<attribute name=\"test\" value=\"true\"/>\n\t\t</attributes>\n\t</classpathentry>\n\t<classpathentry kind=\"output\" path=\"target/classes\"/>\n</classpath>\n"
  },
  {
    "path": ".gitignore",
    "content": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\n.idea\n\n*.iml\n\n./target\ntarget/\n"
  },
  {
    "path": ".project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>looca-api</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.m2e.core.maven2Builder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t\t<nature>org.eclipse.m2e.core.maven2Nature</nature>\n\t</natures>\n\t<filteredResources>\n\t\t<filter>\n\t\t\t<id>1680496548325</id>\n\t\t\t<name></name>\n\t\t\t<type>30</type>\n\t\t\t<matcher>\n\t\t\t\t<id>org.eclipse.core.resources.regexFilterMatcher</id>\n\t\t\t\t<arguments>node_modules|\\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>\n\t\t\t</matcher>\n\t\t</filter>\n\t</filteredResources>\n</projectDescription>\n"
  },
  {
    "path": ".settings/org.eclipse.core.resources.prefs",
    "content": "eclipse.preferences.version=1\nencoding//src/main/java=UTF-8\nencoding//src/test/java=UTF-8\nencoding/<project>=UTF-8\n"
  },
  {
    "path": ".settings/org.eclipse.jdt.apt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.apt.aptEnabled=false\n"
  },
  {
    "path": ".settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\nenableParallelJavaIndexSearch=true\norg.eclipse.jdt.core.builder.annotationPath.allLocations=disabled\norg.eclipse.jdt.core.builder.cleanOutputFolder=clean\norg.eclipse.jdt.core.builder.duplicateResourceTask=warning\norg.eclipse.jdt.core.builder.invalidClasspath=abort\norg.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore\norg.eclipse.jdt.core.builder.resourceCopyExclusionFilter=\norg.eclipse.jdt.core.circularClasspath=warning\norg.eclipse.jdt.core.classpath.exclusionPatterns=enabled\norg.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error\norg.eclipse.jdt.core.classpath.multipleOutputLocations=enabled\norg.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error\norg.eclipse.jdt.core.codeComplete.argumentPrefixes=\norg.eclipse.jdt.core.codeComplete.argumentSuffixes=\norg.eclipse.jdt.core.codeComplete.camelCaseMatch=enabled\norg.eclipse.jdt.core.codeComplete.deprecationCheck=disabled\norg.eclipse.jdt.core.codeComplete.discouragedReferenceCheck=disabled\norg.eclipse.jdt.core.codeComplete.fieldPrefixes=\norg.eclipse.jdt.core.codeComplete.fieldSuffixes=\norg.eclipse.jdt.core.codeComplete.forbiddenReferenceCheck=enabled\norg.eclipse.jdt.core.codeComplete.forceImplicitQualification=disabled\norg.eclipse.jdt.core.codeComplete.localPrefixes=\norg.eclipse.jdt.core.codeComplete.localSuffixes=\norg.eclipse.jdt.core.codeComplete.staticFieldPrefixes=\norg.eclipse.jdt.core.codeComplete.staticFieldSuffixes=\norg.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=\norg.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=\norg.eclipse.jdt.core.codeComplete.subwordMatch=disabled\norg.eclipse.jdt.core.codeComplete.suggestStaticImports=enabled\norg.eclipse.jdt.core.codeComplete.visibilityCheck=enabled\norg.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled\norg.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore\norg.eclipse.jdt.core.compiler.annotation.nonnull=javax.annotation.Nonnull\norg.eclipse.jdt.core.compiler.annotation.nonnull.secondary=\norg.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault\norg.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=\norg.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.Nullable\norg.eclipse.jdt.core.compiler.annotation.nullable.secondary=\norg.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled\norg.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\norg.eclipse.jdt.core.compiler.codegen.lambda.genericSignature=do not generate\norg.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate\norg.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks=disabled\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=11\norg.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\norg.eclipse.jdt.core.compiler.compliance=11\norg.eclipse.jdt.core.compiler.debug.lineNumber=generate\norg.eclipse.jdt.core.compiler.debug.localVariable=generate\norg.eclipse.jdt.core.compiler.debug.sourceFile=generate\norg.eclipse.jdt.core.compiler.doc.comment.support=enabled\norg.eclipse.jdt.core.compiler.emulateJavacBug8031744=enabled\norg.eclipse.jdt.core.compiler.generateClassFiles=enabled\norg.eclipse.jdt.core.compiler.maxProblemPerUnit=100\norg.eclipse.jdt.core.compiler.problem.APILeak=warning\norg.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info\norg.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning\norg.eclipse.jdt.core.compiler.problem.assertIdentifier=error\norg.eclipse.jdt.core.compiler.problem.autoboxing=ignore\norg.eclipse.jdt.core.compiler.problem.comparingIdentical=warning\norg.eclipse.jdt.core.compiler.problem.deadCode=warning\norg.eclipse.jdt.core.compiler.problem.deadCodeInTrivialIfStatement=disabled\norg.eclipse.jdt.core.compiler.problem.deprecation=warning\norg.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled\norg.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled\norg.eclipse.jdt.core.compiler.problem.discouragedReference=warning\norg.eclipse.jdt.core.compiler.problem.emptyStatement=ignore\norg.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled\norg.eclipse.jdt.core.compiler.problem.enumIdentifier=error\norg.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore\norg.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore\norg.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled\norg.eclipse.jdt.core.compiler.problem.fieldHiding=ignore\norg.eclipse.jdt.core.compiler.problem.finalParameterBound=warning\norg.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning\norg.eclipse.jdt.core.compiler.problem.forbiddenReference=warning\norg.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning\norg.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled\norg.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning\norg.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning\norg.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore\norg.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore\norg.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled\norg.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled\norg.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled\norg.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public\norg.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore\norg.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning\norg.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore\norg.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore\norg.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled\norg.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore\norg.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore\norg.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled\norg.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public\norg.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag\norg.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore\norg.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled\norg.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled\norg.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public\norg.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore\norg.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled\norg.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore\norg.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore\norg.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning\norg.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning\norg.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore\norg.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning\norg.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning\norg.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning\norg.eclipse.jdt.core.compiler.problem.nullReference=warning\norg.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning\norg.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning\norg.eclipse.jdt.core.compiler.problem.overridingMethodWithoutSuperInvocation=ignore\norg.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning\norg.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore\norg.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning\norg.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore\norg.eclipse.jdt.core.compiler.problem.potentialNullReference=warning\norg.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore\norg.eclipse.jdt.core.compiler.problem.rawTypeReference=warning\norg.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning\norg.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore\norg.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore\norg.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning\norg.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore\norg.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore\norg.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore\norg.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled\norg.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning\norg.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled\norg.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled\norg.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info\norg.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled\norg.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore\norg.eclipse.jdt.core.compiler.problem.tasks=warning\norg.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning\norg.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning\norg.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled\norg.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning\norg.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning\norg.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore\norg.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore\norg.eclipse.jdt.core.compiler.problem.uninternedIdentityComparison=disabled\norg.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning\norg.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled\norg.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info\norg.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore\norg.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore\norg.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore\norg.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning\norg.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore\norg.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled\norg.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled\norg.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled\norg.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore\norg.eclipse.jdt.core.compiler.problem.unusedImport=warning\norg.eclipse.jdt.core.compiler.problem.unusedLabel=warning\norg.eclipse.jdt.core.compiler.problem.unusedLocal=warning\norg.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore\norg.eclipse.jdt.core.compiler.problem.unusedParameter=ignore\norg.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled\norg.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled\norg.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled\norg.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning\norg.eclipse.jdt.core.compiler.problem.unusedTypeArgumentsForMethodInvocation=warning\norg.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore\norg.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning\norg.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning\norg.eclipse.jdt.core.compiler.processAnnotations=disabled\norg.eclipse.jdt.core.compiler.release=disabled\norg.eclipse.jdt.core.compiler.source=11\norg.eclipse.jdt.core.compiler.storeAnnotations=disabled\norg.eclipse.jdt.core.compiler.taskCaseSensitive=enabled\norg.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL\norg.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX\norg.eclipse.jdt.core.computeJavaBuildOrder=ignore\norg.eclipse.jdt.core.encoding=utf8\norg.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false\norg.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647\norg.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line=true\norg.eclipse.jdt.core.formatter.align_type_members_on_columns=false\norg.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false\norg.eclipse.jdt.core.formatter.align_with_spaces=false\norg.eclipse.jdt.core.formatter.alignment_for_additive_operator=16\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=49\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0\norg.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16\norg.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16\norg.eclipse.jdt.core.formatter.alignment_for_assertion_message=16\norg.eclipse.jdt.core.formatter.alignment_for_assignment=0\norg.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16\norg.eclipse.jdt.core.formatter.alignment_for_compact_if=16\norg.eclipse.jdt.core.formatter.alignment_for_compact_loops=16\norg.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80\norg.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0\norg.eclipse.jdt.core.formatter.alignment_for_enum_constants=16\norg.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16\norg.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0\norg.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow=16\norg.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon=16\norg.eclipse.jdt.core.formatter.alignment_for_logical_operator=16\norg.eclipse.jdt.core.formatter.alignment_for_method_declaration=0\norg.eclipse.jdt.core.formatter.alignment_for_module_statements=16\norg.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16\norg.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16\norg.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0\norg.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_record_components=16\norg.eclipse.jdt.core.formatter.alignment_for_relational_operator=0\norg.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80\norg.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16\norg.eclipse.jdt.core.formatter.alignment_for_shift_operator=0\norg.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16\norg.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow=20\norg.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\norg.eclipse.jdt.core.formatter.alignment_for_type_annotations=0\norg.eclipse.jdt.core.formatter.alignment_for_type_arguments=0\norg.eclipse.jdt.core.formatter.alignment_for_type_parameters=0\norg.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16\norg.eclipse.jdt.core.formatter.blank_lines_after_imports=1\norg.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0\norg.eclipse.jdt.core.formatter.blank_lines_after_package=1\norg.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1\norg.eclipse.jdt.core.formatter.blank_lines_before_field=0\norg.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0\norg.eclipse.jdt.core.formatter.blank_lines_before_imports=1\norg.eclipse.jdt.core.formatter.blank_lines_before_member_type=1\norg.eclipse.jdt.core.formatter.blank_lines_before_method=1\norg.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1\norg.eclipse.jdt.core.formatter.blank_lines_before_package=0\norg.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1\norg.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0\norg.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1\norg.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line\norg.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line\norg.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true\norg.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false\norg.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false\norg.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false\norg.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true\norg.eclipse.jdt.core.formatter.comment.format_block_comments=true\norg.eclipse.jdt.core.formatter.comment.format_header=false\norg.eclipse.jdt.core.formatter.comment.format_html=true\norg.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true\norg.eclipse.jdt.core.formatter.comment.format_line_comments=true\norg.eclipse.jdt.core.formatter.comment.format_source_code=true\norg.eclipse.jdt.core.formatter.comment.indent_parameter_description=false\norg.eclipse.jdt.core.formatter.comment.indent_root_tags=false\norg.eclipse.jdt.core.formatter.comment.indent_tag_description=false\norg.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert\norg.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert\norg.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert\norg.eclipse.jdt.core.formatter.comment.line_length=80\norg.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true\norg.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true\norg.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false\norg.eclipse.jdt.core.formatter.compact_else_if=true\norg.eclipse.jdt.core.formatter.continuation_indentation=2\norg.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2\norg.eclipse.jdt.core.formatter.disabling_tag=@formatter\\:off\norg.eclipse.jdt.core.formatter.enabling_tag=@formatter\\:on\norg.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false\norg.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false\norg.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true\norg.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true\norg.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true\norg.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true\norg.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true\norg.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true\norg.eclipse.jdt.core.formatter.indent_empty_lines=false\norg.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true\norg.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true\norg.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true\norg.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true\norg.eclipse.jdt.core.formatter.indentation.size=4\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert\norg.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert\norg.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert\norg.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert\norg.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert\norg.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert\norg.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\norg.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert\norg.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert\norg.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert\norg.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert\norg.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert\norg.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert\norg.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert\norg.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert\norg.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert\norg.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert\norg.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert\norg.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert\norg.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert\norg.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert\norg.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert\norg.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert\norg.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert\norg.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert\norg.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert\norg.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert\norg.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert\norg.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert\norg.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert\norg.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert\norg.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert\norg.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert\norg.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\norg.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\norg.eclipse.jdt.core.formatter.join_lines_in_comments=false\norg.eclipse.jdt.core.formatter.join_wrapped_lines=false\norg.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false\norg.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false\norg.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false\norg.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false\norg.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false\norg.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false\norg.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false\norg.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false\norg.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never\norg.eclipse.jdt.core.formatter.lineSplit=120\norg.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false\norg.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false\norg.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0\norg.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0\norg.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0\norg.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0\norg.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0\norg.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0\norg.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1\norg.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines\norg.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines\norg.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true\norg.eclipse.jdt.core.formatter.tabulation.char=space\norg.eclipse.jdt.core.formatter.tabulation.size=2\norg.eclipse.jdt.core.formatter.text_block_indentation=0\norg.eclipse.jdt.core.formatter.use_on_off_tags=true\norg.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false\norg.eclipse.jdt.core.formatter.wrap_before_additive_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false\norg.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_logical_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true\norg.eclipse.jdt.core.formatter.wrap_before_relational_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_shift_operator=true\norg.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true\norg.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator=false\norg.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true\norg.eclipse.jdt.core.incompatibleJDKLevel=ignore\norg.eclipse.jdt.core.incompleteClasspath=error\norg.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter\norg.eclipse.jdt.core.timeoutForParameterNameFromAttachedJavadoc=50\n"
  },
  {
    "path": ".settings/org.eclipse.m2e.core.prefs",
    "content": "activeProfiles=\neclipse.preferences.version=1\nresolveWorkspaceProjects=true\nversion=1\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"java.configuration.updateBuildConfiguration\": \"interactive\"\n}"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Diego Brito\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n[![Looca API](./readme/readmes.gif)]()\n# Log of Computer Activity\n\n### **Looca** é uma API que coleta dados de maquina e foi desenvolvida para facilitar o aprendizado em contextos acadêmicos. Esse projeto visa ajudar os alunos da Faculdade [@SPTech](https://github.com/BandTec) em projetos na disciplina de Pesquisa e Inovação.\n# \n\n![Badge](https://img.shields.io/badge/Code-Java-F76911?&logo=java) \n![Badge](https://img.shields.io/badge/compiler-maven-4c9d1flogo=maven)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.nyholmniklas/arithmetic/badge.svg)](https://search.maven.org/artifact/com.github.britooo/looca-api)\n#\n## Instalação\n**Adicione no pom.xml**:\n```xml\n<dependency>\n  <groupId>com.github.britooo</groupId>\n  <artifactId>looca-api</artifactId>\n  <version>--INSIRA A VERSÃO ATUAL--</version>\n</dependency>\n```\n\n**Execute no terminal (linha de comando):**\n```\n$ mvn install\n```\n#\n## Uso\n\n**Crie uma instância do objeto Looca:**\n```java\nLooca looca = new Looca();\n```\n\n**Esse objeto disponibiliza os seguintes recursos:**\n\n```java\nprivate final Sistema sistema;\nprivate final Memoria memoria;\nprivate final Processador processador;\nprivate final Temperatura temperatura;\nprivate final DiscoGrupo grupoDeDiscos;\nprivate final ServicoGrupo grupoDeServicos;\nprivate final ProcessoGrupo grupoDeProcessos;\n```\n\n**Coletando dados do sistema operacional**\n\nPara coletar os dados da máquina, devemos utilizar os **getters** disponíveis no objeto Looca, por exemplo, para coletar os dados do sistema operacional, utilizamos o **```getSistema()```**, que devolve um objeto do tipo Sistema:\n\n\n```java\nSistema sistema = looca.getSistema();\n\n```\nO objeto Sistema por sua vez, também possui **getters** que devolvem informações do sistema:\n```java\nsistema.getPermissao();\nsistema.getFabricante();\nsistema.getArquitetura();\nsistema.getInicializado();\nsistema.getSistemaOperacional();\n```\n\nPara exibir no console as informações do sistema, basta imprimir o objeto:\n```java\nSystem.out.println(sistema);\n```\nSaída do console:\n```\nSistema operacional: Ubuntu\nFabricante: GNU/Linux\nArquitetura: 64 bits.\nInicializado: 2021-03-13T16:07:18Z\nTempo de atividade: 3 days, 06:55:53\nPermissões:\nExecutando como usuário padrão\n```\n\n\n**Trabalhando com os grupos**\n\nPara lidar com objetos que retornam mais de uma instância (lista) da informação desejada, utilizamos os grupos, que gerenciam essas informações, para obte-los, utilizamos o **```getGrupoNomeGrupo()```** (Discos, Processos ou Servicos), exemplo:\n\n```java\n//Criação do gerenciador\nDiscoGrupo grupoDeDiscos = looca.getGrupoDeDiscos();\n\n//Obtendo lista de discos a partir do getter\nList<Disco> discos = grupoDeDiscos.getDiscos();\n```\nExibindo as informações de cada disco:\n\n```java\nfor (Disco disco : discos) {\n  System.out.println(disco);\n}\n```\n\n## Desenvolvedores\n#\n- @Britoo\n- @miniguiti\n\n## Licença\n#\n[MIT](LICENSE) © 2021 Bandtec Digital School\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>com.github.britooo</groupId>\n    <artifactId>looca-api</artifactId>\n    <version>2.2.0</version>\n    <packaging>jar</packaging>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n    </properties>\n\n    <name>Log of computer activity - Looca</name>\n    <description>API for collecting computer data for educational purposes.</description>\n    <url>https://github.com/Britooo/looca-api</url>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>11</source>\n                    <target>11</target>\n                </configuration>\n            </plugin>\n            <!--            <plugin>\n                <groupId>org.sonatype.plugins</groupId>\n                <artifactId>nexus-staging-maven-plugin</artifactId>\n                <version>1.6.7</version>\n                <extensions>true</extensions>\n                <configuration>\n                    <serverId>ossrh</serverId>\n                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>\n                    <autoReleaseAfterClose>true</autoReleaseAfterClose>\n                </configuration>\n            </plugin>-->\n            <plugin>\n                <groupId>org.sonatype.plugins</groupId>\n                <artifactId>nexus-staging-maven-plugin</artifactId>\n                <version>1.6.7</version>\n                <extensions>true</extensions>\n                <configuration>\n                    <serverId>ossrh</serverId>\n                    <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>\n                    <autoReleaseAfterClose>true</autoReleaseAfterClose>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>2.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar-no-fork</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <configuration>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                </configuration>\n                <version>2.9.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-gpg-plugin</artifactId>\n                <version>1.5</version>\n                <executions>\n                    <execution>\n                        <id>sign-artifacts</id>\n                        <phase>verify</phase>\n                        <goals>\n                            <goal>sign</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n    <distributionManagement>\n        <snapshotRepository>\n            <id>ossrh</id>\n            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>\n        </snapshotRepository>\n    </distributionManagement>\n\n    <!--    <distributionManagement>\n        <snapshotRepository>\n            <id>ossrh</id>\n            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>\n        </snapshotRepository>\n        <repository>\n            <id>ossrh</id>\n            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>\n        </repository>\n    </distributionManagement>-->\n\n    <licenses>\n        <license>\n            <name>MIT License</name>\n            <url>http://www.opensource.org/licenses/mit-license.php</url>\n        </license>\n    </licenses>\n      \n    <developers>\n        <developer>\n            <name>Diego Brito</name>\n            <email>diego.lima@bandtec.com.br</email>\n            <organization>com.github.britooo</organization>\n            <organizationUrl>https://github.com/Britooo/looca-api</organizationUrl>\n        </developer>\n    </developers>\n\n    <scm>\n        <connection>scm:git:git://github.com/Britooo/looca-api.git</connection>\n        <developerConnection>scm:git:ssh://github.com:Britooo/looca-api.git</developerConnection>\n        <url>https://github.com/Britooo/looca-api</url>\n    </scm>\n\n    <dependencies>\n        <!--          https://mvnrepository.com/artifact/com.github.oshi/oshi-core  \n        <dependency>\n            <groupId>com.github.oshi</groupId>\n            <artifactId>oshi-core</artifactId>\n            <version>5.3.6</version>\n        </dependency>-->\n        <!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-core -->\n        <dependency>\n            <groupId>com.github.oshi</groupId>\n            <artifactId>oshi-core</artifactId>\n            <version>6.1.5</version>\n        </dependency>\n        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <version>31.1-jre</version>\n        </dependency>\n\n        <!--  https://mvnrepository.com/artifact/org.slf4j/slf4j-api  -->\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <version>1.7.30</version>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-simple</artifactId>\n            <version>1.7.30</version>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "pom.xml.versionsBackup",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>com.github.britooo</groupId>\n    <artifactId>looca-api</artifactId>\n    <version>1.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n    </properties>\n\n    <name>Log of computer activity - Looca</name>\n    <description>API for collecting computer data for educational purposes.</description>\n    <url>https://github.com/Britooo/looca-api</url>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>11</source>\n                    <target>11</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.sonatype.plugins</groupId>\n                <artifactId>nexus-staging-maven-plugin</artifactId>\n                <version>1.6.7</version>\n                <extensions>true</extensions>\n                <configuration>\n                    <serverId>ossrh</serverId>\n                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>\n                    <autoReleaseAfterClose>true</autoReleaseAfterClose>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>2.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar-no-fork</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <configuration>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                </configuration>\n                <version>2.9.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-gpg-plugin</artifactId>\n                <version>1.5</version>\n                <executions>\n                    <execution>\n                        <id>sign-artifacts</id>\n                        <phase>verify</phase>\n                        <goals>\n                            <goal>sign</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n    <distributionManagement>\n        <snapshotRepository>\n            <id>ossrh</id>\n            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>\n        </snapshotRepository>\n        <repository>\n            <id>ossrh</id>\n            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>\n        </repository>\n    </distributionManagement>\n\n    <licenses>\n        <license>\n            <name>MIT License</name>\n            <url>http://www.opensource.org/licenses/mit-license.php</url>\n        </license>\n    </licenses>\n      \n    <developers>\n        <developer>\n            <name>Diego Brito</name>\n            <email>diego.lima@bandtec.com.br</email>\n            <organization>com.github.britooo</organization>\n            <organizationUrl>https://github.com/Britooo/looca-api</organizationUrl>\n        </developer>\n    </developers>\n\n    <scm>\n        <connection>scm:git:git://github.com/Britooo/looca-api.git</connection>\n        <developerConnection>scm:git:ssh://github.com:Britooo/looca-api.git</developerConnection>\n        <url>https://github.com/Britooo/looca-api</url>\n    </scm>\n\n    <dependencies>\n        <!--          https://mvnrepository.com/artifact/com.github.oshi/oshi-core  \n        <dependency>\n            <groupId>com.github.oshi</groupId>\n            <artifactId>oshi-core</artifactId>\n            <version>5.3.6</version>\n        </dependency>-->\n        <!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-core -->\n        <dependency>\n            <groupId>com.github.oshi</groupId>\n            <artifactId>oshi-core</artifactId>\n            <version>6.1.5</version>\n        </dependency>\n\n        <!--  https://mvnrepository.com/artifact/org.slf4j/slf4j-api  -->\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <version>1.7.30</version>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-simple</artifactId>\n            <version>1.7.30</version>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/core/Looca.java",
    "content": "package com.github.britooo.looca.api.core;\n\nimport com.github.britooo.looca.api.group.discos.DiscoGrupo;\nimport com.github.britooo.looca.api.group.dispositivos.DispositivosUsbGrupo;\nimport com.github.britooo.looca.api.group.janelas.JanelaGrupo;\nimport com.github.britooo.looca.api.group.memoria.Memoria;\nimport com.github.britooo.looca.api.group.processador.Processador;\nimport com.github.britooo.looca.api.group.processos.ProcessoGrupo;\nimport com.github.britooo.looca.api.group.rede.Rede;\nimport com.github.britooo.looca.api.group.servicos.ServicoGrupo;\nimport com.github.britooo.looca.api.group.sistema.Sistema;\nimport com.github.britooo.looca.api.group.temperatura.Temperatura;\nimport oshi.SystemInfo;\n\npublic class Looca {\n\n    private final Sistema sistema;\n    private final Memoria memoria;\n    private final Processador processador;\n    private final Temperatura temperatura;\n    private final Rede rede;\n    private final DiscoGrupo grupoDeDiscos;\n    private final ServicoGrupo grupoDeServicos;\n    private final ProcessoGrupo grupoDeProcessos;\n    private final JanelaGrupo grupoDeJanelas;\n    private final DispositivosUsbGrupo grupoDeDispositivosUsb;\n\n    public Looca() {\n        SystemInfo si = new SystemInfo();\n\n        this.sistema = new Sistema();\n        this.memoria = new Memoria();\n        this.processador = new Processador();\n        this.temperatura = new Temperatura();\n        this.rede = new Rede(si);\n        this.grupoDeDiscos = new DiscoGrupo();\n        this.grupoDeServicos = new ServicoGrupo();\n        this.grupoDeProcessos = new ProcessoGrupo();\n        this.grupoDeJanelas = new JanelaGrupo(si);\n        this.grupoDeDispositivosUsb = new DispositivosUsbGrupo();\n    }\n\n    /**\n     * Retorna um <b>Objeto de Sistema</b> que contém métodos relacionados a coleta de informações do <b>Sistema Operacional</b>.\n     * @return Objeto Sistema.\n     */\n    public Sistema getSistema() {\n      return sistema;\n    }\n\n    /**\n     * Retorna um <b>Objeto de Memoria</b> que contém métodos relacionados a coleta de informações da <b>Memória RAM</b>.\n     * @return Objeto Memoria.\n     */\n    public Memoria getMemoria() {\n      return memoria;\n    }\n\n    /**\n     * Retorna um <b>Objeto de Processador</b> que contém métodos relacionados a coleta de informações do <b>Processador</b>.\n     * @return Objeto Processador.\n     */\n    public Processador getProcessador() {\n      return processador;\n    }\n\n    /**\n     * Retorna um <b>Objeto de Temperatura</b> que contém métodos relacionados a coleta de informações de <b>Temperatura</b>.\n     * @return Objeto Temperatura.\n     */\n    public Temperatura getTemperatura() {\n      return temperatura;\n    }\n\n    /**\n     * Retorna um <b>Objeto de DiscoGrupo</b> que contém métodos relacionados a coleta de informações do <b>Grupo de Discos</b>.\n     * @return Objeto DiscoGrupo.\n     */\n    public DiscoGrupo getGrupoDeDiscos() {\n      return grupoDeDiscos;\n    }\n\n    /**\n     * Retorna um <b>Objeto de ServicoGrupo</b> que contém métodos relacionados a coleta de informações do <b>Grupo de Serviços</b>.\n     * @return Objeto ServicoGrupo.\n     */\n    public ServicoGrupo getGrupoDeServicos() {\n      return grupoDeServicos;\n    }\n\n    /**\n     * Retorna um <b>Objeto de ProcessoGrupo</b> que contém métodos relacionados a coleta de informações do <b>Grupo de Processos</b>.\n     * @return Objeto ProcessoGrupo.\n     */\n    public ProcessoGrupo getGrupoDeProcessos() {\n      return grupoDeProcessos;\n    }\n\n    /**\n     * Retorna um <b>Objeto de DispositivosUsbGrupo</b> que contém métodos relacionados a coleta de informações do <b>Grupo de Dispositivos USB</b>.\n     * @return Objeto DispositivosUsbGrupo.\n     */\n    public DispositivosUsbGrupo getDispositivosUsbGrupo() {\n        return grupoDeDispositivosUsb;\n    }\n\n    /**\n     * Retorna um <b>Objeto de Rede</b> que contém métodos relacionados a coleta de informações de <b>Rede</b>.\n     * @return Objeto Rede.\n     */\n    public Rede getRede() {\n        return rede;\n    }\n\n    /**\n     * Retorna um <b>Objeto de JanelaGrupo</b> que contém métodos relacionados a coleta de informações do\n     * <b>Grupo de Janelas</b> do computador.\n     * @return Objeto Rede.\n     */\n    public JanelaGrupo getGrupoDeJanelas() {\n        return grupoDeJanelas;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/discos/Disco.java",
    "content": "package com.github.britooo.looca.api.group.discos;\n\nimport oshi.hardware.HWDiskStore;\n\npublic class Disco {\n\n  private final HWDiskStore disco;\n\n  public Disco(HWDiskStore disco) {\n    this.disco = disco;\n  }\n\n  /**\n   * Retorna o <b>nome</b> do disco.\n   *\n   * @return Nome do disco.\n   */\n  public String getNome() {\n    return disco.getName();\n  }\n\n  /**\n   * Retorna o <b>modelo</b> do disco.\n   *\n   * @return Modelo do disco.\n   */\n  public String getModelo() {\n    return disco.getModel();\n  }\n\n  /**\n   * Retorna o <b>número do serial</b> do disco, <b>se disponível</b>.\n   *\n   * @return Número serial do disco, se disponível.\n   */\n  public String getSerial() {\n    return disco.getSerial();\n  }\n\n  /**\n   * Retorna o <b>tamanho</b> do disco em <b>bytes</b>.\n   *\n   * @return Tamanho do disco em <b>bytes</b>.\n   */\n  public Long getTamanho() {\n    return disco.getSize();\n  }\n\n  /**\n   * Retorna o <b>número de leituras</b> do disco.\n   *\n   * @return Número de leituras do disco.\n   */\n  public Long getLeituras() {\n    return disco.getReads();\n  }\n\n  /**\n   * Retorna o <b>número de bytes lidos</b> pelo disco.\n   *\n   * @return Número de bytes lidos pelo disco.\n   */\n  public Long getBytesDeLeitura() {\n    return disco.getReadBytes();\n  }\n\n  /**\n   * Retorna o <b>número de escritas</b> no disco.\n   *\n   * @return Número de escritas no disco.\n   */\n  public Long getEscritas() {\n    return disco.getWrites();\n  }\n\n  /**\n   * Retorna o <b>número de bytes escritos</b> no disco.\n   *\n   * @return Número de bytes escritos no disco.\n   */\n  public Long getBytesDeEscritas() {\n    return disco.getWriteBytes();\n  }\n\n  /**\n   * <p>Retorna o <b>comprimento da fila</b> de disco (E/S's em andamento).</p>\n   * <br>\n   * <p>Inclui solicitações de E/S que foram emitidas para o driver de dispositivo,\n   * mas ainda não foram concluídas. <b>Não compatível com macOS</b>.</p>\n   *\n   * @return Comprimento da fila de disco (E/S's em andamento).\n   */\n  public Long getTamanhoAtualDaFila() {\n    return disco.getCurrentQueueLength();\n  }\n\n  /**\n   * Retorna o <b>tempo gasto lendo ou escrevendo</b> no disco, em <b>milissegundos</b>.\n   *\n   * @return Tempo gasto lendo ou escrevendo no disco, em <b>milissegundos</b>.\n   */\n\n  public Long getTempoDeTransferencia() {\n    return disco.getTransferTime();\n  }\n\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Disco</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Disco</b>.\n   */\n  @Override\n  public String toString() {\n\n    StringBuilder sb = new StringBuilder();\n\n    sb.append(\"\\nNome: \")\n        .append(getNome())\n        .append(\"\\n\");\n\n    sb.append(\"Modelo: \")\n        .append(getModelo())\n        .append(\"\\n\");\n\n    sb.append(\"Serial: \")\n        .append(getSerial())\n        .append(\"\\n\");\n\n    sb.append(\"Tamanho: \")\n        .append(getTamanho())\n        .append(\"\\n\");\n\n    sb.append(\"Leituras: \")\n        .append(getLeituras())\n        .append(\"\\n\");\n\n    sb.append(\"Bytes de leitura: \")\n        .append(getBytesDeLeitura())\n        .append(\"\\n\");\n\n    sb.append(\"Escritas: \")\n        .append(getEscritas())\n        .append(\"\\n\");\n\n    sb.append(\"Bytes de escritas: \")\n        .append(getBytesDeEscritas())\n        .append(\"\\n\");\n\n    sb.append(\"Tamanho atual da fila: \")\n        .append(getTamanhoAtualDaFila())\n        .append(\"\\n\");\n\n    sb.append(\"Tempo de transferência: \")\n        .append(getTempoDeTransferencia())\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/discos/DiscoGrupo.java",
    "content": "package com.github.britooo.looca.api.group.discos;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.HWDiskStore;\nimport oshi.hardware.HardwareAbstractionLayer;\nimport oshi.software.os.OSFileStore;\nimport oshi.software.os.OperatingSystem;\n\npublic class DiscoGrupo {\n\n  private final SystemInfo system = new SystemInfo();\n  private final OperatingSystem os = system.getOperatingSystem();\n  private final HardwareAbstractionLayer hal = system.getHardware();\n\n  /**\n   * Retorna uma <b>lista de <code>Volume</code></b>.\n   *\n   * @return Lista de Volume.\n   */\n  public List<Volume> getVolumes() {\n    return this.os.getFileSystem()\n        .getFileStores()\n        .stream()\n        .map(DiscoGrupo::of)\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna uma <b>lista de <code>Disco</code></b>.\n   *\n   * @return Lista de Disco.\n   */\n  public List<Disco> getDiscos() {\n    return this.hal.getDiskStores().stream()\n        .map(DiscoGrupo::of)\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna o <b>tamanho dos discos somados</b> em <b>bytes</b>.\n   *\n   * @return Tamanho dos discos somados em <b>bytes</b>.\n   */\n  public Long getTamanhoTotal() {\n    return this.getDiscos().stream()\n        .mapToLong(Disco::getTamanho).sum();\n  }\n\n  /**\n   * Retorna a <b>quantidade de discos existentes</b> citados na lista de discos <b>(Contagem total de discos)</b>.\n   *\n   * @return Soma total de discos.\n   */\n  public Integer getQuantidadeDeDiscos() {\n    return this.getDiscos().size();\n  }\n\n  /**\n   * Retorna a <b>quantidade de volumes existentes</b> citados na lista de volumes <b>(Contagem total de volumes)</b>.\n   *\n   * @return Soma total de volumes.\n   */\n  public Integer getQuantidadeDeVolumes() {\n    return this.getVolumes().size();\n  }\n\n  private static Volume of(OSFileStore volume) {\n    if (volume == null) {\n      return null;\n    }\n    return new Volume(volume);\n  }\n\n  private static Disco of(HWDiskStore disco) {\n    if (disco == null) {\n      return null;\n    }\n    return new Disco(disco);\n  }\n\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/discos/Volume.java",
    "content": "package com.github.britooo.looca.api.group.discos;\n\nimport oshi.software.os.OSFileStore;\n\npublic class Volume {\n\n  private final OSFileStore volume;\n\n  public Volume(OSFileStore volume) {\n    this.volume = volume;\n  }\n\n\n  /**\n   * Retorna o <b>UUID/GUID</b> do sistema de arquivos.\n   *\n   * @return UUID/GUID do sistema de arquivos.\n   */\n  public String getUUID() {\n    return this.volume.getUUID();\n  }\n\n  /**\n   * <p>\n   *  Nome do sistema de arquivos. Um identificador legível que não necessariamente corresponde\n   *  a um caminho no sistema de arquivos.\n   * </p>\n   * \n   * @return Nome do sistema de arquivos\n   */\n  public String getNome() {\n    return this.volume.getName();\n  }\n\n  /**\n   * <p>\n   *  Nome do volume do sistema de arquivos. Geralmente um caminho que representa o dispositivo\n   *  (ex: /dev/foo) que foi montado.\n   * </p>\n   * \n   * @return Nome do volume do sistema de arquivos\n   */\n  public String getVolume() {\n    return this.volume.getVolume();\n  }\n\n  /**\n   * <b>Retorna espaço/capacidade total da unidade (Em bytes).</b>\n   *\n   * @return Espaço/capacidade total da unidade <b>(Em bytes)</b>.\n   */\n  public Long getTotal() {\n    return this.volume.getTotalSpace();\n  }\n\n  /**\n   * <p>Retorna o <b>espaço livre</b> na unidade.</p>\n   * <br>\n   * <p>Esse espaço não é alocado, mas pode exigir permissões elevadas para gravação <b>(Em bytes)</b>.</p>\n   *\n   * @return Espaço livre na unidade <b>(Em bytes)</b>.\n   */\n  public Long getDisponivel() {\n    return this.volume.getFreeSpace();\n  }\n\n  /**\n   * Retorna o tipo do <b>sistema de arquivos</b> <i>(FAT, NTFS, etx2, ext4, etc...)</i>.\n   *\n   * @return sistema de arquivos (FAT, NTFS, etx2, ext4, etc...).\n   */\n  public String getTipo() {\n    return this.volume.getType();\n  }\n\n  /**\n   * <p>Retorna o <b>ponto de montagem</b> do sistema de arquivos.</p>\n   * <br>\n   * <p>O diretório que os usuários normalmente usarão para interagir com o armazenamento de arquivos.\n   * <i>(Exemplo C: no Windows ou / no Linux)</i>.</p>\n   *\n   * @return Ponto de montagem do sistema de arquivos.\n   */\n  public String getPontoDeMontagem() {\n    return this.volume.getMount();\n  }\n\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Volume</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Volume</b>.\n   */\n  @Override\n  public String toString() {\n\n    StringBuilder str = new StringBuilder();\n\n    str.append(\"UUID: \").append(this.getUUID()).append(\"\\n\");\n    str.append(\"nome: \").append(this.getNome()).append(\"\\n\");\n    str.append(\"volume: \").append(this.getVolume()).append(\"\\n\");\n    str.append(\"total: \").append(this.getTotal()).append(\"\\n\");\n    str.append(\"disponível: \").append(this.getDisponivel()).append(\"\\n\");\n    str.append(\"tipo: \").append(this.getTipo()).append(\"\\n\");\n    str.append(\"ponto de montagem: \").append(this.getPontoDeMontagem()).append(\"\\n\");\n\n\n    return str.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/dispositivos/DispositivoUsb.java",
    "content": "package com.github.britooo.looca.api.group.dispositivos;\n\nimport oshi.hardware.UsbDevice;\n\npublic class DispositivoUsb {\n\n    private final UsbDevice usbDevice;\n\n    /**\n     * Retorna o <b>nome do dispositivo</b>.\n     *\n     * @return Nome do dispositivo.\n     */\n    public String getNome() {\n        return usbDevice.getName();\n    }\n\n    /**\n     * Retorna o <b>identificador do produto</b>.\n     *\n     * @return O identificador do produto.\n     */\n    public String getIdProduto() {\n        return usbDevice.getProductId();\n    }\n\n    /**\n     * Retorna o <b>numero de serie</b>.\n     *\n     * @return O número de série.\n     */\n    public String getNumeroDeSerie() {\n        return usbDevice.getSerialNumber();\n    }\n\n\n    /**\n     * Retorna o <b>identificador exclusivo do dispositivo</b>.\n     *\n     * @return O identificador exclusivo do dispositivo.\n     */\n    public String getIdDispositivoUsbExclusivo() {\n        return usbDevice.getUniqueDeviceId();\n    }\n\n    /**\n     * Retorna o <b>nome do fornecedor</b> identificado no dispositivo.\n     *\n     * @return O nome do fornecedor.\n     */\n    public String getForncecedor() {\n        return usbDevice.getVendor();\n    }\n\n    /**\n     * Retorna o <b>identificador do fornecedor</b>.\n     *\n     * @return O identificador do fornecedor.\n     */\n    public String getIdFornecedor() {\n        return usbDevice.getVendorId();\n    }\n\n    public DispositivoUsb(UsbDevice usbDevice) {\n        this.usbDevice = usbDevice;\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"\\nNome: %s\\nId produto: %s\\nNúmero de série: %s\\nId de dispositivo exclusivo: %s\\nFornecedor: %s\\nId fornecedor: %s\\n\",\n        getNome(), getIdProduto(), getNumeroDeSerie(), getIdDispositivoUsbExclusivo(), getForncecedor(), getIdFornecedor());\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/dispositivos/DispositivosUsbGrupo.java",
    "content": "package com.github.britooo.looca.api.group.dispositivos;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.HardwareAbstractionLayer;\nimport oshi.hardware.UsbDevice;\n\npublic class DispositivosUsbGrupo {\n\n    private final HardwareAbstractionLayer hardwareAbstractionLayer = new SystemInfo().getHardware();\n\n    /**\n     * Retorna o número de <b>dispositivos USB</b>.\n     *\n     * @return Número de dispositivos identificados como USB.\n     */\n    public Integer getTotalDispositvosUsb() {\n        int totalDispositivosConectados = 0;\n\n        for(UsbDevice item : this.hardwareAbstractionLayer.getUsbDevices(false)) {\n            totalDispositivosConectados += item.getConnectedDevices().size();\n        }\n\n        return totalDispositivosConectados;\n    }\n\n    /**\n     * Retorna o número de <b>dispositivos USB conectados</b>.\n     *\n     * @return Número de dispositivos conectados identificados como USB.\n     */\n    public Integer getTotalDispositvosUsbConectados() {\n        int totalDispositivosConectados = 0;\n\n        for(UsbDevice item : this.hardwareAbstractionLayer.getUsbDevices(true)) {\n            totalDispositivosConectados += item.getConnectedDevices().size();\n        }\n\n        return totalDispositivosConectados;\n    }\n\n    /**\n     * Retorna os <b>dispositivos USB</b>.\n     *\n     * @return Dispositivos identificados como USB.\n     */\n\n    public List<DispositivoUsb> getDispositivosUsb() {\n        List<DispositivoUsb> dispositivoUsbList = new ArrayList<>();\n\n        for(UsbDevice item : this.hardwareAbstractionLayer.getUsbDevices(false)) {\n                dispositivoUsbList.add(DispositivosUsbGrupo.of(item));\n        }\n\n        return dispositivoUsbList;\n    }\n\n    /**\n     * Retorna os <b>dispositivos USB conectados</b>.\n     *\n     * @return Dispositivos conectados identificados como USB.\n     */\n    public List<DispositivoUsb> getDispositivosUsbConectados() {\n        List<DispositivoUsb> dispositivoUsbList = new ArrayList<>();\n\n        for(UsbDevice item : this.hardwareAbstractionLayer.getUsbDevices(true)) {\n            for (UsbDevice usbDevice : item.getConnectedDevices()) {\n                dispositivoUsbList.add(DispositivosUsbGrupo.of(usbDevice));\n            }\n        }\n\n        return dispositivoUsbList;\n    }\n    \n    private static DispositivoUsb of(UsbDevice usbDevice) {\n        if (usbDevice == null) {\n            return null;\n        }\n        \n        return new DispositivoUsb(usbDevice);\n    }\n}\n\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/janelas/Janela.java",
    "content": "package com.github.britooo.looca.api.group.janelas;\n\nimport oshi.software.os.OSDesktopWindow;\n\nimport java.awt.*;\n\npublic class Janela {\n\n  private final OSDesktopWindow janela;\n\n  public Janela(OSDesktopWindow janela) {\n    this.janela = janela;\n  }\n\n  public static Janela of(OSDesktopWindow janela) {\n    if (janela == null) {\n      return null;\n    }\n\n    return new Janela(janela);\n  }\n\n  /**\n   * Retorna o <b>ID do processo</b> do qual essa janela pertence.\n   *\n   * @return ID do processo.\n   */\n  public Long getPid() {\n    return this.janela.getOwningProcessId();\n  }\n\n  /**\n   * Retorna o identificador do sistema operacional, ID da janela ou outro identificador exclusivo para esta janela.\n   *\n   * @return Identificador da janela.\n   */\n  public Long getJanelaId() {\n    return this.janela.getWindowId();\n  }\n\n  /**\n   * Retorna o <b>título da janela</b> se existir.\n   *\n   * @return Título da janela.\n   */\n  public String getTitulo() {\n    return this.janela.getTitle();\n  }\n\n  /**\n   * Retorna o <b>nome do comando</b> (possivelmente o caminho completo do arquivo) do programa executável da janela,\n   * se conhecido.\n   *\n   * @return Comando do programa executável ou caminho do arquivo executável.\n   */\n  public String getComando() {\n    return this.janela.getCommand();\n  }\n\n  /**\n   * Retorna um <b>Objeto {@link Rectangle}</b> que representa a localização e o tamanho da janela.\n   *\n   * @return Localização e tamanho da janela.\n   * @see Rectangle\n   */\n  public Rectangle getLocalizacaoETamanho() {\n    return this.janela.getLocAndSize();\n  }\n\n  /**\n   * Retorna se a janela está visível para o usuário.\n   *\n   * @return <code>true</code> se a janela está visível para o usuário, caso contrário <code>false</code>.\n   */\n  public Boolean isVisivel() {\n    return this.janela.isVisible();\n  }\n\n  @Override\n  public String toString() {\n    final StringBuilder sb = new StringBuilder(\"\\n\");\n    sb.append(\"PID: \").append(getPid()).append(\"\\n\");\n    sb.append(\"Id da janela: \").append(getJanelaId()).append(\"\\n\");\n    sb.append(\"Título: \").append(getTitulo()).append(\"\\n\");\n    sb.append(\"Comando: \").append(getComando()).append(\"\\n\");\n    sb.append(\"Localização: \").append(getLocalizacaoETamanho()).append(\"\\n\");\n    sb.append(\"Visível: \").append(isVisivel()).append(\"\\n\");\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/janelas/JanelaGrupo.java",
    "content": "package com.github.britooo.looca.api.group.janelas;\n\nimport oshi.SystemInfo;\nimport oshi.software.os.OperatingSystem;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class JanelaGrupo {\n\n  private final OperatingSystem so;\n\n  public JanelaGrupo(SystemInfo si) {\n    this.so = si.getOperatingSystem();\n  }\n\n  /**\n   * Retorna uma lista de <b>Janelas</b> visíveis e invisíveis abertas no sistema operacional.\n   *\n   * @return Lista de janelas.\n   */\n  public List<Janela> getJanelas() {\n    return so.getDesktopWindows(false).stream()\n        .map(Janela::of)\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna uma lista de <b>Janelas</b>, apenas com as janelas visíveis no sistema operacional.\n   *\n   * @return Lista de janelas.\n   */\n  public List<Janela> getJanelasVisiveis() {\n    return so.getDesktopWindows(true).stream()\n        .map(Janela::of)\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna a quantidade total de <b>Janelas</b> visíveis e invisíveis no sistema operacional.\n   *\n   * @return Total de janelas.\n   */\n  public Integer getTotalJanelas() {\n    return so.getDesktopWindows(false).size();\n  }\n\n  /**\n   * Retorna a quantidade total de <b>Janelas</b> visíveis no sistema operacional.\n   *\n   * @return Total de janelas.\n   */\n  public Integer getTotalJanelasVisiveis() {\n    return so.getDesktopWindows(true).size();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/memoria/Memoria.java",
    "content": "package com.github.britooo.looca.api.group.memoria;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.HardwareAbstractionLayer;\nimport com.github.britooo.looca.api.util.Conversor;\n\npublic class Memoria {\n\n\n  private final HardwareAbstractionLayer hardware = new SystemInfo().getHardware();\n\n  /**\n   * Retorna a quantidade de <b>memória física</b> atualmente <b>disponível</b>, <b>em bytes</b>.\n   *\n   * @return Quantidade de memória física atualmente disponível, <b>em bytes</b>.\n   */\n  public Long getDisponivel() {\n    return this.hardware.getMemory().getAvailable();\n  }\n\n  /**\n   * Retorna a quantidade de <b>memória física real</b>, <b>em bytes</b>.\n   *\n   * @return Quantidade de memória física real, <b>em bytes</b>.\n   */\n  public Long getTotal() {\n    return this.hardware.getMemory().getTotal();\n  }\n\n  /**\n   * Retorna a quantidade de <b>memória em uso</b>, <b>em bytes</b>.\n   *\n   * @return Quantidade de memória em uso, <b>em bytes</b>.\n   */\n  public Long getEmUso() {\n    return this.getTotal() - this.getDisponivel();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas a <b>Memória</b>.\n   * @return <code>String</code> com todas as informações relacionadas a <b>Memória</b>.\n   */\n  @Override\n  public String toString() {\n\n    final StringBuilder sb = new StringBuilder(\"Memoria\").append(\"\\n\");\n\n    sb.append(\"Em uso: \")\n        .append(Conversor.formatarBytes(getEmUso()))\n        .append(\"\\n\");\n\n    sb.append(\"Disponível: \")\n        .append(Conversor.formatarBytes(getDisponivel()))\n        .append(\"\\n\");\n\n    sb.append(\"Total: \")\n        .append(Conversor.formatarBytes(getTotal()))\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/processador/Processador.java",
    "content": "package com.github.britooo.looca.api.group.processador;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.CentralProcessor;\n\npublic class Processador {\n\n\n  private final CentralProcessor processador = new SystemInfo().getHardware().getProcessor();\n  private final ProcessadorCacheLoader processadorCacheLoader = new ProcessadorCacheLoader();\n\n  /**\n   * Retorna o nome do Fornecedor do processador.\n   *\n   * @return Nome do Fornecedor do processador.\n   */\n  public String getFabricante() {\n    return this.processador.getProcessorIdentifier().getVendor();\n  }\n\n  /**\n   * Retorna o <b>nome do Processador</b> <i>(Exemplo: Name, eg. Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz)</i>.\n   *\n   * @return Nome do Processador.\n   */\n  public String getNome() {\n    return this.processador.getProcessorIdentifier().getName();\n  }\n\n  /**\n   * <p>Retorna o <b>ID do processador</b>.</p>\n   * <br>\n   * <p>Esta é uma <code>String</code> hexadecimal representando um valor de 8 bytes,\n   * normalmente obtido usando o opcode CPUID com o registrador EAX definido como 1.\n   * Os primeiros quatro bytes são o conteúdo resultante do registrador EAX,\n   * que é a assinatura do processador, representada em legível por humanos.\n   * Os quatro bytes restantes são o conteúdo do registrador EDX, contendo sinalizadores de recursos.\n   * Para processadores que não suportam o opcode CPUID,\n   * este campo é preenchido com uma <code>String</code> hexadecimal comparável.\n   * <p>Por exemplo, os processadores ARM preencherão os primeiros 32 bytes com o MIDR.\n   * Os processadores AIX PowerPC retornarão o ID da máquina.</p>\n   * <br>\n   * <p><b>NOTA: A ordem dos bytes retornados depende da plataforma e do software.\n   * Os valores podem estar na ordem Big Endian ou Little Endian.</b></p>\n   * <br>\n   * <p><b>NOTA: Se o Looca não conseguir determinar o ProcessorID a partir de fontes nativas,\n   * ele tentará reconstruir um a partir das informações disponíveis no identificador do processador.</b></p>\n   *\n   * @return ID do processador.\n   */\n  public String getId() {\n    return this.processador.getProcessorIdentifier().getProcessorID();\n  }\n\n  /**\n   * Retorna o <b>identificador</b>, <i>por exemplo: Família x86 6 Modelo 15 Etapa 10.</i>\n   * Para processadores diferentes de <b>Intel</b> ou <b>AMD</b>, essa <code>String</code> é preenchida com valores comparáveis.\n   *\n   * @return Identificador.\n   */\n  public String getIdentificador() {\n    return this.processador.getProcessorIdentifier().getIdentifier();\n  }\n\n  /**\n   * Retorna a <b>microarquitetura</b> do processador, <b>se conhecida</b>.\n   * Caso contrário retorna a constante: <code>Constant.UNKNOWN</code>\n   *\n   * @return Microarquitetura do processador.\n   */\n  public String getMicroarquitetura() {\n    return this.processador.getProcessorIdentifier().getMicroarchitecture();\n  }\n\n  /**\n   * Retorna a <b>frequência</b> do processador <b>(em Hz)</b>, por exemplo.\n   * Para o processador denominado <i>Intel(R) Core(TM)2 Duo CPU T7300 @ 2,00 GHz</i>,\n   * a frequência do processador é 2000000000hz.\n   * Caso a frequência do processador seja <b>desconhecido retorna -1</b>;\n   *\n   * @return Frequência do processador.\n   */\n  public Long getFrequencia() {\n    return this.processador.getProcessorIdentifier().getVendorFreq();\n  }\n\n  /**\n   * Retorna o número de <b>pacotes/soquetes</b> no sistema.\n   * Um único pacote pode conter vários núcleos.\n   *\n   * @return Número de pacotes físicos disponíveis.\n   */\n  public Integer getNumeroPacotesFisicos() {\n    return this.processador.getPhysicalPackageCount();\n  }\n\n  /**\n   * Retorna o número de <b>CPUs/núcleos físicos disponíveis</b> para processamento.\n   *\n   * @return Número de CPUs físicas disponíveis.\n   */\n  public Integer getNumeroCpusFisicas() {\n    return this.processador.getPhysicalProcessorCount();\n  }\n\n  /**\n   * Retorna o número de <b>CPUs lógicas disponíveis</b> para processamento.\n   * Este valor pode ser <b>maior do que CPUs físicas</b> se o hyperthreading estiver habilitado.\n   *\n   * @return Número de CPUs lógicas disponíveis.\n   */\n  public Integer getNumeroCpusLogicas() {\n    return this.processador.getLogicalProcessorCount();\n  }\n\n  /**\n   * <p>Retorna a porcentagem de <b>uso do processador</b>, por meio dos contadores de ticks de carga de CPU em todo o sistema.</p>\n   * <br>\n   * <p>\n   * Por meio de  um array com oito elementos representando milissegundos gastos nos estados:\n   * User (0), Nice (1), System (2), Idle (3), IOwait (4), Hardware interrupts (IRQ) (5),\n   * Software interrupts/DPC (SoftIRQ) ) (6) ou Steal (7).</p>\n   * <br>\n   * <p>Ao medir a diferença entre os ticks em um intervalo de tempo,\n   * a carga da CPU nesse intervalo pode ser calculada.\n   * Observe que, embora os contadores de tiques estejam em unidades de milissegundos,\n   * eles podem avançar em incrementos maiores junto com tiques de clock (dependentes da plataforma).\n   * Por exemplo, por padrão, os tiques do clock do Windows são 1/64 de segundo (cerca de 15 ou 16 milissegundos) e os tiques do Linux dependem da distribuição e da configuração,\n   * mas geralmente 1/100 de segundo (10 milissegundos).</p>\n   * <br>\n   * <p>As informações de Nice e IOWait não estão disponíveis no Windows,\n   * e as informações de IOwait e IRQ não estão disponíveis no macOS, portanto,\n   * esses ticks sempre serão zero.</p>\n   * <br>\n   * <p>Para calcular o tempo de inatividade geral usando esse método,\n   * inclua os tiques de inatividade e IOWait. Da mesma forma, os ticks de IRQ,\n   * SoftIRQ e Steal devem ser adicionados ao valor do sistema para obter o total.\n   * Os tiques do sistema também incluem o tempo de execução de outros hosts virtuais (steal).</p>\n   * <br>\n   * <p>Com isso fazemos o cálculo necessário para a medição em porcentagem do uso do processador.</p>\n   *\n   * @return Valor em porcentagem de uso do processador.\n   */\n  public Double getUso() {\n    return this.processadorCacheLoader.getUso();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Processador</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Processador</b>.\n   */\n  @Override\n  public String toString() {\n    final StringBuilder sb = new StringBuilder();\n\n    sb.append(\"Fabricante: \")\n        .append(getFabricante())\n        .append(\"\\n\");\n\n    sb.append(\"Nome: \")\n        .append(getNome())\n        .append(\"\\n\");\n\n    sb.append(\"ID: \")\n        .append(getId())\n        .append(\"\\n\");\n\n    sb.append(\"Identificador: \")\n        .append(getIdentificador())\n        .append(\"\\n\");\n\n    sb.append(\"Microarquitetura: \")\n        .append(getMicroarquitetura())\n        .append(\"\\n\");\n\n    sb.append(\"Frequência: \")\n        .append(getFrequencia())\n        .append(\"\\n\");\n\n    sb.append(\"Número de Pacotes Físicos: \")\n        .append(getNumeroPacotesFisicos())\n        .append(\"\\n\");\n\n    sb.append(\"Número de CPUs Fisícas: \")\n        .append(getNumeroCpusFisicas())\n        .append(\"\\n\");\n\n    sb.append(\"Número de CPUs Lógicas: \")\n        .append(getNumeroCpusLogicas())\n        .append(\"\\n\");\n\n    sb.append(\"Em Uso: \")\n        .append(String.format(\"%.1f\", getUso()))\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/processador/ProcessadorCacheLoader.java",
    "content": "package com.github.britooo.looca.api.group.processador;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.TimeUnit;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport com.google.common.util.concurrent.ListenableFuture;\nimport com.google.common.util.concurrent.ListenableFutureTask;\nimport com.google.common.util.concurrent.ListeningExecutorService;\nimport com.google.common.util.concurrent.MoreExecutors;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.CentralProcessor;\n\npublic class ProcessadorCacheLoader {\n\n  private final ExecutorService executor = Executors.newSingleThreadExecutor();\n  private final ListeningExecutorService lExecutor = MoreExecutors.listeningDecorator(executor);\n  private final CentralProcessor processador = new SystemInfo().getHardware().getProcessor();\n\n  private final LoadingCache<String, Double> loader;\n\n  public ProcessadorCacheLoader() {\n    loader = CacheBuilder.newBuilder()\n        .maximumSize(1000)\n        .refreshAfterWrite(1000, TimeUnit.MILLISECONDS)\n        .build(new CacheLoader<String, Double>() {\n          @Override\n          public Double load(String key) throws Exception {\n            return loadUso();\n          }\n\n          @Override\n          public ListenableFuture<Double> reload(String key, Double oldValue) throws Exception {\n            return getUsoOshi();\n          }\n        });\n  }\n\n  /**\n   * Retorna <b>uso</b> do processador em <b>procentagem</b>.\n   * @return Uso do processador em <b>procentagem</b>.\n   */\n  public Double getUso() {\n    try {\n      return loader.get(\"uso\");\n    } catch (ExecutionException e) {\n      e.printStackTrace();\n      return 0.0;\n    }\n  }\n\n  private Double loadUso() {\n    Double resultado = 0.0;\n    Future<Double> uso = getUsoOshi();\n\n    try {\n      while (!uso.isDone()) {\n        TimeUnit.SECONDS.sleep(2);\n      }\n      resultado = uso.get();\n    } catch (InterruptedException e) {\n      e.printStackTrace();\n    } catch (ExecutionException e) {\n      e.printStackTrace();\n    }\n    return resultado;\n  }\n\n  private ListenableFuture<Double> getUsoOshi() {\n    long[] prevTicks = this.processador.getSystemCpuLoadTicks();\n\n    ListenableFutureTask<Double> task = ListenableFutureTask.create(new Callable<Double>() {\n      public Double call() throws InterruptedException {\n        TimeUnit.SECONDS.sleep(1);\n        return processador.getSystemCpuLoadBetweenTicks(prevTicks) * 100;\n      }\n    });\n\n    lExecutor.execute(task);\n    return task;\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/processos/Processo.java",
    "content": "package com.github.britooo.looca.api.group.processos;\n\nimport oshi.software.os.OSProcess;\nimport com.github.britooo.looca.api.group.memoria.Memoria;\n\npublic class Processo {\n\n\n  private final OSProcess processo;\n  private final Memoria memoria;\n\n  public Processo(OSProcess processo, Memoria memoria) {\n    this.processo = processo;\n    this.memoria = memoria;\n  }\n\n  /**\n   * <p>Retorna o <b>ID do processo</b>.</p>\n   * <br>\n   * <p>Embora seja um valor de 32 bits, ele não é assinado no Windows e,\n   * em circunstâncias extremamente raras, pode retornar um valor negativo.</p>\n   *\n   * @return ID do processo.\n   */\n  public Integer getPid() {\n    return this.processo.getProcessID();\n  }\n\n  /**\n   * Retorna o <b>nome do processo</b>, geralmente o programa executável.\n   *\n   * @return Nome do processo, geralmente o programa executável.\n   */\n  public String getNome() {\n    return this.processo.getName();\n  }\n\n  /**\n   * <p>Retorna o valor percentual de <b>uso da CPU pelo processo</b>.</p>\n   * <br>\n   * <p>\n   * Por meio do cálculo: (100d * (o número de milissegundos que o processo executou no modo kernel/sistema.\n   * +\n   * Obtém o tempo do usuário usado pelo processo.)\n   * /\n   * o número de milissegundos desde o início do processo).\n   * Assim conseguimos a porcentagem do uso de CPU pelo processo.\n   * </p>\n   *\n   * @return Valor percentual de uso da CPU pelo processo.\n   */\n  public Double getUsoCpu() {\n    return (100d * (processo.getKernelTime() + processo.getUserTime()) / processo.getUpTime());\n  }\n\n  /**\n   * <p>Retorna no <b>Windows</b> o tamanho do Conjunto de Trabalho Privado, que deve corresponder à coluna \"Memória\" no Gerenciador de Tarefas do Windows.</p>\n   * <p>Retorna no <b>Linux</b> o valor RSS de /proc/[pid]/stat, que pode ser impreciso devido a uma otimização de escalabilidade interna do kernel. Se forem necessários valores precisos, leia /proc/[pid]/smaps usando <code>FileUtil.getKeyValueMapFromFile(String, String)</code>.</p>\n   * <br>\n   * <p>E por meio do cálculo: (100d * Obtém o tamanho do conjunto residente (RSS). Usado para mostrar quanta memória está alocada para esse processo e está na RAM. Não inclui memória que é trocada. Inclui memória de bibliotecas compartilhadas, desde que as páginas dessas bibliotecas estejam realmente na memória. Inclui toda a memória de pilha e heap.\n   * Retorna (o tamanho do conjunto residente / A quantidade de memória física real, em bytes).</p>\n   *\n   * @return Valor percentual de uso da Memória RAM pelo processo.\n   */\n  public Double getUsoMemoria() {\n    return (100d * processo.getResidentSetSize() / memoria.getTotal());\n  }\n\n  /**\n   * <p>Retorna o tamanho do conjunto residente (RSS). Usado para mostrar quanta memória está alocada para esse processo e está na RAM.</p>\n   * <br>\n   * <p>Não inclui memória que é trocada. Inclui memória de bibliotecas compartilhadas,\n   * desde que as páginas dessas bibliotecas estejam realmente na memória.\n   * Inclui toda a memória de pilha e heap.\n   * No <b>Windows</b>, retorna o tamanho do Conjunto de Trabalho Privado,\n   * que deve corresponder à coluna \"Memória\" no Gerenciador de Tarefas do Windows.</p>\n   * <br>\n   * <p>\n   * No <b>Linux</b>, retorna o valor RSS de /proc/[pid]/stat,\n   * que pode ser impreciso devido a uma otimização de escalabilidade interna do kernel.\n   * Se forem necessários valores precisos, leia /proc/[pid]/smaps usando\n   * <code>FileUtil.getKeyValueMapFromFile(String, String)</code>.\n   * </p>\n   *\n   * @return Tamanho do conjunto residente (ou Quantidade de <b>bytes</b> utilizados).\n   */\n  public Long getBytesUtilizados() {\n    return processo.getResidentSetSize();\n  }\n\n  /**\n   * <p>Retorna o <b>tamanho da memória virtual (VSZ)</b>.</p>\n   * <br>\n   * <p>Inclui toda a memória que o processo pode acessar,\n   * incluindo memória que é trocada e memória que é de bibliotecas compartilhadas.</p>\n   *\n   * @return Tamanho da memória virtual.\n   */\n  public Long getMemoriaVirtualUtilizada() {\n    return processo.getVirtualSize();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Processo</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Grupo de Processos</b>.\n   */\n  @Override\n  public String toString() {\n\n    final StringBuilder sb = new StringBuilder();\n\n    sb.append(\"PID: \").append(getPid())\n        .append(\"\\n\");\n\n    sb.append(\"Uso CPU: \")\n        .append(String.format(\"%.1f\", getUsoCpu()))\n        .append(\"\\n\");\n\n    sb.append(\"Uso memória: \")\n        .append(String.format(\"%.1f\", getUsoMemoria()))\n        .append(\"\\n\");\n\n    sb.append(\"Bytes utilizados: \")\n        .append(getBytesUtilizados())\n        .append(\"\\n\");\n\n    sb.append(\"Memória virtual utilizada: \")\n        .append(getMemoriaVirtualUtilizada())\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/processos/ProcessoGrupo.java",
    "content": "package com.github.britooo.looca.api.group.processos;\n\nimport java.util.List;\n\nimport oshi.SystemInfo;\nimport oshi.software.os.OSProcess;\n\nimport java.util.stream.Collectors;\n\nimport oshi.software.os.OperatingSystem;\nimport com.github.britooo.looca.api.group.memoria.Memoria;\n\npublic class ProcessoGrupo {\n\n  private final OperatingSystem os = new SystemInfo().getOperatingSystem();\n\n  /**\n   * Retorna o número de <b>threads em execução</b>.\n   *\n   * @return Número de threads em execução.\n   */\n  public Integer getTotalThreads() {\n    return this.os.getThreadCount();\n  }\n\n  /**\n   * Retorna o número de <b>processos em execução</b>.\n   *\n   * @return Número de processos em execução.\n   */\n  public Integer getTotalProcessos() {\n    return this.os.getProcessCount();\n  }\n\n  /**\n   * <p>Retorna os <b>processos em execução no momento</b>. Nenhum pedido é garantido.</p>\n   * <br>\n   * <p>Sendo uma lista de objetos <code>OSProcess</code> para o número especificado (ou todos) de processos atualmente em execução,\n   * classificados conforme especificado.\n   * A lista pode conter elementos nulos ou processos com estado <code>OSProcess.State.INVALID</code> se um processo for encerrado durante a iteração.</p>\n   *\n   * @return Lista com os processos em execução no momento. Nenhum pedido é garantido.\n   */\n  public List<Processo> getProcessos() {\n    return this.os.getProcesses()\n        .stream()\n        .map(ProcessoGrupo::of)\n        .collect(Collectors.toList());\n  }\n\n  private static Processo of(OSProcess processo) {\n    if (processo == null) {\n      return null;\n    }\n    Memoria memoria = new Memoria();\n    return new Processo(processo, memoria);\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Grupo de Processos</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Grupo de Processos</b>.\n   */\n  @Override\n  public String toString() {\n    return String.format(\"\\nLista de processos\\nTotal de processos ativos: %d\\nTotal de threads: %d\\nProcessos: %s\",\n        this.getTotalProcessos(), this.getTotalThreads(), this.getProcessos());\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/rede/Rede.java",
    "content": "package com.github.britooo.looca.api.group.rede;\n\nimport oshi.SystemInfo;\n\npublic class Rede {\n\n  private final SystemInfo si;\n\n  public Rede(SystemInfo si) {\n    this.si = si;\n  }\n\n  /**\n   * Retorna um <b>Objeto de RedeInterfaceGroup</b> que contém métodos relacionados a coleta de informações de\n   * <b>Interfaces de Rede</b> físicas e virtuais disponíveis para uso no computador.\n   * @return Objeto RedeInterfaceGroup.\n   */\n  public RedeInterfaceGroup getGrupoDeInterfaces() {\n    return new RedeInterfaceGroup(si);\n  }\n\n  /**\n   * Retorna um <b>Objeto de RedeParametros</b> que contém métodos relacionados a coleta de informações\n   * de <b>Parâmetros de Rede</b> do sistema operacional como username e domínio.\n   * @return Objeto RedeParametros.\n   */\n  public RedeParametros getParametros() {\n    return new RedeParametros(si);\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/rede/RedeInterface.java",
    "content": "package com.github.britooo.looca.api.group.rede;\n\nimport oshi.hardware.NetworkIF;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class RedeInterface {\n\n  private final NetworkIF redeInterface;\n\n  public RedeInterface(NetworkIF redeInterface) {\n    this.redeInterface = redeInterface;\n  }\n\n  public static RedeInterface of(NetworkIF redeInterface) {\n    if (redeInterface == null) {\n      return null;\n    }\n\n    return new RedeInterface(redeInterface);\n  }\n\n  /**\n   * Retorna o <b>nome</b> da interface de rede.\n   *\n   * @return Nome da interface de rede.\n   */\n  public String getNome() {\n    return this.redeInterface.getName();\n  }\n\n  /**\n   * Retorna a <b>descrição</b> da interface de rede.\n   *\n   * @return Descrição da interface.\n   */\n  public String getNomeExibicao() {\n    return this.redeInterface.getDisplayName();\n  }\n\n  /**\n   * Retorna uma lista com os <b>endereços de IP (v4)</b> relacionados com essa interface de rede.\n   *\n   * @return Lista de endereços de IP\n   */\n  public List<String> getEnderecoIpv4() {\n    return Arrays.asList(this.redeInterface.getIPv4addr());\n  }\n\n  /**\n   * Retorna uma lista com os <b>endereços de IP (v6)</b> relacionados com essa interface de rede.\n   *\n   * @return Lista de endereços de IP\n   */\n  public List<String> getEnderecoIpv6() {\n    return Arrays.asList(this.redeInterface.getIPv6addr());\n  }\n\n  /**\n   * Retorna o <b>endereço MAC</b> da interface de rede.\n   *\n   * @return MAC address.\n   */\n  public String getEnderecoMac() {\n    return this.redeInterface.getMacaddr();\n  }\n\n  /**\n   * Retorna o total de <b>bytes recebidos</b> pela interface de rede.\n   *\n   * @return Total de bytes recebidos\n   */\n  public Long getBytesRecebidos() {\n    this.redeInterface.updateAttributes();\n    return this.redeInterface.getBytesRecv();\n  }\n\n  /**\n   * Retorna o total de <b>bytes enviados</b> pela interface de rede.\n   *\n   * @return Total de bytes enviados\n   */\n  public Long getBytesEnviados() {\n    this.redeInterface.updateAttributes();\n    return this.redeInterface.getBytesSent();\n  }\n\n  /**\n   * Retorna o total de <b>pacotes recebidos</b> pela interface de rede.\n   *\n   * @return Total de pacotes recebidos\n   */\n  public Long getPacotesRecebidos() {\n    return this.redeInterface.getPacketsRecv();\n  }\n\n  /**\n   * Retorna o total de <b>pacotes enviados</b> pela interface de rede.\n   *\n   * @return Total de pacotes enviados\n   */\n  public Long getPacotesEnviados() {\n    return this.redeInterface.getPacketsSent();\n  }\n\n  @Override\n  public String toString() {\n    final StringBuilder sb = new StringBuilder(\"\\n\");\n    sb.append(\"Nome: \").append(getNome()).append(\"\\n\");\n    sb.append(\"Nome de Exibição: \").append(getNomeExibicao()).append(\"\\n\");\n    sb.append(\"Endereço IPv4: \").append(getEnderecoIpv4()).append(\"\\n\");\n    sb.append(\"Endereço IPv6: \").append(getEnderecoIpv6()).append(\"\\n\");\n    sb.append(\"Endereço MAC: \").append(getEnderecoMac()).append(\"\\n\");\n    sb.append(\"Bytes recebidos: \").append(getBytesRecebidos()).append(\"\\n\");\n    sb.append(\"Bytes enviados: \").append(getBytesEnviados()).append(\"\\n\");\n    sb.append(\"Pacotes recebidos: \").append(getPacotesRecebidos()).append(\"\\n\");\n    sb.append(\"Pacotes enviados: \").append(getPacotesEnviados()).append(\"\\n\");\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/rede/RedeInterfaceGroup.java",
    "content": "package com.github.britooo.looca.api.group.rede;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.HardwareAbstractionLayer;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class RedeInterfaceGroup {\n\n  private final HardwareAbstractionLayer hal;\n\n  public RedeInterfaceGroup(SystemInfo si) {\n    this.hal = si.getHardware();\n  }\n\n  /**\n   * Retorna uma lista de <b>Interfaces de Rede</b> disponíveis.\n   *\n   * @return Lista de interfaces de rede.\n   */\n  public List<RedeInterface> getInterfaces() {\n    return this.hal.getNetworkIFs().stream()\n        .map(RedeInterface::of)\n        .collect(Collectors.toList());\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/rede/RedeParametros.java",
    "content": "package com.github.britooo.looca.api.group.rede;\n\nimport oshi.SystemInfo;\nimport oshi.software.os.NetworkParams;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class RedeParametros {\n\n  private final NetworkParams parametrosRede;\n\n  public RedeParametros(SystemInfo si) {\n    this.parametrosRede = si.getOperatingSystem().getNetworkParams();\n  }\n\n  /**\n   * Retorna o <b>hostname</b> do computador.\n   *\n   * @return Hostname.\n   */\n  public String getHostName() {\n    return this.parametrosRede.getHostName();\n  }\n\n  /**\n   * Retorna o <b>nome de domínio</b> do computador.\n   *\n   * @return Nome de domínio.\n   */\n  public String getNomeDeDominio() {\n    return this.parametrosRede.getDomainName();\n  }\n\n  /**\n   * Retorna uma lista de <b>IPs</b> dos <b>servidores DNS</b> disponíveis.\n   *\n   * @return IPs dos servidores DNS.\n   */\n  public List<String> getServidoresDns() {\n    return Arrays.asList(this.parametrosRede.getDnsServers());\n  }\n\n  @Override\n  public String toString() {\n    final StringBuilder sb = new StringBuilder(\"\\n\");\n    sb.append(\"Hostname: \").append(getHostName()).append(\"\\n\");\n    sb.append(\"Nome de domínio: \").append(getNomeDeDominio()).append(\"\\n\");\n    sb.append(\"Servidores DNS: \").append(getServidoresDns()).append(\"\\n\");\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/servicos/Servico.java",
    "content": "package com.github.britooo.looca.api.group.servicos;\n\nimport oshi.software.os.OSService;\n\npublic class Servico {\n\n  private final OSService servico;\n\n  public Servico(OSService servico) {\n    this.servico = servico;\n  }\n\n  /**\n   * Obtém o <b>ID do processo atual</b>.\n   * \n   * @return ID do processo.\n   */\n  public Integer getPid() {\n    return this.servico.getProcessID();\n  }\n\n  /**\n   * Retorna o <b>nome do serviço</b>.\n   * \n   * @return Nome do serviço.\n   */\n  public String getNome() {\n    return this.servico.getName();\n  }\n\n  /**\n   * <p>\n   *  Retorna o <b>estado do serviço</b>.\n   * </p>\n   * \n   * Ex: <code>STOPPED</code>, <code>RUNNING</code>.\n   * \n   * @return Estado do serviço.\n   */\n  public String getEstado() {\n    return this.servico.getState().toString();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Serviço</b>.\n   * @return <code>String</code> com todas as informações relacionadas ao <b>Serviço</b>.\n   */\n  @Override\n  public String toString() {\n\n    final StringBuilder sb = new StringBuilder();\n\n    sb.append(\"PID: \")\n        .append(getPid())\n        .append(\"\\n\");\n\n    sb.append(\"Nome: \")\n        .append(getNome())\n        .append(\"\\n\");\n\n    sb.append(\"Estado: \")\n        .append(getEstado())\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/servicos/ServicoGrupo.java",
    "content": "package com.github.britooo.looca.api.group.servicos;\n\nimport java.util.List;\n\nimport oshi.SystemInfo;\n\nimport java.util.stream.Collectors;\n\nimport oshi.software.os.OSService;\n\npublic class ServicoGrupo {\n\n  enum STATUS {\n    RUNNING,\n    STOPPED\n  }\n\n  private final SystemInfo sistema = new SystemInfo();\n\n  /**\n   * Devolve uma lista com todos os serviços\n   *\n   * @return Lista com todos os serviços\n   */\n  public List<Servico> getServicos() {\n    return recuperarServicosOshi().stream().map(ServicoGrupo::of).collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna a quantidade de serviços\n   *\n   * @return Quantidade de serviços\n   */\n  public Integer getTotalDeServicos() {\n    return this.getServicos().size();\n  }\n\n  /**\n   * Lista todos os serviços cujo o status é <code>RUNNING</code> (ou em execução)\n   *\n   * @return Lista de serviços ativos\n   */\n  public List<Servico> getServicosAtivos() {\n    return this.getServicos().stream()\n        .filter(servico -> servico.getEstado()\n            .equals(STATUS.RUNNING.toString()))\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna a quantidade de serviços em execução\n   *\n   * @return Quantidade de serviços em execução\n   */\n  public Integer getTotalServicosAtivos() {\n    return this.getServicosAtivos().size();\n  }\n\n  /**\n   * Lista todos os serviços cujo o status é <code>STOPPED</code> (ou inativo)\n   *\n   * @return Lista de serviços inativos\n   */\n  public List<Servico> getServicosInativos() {\n    return this.getServicos().stream()\n        .filter(servico -> servico.getEstado()\n            .equals(STATUS.STOPPED.toString()))\n        .collect(Collectors.toList());\n  }\n\n  /**\n   * Retorna a quantidade de <b>serviços inativos</b>.\n   *\n   * @return Quantidade de serviços inativos.\n   */\n  public Integer getTotalServicosInativos() {\n    return this.getServicosInativos().size();\n  }\n\n  private List<OSService> recuperarServicosOshi() {\n    return this.sistema.getOperatingSystem().getServices();\n  }\n\n  private static Servico of(OSService servico) {\n    if (servico == null) {\n      return null;\n    }\n\n    return new Servico(servico);\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/sistema/Sistema.java",
    "content": "package com.github.britooo.looca.api.group.sistema;\n\nimport oshi.SystemInfo;\n\nimport java.time.Instant;\n\nimport oshi.software.os.OperatingSystem;\nimport com.github.britooo.looca.api.util.Conversor;\n\npublic class Sistema {\n\n  private final OperatingSystem os;\n  private final String fabricante;\n  private final Integer arquitetura;\n  private final String sistemaOperacional;\n\n  public Sistema() {\n    os = new SystemInfo().getOperatingSystem();\n    this.arquitetura = this.os.getBitness();\n    this.fabricante = this.os.getManufacturer();\n    this.sistemaOperacional = this.os.getFamily();\n  }\n\n  /**\n   * Retorna o <b>Sistema Operacional</b>.\n   *\n   * @return Sistema Operacional.\n   */\n  public String getSistemaOperacional() {\n    return sistemaOperacional;\n  }\n\n  /**\n   * Retorna a <b>empresa fabricante</b> do sistema operacional.\n   *\n   * @return Fabricante do sitema operacional.\n   */\n  public String getFabricante() {\n    return fabricante;\n  }\n\n  /**\n   * Retorna o número de <b>bits</b> <i>(32 ou 64)</i> do sistema operacional.\n   *\n   * @return Número de <b>bits</b> do sistema operacional.\n   */\n  public Integer getArquitetura() {\n    return arquitetura;\n  }\n\n  /**\n   * Retorna o <b>momento</b> em que o sistema operacional foi <b>inicializado</b>.\n   *\n   * @return Data aproximada da inicialização do sistema operacional.\n   */\n  public Instant getInicializado() {\n    return Instant.ofEpochSecond(this.os.getSystemBootTime());\n  }\n\n  /**\n   * Retorna o <b>tempo de funcionamento</b> do sistema <b>(tempo desde a inicialização)</b>.\n   *\n   * @return Quantidade de <b>segundos</b> desde a inicialização.\n   */\n  public Long getTempoDeAtividade() {\n    return this.os.getSystemUptime();\n  }\n\n  /**\n   * Retorna <b><code>True</code></b> caso o processo atual tem <b>permissões elevadas</b>, como <i>sudo/Administrador</i>.\n   *\n   * @return <code>True</code> se este processo tiver permissões elevadas.\n   */\n  public Boolean getPermissao() {\n    return this.os.isElevated();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas ao <b>Sistema Operacional</b>.\n   * @return <code>String</code> que contém todas as informações relacionadas ao <b>Sistema Operacional</b>.\n   */\n  @Override\n  public String toString() {\n\n    final StringBuilder sb = new StringBuilder();\n\n    sb.append(\"Sistema operacional: \")\n        .append(sistemaOperacional)\n        .append(\"\\n\");\n\n    sb.append(\"Fabricante: \")\n        .append(fabricante)\n        .append(\"\\n\");\n\n    sb.append(\"Arquitetura: \")\n        .append(arquitetura)\n        .append(\"bits\\n\");\n\n    sb.append(\"Inicializado: \")\n        .append(getInicializado())\n        .append(\"\\n\");\n\n    sb.append(\"Tempo de atividade: \")\n        .append(Conversor.formatarSegundosDecorridos(this.getTempoDeAtividade()))\n        .append(\"\\n\");\n\n    sb.append(\"Permissões: \")\n        .append((\"Executando como \"))\n        .append((this.getPermissao() ? \"root\" : \"usuário padrão\"))\n        .append(\"\\n\");\n\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/group/temperatura/Temperatura.java",
    "content": "package com.github.britooo.looca.api.group.temperatura;\n\nimport oshi.SystemInfo;\nimport oshi.hardware.HardwareAbstractionLayer;\n\npublic class Temperatura {\n\n  private final HardwareAbstractionLayer hardware;\n\n  public Temperatura() {\n    hardware = new SystemInfo().getHardware();\n  }\n\n  /**\n   * <p>\n   * Retorna a <b>temperatura</b> da CPU em <b>graus Celsius</b> se disponível, caso contrário <b>retorna 0 ou Double.NaN</b>.\n   * </p>\n   *\n   * <p>\n   * No <b>Windows</b>, se não estiver executando o Open Hardware Monitor,\n   * requer permissões elevadas e BIOS de hardware que ofereça suporte à publicação no WMI.\n   * Neste caso, retorna a temperatura da \"Zona Térmica\" que pode ser diferente da temperatura da CPU\n   * obtida de outras fontes.\n   * </p>\n   *\n   * <p>\n   * Além disso, <b>algumas placas-mãe só podem atualizar esse valor em determinados eventos</b>.\n   * <p>\n   *\n   * @return Temperatura em graus Celsius caso disponível\n   */\n  public Double getTemperatura() {\n    return this.hardware.getSensors().getCpuTemperature();\n  }\n\n  /**\n   * Retorna uma <code>String</code> com todas as informações relacionadas a <b>Temperatura</b>.\n   * @return <code>String</code> com todas as informações relacionadas a <b>Temperatura</b>.\n   */\n  @Override\n  public String toString() {\n    return String.format(\"Temperatura: %.1f\", getTemperatura());\n  }\n}\n"
  },
  {
    "path": "src/main/java/com/github/britooo/looca/api/util/Conversor.java",
    "content": "package com.github.britooo.looca.api.util;\n\nimport java.util.concurrent.TimeUnit;\n\n\npublic class Conversor {\n\n    private static final long KIBI = 1L << 10;\n    private static final long MEBI = 1L << 20;\n    private static final long GIBI = 1L << 30;\n    private static final long TEBI = 1L << 40;\n    private static final long PEBI = 1L << 50;\n    private static final long EXBI = 1L << 60;\n\n    /**\n     * Retorna uma <code>String</code> com o valor em <b>bytes</b> convertidos em sua ordem de grandeza equivalente.\n     * @param bytes\n     * Corresponde a quantidade de <b>bytes</b> <i>(Ex: 1000000000 bytes = 1 Gigabyte)</i>.\n     * @return Retorna uma <code>String</code> que corresponde aos <b>bytes</b> convertidos em sua ordem de grandeza equivalente.\n     */\n    public static String formatarBytes(long bytes) {\n        if (bytes == 1L) { // bytes\n            return String.format(\"%d byte\", bytes);\n        } else if (bytes < KIBI) { // bytes\n            return String.format(\"%d bytes\", bytes);\n        } else if (bytes < MEBI) { // KiB\n            return formatarUnidades(bytes, KIBI, \"KiB\");\n        } else if (bytes < GIBI) { // MiB\n            return formatarUnidades(bytes, MEBI, \"MiB\");\n        } else if (bytes < TEBI) { // GiB\n            return formatarUnidades(bytes, GIBI, \"GiB\");\n        } else if (bytes < PEBI) { // TiB\n            return formatarUnidades(bytes, TEBI, \"TiB\");\n        } else if (bytes < EXBI) { // PiB\n            return formatarUnidades(bytes, PEBI, \"PiB\");\n        } else { // EiB\n            return formatarUnidades(bytes, EXBI, \"EiB\");\n        }\n    }\n\n    /**\n     * Retorna uma <code>String</code> com <b>segundos</b> convertidos em <b>data</b>;\n     * @param secs\n     * Corresponde aos segundos.\n     * @return Devolve uma <code>String</code> com os <b>segundos</b> convertidos em <b>data</b>.\n     */\n    public static String formatarSegundosDecorridos(long secs) {\n        \n        long eTime = secs;\n        \n        final long days = TimeUnit.SECONDS.toDays(eTime);\n        eTime -= TimeUnit.DAYS.toSeconds(days);\n        \n        final long hr = TimeUnit.SECONDS.toHours(eTime);\n        eTime -= TimeUnit.HOURS.toSeconds(hr);\n        \n        final long min = TimeUnit.SECONDS.toMinutes(eTime);\n        eTime -= TimeUnit.MINUTES.toSeconds(min);\n        \n        final long sec = eTime;\n        \n        return String.format(\"%d days, %02d:%02d:%02d\", days, hr, min, sec);\n    }\n\n    private static String formatarUnidades(long valor, long prefixo, String unidade) {\n        if (valor % prefixo == 0) {\n            return String.format(\"%d %s\", valor / prefixo, unidade);\n        }\n        return String.format(\"%.1f %s\", (double) valor / prefixo, unidade);\n    }\n\n    private static Double formatarUnidades(long valor, long prefixo) {\n        if (valor % prefixo == 0) {\n            return (double) valor / prefixo;\n        }\n        return (double) valor / prefixo;\n    }\n}\n"
  }
]