Full Code of open-obfuscator/dProtect for AI

main 25173cc11644 cached
690 files
4.5 MB
1.2M tokens
4392 symbols
1 requests
Download .txt
Showing preview only (4,890K chars total). Download the full file or copy to clipboard to get everything.
Repository: open-obfuscator/dProtect
Branch: main
Commit: 25173cc11644
Files: 690
Total size: 4.5 MB

Directory structure:
gitextract_i4svht9p/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── scripts/
│   │   └── s3-deploy.py
│   └── workflows/
│       ├── continuous_integration.yml
│       └── main.yml
├── .gitignore
├── .hgignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── annotations/
│   ├── annotations.pro
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── annotation/
│               ├── Keep.java
│               ├── KeepApplication.java
│               ├── KeepClassMemberNames.java
│               ├── KeepClassMembers.java
│               ├── KeepGettersSetters.java
│               ├── KeepImplementations.java
│               ├── KeepName.java
│               ├── KeepPublicClassMemberNames.java
│               ├── KeepPublicClassMembers.java
│               ├── KeepPublicGettersSetters.java
│               ├── KeepPublicImplementations.java
│               ├── KeepPublicProtectedClassMemberNames.java
│               └── KeepPublicProtectedClassMembers.java
├── ant/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── ant/
│               ├── ClassPathElement.java
│               ├── ClassSpecificationElement.java
│               ├── ConfigurationElement.java
│               ├── ConfigurationTask.java
│               ├── FilterElement.java
│               ├── KeepSpecificationElement.java
│               ├── MemberSpecificationElement.java
│               ├── ProGuardTask.java
│               ├── package.html
│               └── task.properties
├── base/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── dprotect/
│       │   │   │   ├── ArithmeticObfuscationClassSpecification.java
│       │   │   │   ├── CFObfuscationClassSpecification.java
│       │   │   │   ├── ClassObfuSpecVisitorFactory.java
│       │   │   │   ├── Configuration.java
│       │   │   │   ├── ConfigurationConstants.java
│       │   │   │   ├── ConfigurationParser.java
│       │   │   │   ├── ConstantObfuscationClassSpecification.java
│       │   │   │   ├── DProtect.java
│       │   │   │   ├── ObfuscationClassSpecification.java
│       │   │   │   ├── deobfuscation/
│       │   │   │   │   ├── Deobfuscator.java
│       │   │   │   │   └── strings/
│       │   │   │   │       └── XoredStrings.java
│       │   │   │   ├── obfuscation/
│       │   │   │   │   ├── CodeObfuscator.java
│       │   │   │   │   ├── Marker.java
│       │   │   │   │   ├── arithmetic/
│       │   │   │   │   │   ├── ArithmeticObfuscationFilter.java
│       │   │   │   │   │   ├── ArithmeticObfuscationInfo.java
│       │   │   │   │   │   ├── ArithmeticObfuscationMarker.java
│       │   │   │   │   │   ├── MBANormalizer.java
│       │   │   │   │   │   ├── MBAObfuscationAdd.java
│       │   │   │   │   │   ├── MBAObfuscationAnd.java
│       │   │   │   │   │   ├── MBAObfuscationOr.java
│       │   │   │   │   │   ├── MBAObfuscationSub.java
│       │   │   │   │   │   └── MBAObfuscationXor.java
│       │   │   │   │   ├── constants/
│       │   │   │   │   │   ├── ConstantFieldMarker.java
│       │   │   │   │   │   ├── ConstantObfuscationInfo.java
│       │   │   │   │   │   ├── ConstantObfuscationMarker.java
│       │   │   │   │   │   └── ConstantsObfuscator.java
│       │   │   │   │   ├── controlflow/
│       │   │   │   │   │   ├── ControlFlowObfuscation.java
│       │   │   │   │   │   ├── ControlFlowObfuscationInfo.java
│       │   │   │   │   │   └── ControlFlowObfuscationMarker.java
│       │   │   │   │   ├── info/
│       │   │   │   │   │   ├── ObfuscationInfo.java
│       │   │   │   │   │   └── ObfuscationInfoSetter.java
│       │   │   │   │   └── strings/
│       │   │   │   │       ├── StringFieldMarker.java
│       │   │   │   │       ├── StringObfuscationMarker.java
│       │   │   │   │       └── StringObfuscator.java
│       │   │   │   └── runtime/
│       │   │   │       ├── strings/
│       │   │   │       │   └── StringEncoding.java
│       │   │   │       └── util/
│       │   │   │           ├── Helpers.java
│       │   │   │           └── Loader.java
│       │   │   └── proguard/
│       │   │       ├── AfterInitConfigurationVerifier.java
│       │   │       ├── AppView.java
│       │   │       ├── ArgumentWordReader.java
│       │   │       ├── AssumeNoSideEffectsChecker.java
│       │   │       ├── ClassMemberChecker.java
│       │   │       ├── ClassPath.java
│       │   │       ├── ClassPathEntry.java
│       │   │       ├── ClassSpecification.java
│       │   │       ├── ClassSpecificationVisitorFactory.java
│       │   │       ├── Configuration.java
│       │   │       ├── ConfigurationConstants.java
│       │   │       ├── ConfigurationParser.java
│       │   │       ├── ConfigurationVerifier.java
│       │   │       ├── ConfigurationWriter.java
│       │   │       ├── DataEntryReaderFactory.java
│       │   │       ├── DataEntryWriterFactory.java
│       │   │       ├── DescriptorKeepChecker.java
│       │   │       ├── Dumper.java
│       │   │       ├── DuplicateClassPrinter.java
│       │   │       ├── DuplicateResourceFilePrinter.java
│       │   │       ├── FileWordReader.java
│       │   │       ├── FullyQualifiedClassNameChecker.java
│       │   │       ├── GPL.java
│       │   │       ├── GetAnnotationChecker.java
│       │   │       ├── GetEnclosingClassChecker.java
│       │   │       ├── GetEnclosingMethodChecker.java
│       │   │       ├── GetSignatureChecker.java
│       │   │       ├── Initializer.java
│       │   │       ├── InputReader.java
│       │   │       ├── KeepClassMemberChecker.java
│       │   │       ├── KeepClassSpecification.java
│       │   │       ├── KeepClassSpecificationVisitorFactory.java
│       │   │       ├── KotlinMetadataAdapter.java
│       │   │       ├── LibraryKeepChecker.java
│       │   │       ├── LineWordReader.java
│       │   │       ├── MemberSpecification.java
│       │   │       ├── MemberValueSpecification.java
│       │   │       ├── OutputWriter.java
│       │   │       ├── ParseException.java
│       │   │       ├── ProGuard.java
│       │   │       ├── SeedPrinter.java
│       │   │       ├── SubclassedClassFilter.java
│       │   │       ├── Targeter.java
│       │   │       ├── UpToDateChecker.java
│       │   │       ├── WordReader.java
│       │   │       ├── backport/
│       │   │       │   ├── AbstractAPIConverter.java
│       │   │       │   ├── Backporter.java
│       │   │       │   ├── DefaultInterfaceMethodConverter.java
│       │   │       │   ├── JSR310Converter.java
│       │   │       │   ├── LambdaExpression.java
│       │   │       │   ├── LambdaExpressionCollector.java
│       │   │       │   ├── LambdaExpressionConverter.java
│       │   │       │   ├── StaticInterfaceMethodConverter.java
│       │   │       │   ├── StreamSupportConverter.java
│       │   │       │   └── StringConcatenationConverter.java
│       │   │       ├── classfile/
│       │   │       │   ├── ClassMemberPair.java
│       │   │       │   ├── pass/
│       │   │       │   │   └── PrimitiveArrayConstantIntroducer.java
│       │   │       │   └── visitor/
│       │   │       │       └── InjectedClassFilter.java
│       │   │       ├── configuration/
│       │   │       │   ├── ConfigurationLogger.java
│       │   │       │   ├── ConfigurationLoggingAdder.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequenceConstants.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequenceReplacer.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequencesReplacer.java
│       │   │       │   └── InitialStateInfo.java
│       │   │       ├── evaluation/
│       │   │       │   └── AssumeClassSpecificationVisitorFactory.java
│       │   │       ├── fixer/
│       │   │       │   └── kotlin/
│       │   │       │       ├── KotlinAnnotationCounter.java
│       │   │       │       └── KotlinAnnotationFlagFixer.java
│       │   │       ├── io/
│       │   │       │   ├── ClassMapDataEntryReplacer.java
│       │   │       │   ├── ExtraDataEntryNameMap.java
│       │   │       │   ├── ExtraDataEntryReader.java
│       │   │       │   ├── KotlinModuleRewriter.java
│       │   │       │   └── UniqueDataEntryWriter.java
│       │   │       ├── logging/
│       │   │       │   └── Logging.java
│       │   │       ├── mark/
│       │   │       │   └── Marker.java
│       │   │       ├── obfuscate/
│       │   │       │   ├── AttributeShrinker.java
│       │   │       │   ├── AttributeUsageMarker.java
│       │   │       │   ├── ClassNameAdapterFunction.java
│       │   │       │   ├── ClassObfuscator.java
│       │   │       │   ├── ClassRenamer.java
│       │   │       │   ├── DictionaryNameFactory.java
│       │   │       │   ├── MapCleaner.java
│       │   │       │   ├── MappingKeeper.java
│       │   │       │   ├── MappingPrinter.java
│       │   │       │   ├── MappingProcessor.java
│       │   │       │   ├── MappingReader.java
│       │   │       │   ├── MemberNameCleaner.java
│       │   │       │   ├── MemberNameCollector.java
│       │   │       │   ├── MemberNameConflictFixer.java
│       │   │       │   ├── MemberObfuscator.java
│       │   │       │   ├── MemberSpecialNameFilter.java
│       │   │       │   ├── MultiMappingProcessor.java
│       │   │       │   ├── NameFactory.java
│       │   │       │   ├── NameFactoryResetter.java
│       │   │       │   ├── NameMarker.java
│       │   │       │   ├── NameObfuscationReferenceFixer.java
│       │   │       │   ├── NewMemberNameFilter.java
│       │   │       │   ├── NumericNameFactory.java
│       │   │       │   ├── ObfuscationPreparation.java
│       │   │       │   ├── Obfuscator.java
│       │   │       │   ├── OriginalClassNameFilter.java
│       │   │       │   ├── ParameterNameMarker.java
│       │   │       │   ├── PrefixingNameFactory.java
│       │   │       │   ├── RenamedFlagSetter.java
│       │   │       │   ├── ResourceFileNameAdapter.java
│       │   │       │   ├── ResourceFileNameObfuscator.java
│       │   │       │   ├── ResourceJavaReferenceFixer.java
│       │   │       │   ├── SimpleNameFactory.java
│       │   │       │   ├── SourceFileRenamer.java
│       │   │       │   ├── SpecialNameFactory.java
│       │   │       │   ├── UniqueMemberNameFactory.java
│       │   │       │   ├── kotlin/
│       │   │       │   │   ├── KotlinAliasNameObfuscator.java
│       │   │       │   │   ├── KotlinAliasReferenceFixer.java
│       │   │       │   │   ├── KotlinCallableReferenceFixer.java
│       │   │       │   │   ├── KotlinCompanionEqualizer.java
│       │   │       │   │   ├── KotlinDefaultImplsMethodNameEqualizer.java
│       │   │       │   │   ├── KotlinDefaultMethodNameEqualizer.java
│       │   │       │   │   ├── KotlinIntrinsicsReplacementSequences.java
│       │   │       │   │   ├── KotlinModuleFixer.java
│       │   │       │   │   ├── KotlinModuleNameObfuscator.java
│       │   │       │   │   ├── KotlinMultiFileFacadeFixer.java
│       │   │       │   │   ├── KotlinObjectFixer.java
│       │   │       │   │   ├── KotlinPropertyNameObfuscator.java
│       │   │       │   │   ├── KotlinPropertyRenamer.java
│       │   │       │   │   ├── KotlinSourceDebugExtensionAttributeObfuscator.java
│       │   │       │   │   ├── KotlinSyntheticClassFixer.java
│       │   │       │   │   ├── KotlinSyntheticToStringObfuscator.java
│       │   │       │   │   ├── KotlinUnsupportedExceptionReplacementSequences.java
│       │   │       │   │   ├── KotlinValueParameterNameShrinker.java
│       │   │       │   │   └── KotlinValueParameterUsageMarker.java
│       │   │       │   ├── obfuscate/
│       │   │       │   │   └── package.html
│       │   │       │   └── util/
│       │   │       │       ├── InstructionSequenceObfuscator.java
│       │   │       │       └── ReplacementSequences.java
│       │   │       ├── optimize/
│       │   │       │   ├── BootstrapMethodArgumentShrinker.java
│       │   │       │   ├── CalledMemberVisitor.java
│       │   │       │   ├── ChangedCodePrinter.java
│       │   │       │   ├── ConstantMemberFilter.java
│       │   │       │   ├── ConstantParameterFilter.java
│       │   │       │   ├── DuplicateInitializerFixer.java
│       │   │       │   ├── DuplicateInitializerInvocationFixer.java
│       │   │       │   ├── InfluenceFixpointVisitor.java
│       │   │       │   ├── KeepMarker.java
│       │   │       │   ├── KeptClassFilter.java
│       │   │       │   ├── KeptMemberFilter.java
│       │   │       │   ├── LineNumberTrimmer.java
│       │   │       │   ├── MemberDescriptorSpecializer.java
│       │   │       │   ├── MemberReferenceGeneralizer.java
│       │   │       │   ├── MethodDescriptorShrinker.java
│       │   │       │   ├── MethodStaticizer.java
│       │   │       │   ├── OptimizationInfoClassFilter.java
│       │   │       │   ├── OptimizationInfoMemberFilter.java
│       │   │       │   ├── Optimizer.java
│       │   │       │   ├── ParameterShrinker.java
│       │   │       │   ├── ReverseDependencyCalculator.java
│       │   │       │   ├── ReverseDependencyStore.java
│       │   │       │   ├── SideEffectVisitorMarkerFactory.java
│       │   │       │   ├── TailRecursionSimplifier.java
│       │   │       │   ├── TimedClassPoolVisitor.java
│       │   │       │   ├── WriteOnlyFieldFilter.java
│       │   │       │   ├── evaluation/
│       │   │       │   │   ├── EvaluationShrinker.java
│       │   │       │   │   ├── EvaluationSimplifier.java
│       │   │       │   │   ├── InstructionUsageMarker.java
│       │   │       │   │   ├── LoadingInvocationUnit.java
│       │   │       │   │   ├── ParameterTracingInvocationUnit.java
│       │   │       │   │   ├── SimpleEnumArrayPropagator.java
│       │   │       │   │   ├── SimpleEnumClassChecker.java
│       │   │       │   │   ├── SimpleEnumClassSimplifier.java
│       │   │       │   │   ├── SimpleEnumDescriptorSimplifier.java
│       │   │       │   │   ├── SimpleEnumUseChecker.java
│       │   │       │   │   ├── SimpleEnumUseSimplifier.java
│       │   │       │   │   ├── StoringInvocationUnit.java
│       │   │       │   │   └── VariableOptimizer.java
│       │   │       │   ├── gson/
│       │   │       │   │   ├── DuplicateJsonFieldNameChecker.java
│       │   │       │   │   ├── FieldSignatureCollector.java
│       │   │       │   │   ├── GsonAnnotationCleaner.java
│       │   │       │   │   ├── GsonBuilderInvocationFinder.java
│       │   │       │   │   ├── GsonClassConstants.java
│       │   │       │   │   ├── GsonConstructorPatcher.java
│       │   │       │   │   ├── GsonContext.java
│       │   │       │   │   ├── GsonDeserializationInvocationFinder.java
│       │   │       │   │   ├── GsonDeserializationOptimizer.java
│       │   │       │   │   ├── GsonDomainClassFinder.java
│       │   │       │   │   ├── GsonInstrumentationAdder.java
│       │   │       │   │   ├── GsonOptimizer.java
│       │   │       │   │   ├── GsonRuntimeSettings.java
│       │   │       │   │   ├── GsonSerializationInvocationFinder.java
│       │   │       │   │   ├── GsonSerializationOptimizer.java
│       │   │       │   │   ├── InlineDeserializer.java
│       │   │       │   │   ├── InlineDeserializers.java
│       │   │       │   │   ├── InlineSerializer.java
│       │   │       │   │   ├── InlineSerializers.java
│       │   │       │   │   ├── LocalOrAnonymousClassChecker.java
│       │   │       │   │   ├── MarkedAnnotationDeleter.java
│       │   │       │   │   ├── OptimizedClassConstants.java
│       │   │       │   │   ├── OptimizedJsonFieldCollector.java
│       │   │       │   │   ├── OptimizedJsonFieldVisitor.java
│       │   │       │   │   ├── OptimizedJsonInfo.java
│       │   │       │   │   ├── OptimizedJsonReaderImplInitializer.java
│       │   │       │   │   ├── OptimizedJsonWriterImplInitializer.java
│       │   │       │   │   ├── OptimizedTypeAdapterAdder.java
│       │   │       │   │   ├── OptimizedTypeAdapterFactoryInitializer.java
│       │   │       │   │   ├── OptimizedTypeAdapterInitializer.java
│       │   │       │   │   ├── TypeArgumentFinder.java
│       │   │       │   │   ├── TypeParameterClassChecker.java
│       │   │       │   │   ├── TypeTokenClassBuilder.java
│       │   │       │   │   ├── _GsonUtil.java
│       │   │       │   │   ├── _OptimizedJsonReader.java
│       │   │       │   │   ├── _OptimizedJsonReaderImpl.java
│       │   │       │   │   ├── _OptimizedJsonWriter.java
│       │   │       │   │   ├── _OptimizedJsonWriterImpl.java
│       │   │       │   │   ├── _OptimizedTypeAdapter.java
│       │   │       │   │   ├── _OptimizedTypeAdapterFactory.java
│       │   │       │   │   ├── _OptimizedTypeAdapterImpl.java
│       │   │       │   │   └── package.html
│       │   │       │   ├── info/
│       │   │       │   │   ├── AccessMethodMarker.java
│       │   │       │   │   ├── BackwardBranchMarker.java
│       │   │       │   │   ├── CatchExceptionMarker.java
│       │   │       │   │   ├── CaughtClassFilter.java
│       │   │       │   │   ├── CaughtClassMarker.java
│       │   │       │   │   ├── ClassOptimizationInfo.java
│       │   │       │   │   ├── CodeAttributeOptimizationInfo.java
│       │   │       │   │   ├── ContainsConstructorsMarker.java
│       │   │       │   │   ├── DotClassFilter.java
│       │   │       │   │   ├── DotClassMarker.java
│       │   │       │   │   ├── DynamicInvocationMarker.java
│       │   │       │   │   ├── EscapingClassFilter.java
│       │   │       │   │   ├── EscapingClassMarker.java
│       │   │       │   │   ├── ExceptionInstructionChecker.java
│       │   │       │   │   ├── FieldOptimizationInfo.java
│       │   │       │   │   ├── FinalFieldAssignmentMarker.java
│       │   │       │   │   ├── InstanceofClassFilter.java
│       │   │       │   │   ├── InstanceofClassMarker.java
│       │   │       │   │   ├── InstantiationClassFilter.java
│       │   │       │   │   ├── InstantiationClassMarker.java
│       │   │       │   │   ├── MethodInvocationMarker.java
│       │   │       │   │   ├── MethodOptimizationInfo.java
│       │   │       │   │   ├── MutableBoolean.java
│       │   │       │   │   ├── NoEscapingParametersMethodMarker.java
│       │   │       │   │   ├── NoExternalReturnValuesMethodMarker.java
│       │   │       │   │   ├── NoExternalSideEffectMethodMarker.java
│       │   │       │   │   ├── NoSideEffectClassMarker.java
│       │   │       │   │   ├── NoSideEffectMethodMarker.java
│       │   │       │   │   ├── NonEmptyStackReturnMarker.java
│       │   │       │   │   ├── NonPrivateMemberMarker.java
│       │   │       │   │   ├── OptimizationCodeAttributeFilter.java
│       │   │       │   │   ├── PackageVisibleMemberContainingClassMarker.java
│       │   │       │   │   ├── PackageVisibleMemberInvokingClassMarker.java
│       │   │       │   │   ├── ParameterEscapeMarker.java
│       │   │       │   │   ├── ParameterEscapedMarker.java
│       │   │       │   │   ├── ParameterUsageMarker.java
│       │   │       │   │   ├── ProgramClassOptimizationInfo.java
│       │   │       │   │   ├── ProgramClassOptimizationInfoSetter.java
│       │   │       │   │   ├── ProgramFieldOptimizationInfo.java
│       │   │       │   │   ├── ProgramMemberOptimizationInfoSetter.java
│       │   │       │   │   ├── ProgramMethodOptimizationInfo.java
│       │   │       │   │   ├── ReadWriteFieldMarker.java
│       │   │       │   │   ├── ReferenceEscapeChecker.java
│       │   │       │   │   ├── RepeatedClassPoolVisitor.java
│       │   │       │   │   ├── SideEffectClassChecker.java
│       │   │       │   │   ├── SideEffectClassFilter.java
│       │   │       │   │   ├── SideEffectClassMarker.java
│       │   │       │   │   ├── SideEffectInstructionChecker.java
│       │   │       │   │   ├── SideEffectMethodFilter.java
│       │   │       │   │   ├── SideEffectMethodMarker.java
│       │   │       │   │   ├── SimpleEnumFilter.java
│       │   │       │   │   ├── SimpleEnumMarker.java
│       │   │       │   │   ├── SuperInvocationMarker.java
│       │   │       │   │   ├── SynchronizedBlockMethodMarker.java
│       │   │       │   │   ├── UnusedParameterMethodFilter.java
│       │   │       │   │   ├── UnusedParameterOptimizationInfoUpdater.java
│       │   │       │   │   ├── UsedParameterFilter.java
│       │   │       │   │   ├── VariableUsageMarker.java
│       │   │       │   │   └── WrapperClassMarker.java
│       │   │       │   ├── kotlin/
│       │   │       │   │   └── KotlinContextReceiverUsageMarker.java
│       │   │       │   └── peephole/
│       │   │       │       ├── ClassFinalizer.java
│       │   │       │       ├── ClassMerger.java
│       │   │       │       ├── GotoCommonCodeReplacer.java
│       │   │       │       ├── GotoGotoReplacer.java
│       │   │       │       ├── GotoReturnReplacer.java
│       │   │       │       ├── HorizontalClassMerger.java
│       │   │       │       ├── InstructionSequenceConstants.java
│       │   │       │       ├── LineNumberLinearizer.java
│       │   │       │       ├── MemberPrivatizer.java
│       │   │       │       ├── MethodFinalizer.java
│       │   │       │       ├── MethodInliner.java
│       │   │       │       ├── NoConstructorReferenceReplacer.java
│       │   │       │       ├── NopRemover.java
│       │   │       │       ├── ReachableCodeMarker.java
│       │   │       │       ├── RetargetedClassFilter.java
│       │   │       │       ├── RetargetedInnerClassAttributeRemover.java
│       │   │       │       ├── ShortMethodInliner.java
│       │   │       │       ├── SingleInvocationMethodInliner.java
│       │   │       │       ├── TargetClassChanger.java
│       │   │       │       ├── UnreachableCodeRemover.java
│       │   │       │       ├── UnreachableExceptionRemover.java
│       │   │       │       ├── VariableShrinker.java
│       │   │       │       ├── VerticalClassMerger.java
│       │   │       │       ├── WrapperClassMerger.java
│       │   │       │       └── WrapperClassUseSimplifier.java
│       │   │       ├── pass/
│       │   │       │   ├── Pass.java
│       │   │       │   └── PassRunner.java
│       │   │       ├── preverify/
│       │   │       │   ├── PreverificationClearer.java
│       │   │       │   ├── Preverifier.java
│       │   │       │   └── SubroutineInliner.java
│       │   │       ├── shrink/
│       │   │       │   ├── AnnotationUsageMarker.java
│       │   │       │   ├── ClassShrinker.java
│       │   │       │   ├── ClassUsageMarker.java
│       │   │       │   ├── InnerUsageMarker.java
│       │   │       │   ├── InterfaceUsageMarker.java
│       │   │       │   ├── KotlinModuleShrinker.java
│       │   │       │   ├── KotlinModuleUsageMarker.java
│       │   │       │   ├── KotlinShrinker.java
│       │   │       │   ├── LocalVariableTypeUsageMarker.java
│       │   │       │   ├── NestUsageMarker.java
│       │   │       │   ├── RecordComponentUsageMarker.java
│       │   │       │   ├── ShortestClassUsageMarker.java
│       │   │       │   ├── ShortestUsageMark.java
│       │   │       │   ├── ShortestUsageMarker.java
│       │   │       │   ├── ShortestUsagePrinter.java
│       │   │       │   ├── Shrinker.java
│       │   │       │   ├── SimpleUsageMarker.java
│       │   │       │   ├── UsageMarker.java
│       │   │       │   ├── UsagePrinter.java
│       │   │       │   ├── UsedClassFilter.java
│       │   │       │   ├── UsedMemberFilter.java
│       │   │       │   └── shrink/
│       │   │       │       └── package.html
│       │   │       ├── strip/
│       │   │       │   └── KotlinAnnotationStripper.java
│       │   │       └── util/
│       │   │           ├── Benchmark.java
│       │   │           ├── HashUtil.java
│       │   │           ├── PrintWriterUtil.java
│       │   │           ├── TimeUtil.java
│       │   │           ├── TransformedStringMatcher.java
│       │   │           └── kotlin/
│       │   │               ├── KotlinUnsupportedVersionChecker.java
│       │   │               └── asserter/
│       │   │                   ├── KotlinMetadataVerifier.java
│       │   │                   └── Reporter.java
│       │   └── resources/
│       │       └── log4j2.xml
│       └── test/
│           └── kotlin/
│               ├── proguard/
│               │   ├── AfterInitConfigurationVerifierTest.kt
│               │   ├── ClassMergerTest.kt
│               │   ├── ClassSpecificationVisitorFactoryTest.kt
│               │   ├── ConfigurationParserTest.kt
│               │   ├── Java19RecordPatternTest.kt
│               │   ├── Java20RecordPatternTest.kt
│               │   ├── LoggingTest.kt
│               │   ├── MarkerTest.kt
│               │   ├── obfuscate/
│               │   │   ├── SimpleNameFactoryTest.kt
│               │   │   └── kotlin/
│               │   │       ├── KotlinCallableReferenceFixerTest.kt
│               │   │       ├── KotlinIntrinsicsReplacementSequencesTest.kt
│               │   │       └── KotlinValueParameterNameShrinkerTest.kt
│               │   ├── optimize/
│               │   │   ├── KotlinContextReceiverParameterShrinkingTest.kt
│               │   │   ├── MemberDescriptorSpecializerTest.kt
│               │   │   ├── SimpleEnumClassCheckerTest.kt
│               │   │   ├── gson/
│               │   │   │   ├── MarkedAnnotationDeleterTest.kt
│               │   │   │   └── TypeArgumentFinderTest.kt
│               │   │   ├── info/
│               │   │   │   └── InstantiationClassMarkerTest.kt
│               │   │   └── peephole/
│               │   │       └── MethodInlinerTest.kt
│               │   ├── shrink/
│               │   │   └── ClassUsageMarkerTest.kt
│               │   └── util/
│               │       └── ProguardAssemblerTest.kt
│               └── testutils/
│                   ├── ConfigurationUtil.kt
│                   ├── JavaUtil.kt
│                   ├── LogUtils.kt
│                   ├── ProcessingFlagUtil.kt
│                   └── TestConfig.kt
├── bin/
│   ├── dprotect.sh
│   ├── proguard.bat
│   ├── proguard.sh
│   ├── proguardgui.bat
│   ├── proguardgui.sh
│   ├── retrace.bat
│   └── retrace.sh
├── build.gradle
├── docs/
│   ├── md/
│   │   ├── css/
│   │   │   ├── admonition.css
│   │   │   └── extra.css
│   │   ├── downloads.md
│   │   ├── index.md
│   │   ├── manual/
│   │   │   ├── FAQ.md
│   │   │   ├── building.md
│   │   │   ├── configuration/
│   │   │   │   ├── attributes.md
│   │   │   │   ├── examples.md
│   │   │   │   ├── optimizations.md
│   │   │   │   └── usage.md
│   │   │   ├── feedback.md
│   │   │   ├── home.md
│   │   │   ├── languages/
│   │   │   │   ├── java.md
│   │   │   │   └── kotlin.md
│   │   │   ├── license/
│   │   │   │   ├── gpl.md
│   │   │   │   ├── gplexception.md
│   │   │   │   └── license.md
│   │   │   ├── quickstart.md
│   │   │   ├── refcard.md
│   │   │   ├── releasenotes.md
│   │   │   ├── setup/
│   │   │   │   ├── ant.md
│   │   │   │   ├── gradle.md
│   │   │   │   ├── gradleplugin.md
│   │   │   │   └── standalone.md
│   │   │   ├── tools/
│   │   │   │   ├── appsweep.md
│   │   │   │   ├── playground.md
│   │   │   │   └── retrace.md
│   │   │   └── troubleshooting/
│   │   │       ├── limitations.md
│   │   │       └── troubleshooting.md
│   │   └── results.md
│   ├── mkdocs.yml
│   └── notices/
│       └── Gson
├── dprotect/
│   └── build.gradle
├── examples/
│   ├── android-agp3-agp4/
│   │   ├── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── debug.keystore
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard-project.txt
│   │   ├── res/
│   │   │   └── values/
│   │   │       ├── colors.xml
│   │   │       ├── strings.xml
│   │   │       └── styles.xml
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── com/
│   │           └── example/
│   │               └── HelloWorldActivity.java
│   ├── android-plugin/
│   │   ├── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── debug.keystore
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard-project.txt
│   │   ├── res/
│   │   │   └── values/
│   │   │       ├── colors.xml
│   │   │       ├── strings.xml
│   │   │       └── styles.xml
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── com/
│   │           └── example/
│   │               └── HelloWorldActivity.java
│   ├── annotations/
│   │   ├── examples/
│   │   │   ├── Applet.java
│   │   │   ├── Application.java
│   │   │   ├── Bean.java
│   │   │   └── NativeCallBack.java
│   │   └── examples.pro
│   ├── ant/
│   │   ├── applets.xml
│   │   ├── applications1.xml
│   │   ├── applications2.xml
│   │   ├── applications3.xml
│   │   ├── library.xml
│   │   ├── midlets.xml
│   │   ├── proguard.xml
│   │   └── servlets.xml
│   ├── application/
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard.pro
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── example/
│   │                       └── App.java
│   ├── application-kotlin/
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard.pro
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           └── kotlin/
│   │               └── App.kt
│   ├── dictionaries/
│   │   ├── compact.txt
│   │   ├── keywords.txt
│   │   ├── shakespeare.txt
│   │   └── windows.txt
│   ├── gradle/
│   │   ├── android.gradle
│   │   ├── applets.gradle
│   │   ├── applications.gradle
│   │   ├── library.gradle
│   │   ├── midlets.gradle
│   │   ├── proguard.gradle
│   │   ├── proguardgui.gradle
│   │   ├── retrace.gradle
│   │   ├── scala.gradle
│   │   ├── servlets.gradle
│   │   └── settings.gradle
│   ├── gradle-kotlin-dsl/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── settings.gradle.kts
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── gradlekotlindsl/
│   │       │           └── App.java
│   │       └── test/
│   │           └── java/
│   │               └── gradlekotlindsl/
│   │                   └── AppTest.java
│   ├── spring-boot/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── example/
│   │           │           └── demo/
│   │           │               ├── DemoApplication.java
│   │           │               ├── TestComponent.java
│   │           │               └── sub/
│   │           │                   └── TestComponent2.java
│   │           └── resources/
│   │               └── application.properties
│   └── standalone/
│       ├── android.pro
│       ├── applets.pro
│       ├── applications.pro
│       ├── library.pro
│       ├── midlets.pro
│       ├── proguard.pro
│       ├── proguardgui.pro
│       ├── retrace.pro
│       ├── scala.pro
│       └── servlets.pro
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle-plugin/
│   ├── .gitignore
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── proguard/
│       │   │       └── gradle/
│       │   │           └── ProGuardTask.java
│       │   ├── kotlin/
│       │   │   └── proguard/
│       │   │       └── gradle/
│       │   │           └── plugin/
│       │   │               ├── ProGuardPlugin.kt
│       │   │               └── android/
│       │   │                   ├── AndroidPlugin.kt
│       │   │                   ├── ProGuardTransform.kt
│       │   │                   ├── dsl/
│       │   │                   │   ├── ProGuardAndroidExtension.kt
│       │   │                   │   ├── ProGuardConfiguration.kt
│       │   │                   │   └── VariantConfiguration.kt
│       │   │                   ├── tasks/
│       │   │                   │   ├── CollectConsumerRulesTask.kt
│       │   │                   │   └── PrepareProguardConfigDirectoryTask.kt
│       │   │                   └── transforms/
│       │   │                       ├── AndroidConsumerRulesTransform.kt
│       │   │                       └── ArchiveConsumerRulesTransform.kt
│       │   └── resources/
│       │       └── lib/
│       │           ├── proguard-android-common.txt
│       │           ├── proguard-android-debug.txt
│       │           ├── proguard-android-optimize.txt
│       │           └── proguard-android.txt
│       └── test/
│           └── kotlin/
│               ├── proguard/
│               │   └── gradle/
│               │       ├── AgpVersionParserTest.kt
│               │       ├── ConsumerRulesCollectionTest.kt
│               │       ├── ConsumerRulesFilterTest.kt
│               │       ├── GradlePluginIntegrationTest.kt
│               │       ├── ProGuardPluginLegacyAGPIntegrationTest.kt
│               │       ├── ProGuardPluginTest.kt
│               │       ├── ProguardCacheRelocateabilityIntegrationTest.kt
│               │       └── plugin/
│               │           └── android/
│               │               └── dsl/
│               │                   ├── AaptRulesTest.kt
│               │                   ├── ConfigurationOrderTest.kt
│               │                   ├── ConfigurationTest.kt
│               │                   ├── DefaultConfigurationTest.kt
│               │                   └── FlavorsConfigurationTest.kt
│               └── testutils/
│                   ├── AndroidProjectBuilder.kt
│                   ├── GradleRunnerUtil.kt
│                   └── TestPluginClasspath.kt
├── gradle.properties
├── gradlew
├── gradlew.bat
├── gui/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── gui/
│               ├── ClassPathPanel.java
│               ├── ClassSpecificationDialog.java
│               ├── ClassSpecificationsPanel.java
│               ├── ExtensionFileFilter.java
│               ├── FilterBuilder.java
│               ├── FilterDialog.java
│               ├── GUIResources.java
│               ├── GUIResources.properties
│               ├── JavaUtil.java
│               ├── KeepSpecificationsPanel.java
│               ├── ListPanel.java
│               ├── MemberSpecificationDialog.java
│               ├── MemberSpecificationsPanel.java
│               ├── MessageDialogRunnable.java
│               ├── OptimizationsDialog.java
│               ├── ProGuardGUI.java
│               ├── ProGuardRunnable.java
│               ├── ReTraceRunnable.java
│               ├── SwingUtil.java
│               ├── TabbedPane.java
│               ├── TextAreaOutputStream.java
│               ├── TextAreaWriter.java
│               ├── boilerplate.pro
│               ├── default.pro
│               ├── package.html
│               └── splash/
│                   ├── BufferedSprite.java
│                   ├── CircleSprite.java
│                   ├── ClipSprite.java
│                   ├── ColorSprite.java
│                   ├── CompositeSprite.java
│                   ├── ConstantColor.java
│                   ├── ConstantDouble.java
│                   ├── ConstantFont.java
│                   ├── ConstantInt.java
│                   ├── ConstantString.java
│                   ├── ConstantTiming.java
│                   ├── FontSprite.java
│                   ├── ImageSprite.java
│                   ├── LinearColor.java
│                   ├── LinearDouble.java
│                   ├── LinearInt.java
│                   ├── LinearTiming.java
│                   ├── OverrideGraphics2D.java
│                   ├── RectangleSprite.java
│                   ├── SawToothTiming.java
│                   ├── ShadowedSprite.java
│                   ├── SineTiming.java
│                   ├── SmoothTiming.java
│                   ├── SplashPanel.java
│                   ├── Sprite.java
│                   ├── TextSprite.java
│                   ├── TimeSwitchSprite.java
│                   ├── Timing.java
│                   ├── TypeWriterString.java
│                   ├── VariableColor.java
│                   ├── VariableDouble.java
│                   ├── VariableFont.java
│                   ├── VariableInt.java
│                   ├── VariableSizeFont.java
│                   ├── VariableString.java
│                   └── package.html
├── proguard-app/
│   └── build.gradle
├── retrace/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── retrace/
│               ├── FrameInfo.java
│               ├── FramePattern.java
│               ├── FrameRemapper.java
│               ├── ReTrace.java
│               └── package.html
├── scripts/
│   ├── docker/
│   │   ├── gh_action.sh
│   │   └── publish_gradle_plugin.sh
│   └── fetch_dprotect_core.py
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*.java]
indent_style = space
indent_size = 4


================================================
FILE: .gitattributes
================================================
gradlew -text
gradlew.bat -text


================================================
FILE: .github/scripts/s3-deploy.py
================================================
#!/usr/bin/env python3
import sys
import os
import logging
import pathlib
from mako.template import Template
from enum import Enum, auto
import tempfile
import boto3
from botocore.exceptions import ClientError

class CI(Enum):
    UNKNOWN        = auto()
    GITHUB_ACTIONS = auto()

def pretty_ci_name(ci):
    return str(ci).split(".")[-1].replace("_", "-").lower()

def is_pr(ci):
    if ci == CI.GITHUB_ACTIONS:
        cond1 = os.getenv("GITHUB_HEAD_REF", "") != ""
        cond2 = not (os.getenv("GITHUB_REPOSITORY", "").startswith("open-obfuscator/") or os.getenv("GITHUB_REPOSITORY", "").startswith("romainthomas/"))
        return cond1 or cond2
    return True

def get_branch(ci):
    if ci == CI.GITHUB_ACTIONS:
        return os.getenv("GITHUB_REF").replace("refs/heads/", "")
    return None

def get_ci_workdir(ci):
    if ci == CI.GITHUB_ACTIONS:
        return os.getenv("GITHUB_WORKSPACE")
    logger.critical("Unsupported CI to resolve working directory")
    sys.exit(1)

def get_tag(ci):
    if ci == CI.GITHUB_ACTIONS:
        ref = os.getenv("GITHUB_REF", "")
        logger.info("Github Action tag: {}".format(ref))
        if ref.startswith("refs/tags/"):
            return ref.replace("refs/tags/", "")
        return ""

    logger.critical("Unsupported CI to resolve working directory")
    sys.exit(1)

LOG_LEVEL = logging.INFO

logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
logging.getLogger().setLevel(LOG_LEVEL)
logger = logging.getLogger(__name__)

CURRENT_CI = CI.GITHUB_ACTIONS

CI_PRETTY_NAME = pretty_ci_name(CURRENT_CI)
logger.info("CI: %s", CI_PRETTY_NAME)

ALLOWED_BRANCHES = {"main", "deploy", "devel"}
BRANCH_NAME      = get_branch(CURRENT_CI)
TAG_NAME         = get_tag(CURRENT_CI)
IS_TAGGED        = TAG_NAME is not None and len(TAG_NAME) > 0

logger.info("Branch: %s", BRANCH_NAME)
logger.info("Tag:    %s", TAG_NAME)

if BRANCH_NAME.startswith("release-"):
    logger.info("Branch release")
elif BRANCH_NAME not in ALLOWED_BRANCHES and not IS_TAGGED:
    logger.info("Skip deployment for branch '%s'", BRANCH_NAME)
    sys.exit(0)

if is_pr(CURRENT_CI):
    logger.info("Skip pull request")
    sys.exit(0)

CURRENTDIR = pathlib.Path(__file__).resolve().parent
REPODIR    = CURRENTDIR / ".." / ".."

# According to Scaleway S3 documentation, the endpoint
# should starts with '<bucket>'.s3.<region>.scw.cloud
# Nevertheless boto3 uses /{Bucket} endpoints suffix
# which create issues (see: https://stackoverflow.com/a/70383653)
DPROTECT_S3_REGION   = "fr-par"
DPROTECT_S3_ENDPOINT = "https://s3.{region}.scw.cloud".format(region=DPROTECT_S3_REGION)
DPROTECT_S3_BUCKET   = "obfuscator"
DPROTECT_S3_KEY      = os.getenv("DPROTECT_S3_KEY", None)
DPROTECT_S3_SECRET   = os.getenv("DPROTECT_S3_SECRET", None)

if DPROTECT_S3_KEY is None or len(DPROTECT_S3_KEY) == 0:
    logger.error("OPEN_OBFUSCATOR_S3_KEY is not set!")
    sys.exit(1)

if DPROTECT_S3_SECRET is None or len(DPROTECT_S3_SECRET) == 0:
    logger.error("OPEN_OBFUSCATOR_S3_SECRET is not set!")
    sys.exit(1)

CI_CWD = pathlib.Path(get_ci_workdir(CURRENT_CI))

if CI_CWD is None:
    logger.error("Can't resolve CI working dir")
    sys.exit(1)

DIST_DIR  = REPODIR / "dist"

logger.info("Working directory: %s", CI_CWD)

INDEX_TEMPLATE = r"""
<!DOCTYPE html>
<html>
<title>Packages for dProtect</title>
<body>
<h1>Packages for dProtect</h1>
% for path, filename in files:
    <a href="/${path}">${filename}</a><br />
% endfor
</body>
</html>
"""

SKIP_LIST = ["index.html"]

s3 = boto3.resource(
    's3',
    region_name=DPROTECT_S3_REGION,
    use_ssl=True,
    endpoint_url=DPROTECT_S3_ENDPOINT,
    aws_access_key_id=DPROTECT_S3_KEY,
    aws_secret_access_key=DPROTECT_S3_SECRET
)


def push(file: str, dir_name: str):
    zipfile = pathlib.Path(file)
    dst = f"{dir_name}/dprotect/{zipfile.name}"
    logger.info("Uploading %s to %s", file, dst)
    try:
        obj = s3.Object(DPROTECT_S3_BUCKET, dst)
        obj.put(Body=zipfile.read_bytes())
        return 0
    except ClientError as e:
        logger.error("S3 push failed: %s", e)
        return 1


def filename(object):
    return pathlib.Path(object.key).name

def generate_index(dir_name: str):
    files = s3.Bucket(DPROTECT_S3_BUCKET).objects.filter(Prefix=f'{dir_name}/dprotect')
    tmpl_info = [(object.key, filename(object)) for object in files if filename(object) not in SKIP_LIST]
    html = Template(INDEX_TEMPLATE).render(files=tmpl_info)
    return html

dir_name = "latest"

if BRANCH_NAME != "main":
    dir_name = "{}".format(BRANCH_NAME.replace("/", "-").replace("_", "-"))

if BRANCH_NAME.startswith("release-"):
    _, dir_name = BRANCH_NAME.split("release-")

if IS_TAGGED:
    dir_name = str(TAG_NAME)

logger.info("Destination directory: %s", dir_name)

for file in DIST_DIR.glob("*.zip"):
    logger.info("[ZIP  ] Uploading '%s'", file.as_posix())
    push(file.as_posix(), dir_name)

nightly_index = generate_index(dir_name)
with tempfile.TemporaryDirectory() as tmp:
    tmp = pathlib.Path(tmp)
    index = (tmp / "index.html")
    index.write_text(nightly_index)
    push(index.as_posix(), dir_name)

logger.info("Done!")



================================================
FILE: .github/workflows/continuous_integration.yml
================================================
name: Continuous Integration
on:
  pull_request:
    branches:
      - skip
      - skip
  push:
    branches:
      - skip
      - skip
jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v2
        with:
          path: proguard-main
      - uses: actions/setup-java@v1
        with:
          java-version: 8
      - uses: eskatos/gradle-command-action@v1
        with:
          build-root-directory: proguard-main/
          wrapper-directory: proguard-main/
          arguments: test :base:testAllJavaVersions :base:jacocoTestReport jar --info
      - name: Publish Test Report
        uses: mikepenz/action-junit-report@v3
        if: always() # always run even if the previous step fails
        with:
          report_paths: '**/build/test-results/test/TEST-*.xml'


================================================
FILE: .github/workflows/main.yml
================================================
name: 'dProtect Main'
on: [push, workflow_dispatch]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Build dProtect-core & dProtect
        shell: bash
        run: |
          mkdir -p $GITHUB_WORKSPACE/dist
          docker run --rm \
           -v $GITHUB_WORKSPACE:/dprotect \
           openobfuscator/dprotect-build:latest bash /dprotect/scripts/docker/gh_action.sh
      - name: Deploy
        env:
          DPROTECT_S3_KEY: ${{ secrets.DPROTECT_S3_KEY }}
          DPROTECT_S3_SECRET: ${{ secrets.DPROTECT_S3_SECRET }}
        shell: bash
        run: |
          docker run \
            -v $GITHUB_WORKSPACE:/dprotect \
            -e GITHUB_ACTIONS="true" \
            -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
            -e GITHUB_REF=$GITHUB_REF \
            -e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
            -e DPROTECT_S3_KEY=$DPROTECT_S3_KEY \
            -e DPROTECT_S3_SECRET=$DPROTECT_S3_SECRET \
            --rm \
            openobfuscator/deployment python3 /dprotect/.github/scripts/s3-deploy.py



================================================
FILE: .gitignore
================================================
.gradle
.hg/**
.hgtags
.idea
build
local.properties
/lib/
docs/html


================================================
FILE: .hgignore
================================================
syntax: glob
.git/*


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to ProGuard

Thank you for contributing!

- You can report issues on our [issue tracker](issues) on GitHub. Please be
  concise and complete. If we can't reproduce an issue, we most likely can't
  fix it.

- You can also clone the [source code](.) yourself and create [pull
  requests](pulls) on GitHub.

These are a few guidelines for our code and documentation.

## Basic principle

Above all, code should be consistent. Study, respect, and follow the style of
the existing code.

## Code design

The code generally defines many short classes, as the building blocks for
classes that contain the real logic. This is sometimes taken to the extreme:
even loops and conditional statements can often be implemented as separate
classes. Even though these classes are verbose and repetitive, the resulting
main code becomes much more compact, flexible, and robust.

### Data classes

Basic data classes define the data structures, with just a minimum number of
operations: Java bytecode classes, Dex bytecode classes, XML data, native
libraries, etc. They typically reflect their respective specifications
literally. The data classes have one or more `accept` methods to let the
visitor classes below operate on them.

### Visitors

The code relies a lot on the visitor pattern. Visitor classes define the
operations on the data: reading, writing, editing, transforming, etc. The
visitor classes have one or more `visit` methods to operate on data classes of
the same basic type.

For example, a Java bytecode class contains a constant pool with constants of
different types: integer constants, float constants, string constants, etc.
The data classes IntegerConstant, FloatConstant, StringConstant, etc. all
implement the basic type Constant. The visitor interface ConstantVisitor
contains methods 'visitIntegerConstant', 'visitFloatConstant',
'visitStringConstant', etc. Implementations of this visitor interface can
perform all kinds of operations on the constants.

The reasoning behind this pattern is that the data classes are very stable,
because they are directly based on the specifications (class files, dex files,
binary XML files, ELF files, etc). The operations are more dynamic. They are
changed and extended all the time. It is practically impossible to add all
possible operations in the data classes, but it is easy to add another
implementation of a visitor interface. Implementing an interface in practice
helps a lot to think of all possible cases.

The visitor pattern uses visitor interfaces to operate on the similar elements
of a data structure. Each interface often has many implementations. A great
disadvantage at this time is that visitor methods can invoke one another
(directly or indirectly), but they can't communicate easily. Since the
implementations can't add their own parameters or return values, they often
have to rely on fields to pass values back and forth. This is more
error-prone. Still, the advantages of the visitor pattern outweigh the
disadvantages.

We prefer (visitor) interfaces with many classes that implement them, so the
implementations can be used as building blocks.

### Facade classes

With many small visitor classes available as building blocks, the important
code chains these visitors together. The main ProGuard packages contain a
number of facade classes that construct and run these chains. Notably:

- `ProGuard` is the main entry point, with a long linear sequence of
  operations that it delegates to the facade classes.

- `InputReader` reads the code and resources.

- `Initializer` initializes links between the code and resources, to traverse
  the data structures more easily.

- `Marker` marks code and resources to be kept, encrypted, etc., based on the
  configuration.

- `Backporter` backports code to older versions of Java.

- `ConfigurationLoggingAdder` instruments code to give feedback about
  potentially missing configuration.

- `Shrinker` removes unused code and resources.

- `Optimizer` optimizes the code and resources.

- `Obfuscator` obfuscates the code and resources.

- `Preverifier` adds preverification metadata to code for Java 6 and higher.

### Data flow

At a high level, the flow of data inside ProGuard is as follows:

- Traverse the input data, to parse any useful data structures.

- Process the data structures in a number of steps (mainly shrinking, string
  encryption, optimization, obfuscation, class encryption).

- Traverse the input data again, this time to write to the output, by copying,
  transforming, replacing, or removing data entries. The transformations can
  be small (e.g. replacing class names in properties files) or large (e.g.
  replacing all classes and resources by obfuscated counterparts).

Important interfaces for this flow:

- `DataEntryReader` uses a push mechanism. It typically traverses data entries
  (files and nested zip entries) in the input and pushes them to data entry
  visitors. The visitors can access the actual data through input streams.

- `DataEntryWriter` uses a pull mechanism. It can return output streams for
  data entries.

The first traversal and parsing of the input data is based on implementations
of DataEntryReader.

The second traversal of the input data is based on the same implementations of
DataEntryReader, with additional implementations that use implementations of
DataEntryWriter to transform and write the output data.

### Dependency injection

We heavily use **constructor-based dependency injection**, to create immutable
objects. Notably the visitors are often like commands that are combined in an
immutable structure, via constructors. The commands are then executed by
applying the visitors to the classes or other data structures.

### Getters and setters

We try to **avoid getters and setters** outside of pure data classes.
Generally, getters and setters break data encapsulation -- "Tell, don't ask".
In our architecture, visitors often delegate to a chain of other visitors,
with the final visitor applying actual changes to the data structures.
Visitors that change the data classes often access fields directly, since they
conceptually have the same purpose as methods inside the data classes.

## Code style

Over time, we've adopted a few guidelines:

- Historically, ProGuard hasn't used generics, enums, iterable loops, variable
  arguments, or closures. More recent code can use the features of Java 8, but
  be consistent.

- Prefer **arrays** over lists, if their sizes are relatively static. The
  resulting code is easier to read, without casts or generics.

- Prefer **short classes** over long classes, although long classes that simply
  implement the many methods of their interfaces are okay.

- Prefer **short methods**, although long methods with a linear flow are okay.

- **Declare and initialize** fields and variables at the same time, when
  possible.

- Make fields **final**, when possible:
    ```
    private final CodeAttributeComposer composer = new CodeAttributeComposer();
    ```

- We generally don't make local variables final, to avoid cluttering the code
  too much.

- Maintain a **consistent order** for fields, methods (e.g.. getters and
  setters), case statements, etc. A good basic rule for new classes is that
  their contents should be in chronological order or respecting the natural
  hierarchical order of the data -- Which fields are accessed first? Which
  methods are accessed first? Which data comes first in the data structures?
  For classes that implement or resemble other classes, the contents should
  respect the same order.

## Documentation

All classes must have main javadoc:

    /**
     * This {@link ClassVisitor} collects the names of the classes that it
     * visits in the given collection.
     *
     * @author Eric Lafortune
     */

Methods should have javadoc:

    /**
     * Returns the number of parameters of the given internal method descriptor.
     * @param internalMethodDescriptor the internal method descriptor,
     *                                 e.g. "<code>(ID)Z</code>".
     * @param isStatic                 specifies whether the method is static,
     *                                 e.g. false.
     * @return the number of parameters,
     *                                 e.g. 3.
     */

In practice, fields rarely have javadoc (this is debatable...)

Methods that implement interfaces generally don't have javadoc, since they
simply implement the behavior specified by the interfaces. Instead, a group of
methods that implements an interface is documented with:

    // Implementations for SomeInterface.

Most code has comments for each block of statements. The idea is to make the
code readable by just glancing over the comments (which works well if they are
colored in an IDE).

Comments are generally short sentences, starting with a capital and ending
with a period:

    // This is a comment.

For the manual (written as markdown), you should follow the excellent advice
of the [Google Developer Documentation Style
Guide](https://developers.google.com/style/).

## Code format

We strive for code that is super-aligned. Ideally, the code should look like a
set of tables, for variable declarations, parameter declarations, ternary
operators, etc.

- The basic indentation is 4 spaces (never tabs).

- Curly braces are on separate lines.

- The ideal maximum line length is 120 characters. Documentation and comments
  should stick to this limit. Code that has a nice table-like structure can
  exceed it.

- Imports of multiple classes in the same package are specified with a
  wildcard '*'.

- Try to preserve a logical, consistent order in fields, getters/setters,
  methods, variables.

- Whenever overriding a method, add the @Override annotation.

In practice, an IDE can help to obtain a clean indentation and structure, but
it is often not sufficient. Be careful to never upset a cleanly formatted
source file by automatically reformatting it.

### Naming Conventions

- Names (class names, field names, etc) should be descriptive.

- We generally don't abbreviate names, not even index variables:
    ```
    for (int index = 0; index < count; index++)
    ```


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.


================================================
FILE: README.md
================================================
<p align="center">
  <br />
  <br />
  <a href="https://obfuscator.re/dprotect">
    <img src=".github/img/banner.webp" alt="dProtect" width="100%">
  </a>
</p>

<p align="center">
  <a href="LICENSE">
    <img src="https://img.shields.io/github/license/open-obfuscator/dProtect">
  </a>
</p>

dProtect is an extension of Proguard with enhanced code obfuscation features. While Proguard is known for obfuscating
symbols (package names, class names, ...) and optimizing Java/Kotlin code, dProtect brings code obfuscation
for Java and Kotlin on the top of Proguard:

```bash
# Arithmetic Obfuscation
-obfuscate-arithmetic,low class dprotect.examples.**
-obfuscate-arithmetic,high,skipfloat class dprotect.internal.**

# Strings Obfuscation
-obfuscate-strings class dprotect.examples.**
-obfuscate-strings class dprotect.internal.CheckPassword {
    public static java.lang.String getPassword();
    public static java.lang.String getLogin();

    private static java.lang.String KEY;
}

# Control-flow obfuscation
-obfuscate-control-flow class dprotect.internal.api.**

# Constants Obfuscation
-obfuscate-constants class dprotect.internal.api.Enum {
  *;
}
```

dProtect follows the same integration mechanism as Proguard such as it can be instantiated in an Android
Gradle-based project as follows:

<h6>build.gradle</h6>

```gradle
buildscript {
    repositories {
        mavenCentral()
        maven {
          url = uri("https://maven.pkg.github.com/open-obfuscator/dProtect")
          credentials {
              username = "your-username"
              password = "the-token"
          }
        }
    }
    dependencies {
        classpath 're.obfuscator:dprotect-gradle:1.0.0'
    }
}
```

**You need to generate a Github token to use `maven.pkg.github.com`**. Alternatively,
you can use the `dprotect-gradle-1.0.0.jar` archive of the release's artifacts.

<h6>app/build.gradle</h6>

```gradle
apply plugin: 're.obfuscator.dprotect'
// ...
dProtect {
    configurations {
      release {
          configuration 'dprotect-rules.pro'
      }
    }
}
```

<img src=".github/img/dprotect-pipeline.webp" alt="dProtect Pipeline" width="100%">

You can also find out more information here: https://obfuscator.re/dprotect

### Contact

You can reach out by email at this address: `ping@obfuscator.re`

#### Maintainers

- [Romain Thomas](https://www.romainthomas.fr): [@rh0main](https://twitter.com/rh0main) - `me@romainthomas.fr`

#### Credits

- [Guardsquare](https://www.guardsquare.com/): Proguard's Owner
- [Eric Lafortune](https://www.lafortune.eu/): Proguard's Author
- [James Hamilton](https://jameshamilton.eu/): Proguard's Core dev/maintainer

### License

dProtect is released under the same License as Proguard: [GNU General Public License v2.0](https://github.com/Guardsquare/proguard/blob/master/LICENSE)


================================================
FILE: annotations/annotations.pro
================================================
#
# This ProGuard configuration file specifies how annotations can be used
# to configure the processing of other code.
# Usage:
#     java -jar proguard.jar @annotations.pro -libraryjars annotations.jar ...
#
# Note that the other input/output options still have to be specified.
# If you specify them in a separate file, you can simply include this file:
#     -include annotations.pro
#
# You can add any other options that are required. For instance, if you are
# processing a library, you can still include the options from library.pro.


# The annotations are defined in the accompanying jar. For now, we'll start
# with these. You can always define your own annotations, if necessary.
-libraryjars annotations.jar


# The following annotations can be specified with classes and with class
# members.

# @Keep specifies not to shrink, optimize, or obfuscate the annotated class
# or class member as an entry point.

-keep @proguard.annotation.Keep class *

-keepclassmembers class * {
    @proguard.annotation.Keep *;
}


# @KeepName specifies not to optimize or obfuscate the annotated class or
# class member as an entry point.

-keepnames @proguard.annotation.KeepName class *

-keepclassmembernames class * {
    @proguard.annotation.KeepName *;
}


# The following annotations can only be specified with classes.

# @KeepImplementations and @KeepPublicImplementations specify to keep all,
# resp. all public, implementations or extensions of the annotated class as
# entry points. Note the extension of the java-like syntax, adding annotations
# before the (wild-carded) interface name.

-keep        class * implements @proguard.annotation.KeepImplementations       *
-keep public class * implements @proguard.annotation.KeepPublicImplementations *

# @KeepApplication specifies to keep the annotated class as an application,
# together with its main method.

-keepclasseswithmembers @proguard.annotation.KeepApplication public class * {
    public static void main(java.lang.String[]);
}

# @KeepClassMembers, @KeepPublicClassMembers, and
# @KeepPublicProtectedClassMembers specify to keep all, all public, resp.
# all public or protected, class members of the annotated class from being
# shrunk, optimized, or obfuscated as entry points.

-keepclassmembers @proguard.annotation.KeepClassMembers class * {
    *;
}

-keepclassmembers @proguard.annotation.KeepPublicClassMembers class * {
    public *;
}

-keepclassmembers @proguard.annotation.KeepPublicProtectedClassMembers class * {
    public protected *;
}

# @KeepClassMemberNames, @KeepPublicClassMemberNames, and
# @KeepPublicProtectedClassMemberNames specify to keep all, all public, resp.
# all public or protected, class members of the annotated class from being
# optimized or obfuscated as entry points.

-keepclassmembernames @proguard.annotation.KeepClassMemberNames class * {
    *;
}

-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames class * {
    public *;
}

-keepclassmembernames @proguard.annotation.KeepPublicProtectedClassMemberNames class * {
    public protected *;
}

# @KeepGettersSetters and @KeepPublicGettersSetters specify to keep all, resp.
# all public, getters and setters of the annotated class from being shrunk,
# optimized, or obfuscated as entry points.

-keepclassmembers @proguard.annotation.KeepGettersSetters class * {
    void set*(***);
    void set*(int, ***);

    boolean is*();
    boolean is*(int);

    *** get*();
    *** get*(int);
}

-keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * {
    public void set*(***);
    public void set*(int, ***);

    public boolean is*();
    public boolean is*(int);

    public *** get*();
    public *** get*(int);
}


================================================
FILE: annotations/build.gradle
================================================
plugins {
    id 'java'
    id 'maven-publish'
}

sourceSets.main {
    java {
        srcDirs = ['src']
    }
    resources {
        srcDirs = ['src']
        include '**/*.properties'
        include '**/*.gif'
        include '**/*.png'
        include '**/*.pro'
    }
}

afterEvaluate {
    publishing {
        publications.getByName(project.name) {
            pom {
                description = 'Java annotations to configure ProGuard, the free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
            }
        }
    }
}


================================================
FILE: annotations/src/proguard/annotation/Keep.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies not to optimize or obfuscate the annotated class or
 * class member as an entry point.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface Keep {}


================================================
FILE: annotations/src/proguard/annotation/KeepApplication.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep the annotated class as an application,
 * together with its a main method.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepApplication {}


================================================
FILE: annotations/src/proguard/annotation/KeepClassMemberNames.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all class members of the annotated class
 * from being optimized or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepClassMemberNames {}


================================================
FILE: annotations/src/proguard/annotation/KeepClassMembers.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all class members of the annotated class
 * from being shrunk, optimized, or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepClassMembers {}


================================================
FILE: annotations/src/proguard/annotation/KeepGettersSetters.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all getters and setters of the annotated
 * class from being shrunk, optimized, or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepGettersSetters {}


================================================
FILE: annotations/src/proguard/annotation/KeepImplementations.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all implementations or extensions of the
 * annotated class as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepImplementations {}


================================================
FILE: annotations/src/proguard/annotation/KeepName.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies not to optimize or obfuscate the annotated class or
 * class member as an entry point.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepName {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicClassMemberNames.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public class members of the annotated
 * class from being optimized or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicClassMemberNames {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicClassMembers.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public class members of the annotated
 * class from being shrunk, optimized, or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicClassMembers {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicGettersSetters.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public getters and setters of the
 * annotated class from being shrunk, optimized, or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicGettersSetters {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicImplementations.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public implementations or extensions
 * of the annotated class as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicImplementations {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public or protected class members of
 * the annotated class from being optimized or obfuscated as entry points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicProtectedClassMemberNames {}


================================================
FILE: annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 */
package proguard.annotation;

import java.lang.annotation.*;

/**
 * This annotation specifies to keep all public or protected class members of
 * the annotated class from being shrunk, optimized, or obfuscated as entry
 * points.
 *
 * @author Eric Lafortune
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicProtectedClassMembers {}


================================================
FILE: ant/build.gradle
================================================
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

plugins {
    id 'com.github.johnrengelman.shadow'
    id 'java'
    id 'maven-publish'
}

repositories {
    mavenCentral()
}

sourceSets.main {
    java {
        srcDirs = ['src']
        include '**/*.java'
    }
    resources {
        srcDirs = ['src']
        include '**/*.properties'
        include '**/*.gif'
        include '**/*.png'
        include '**/*.pro'
    }
}

dependencies {
    implementation project(':base')
    implementation 'org.apache.ant:ant:1.9.7'
}

task fatJar(type: ShadowJar) {
    destinationDirectory.set(file("$rootDir/lib"))
    archiveFileName.set('proguard-ant.jar')
    from sourceSets.main.output
    configurations = [project.configurations.runtimeClasspath]
    manifest {
        attributes(
                'Manifest-Version': '1.0',
                'Multi-Release': true,
                'Implementation-Version': archiveVersion.get())
    }
}

assemble.dependsOn fatJar

afterEvaluate {
    publishing {
        publications.getByName(project.name) {
            pom {
                description = 'Ant plugin for ProGuard, the free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
            }
        }
    }
}


================================================
FILE: ant/src/proguard/ant/ClassPathElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import proguard.*;
import proguard.util.ListUtil;

import java.io.File;

/**
 * This FileSet represents a class path entry (or a set of class path entries)
 * in Ant.
 *
 * @author Eric Lafortune
 */
public class ClassPathElement extends Path
{
    private String filter;
    private String apkFilter;
    private String jarFilter;
    private String aarFilter;
    private String warFilter;
    private String earFilter;
    private String zipFilter;


    /**
     * @see Path#Path(Project)
     */
    public ClassPathElement(Project project)
    {
        super(project);
    }


    /**
     * Adds the contents of this class path element to the given class path.
     * @param classPath the class path to be extended.
     * @param output    specifies whether this is an output entry or not.
     */
    public void appendClassPathEntriesTo(ClassPath classPath, boolean output)
    {
        File     baseDir = getProject().getBaseDir();
        String[] fileNames;

        if (isReference())
        {
            // Get the referenced path or file set.
            Object referencedObject = getCheckedRef(DataType.class,
                                                    DataType.class.getName());

            if (referencedObject instanceof Path)
            {
                Path path = (Path)referencedObject;

                // Get the names of the files in the referenced path.
                fileNames = path.list();
            }
            else if (referencedObject instanceof AbstractFileSet)
            {
                AbstractFileSet fileSet = (AbstractFileSet)referencedObject;

                // Get the names of the existing input files in the referenced file set.
                DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
                baseDir   = scanner.getBasedir();
                fileNames = scanner.getIncludedFiles();
            }
            else
            {
                throw new BuildException("The refid attribute doesn't point to a <path> element or a <fileset> element");
            }
        }
        else
        {
            // Get the names of the files in this path.
            fileNames = list();
        }

        if (output)
        {
            if (fileNames.length != 1)
            {
                throw new BuildException("The <outjar> element must specify exactly one file or directory ["+fileNames.length+"]");
            }
        }
        //else
        //{
        //    if (fileNames.length < 1)
        //    {
        //        throw new BuildException("The <injar> element must specify at least one file or directory");
        //    }
        //}

        for (int index = 0; index < fileNames.length; index++)
        {
            // Create a new class path entry, with the proper file name and
            // any filters.
            String fileName = fileNames[index];
            File   file     = new File(fileName);

            ClassPathEntry entry =
                new ClassPathEntry(file.isAbsolute() ? file : new File(baseDir, fileName),
                                   output);
            entry.setFilter(ListUtil.commaSeparatedList(filter));
            entry.setApkFilter(ListUtil.commaSeparatedList(apkFilter));
            entry.setJarFilter(ListUtil.commaSeparatedList(jarFilter));
            entry.setAarFilter(ListUtil.commaSeparatedList(aarFilter));
            entry.setWarFilter(ListUtil.commaSeparatedList(warFilter));
            entry.setEarFilter(ListUtil.commaSeparatedList(earFilter));
            entry.setZipFilter(ListUtil.commaSeparatedList(zipFilter));

            // Add it to the class path.
            classPath.add(entry);
        }
    }


    // Ant task attributes.

    /**
     * @deprecated Use {@link #setLocation(File)} instead.
     */
    public void setFile(File file)
    {
        setLocation(file);
    }


    /**
     * @deprecated Use {@link #setLocation(File)} instead.
     */
    public void setDir(File file)
    {
        setLocation(file);
    }


    /**
     * @deprecated Use {@link #setLocation(File)} instead.
     */
    public void setName(File file)
    {
        setLocation(file);
    }


    public void setFilter(String filter)
    {
        this.filter = filter;
    }


    public void setApkfilter(String apkFilter)
    {
        this.apkFilter = apkFilter;
    }


    public void setJarfilter(String jarFilter)
    {
        this.jarFilter = jarFilter;
    }


    public void setAarfilter(String aarFilter)
    {
        this.aarFilter = aarFilter;
    }


    public void setWarfilter(String warFilter)
    {
        this.warFilter = warFilter;
    }


    public void setEarfilter(String earFilter)
    {
        this.earFilter = earFilter;
    }


    public void setZipfilter(String zipFilter)
    {
        this.zipFilter = zipFilter;
    }
}


================================================
FILE: ant/src/proguard/ant/ClassSpecificationElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import proguard.*;
import proguard.classfile.*;
import proguard.classfile.util.ClassUtil;

import java.util.*;

/**
 * This DataType represents a class specification in Ant.
 *
 * @author Eric Lafortune
 */
public class ClassSpecificationElement extends DataType
{
    private static final String ANY_CLASS_KEYWORD  = "*";

    private String access;
    private String annotation;
    private String type;
    private String name;
    private String extendsAnnotation;
    private String extends_;
    private List   fieldSpecifications  = new ArrayList();
    private List   methodSpecifications = new ArrayList();


    /**
     * Adds the contents of this class specification element to the given list.
     * @param classSpecifications the class specifications to be extended.
     */
    public void appendTo(List classSpecifications)
    {
        // Get the referenced file set, or else this one.
        ClassSpecificationElement classSpecificationElement = isReference() ?
            (ClassSpecificationElement)getCheckedRef(this.getClass(),
                                                     this.getClass().getName()) :
            this;

        ClassSpecification classSpecification =
            createClassSpecification(classSpecificationElement);

        // Add it to the list.
        classSpecifications.add(classSpecification);
    }


    /**
     * Creates a new class specification corresponding to the contents of this
     * class specification element.
     */
    protected ClassSpecification createClassSpecification(ClassSpecificationElement classSpecificationElement)
    {
        String access            = classSpecificationElement.access;
        String annotation        = classSpecificationElement.annotation;
        String type              = classSpecificationElement.type;
        String name              = classSpecificationElement.name;
        String extendsAnnotation = classSpecificationElement.extendsAnnotation;
        String extends_          = classSpecificationElement.extends_;

        // For backward compatibility, allow a single "*" wildcard to match
        // any class.
        if (name != null &&
            name.equals(ANY_CLASS_KEYWORD))
        {
            name = null;
        }

        ClassSpecification classSpecification =
            new ClassSpecification(null,
                                   requiredAccessFlags(true,  access, type),
                                   requiredAccessFlags(false, access, type),
                                   annotation        != null ? ClassUtil.internalType(annotation)        : null,
                                   name              != null ? ClassUtil.internalClassName(name)         : null,
                                   extendsAnnotation != null ? ClassUtil.internalType(extendsAnnotation) : null,
                                   extends_          != null ? ClassUtil.internalClassName(extends_)     : null);

        for (int index = 0; index < fieldSpecifications.size(); index++)
        {
            classSpecification.addField((MemberSpecification)fieldSpecifications.get(index));
        }

        for (int index = 0; index < methodSpecifications.size(); index++)
        {
            classSpecification.addMethod((MemberSpecification)methodSpecifications.get(index));
        }

        return classSpecification;
    }


    // Ant task attributes.

    public void setAccess(String access)
    {
        this.access = access;
    }


    public void setAnnotation(String annotation)
    {
        this.annotation = annotation;
    }


    public void setType(String type)
    {
        this.type = type;
    }


    public void setName(String name)
    {
        this.name = name;
    }


    public void setExtendsannotation(String extendsAnnotation)
    {
        this.extendsAnnotation = extendsAnnotation;
    }


    public void setExtends(String extends_)
    {
        this.extends_ = extends_;
    }


    public void setImplements(String implements_)
    {
        this.extends_ = implements_;
    }


    // Ant task nested elements.

    public void addConfiguredField(MemberSpecificationElement memberSpecificationElement)
    {
        if (fieldSpecifications == null)
        {
            fieldSpecifications = new ArrayList();
        }

        memberSpecificationElement.appendTo(fieldSpecifications,
                                            false,
                                            false);
    }


    public void addConfiguredMethod(MemberSpecificationElement memberSpecificationElement)
    {
        if (methodSpecifications == null)
        {
            methodSpecifications = new ArrayList();
        }

        memberSpecificationElement.appendTo(methodSpecifications,
                                            true,
                                            false);
    }


    public void addConfiguredConstructor(MemberSpecificationElement memberSpecificationElement)
    {
        if (methodSpecifications == null)
        {
            methodSpecifications = new ArrayList();
        }

        memberSpecificationElement.appendTo(methodSpecifications,
                                            true,
                                            true);
    }


    // Small utility methods.

    private int requiredAccessFlags(boolean set,
                                    String  access,
                                    String  type)
    throws BuildException
    {
        int accessFlags = 0;

        if (access != null)
        {
            StringTokenizer tokenizer = new StringTokenizer(access, " ,");
            while (tokenizer.hasMoreTokens())
            {
                String token = tokenizer.nextToken();

                if (token.startsWith("!") ^ set)
                {
                    String strippedToken = token.startsWith("!") ?
                        token.substring(1) :
                        token;

                    int accessFlag =
                        strippedToken.equals(JavaAccessConstants.PUBLIC)     ? AccessConstants.PUBLIC     :
                        strippedToken.equals(JavaAccessConstants.FINAL)      ? AccessConstants.FINAL      :
                        strippedToken.equals(JavaAccessConstants.ABSTRACT)   ? AccessConstants.ABSTRACT   :
                        strippedToken.equals(JavaAccessConstants.SYNTHETIC)  ? AccessConstants.SYNTHETIC  :
                        strippedToken.equals(JavaAccessConstants.ANNOTATION) ? AccessConstants.ANNOTATION :
                                                                               0;

                    if (accessFlag == 0)
                    {
                        throw new BuildException("Incorrect class access modifier ["+strippedToken+"]");
                    }

                    accessFlags |= accessFlag;
                }
            }
        }

        if (type != null && (type.startsWith("!") ^ set))
        {
            int accessFlag =
                type.equals("class")                             ? 0                         :
                type.equals(      JavaAccessConstants.INTERFACE) ||
                type.equals("!" + JavaAccessConstants.INTERFACE) ? AccessConstants.INTERFACE :
                type.equals(      JavaAccessConstants.ENUM)      ||
                type.equals("!" + JavaAccessConstants.ENUM)      ? AccessConstants.ENUM      :
                                                                   -1;

            if (accessFlag == -1)
            {
                throw new BuildException("Incorrect class type ["+type+"]");
            }

            accessFlags |= accessFlag;
        }

        return accessFlags;
    }
}


================================================
FILE: ant/src/proguard/ant/ConfigurationElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import proguard.*;

import java.io.*;
import java.util.Properties;

/**
 * This DataType represents a reference to an XML-style ProGuard configuration
 * in Ant, or a file set of ProGuard-style configuration files.
 *
 * @author Eric Lafortune
 */
public class ConfigurationElement extends FileSet
{
    /**
     * Adds the contents of this configuration element to the given
     * configuration.
     * @param configuration the configuration to be extended.
     */
    public void appendTo(Configuration configuration)
    {
        File     baseDir;
        String[] fileNames;

        if (isReference())
        {
            // Get the referenced path or file set.
            Object referencedObject = getCheckedRef(Object.class,
                                                    Object.class.getName());

            if (referencedObject instanceof ConfigurationTask)
            {
                // The reference doesn't point to a file set, but to a
                // configuration task.
                ConfigurationTask configurationTask =
                    (ConfigurationTask)referencedObject;

                // Append the contents of the referenced configuration to the
                // current configuration.
                configurationTask.appendTo(configuration);

                return;
            }
            else if (referencedObject instanceof AbstractFileSet)
            {
                AbstractFileSet fileSet = (AbstractFileSet)referencedObject;

                // Get the names of the existing input files in the referenced file set.
                DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
                baseDir   = scanner.getBasedir();
                fileNames = scanner.getIncludedFiles();
            }
            else
            {
                throw new BuildException("The refid attribute doesn't point to a <proguardconfiguration> element or a <fileset> element");
            }
        }
        else
        {
            // Get the names of the existing input files in the referenced file set.
            DirectoryScanner scanner = getDirectoryScanner(getProject());
            baseDir   = scanner.getBasedir();
            fileNames = scanner.getIncludedFiles();
        }

        // Get the combined system properties and Ant properties, for
        // replacing ProGuard-style properties ('<...>').
        Properties properties = new Properties();
        properties.putAll(getProject().getProperties());

        try
        {
            // Append the contents of the configuration files to the current
            // configuration.
            for (int index = 0; index < fileNames.length; index++)
            {
                File configurationFile = new File(baseDir, fileNames[index]);

                try (ConfigurationParser parser =
                     new ConfigurationParser(configurationFile, properties))
                {
                    parser.parse(configuration);
                }
                catch (ParseException ex)
                {
                    throw new BuildException(ex.getMessage());
                }
            }
        }
        catch (IOException ex)
        {
            throw new BuildException(ex.getMessage());
        }
    }
}


================================================
FILE: ant/src/proguard/ant/ConfigurationTask.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.*;
import proguard.*;

import java.io.IOException;
import java.util.*;

/**
 * This Task allows to define a ProGuard configuration from Ant.
 *
 * @author Eric Lafortune
 */
public class ConfigurationTask extends Task
{
    protected final Configuration configuration = new Configuration();


    /**
     * Adds the contents of this configuration task to the given configuration.
     * @param configuration the configuration to be extended.
     */
    public void appendTo(Configuration configuration)
    {
        // Append all of these configuration entries to the given configuration.
        configuration.programJars                  = extendClassPath(configuration.programJars,
                                                                     this.configuration.programJars);

        configuration.libraryJars                  = extendClassPath(configuration.libraryJars,
                                                                     this.configuration.libraryJars);

        configuration.keep                         = extendClassSpecifications(configuration.keep,
                                                                               this.configuration.keep);

        configuration.keepDirectories              = extendList(configuration.keepDirectories,
                                                                this.configuration.keepDirectories);

        configuration.whyAreYouKeeping             = extendClassSpecifications(configuration.whyAreYouKeeping,
                                                                               this.configuration.whyAreYouKeeping);

        configuration.optimizations                = extendClassSpecifications(configuration.optimizations,
                                                                               this.configuration.optimizations);

        configuration.assumeNoSideEffects          = extendClassSpecifications(configuration.assumeNoSideEffects,
                                                                               this.configuration.assumeNoSideEffects);

        configuration.assumeNoExternalSideEffects  = extendClassSpecifications(configuration.assumeNoExternalSideEffects,
                                                                              this.configuration.assumeNoExternalSideEffects);

        configuration.assumeNoEscapingParameters   = extendClassSpecifications(configuration.assumeNoEscapingParameters,
                                                                               this.configuration.assumeNoEscapingParameters);

        configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues,
                                                                               this.configuration.assumeNoExternalReturnValues);

        configuration.assumeValues                 = extendClassSpecifications(configuration.assumeValues,
                                                                               this.configuration.assumeValues);

        configuration.keepPackageNames             = extendList(configuration.keepPackageNames,
                                                                this.configuration.keepPackageNames);

        configuration.keepAttributes               = extendList(configuration.keepAttributes,
                                                                this.configuration.keepAttributes);

        configuration.adaptClassStrings            = extendList(configuration.adaptClassStrings,
                                                                this.configuration.adaptClassStrings);

        configuration.adaptResourceFileNames       = extendList(configuration.adaptResourceFileNames,
                                                                this.configuration.adaptResourceFileNames);

        configuration.adaptResourceFileContents    = extendList(configuration.adaptResourceFileContents,
                                                                this.configuration.adaptResourceFileContents);

        configuration.note                         = extendList(configuration.note,
                                                                this.configuration.note);

        configuration.warn                         = extendList(configuration.warn,
                                                                this.configuration.warn);
    }


    // Ant task nested elements.

    public void addConfiguredInjar(ClassPathElement classPathElement)
    {
        configuration.programJars = extendClassPath(configuration.programJars,
                                                    classPathElement,
                                                    false);
    }


    public void addConfiguredOutjar(ClassPathElement classPathElement)
    {
        configuration.programJars = extendClassPath(configuration.programJars,
                                                    classPathElement,
                                                    true);
    }


    public void addConfiguredLibraryjar(ClassPathElement classPathElement)
    {
        configuration.libraryJars = extendClassPath(configuration.libraryJars,
                                                    classPathElement,
                                                    false);
    }


    public void addConfiguredKeepdirectory(FilterElement filterElement)
    {
        configuration.keepDirectories = extendFilter(configuration.keepDirectories,
                                                     filterElement);
    }


    public void addConfiguredKeepdirectories(FilterElement filterElement)
    {
        configuration.keepDirectories = extendFilter(configuration.keepDirectories,
                                                     filterElement);
    }


    public void addConfiguredKeep(KeepSpecificationElement keepSpecificationElement)
    {
        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      true,
                                                      true,
                                                      false);
    }


    public void addConfiguredKeepclassmembers(KeepSpecificationElement keepSpecificationElement)
    {
        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      false,
                                                      true,
                                                      false);
    }


    public void addConfiguredKeepclasseswithmembers(KeepSpecificationElement keepSpecificationElement)
    {
        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      true,
                                                      true,
                                                      true);
    }


    public void addConfiguredKeepnames(KeepSpecificationElement keepSpecificationElement)
    {
        // Set the shrinking flag, based on the name (backward compatibility).
        keepSpecificationElement.setAllowshrinking(true);

        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      true,
                                                      true,
                                                      false);
    }


    public void addConfiguredKeepclassmembernames(KeepSpecificationElement keepSpecificationElement)
    {
        // Set the shrinking flag, based on the name (backward compatibility).
        keepSpecificationElement.setAllowshrinking(true);

        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      false,
                                                      true,
                                                      false);
    }


    public void addConfiguredKeepclasseswithmembernames(KeepSpecificationElement keepSpecificationElement)
    {
        // Set the shrinking flag, based on the name (backward compatibility).
        keepSpecificationElement.setAllowshrinking(true);

        configuration.keep = extendKeepSpecifications(configuration.keep,
                                                      keepSpecificationElement,
                                                      true,
                                                      true,
                                                      true);
    }


    public void addConfiguredWhyareyoukeeping(ClassSpecificationElement classSpecificationElement)
    {
        configuration.whyAreYouKeeping = extendClassSpecifications(configuration.whyAreYouKeeping,
                                                                   classSpecificationElement);
    }


    public void addConfiguredAssumenosideeffects(ClassSpecificationElement classSpecificationElement)
    {
        configuration.assumeNoSideEffects = extendClassSpecifications(configuration.assumeNoSideEffects,
                                                                      classSpecificationElement);
    }


    public void addConfiguredAssumenoexternalsideeffects(ClassSpecificationElement classSpecificationElement)
    {
        configuration.assumeNoExternalSideEffects = extendClassSpecifications(configuration.assumeNoExternalSideEffects,
                                                                      classSpecificationElement);
    }


    public void addConfiguredAssumenoescapingparameters(ClassSpecificationElement classSpecificationElement)
    {
        configuration.assumeNoEscapingParameters = extendClassSpecifications(configuration.assumeNoEscapingParameters,
                                                                             classSpecificationElement);
    }


    public void addConfiguredAssumenoexternalreturnvalues(ClassSpecificationElement classSpecificationElement)
    {
        configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues,
                                                                               classSpecificationElement);
    }


    public void addConfiguredAssumevalues(ClassSpecificationElement classSpecificationElement)
    {
        configuration.assumeValues = extendClassSpecifications(configuration.assumeValues,
                                                               classSpecificationElement);
    }


    public void addConfiguredOptimizations(FilterElement filterElement)
    {
        addConfiguredOptimization(filterElement);
    }


    public void addConfiguredOptimization(FilterElement filterElement)
    {
        configuration.optimizations = extendFilter(configuration.optimizations,
                                                   filterElement);
    }


    public void addConfiguredKeeppackagename(FilterElement filterElement)
    {
        configuration.keepPackageNames = extendFilter(configuration.keepPackageNames,
                                                      filterElement,
                                                      true);
    }


    public void addConfiguredKeeppackagenames(FilterElement filterElement)
    {
        configuration.keepPackageNames = extendFilter(configuration.keepPackageNames,
                                                      filterElement,
                                                      true);
    }


    public void addConfiguredKeepattributes(FilterElement filterElement)
    {
        addConfiguredKeepattribute(filterElement);
    }


    public void addConfiguredKeepattribute(FilterElement filterElement)
    {
        configuration.keepAttributes = extendFilter(configuration.keepAttributes,
                                                    filterElement);
    }


    public void addConfiguredAdaptclassstrings(FilterElement filterElement)
    {
        configuration.adaptClassStrings = extendFilter(configuration.adaptClassStrings,
                                                       filterElement, true);
    }


    public void addConfiguredAdaptresourcefilenames(FilterElement filterElement)
    {
        configuration.adaptResourceFileNames = extendFilter(configuration.adaptResourceFileNames,
                                                            filterElement);
    }


    public void addConfiguredAdaptresourcefilecontents(FilterElement filterElement)
    {
        configuration.adaptResourceFileContents = extendFilter(configuration.adaptResourceFileContents,
                                                               filterElement);
    }


    public void addConfiguredDontnote(FilterElement filterElement)
    {
        configuration.note = extendFilter(configuration.note, filterElement, true);
    }


    public void addConfiguredDontwarn(FilterElement filterElement)
    {
        configuration.warn = extendFilter(configuration.warn, filterElement, true);
    }


    public void addConfiguredConfiguration(ConfigurationElement configurationElement)
    {
        configurationElement.appendTo(configuration);
    }


    // Implementations for Task.

    public void addText(String text) throws BuildException
    {
        try
        {
            Project project = getProject();

            // Replace Ant-style properties ('${...}').
            String arg = project.replaceProperties(text);

            // Get the combined system properties and Ant properties, for
            // replacing ProGuard-style properties ('<...>').
            Properties properties = new Properties();
            properties.putAll(project.getProperties());

            try (ConfigurationParser parser = new ConfigurationParser(arg,
                                                                      "embedded configuration",
                                                                      project.getBaseDir(),
                                                                      properties))
            {
                parser.parse(configuration);
            }
            catch (ParseException ex)
            {
                throw new BuildException(ex.getMessage());
            }
        }
        catch (IOException ex)
        {
            throw new BuildException(ex.getMessage());
        }
    }


    // Small utility methods.

    private ClassPath extendClassPath(ClassPath        classPath,
                                      ClassPathElement classPathElement,
                                      boolean          output)
    {
        if (classPath == null)
        {
            classPath = new ClassPath();
        }

        classPathElement.appendClassPathEntriesTo(classPath,
                                                  output);

        return classPath;
    }


    private ClassPath extendClassPath(ClassPath classPath,
                                      ClassPath additionalClassPath)
    {
        if (additionalClassPath != null)
        {
            if (classPath == null)
            {
                classPath = new ClassPath();
            }

            classPath.addAll(additionalClassPath);
        }

        return classPath;
    }


    private List extendKeepSpecifications(List                     keepSpecifications,
                                          KeepSpecificationElement keepSpecificationElement,
                                          boolean                  markClasses,
                                          boolean                  markClassMembers,
                                          boolean                  markClassesConditionally)
    {
        if (keepSpecifications == null)
        {
            keepSpecifications = new ArrayList();
        }

        keepSpecificationElement.appendTo(keepSpecifications,
                                          markClasses,
                                          markClassMembers,
                                          markClassesConditionally);

        return keepSpecifications;
    }


    private List extendClassSpecifications(List                      classSpecifications,
                                           ClassSpecificationElement classSpecificationElement)
    {
        if (classSpecifications == null)
        {
            classSpecifications = new ArrayList();
        }

        classSpecificationElement.appendTo(classSpecifications);

        return classSpecifications;
    }


    private List extendClassSpecifications(List classSpecifications,
                                           List additionalClassSpecifications)
    {
        if (additionalClassSpecifications != null)
        {
            if (classSpecifications == null)
            {
                classSpecifications = new ArrayList();
            }

            classSpecifications.addAll(additionalClassSpecifications);
        }

        return classSpecifications;
    }


    private List extendFilter(List          filter,
                              FilterElement filterElement)
    {
        return extendFilter(filter, filterElement, false);
    }


    private List extendFilter(List          filter,
                              FilterElement filterElement,
                              boolean       internal)
    {
        if (filter == null)
        {
            filter = new ArrayList();
        }

        filterElement.appendTo(filter, internal);

        return filter;
    }


    private List extendList(List list,
                            List additionalList)
    {
        if (additionalList != null)
        {
            if (list == null)
            {
                list = new ArrayList();
            }

            list.addAll(additionalList);
        }

        return list;
    }
}


================================================
FILE: ant/src/proguard/ant/FilterElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.types.DataType;
import proguard.classfile.util.ClassUtil;
import proguard.util.ListUtil;

import java.util.List;

/**
 * This DataType represents a name filter in Ant.
 *
 * @author Eric Lafortune
 */
public class FilterElement extends DataType
{
    private String filter;


    /**
     * Adds the contents of this element to the given name filter.
     * @param filter   the list of attributes to be extended.
     * @param internal specifies whether the filter string should be converted
     *                 to internal types.
     */
    public void appendTo(List filter, boolean internal)
    {
        // Get the referenced element, or else this one.
        FilterElement filterElement = isReference() ?
            (FilterElement)getCheckedRef(this.getClass(),
                                         this.getClass().getName()) :
            this;

        String filterString = filterElement.filter;

        if (filterString == null)
        {
            // Clear the filter to keep all names.
            filter.clear();
        }
        else
        {
            if (internal)
            {
                filterString = ClassUtil.internalClassName(filterString);
            }

            // Append the filter.
            filter.addAll(ListUtil.commaSeparatedList(filterString));
        }
    }


    // Ant task attributes.

    public void setName(String name)
    {
        this.filter = name;
    }


    public void setFilter(String filter)
    {
        this.filter = filter;
    }
}


================================================
FILE: ant/src/proguard/ant/KeepSpecificationElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import proguard.KeepClassSpecification;

import java.util.List;

/**
 * This DataType represents a class specification in Ant.
 *
 * @author Eric Lafortune
 */
public class KeepSpecificationElement extends ClassSpecificationElement
{
    private boolean markDescriptorClasses;
    private boolean markCodeAttributes;
    private boolean allowShrinking;
    private boolean allowOptimization;
    private boolean allowObfuscation;


    /**
     * Adds the contents of this class specification element to the given list.
     * @param keepSpecifications the class specifications to be extended.
     * @param markClasses        specifies whether to mark the classes.
     * @param markConditionally  specifies whether to mark the classes
     *                           and class members conditionally.
     */
    public void appendTo(List    keepSpecifications,
                         boolean markClasses,
                         boolean markClassMembers,
                         boolean markConditionally)
    {
        // Get the referenced file set, or else this one.
        KeepSpecificationElement keepSpecificationElement = isReference() ?
            (KeepSpecificationElement)getCheckedRef(this.getClass(),
                                                    this.getClass().getName()) :
            this;

        KeepClassSpecification keepClassSpecification =
            new KeepClassSpecification(markClasses,
                                       markClassMembers,
                                       markConditionally,
                                       markDescriptorClasses,
                                       markCodeAttributes,
                                       allowShrinking,
                                       allowOptimization,
                                       allowObfuscation,
                                       null,
                                       createClassSpecification(keepSpecificationElement));

        // Add it to the list.
        keepSpecifications.add(keepClassSpecification);
    }


    // Ant task attributes.

    public void setIncludedescriptorclasses(boolean markDescriptorClasses)
    {
        this.markDescriptorClasses = markDescriptorClasses;
    }


    public void setIncludecode(boolean markCodeAttributes)
    {
        this.markCodeAttributes = markCodeAttributes;
    }


    public void setAllowshrinking(boolean allowShrinking)
    {
        this.allowShrinking = allowShrinking;
    }


    public void setAllowoptimization(boolean allowOptimization)
    {
        this.allowOptimization = allowOptimization;
    }


    public void setAllowobfuscation(boolean allowObfuscation)
    {
        this.allowObfuscation = allowObfuscation;
    }
}


================================================
FILE: ant/src/proguard/ant/MemberSpecificationElement.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import proguard.*;
import proguard.classfile.*;
import proguard.classfile.util.ClassUtil;
import proguard.util.ListUtil;

import java.util.*;

/**
 * This DataType represents a class member specification in Ant.
 *
 * @author Eric Lafortune
 */
public class MemberSpecificationElement extends DataType
{
    private String access;
    private String annotation;
    private String type;
    private String name;
    private String parameters;
    private String values;


    /**
     * Adds the contents of this class member specification element to the given
     * list.
     * @param memberSpecifications the class member specifications to be
     *                                  extended.
     * @param isMethod                  specifies whether this specification
     *                                  refers to a method.
     * @param isConstructor             specifies whether this specification
     *                                  refers to a constructor.
     */
    public void appendTo(List    memberSpecifications,
                         boolean isMethod,
                         boolean isConstructor)
    {
        // Get the referenced file set, or else this one.
        MemberSpecificationElement memberSpecificationElement = isReference() ?
            (MemberSpecificationElement)getCheckedRef(this.getClass(),
                                                      this.getClass().getName()) :
            this;

        // Create a new class member specification.
        String access     = memberSpecificationElement.access;
        String type       = memberSpecificationElement.type;
        String annotation = memberSpecificationElement.annotation;
        String name       = memberSpecificationElement.name;
        String parameters = memberSpecificationElement.parameters;
        String values     = memberSpecificationElement.values;

        // Perform some basic conversions and checks on the attributes.
        if (annotation != null)
        {
            annotation = ClassUtil.internalType(annotation);
        }

        if (isMethod)
        {
            if (isConstructor)
            {
                if (type != null)
                {
                    throw new BuildException("Type attribute not allowed in constructor specification ["+type+"]");
                }

                if (parameters != null)
                {
                    type = JavaTypeConstants.VOID;
                }

                if (values != null)
                {
                    throw new BuildException("Values attribute not allowed in constructor specification ["+values+"]");
                }

                name = ClassConstants.METHOD_NAME_INIT;
            }
            else if ((type != null) ^ (parameters != null))
            {
                throw new BuildException("Type and parameters attributes must always be present in combination in method specification");
            }
        }
        else
        {
            if (parameters != null)
            {
                throw new BuildException("Parameters attribute not allowed in field specification ["+parameters+"]");
            }
        }

        if (values != null)
        {
            if (type == null)
            {
                throw new BuildException("Values attribute must be specified in combination with type attribute in class member specification ["+values+"]");
            }
        }

        List parameterList = ListUtil.commaSeparatedList(parameters);

        String descriptor =
            parameters != null ? ClassUtil.internalMethodDescriptor(type, parameterList) :
            type       != null ? ClassUtil.internalType(type)                            :
                                 null;

        MemberSpecification memberSpecification = values != null ?
            new MemberValueSpecification(requiredAccessFlags(true, access),
                                         requiredAccessFlags(false, access),
                                         annotation,
                                         name,
                                         descriptor,
                                         parseValues(type,
                                                     ClassUtil.internalType(type),
                                                     values)) :
            new MemberSpecification(requiredAccessFlags(true,  access),
                                    requiredAccessFlags(false, access),
                                    annotation,
                                    name,
                                    descriptor);

        // Add it to the list.
        memberSpecifications.add(memberSpecification);
    }


    // Ant task attributes.

    public void setAccess(String access)
    {
        this.access = access;
    }


    public void setAnnotation(String annotation)
    {
        this.annotation = annotation;
    }


    public void setType(String type)
    {
        this.type = type;
    }


    public void setName(String name)
    {
        this.name = name;
    }


    public void setParameters(String parameters)
    {
        this.parameters = parameters;
    }


    /**
     * @deprecated Use {@link #setParameters(String)} instead.
     */
    public void setParam(String parameters)
    {
        this.parameters = parameters;
    }


    public void setValues(String values)
    {
        this.values = values;
    }


    // Small utility methods.

    private int requiredAccessFlags(boolean set,
                                    String  access)
    throws BuildException
    {
        int accessFlags = 0;

        if (access != null)
        {
            StringTokenizer tokenizer = new StringTokenizer(access, " ,");
            while (tokenizer.hasMoreTokens())
            {
                String token = tokenizer.nextToken();

                if (token.startsWith("!") ^ set)
                {
                    String strippedToken = token.startsWith("!") ?
                        token.substring(1) :
                        token;

                    int accessFlag =
                        strippedToken.equals(JavaAccessConstants.PUBLIC)       ? AccessConstants.PUBLIC       :
                        strippedToken.equals(JavaAccessConstants.PRIVATE)      ? AccessConstants.PRIVATE      :
                        strippedToken.equals(JavaAccessConstants.PROTECTED)    ? AccessConstants.PROTECTED    :
                        strippedToken.equals(JavaAccessConstants.STATIC)       ? AccessConstants.STATIC       :
                        strippedToken.equals(JavaAccessConstants.FINAL)        ? AccessConstants.FINAL        :
                        strippedToken.equals(JavaAccessConstants.SYNCHRONIZED) ? AccessConstants.SYNCHRONIZED :
                        strippedToken.equals(JavaAccessConstants.VOLATILE)     ? AccessConstants.VOLATILE     :
                        strippedToken.equals(JavaAccessConstants.TRANSIENT)    ? AccessConstants.TRANSIENT    :
                        strippedToken.equals(JavaAccessConstants.BRIDGE)       ? AccessConstants.BRIDGE       :
                        strippedToken.equals(JavaAccessConstants.VARARGS)      ? AccessConstants.VARARGS      :
                        strippedToken.equals(JavaAccessConstants.NATIVE)       ? AccessConstants.NATIVE       :
                        strippedToken.equals(JavaAccessConstants.ABSTRACT)     ? AccessConstants.ABSTRACT     :
                        strippedToken.equals(JavaAccessConstants.STRICT)       ? AccessConstants.STRICT       :
                        strippedToken.equals(JavaAccessConstants.SYNTHETIC)    ? AccessConstants.SYNTHETIC    :
                                                                                 0;

                    if (accessFlag == 0)
                    {
                        throw new BuildException("Incorrect class member access modifier ["+strippedToken+"]");
                    }

                    accessFlags |= accessFlag;
                }
            }
        }

        return accessFlags;
    }


    /**
     * Parses the given string as a value or value range of the given primitive
     * type. For example, values "123" or "100..199" of type "int" ("I").
     */
    private Number[] parseValues(String externalType,
                                 String internalType,
                                 String string)
    throws BuildException
    {
        int rangeIndex = string.lastIndexOf("..");
        return rangeIndex >= 0 ?
            new Number[]
            {
                parseValue(externalType, internalType, string.substring(0, rangeIndex)),
                parseValue(externalType, internalType, string.substring(rangeIndex + 2))
            } :
            new Number[]
            {
                parseValue(externalType, internalType, string)
            };
    }


    /**
     * Parses the given string as a value of the given primitive type.
     * For example, value "123" of type "int" ("I").
     * For example, value "true" of type "boolean" ("Z"), returned as 1.
     */
    private Number parseValue(String externalType,
                              String internalType,
                              String string)
    throws BuildException
    {
        try
        {
            switch (internalType.charAt(0))
            {
                case TypeConstants.BOOLEAN:
                {
                    return parseBoolean(string);
                }
                case TypeConstants.BYTE:
                case TypeConstants.CHAR:
                case TypeConstants.SHORT:
                case TypeConstants.INT:
                {
                    return Integer.decode(string);
                }
                //case TypeConstants.LONG:
                //{
                //    return Long.decode(string);
                //}
                //case TypeConstants.FLOAT:
                //{
                //    return Float.valueOf(string);
                //}
                //case TypeConstants.DOUBLE:
                //{
                //    return Double.valueOf(string);
                //}
                default:
                {
                    throw new BuildException("Can't handle '"+externalType+"' constant ["+string+"]");
                }
            }
        }
        catch (NumberFormatException e)
        {
            throw new BuildException("Can't parse "+externalType+" constant ["+string+"]");
        }
    }


    /**
     * Parses the given boolean string as an integer (0 or 1).
     */
    private Integer parseBoolean(String string)
    throws BuildException
    {
        if      ("false".equals(string))
        {
            return Integer.valueOf(0);
        }
        else if ("true".equals(string))
        {
            return Integer.valueOf(1);
        }
        else
        {
            throw new BuildException("Unknown boolean constant ["+string+"]");
        }
    }
}


================================================
FILE: ant/src/proguard/ant/ProGuardTask.java
================================================
/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package proguard.ant;

import org.apache.tools.ant.BuildException;
import proguard.*;
import proguard.classfile.util.ClassUtil;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * This Task allows to configure and run ProGuard from Ant.
 *
 * @author Eric Lafortune
 */
public class ProGuardTask extends ConfigurationTask
{
    // Ant task attributes.

    public void setConfiguration(File configurationFile) throws BuildException
    {
        try
        {
            // Get the combined system properties and Ant properties, for
            // replacing ProGuard-style properties ('<...>').
            Properties properties = new Properties();
            properties.putAll(getProject().getProperties());

            URL configUrl =
                ConfigurationElement.class.getResource(configurationFile.toString());

            try (ConfigurationParser parser = configUrl != null ?
                    new ConfigurationParser(configUrl, properties) :
                    new ConfigurationParser(configurationFile, properties))
            {
                parser.parse(configuration);
            }
            catch (ParseException e)
            {
                throw new BuildException(e.getMessage(), e);
            }
        }
        catch (IOException e)
        {
            throw new BuildException(e.getMessage(), e);
        }
    }


    /**
     * @deprecated Use the nested outjar element instead.
     */
    public void setOutjar(String parameters)
    {
        throw new BuildException("Use the <outjar> nested element instead of the 'outjar' attribute");
    }


    public void setSkipnonpubliclibraryclasses(boolean skipNonPublicLibraryClasses)
    {
        configuration.skipNonPublicLibraryClasses = skipNonPublicLibraryClasses;
    }


    public void setSkipnonpubliclibraryclassmembers(boolean skipNonPublicLibraryClassMembers)
    {
        configuration.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembers;
    }


    public void setTarget(String target)
    {
        configuration.targetClassVersion = ClassUtil.internalClassVersion(target);
        if (configuration.targetClassVersion == 0)
        {
            throw new BuildException("Unsupported target '"+target+"'");
        }
    }


    public void setForceprocessing(boolean forceProcessing)
    {
        configuration.lastModified = forceProcessing ? Long.MAX_VALUE : 0;
    }


    public void setPrintseeds(File printSeeds)
    {
        configuration.printSeeds = optionalFile(printSeeds);
    }


    public void setShrink(boolean shrink)
    {
        configuration.shrink = shrink;
    }


    public void setPrintusage(File printUsage)
    {
        configuration.printUsage = optionalFile(printUsage);
    }


    public void setOptimize(boolean optimize)
    {
        configuration.optimize = optimize;
    }


    public void setOptimizationpasses(int optimizationPasses)
    {
        configuration.optimizationPasses = optimizationPasses;
    }


    public void setAllowaccessmodification(boolean allowAccessModification)
    {
        configuration.allowAccessModification = allowAccessModification;
    }


    public void setMergeinterfacesaggressively(boolean mergeinterfacesaggressively)
    {
        configuration.mergeInterfacesAggressively = mergeinterfacesaggressively;
    }


    public void setObfuscate(boolean obfuscate)
    {
        configuration.obfuscate = obfuscate;
    }


    public void setPrintmapping(File printMapping)
    {
        configuration.printMapping = optionalFile(printMapping);
    }


    public void setApplymapping(File applyMapping)
    {
        configuration.applyMapping = resolvedFile(applyMapping);
    }


    public void setObfuscationdictionary(File obfuscationDictionary)
    {
        configuration.obfuscationDictionary = resolvedURL(obfuscationDictionary);
    }


    public void setClassobfuscationdictionary(File classObfuscationDictionary)
    {
        configuration.classObfuscationDictionary = resolvedURL(classObfuscationDictionary);
    }


    public void setPackageobfuscationdictionary(File packageObfuscationDictionary)
    {
        configuration.packageObfuscationDictionary = resolvedURL(packageObfuscationDictionary);
    }


    public void setOverloadaggressively(boolean overloadAggressively)
    {
        configuration.overloadAggressively = overloadAggressively;
    }


    public void setUseuniqueclassmembernames(boolean useUniqueClassMemberNames)
    {
        configuration.useUniqueClassMemberNames = useUniqueClassMemberNames;
    }


    public void setUsemixedcaseclassnames(boolean useMixedCaseClassNames)
    {
        configuration.useMixedCaseClassNames = useMixedCaseClassNames;
    }


    public void setFlattenpackagehierarchy(String flattenPackageHierarchy)
    {
        configuration.flattenPackageHierarchy = ClassUtil.internalClassName(flattenPackageHierarchy);
    }


    public void setRepackageclasses(String repackageClasses)
    {
        configuration.repackageClasses = ClassUtil.internalClassName(repackageClasses);
    }

    /**
     * @deprecated Use the repackageclasses attribute instead.
     */
    public void setDefaultpackage(String defaultPackage)
    {
        configuration.repackageClasses = ClassUtil.internalClassName(defaultPackage);
    }


    public void setKeepparameternames(boolean keepParameterNames)
    {
        configuration.keepParameterNames = keepParameterNames;
    }


    public void setRenamesourcefileattribute(String newSourceFileAttribute)
    {
        configuration.newSourceFileAttribute = newSourceFileAttribute;
    }


    public void setPreverify(boolean preverify)
    {
        configuration.preverify = preverify;
    }


    public void setMicroedition(boolean microEdition)
    {
        configuration.microEdition = microEdition;
    }


    public void setAndroid(boolean android)
    {
        configuration.android = android;
    }


    public void setVerbose(boolean verbose)
    {
        configuration.verbose = verbose;
    }


    public void setNote(boolean note)
    {
        if (note)
        {
            // Switch on notes if they were completely disabled.
            if (configuration.note != null &&
                configuration.note.isEmpty())
            {
                configuration.note = null;
            }
        }
        else
        {
            // Switch off notes.
            configuration.note = new ArrayList();
        }
    }


    public void setWarn(boolean warn)
    {
        if (warn)
        {
            // Switch on warnings if they were completely disabled.
            if (configuration.warn != null &&
                configuration.warn.isEmpty())
            {
                configuration.warn = null;
            }
        }
        else
        {
            // Switch off warnings.
            configuration.warn = new ArrayList();
        }
    }


    public void setIgnorewarnings(boolean ignoreWarnings)
    {
        configuration.ignoreWarnings = ignoreWarnings;
    }


    public void setPrintconfiguration(File printConfiguration)
    {
        configuration.printConfiguration = optionalFile(printConfiguration);
    }


    public void setDump(File dump)
    {
        configuration.dump = optionalFile(dump);
    }


    public void setAddconfigurationdebugging(boolean addConfigurationDebugging)
    {
        configuration.addConfigurationDebugging = addConfigurationDebugging;
    }

    public void setKeepkotlinmetadata(boolean keepKotlinMetadata)
    {
        configuration.keepKotlinMetadata = keepKotlinMetadata;
    }


    // Implementations for Task.

    public void execute() throws BuildException
    {
        try
        {
            ProGuard proGuard = new ProGuard(configuration);
            proGuard.execute();
        }
        catch (Exception e)
        {
            throw new BuildException(e.getMessage(), e);
        }
    }


    // Small utility methods.

    /**
     * Returns a file that is properly resolved with respect to the project
     * directory, or <code>null</code> or empty if its name is actually a
     * boolean flag.
     */
    private File optionalFile(File file)
    {
        String fileName = file.getName();

        return
            fileName.equalsIgnoreCase("false") ||
            fileName.equalsIgnoreCase("no")    ||
            fileName.equalsIgnoreCase("off")    ? null :
            fileName.equalsIgnoreCase("true")  ||
            fileName.equalsIgnoreCase("yes")   ||
            fileName.equalsIgnoreCase("on")     ? Configuration.STD_OUT :
                                                  resolvedFile(file);
    }


    /**
     * Returns a URL that is properly resolved with respect to the project
     * directory.
     */
    private URL resolvedURL(File file)
    {
        try
        {
            return resolvedFile(file).toURI().toURL();
        }
        catch (MalformedURLException e)
        {
            return null;
        }
    }


    /**
     * Returns a file that is properly resolved with respect to the project
     * directory.
     */
    private File resolvedFile(File file)
    {
        return file.isAbsolute() ? file :
                                   new File(getProject().getBaseDir(),
                                            file.getName());
    }
}


================================================
FILE: ant/src/proguard/ant/package.html
================================================
<body>
This package contains the Ant task for ProGuard.
</body>


================================================
FILE: ant/src/proguard/ant/task.properties
================================================
proguard              = proguard.ant.ProGuardTask
proguardconfiguration = proguard.ant.ConfigurationTask


================================================
FILE: base/build.gradle
================================================
plugins {
    id 'java-library'
    id 'java-test-fixtures'
    id 'maven-publish'
    id "org.jetbrains.kotlin.jvm" version "$kotlinVersion"
    id 'com.adarshr.test-logger' version '3.0.0'
    id 'de.jansauer.printcoverage' version '2.0.0'
    id 'jacoco'
    id "org.jlleitschuh.gradle.ktlint" version '10.2.1'
}

repositories {
    mavenCentral()
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
  kotlinOptions {
    jvmTarget = "${target}"
  }
}

dependencies {
    api "re.obfuscator:dprotect-core:${dprotectCoreVersion}"
    implementation "com.google.code.gson:gson:${gsonVersion}"
    implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
    implementation 'org.json:json:20220924'

    testImplementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
    testImplementation 'dev.zacsweers.kctfork:core:0.2.1'
    testImplementation 'io.kotest:kotest-runner-junit5-jvm:5.5.4' // for kotest framework
    testImplementation 'io.kotest:kotest-assertions-core-jvm:5.5.4' // for kotest core jvm assertions
    testImplementation 'io.kotest:kotest-property-jvm:5.5.4' // for kotest property test
    testImplementation 'io.mockk:mockk:1.13.2' // for mocking

    testImplementation(testFixtures("com.guardsquare:proguard-core:9.0.8")) {
        exclude group: 'com.guardsquare', module: 'proguard-core'
    }
}

jar {
    manifest {
        attributes(
                'Multi-Release': true,
                'Implementation-Version': archiveVersion.get())
    }
}

// Early access automatic downloads are not yet supported:
// https://github.com/gradle/gradle/issues/14814
// But it will work if e.g. Java N-ea is pre-installed
def javaVersionsForTest = 9..19

test {
    useJUnitPlatform()
}

task testAllJavaVersions() { testAllTask ->
    dependsOn(test) // the usual test runs on Java 8

    javaVersionsForTest.each {version ->
        task("testJava$version", type: Test) {
            useJUnitPlatform()
            ignoreFailures = true

            // The version of bytebuddy used by mockk only supports Java 20 experimentally so far
            if (version == 20) systemProperty 'net.bytebuddy.experimental', true

            testAllTask.dependsOn(it)

            javaLauncher = javaToolchains.launcherFor {
                languageVersion = JavaLanguageVersion.of(version)
            }
        }
    }
}

jacocoTestReport {
    // Define which classes need to be monitored
    def sources = files(project.sourceSets.main.allSource.srcDirs)
    sourceDirectories.setFrom(sources)
    additionalSourceDirs.setFrom(sources)
    sourceDirectories.setFrom(sources)
    def classes = files(project.sourceSets.main.output.classesDirs)
    classDirectories.setFrom(classes)
    executionData.setFrom project.fileTree(dir: '.', include: '**/build/jacoco/*.exec')
    reports {
        xml.enabled true
        csv.enabled false
        html.destination file("${buildDir}/reports/coverage")
    }
}

afterEvaluate {
    publishing {
        publications.getByName(project.name) {
            pom {
                description = 'ProGuard is a free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
            }
        }
    }
}


================================================
FILE: base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;

public class ArithmeticObfuscationClassSpecification extends ObfuscationClassSpecification
{
    public final boolean skipFloat;

    public ArithmeticObfuscationClassSpecification(ClassSpecification classSpecification,
                                                   Level              level,
                                                   boolean            skipFloat)
    {
        super(classSpecification, level);
        this.skipFloat = false;
    }

    @Override
    public boolean equals(Object object)
    {
        if (object == null ||
            this.getClass() != object.getClass())
        {
            return false;
        }

        ArithmeticObfuscationClassSpecification other = (ArithmeticObfuscationClassSpecification)object;
        return
            this.skipFloat == other.skipFloat &&
            super.equals(other);
    }

    @Override
    public int hashCode()
    {
        return
            (skipFloat ? 0 : 1) ^
            super.hashCode();
    }


    @Override
    public Object clone()
    {
        return super.clone();
    }
}



================================================
FILE: base/src/main/java/dprotect/CFObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;

public class CFObfuscationClassSpecification extends ObfuscationClassSpecification
{
    public CFObfuscationClassSpecification(ClassSpecification classSpecification,
                                           Level              level)
    {
        super(classSpecification, level);
    }

    @Override
    public boolean equals(Object object)
    {
        if (object == null ||
            this.getClass() != object.getClass())
        {
            return false;
        }

        CFObfuscationClassSpecification other = (CFObfuscationClassSpecification)object;
        return super.equals(other);
    }

    @Override
    public int hashCode()
    {
        return super.hashCode();
    }


    @Override
    public Object clone()
    {
        return super.clone();
    }
}



================================================
FILE: base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java
================================================
package dprotect;

import proguard.ClassSpecificationVisitorFactory;

import proguard.classfile.visitor.*;

import java.util.List;
import java.util.function.Function;

public class ClassObfuSpecVisitorFactory extends ClassSpecificationVisitorFactory
{
    public ClassPoolVisitor createClassPoolVisitor(List classSpecifications,
                                                   Function<ObfuscationClassSpecification, ClassVisitor>  classCreator,
                                                   Function<ObfuscationClassSpecification, MemberVisitor> memberCreator)
    {
        MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor();

        if (classSpecifications != null)
        {
            for (int index = 0; index < classSpecifications.size(); index++)
            {
                ObfuscationClassSpecification classSpecification =
                    (ObfuscationClassSpecification)classSpecifications.get(index);

                ClassVisitor classVisitor = null;
                MemberVisitor memberVisitor = null;

                if (classCreator != null)
                {
                    classVisitor = classCreator.apply(classSpecification);
                }

                if (memberCreator != null)
                {
                    memberVisitor = memberCreator.apply(classSpecification);
                }

                multiClassPoolVisitor.addClassPoolVisitor(
                    super.createClassPoolVisitor(classSpecification,
                                                 classVisitor,
                                                 memberVisitor,
                                                 memberVisitor,
                                                 null,
                                                 null));
            }
        }
        return multiClassPoolVisitor;

    }
}


================================================
FILE: base/src/main/java/dprotect/Configuration.java
================================================
package dprotect;

import proguard.ClassSpecification;

import java.util.*;


/**
 * The extended dProtect configuration based on Proguard
 * @author Romain Thomas
 */

public class Configuration extends proguard.Configuration
{

    ///////////////////////////////////////////////////////////////////////////
    // Obfuscation options.
    ///////////////////////////////////////////////////////////////////////////


    /**
     * These options are used for deobfuscation purpose and
     * should not be used right now.
     */
    public ClassSpecification            deobfStrDecodeName;
    public String                        deobfStrXorKey;

    /**
     * List of obfuscation passes enbled
     */
    public List<String>                                 obfuscations;

    /**
     * List of classes which must be constant-obfuscated
     */
    public List<ConstantObfuscationClassSpecification>   obfuscateConstants;

    /**
     * List of classes which must be control-flow-obfuscated
     */
    public List<CFObfuscationClassSpecification>         obfuscateControlFlow;

    /**
     * List of classes for which arithmetic operations must
     * be obfuscated
     */
    public List<ArithmeticObfuscationClassSpecification> obfuscateArithmetic;

    /**
     * List of classes for which strings must be obfuscated
     */
    public List<ClassSpecification>                      obfuscateStrings;

    /**
     * List of string that must also be obfuscated
     */
    public List<String>                                  obfuscateStringsList;


    /**
     * Seed used for the random generator of obfuscation passes
     */
    public Integer                                       seed = null;
}


================================================
FILE: base/src/main/java/dprotect/ConfigurationConstants.java
================================================
package dprotect;

public class ConfigurationConstants extends proguard.ConfigurationConstants
{
    public static final String OBFUSCATIONS           = "-obfuscations";
    public static final String OBFUSCATION_SEED       = "-obfuscation-seed";
    public static final String OBFUSCATE_STRING       = "-obfuscate-strings";
    public static final String OBFUSCATE_ARITHMETIC   = "-obfuscate-arithmetic";
    public static final String OBFUSCATE_CONSTANTS    = "-obfuscate-constants";
    public static final String OBFUSCATE_CONTROL_FLOW = "-obfuscate-control-flow";

    public static final String OBFUCATION_LEVEL_LOW    = "low";
    public static final String OBFUCATION_LEVEL_MEDIUM = "medium";
    public static final String OBFUCATION_LEVEL_HIGH   = "high";

    public static final String ARITHMETIC_OPT_SKIP_FLOAT = "skipfloat";

    public static final String DEOBFUSCATE_XOR_STRINGS_DECODE_NAME = "-deobfuscate-xor-strings-decode-name";
    public static final String DEOBFUSCATE_XOR_STRINGS_KEY         = "-deobfuscate-xor-strings-key";
}


================================================
FILE: base/src/main/java/dprotect/ConfigurationParser.java
================================================
package dprotect;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import proguard.ClassSpecification;
import proguard.ParseException;
import proguard.WordReader;
import proguard.classfile.JavaAccessConstants;
import proguard.classfile.util.ClassUtil;

import java.io.*;
import java.net.*;
import java.util.*;

public class ConfigurationParser extends proguard.ConfigurationParser
{

    private static final Logger logger = LogManager.getLogger(ConfigurationParser.class);

    public ConfigurationParser(String[]   args,
                               Properties properties) throws IOException
    {
        super(args, properties);
    }



    public ConfigurationParser(String[]   args,
                               File       baseDir,
                               Properties properties) throws IOException
    {
        super(args, baseDir, properties);
    }



    public ConfigurationParser(String     lines,
                               String     description,
                               File       baseDir,
                               Properties properties) throws IOException
    {
        super(lines, description, baseDir, properties);
    }



    public ConfigurationParser(File file) throws IOException
    {
        super(file);
    }



    public ConfigurationParser(File       file,
                               Properties properties) throws IOException
    {
        super(file, properties);
    }



    public ConfigurationParser(URL        url,
                               Properties properties) throws IOException
    {
        super(url, properties);
    }



    public ConfigurationParser(WordReader reader,
                               Properties properties) throws IOException
    {
        super(reader, properties);
    }


    public void parse(Configuration configuration)
    throws ParseException, IOException
    {
        while (nextWord != null)
        {
            lastComments = reader.lastComments();

            // First include directives.
            if      (ConfigurationConstants.AT_DIRECTIVE                                     .startsWith(nextWord) ||
                     ConfigurationConstants.INCLUDE_DIRECTIVE                                .startsWith(nextWord)) configuration.lastModified                          = super.parseIncludeArgument(configuration.lastModified);
            else if (ConfigurationConstants.BASE_DIRECTORY_DIRECTIVE                         .startsWith(nextWord)) super.parseBaseDirectoryArgument();

            // Then configuration options with or without arguments.
            else if (ConfigurationConstants.INJARS_OPTION                                    .startsWith(nextWord)) configuration.programJars                           = super.parseClassPathArgument(configuration.programJars, false, true);
            else if (ConfigurationConstants.OUTJARS_OPTION                                   .startsWith(nextWord)) configuration.programJars                           = super.parseClassPathArgument(configuration.programJars, true, false);
            else if (ConfigurationConstants.LIBRARYJARS_OPTION                               .startsWith(nextWord)) configuration.libraryJars                           = super.parseClassPathArgument(configuration.libraryJars, false, false);
            else if (ConfigurationConstants.RESOURCEJARS_OPTION                              .startsWith(nextWord)) throw new ParseException("The '-resourcejars' option is no longer supported. Please use the '-injars' option for all input");
            else if (ConfigurationConstants.SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION           .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses           = super.parseNoArgument(true);
            else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION      .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses           = super.parseNoArgument(false);
            else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION.startsWith(nextWord)) configuration.skipNonPublicLibraryClassMembers      = super.parseNoArgument(false);
            else if (ConfigurationConstants.TARGET_OPTION                                    .startsWith(nextWord)) configuration.targetClassVersion                    = super.parseClassVersion();
            else if (ConfigurationConstants.DONT_COMPRESS_OPTION                             .startsWith(nextWord)) configuration.dontCompress                          = super.parseCommaSeparatedList("file name", true, true, false, true, false, true, false, false, false, configuration.dontCompress);
            else if (ConfigurationConstants.ZIP_ALIGN_OPTION                                 .startsWith(nextWord)) configuration.zipAlign                              = super.parseIntegerArgument();
            else if (ConfigurationConstants.FORCE_PROCESSING_OPTION                          .startsWith(nextWord)) configuration.lastModified                          = super.parseNoArgument(Long.MAX_VALUE);

            else if (ConfigurationConstants.IF_OPTION                                        .startsWith(nextWord)) configuration.keep                                  = super.parseIfCondition(configuration.keep);
            else if (ConfigurationConstants.KEEP_OPTION                                      .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, true,  true,  false, false, false, null);
            else if (ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION                        .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, false, true,  false, false, false, null);
            else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION                 .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, false, true,  false, true,  false, null);
            else if (ConfigurationConstants.KEEP_NAMES_OPTION                                .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, true,  true,  false, false, true,  null);
            else if (ConfigurationConstants.KEEP_CLASS_MEMBER_NAMES_OPTION                   .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, false, true,  false, false, true,  null);
            else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION            .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, false, true,  false, true,  true,  null);
            else if (ConfigurationConstants.KEEP_CODE_OPTION                                 .startsWith(nextWord)) configuration.keep                                  = super.parseKeepClassSpecificationArguments(configuration.keep, false, false, true,  false, false, null);
            else if (ConfigurationConstants.PRINT_SEEDS_OPTION                               .startsWith(nextWord)) configuration.printSeeds                            = super.parseOptionalFile();

            // After '-keep'.
            else if (ConfigurationConstants.KEEP_DIRECTORIES_OPTION                          .startsWith(nextWord)) configuration.keepDirectories                       = super.parseCommaSeparatedList("directory name", true, true, false, true, false, true, true, false, false, configuration.keepDirectories);

            else if (ConfigurationConstants.DONT_SHRINK_OPTION                               .startsWith(nextWord)) configuration.shrink                                = super.parseNoArgument(false);
            else if (ConfigurationConstants.PRINT_USAGE_OPTION                               .startsWith(nextWord)) configuration.printUsage                            = super.parseOptionalFile();
            else if (ConfigurationConstants.WHY_ARE_YOU_KEEPING_OPTION                       .startsWith(nextWord)) configuration.whyAreYouKeeping                      = super.parseClassSpecificationArguments(configuration.whyAreYouKeeping);

            else if (ConfigurationConstants.DONT_OPTIMIZE_OPTION                             .startsWith(nextWord)) configuration.optimize                              = super.parseNoArgument(false);
            else if (ConfigurationConstants.OPTIMIZATION_PASSES                              .startsWith(nextWord)) configuration.optimizationPasses                    = super.parseIntegerArgument();
            else if (ConfigurationConstants.OPTIMIZATIONS                                    .startsWith(nextWord)) configuration.optimizations                         = super.parseCommaSeparatedList("optimization name", true, false, false, false, false, true, false, false, false, configuration.optimizations);
            else if (ConfigurationConstants.ASSUME_NO_SIDE_EFFECTS_OPTION                    .startsWith(nextWord)) configuration.assumeNoSideEffects                   = super.parseAssumeClassSpecificationArguments(configuration.assumeNoSideEffects);
            else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_SIDE_EFFECTS_OPTION           .startsWith(nextWord)) configuration.assumeNoExternalSideEffects           = super.parseAssumeClassSpecificationArguments(configuration.assumeNoExternalSideEffects);
            else if (ConfigurationConstants.ASSUME_NO_ESCAPING_PARAMETERS_OPTION             .startsWith(nextWord)) configuration.assumeNoEscapingParameters            = super.parseAssumeClassSpecificationArguments(configuration.assumeNoEscapingParameters);
            else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_RETURN_VALUES_OPTION          .startsWith(nextWord)) configuration.assumeNoExternalReturnValues          = super.parseAssumeClassSpecificationArguments(configuration.assumeNoExternalReturnValues);
            else if (ConfigurationConstants.ASSUME_VALUES_OPTION                             .startsWith(nextWord)) configuration.assumeValues                          = super.parseAssumeClassSpecificationArguments(configuration.assumeValues);
            else if (ConfigurationConstants.ALLOW_ACCESS_MODIFICATION_OPTION                 .startsWith(nextWord)) configuration.allowAccessModification               = super.parseNoArgument(true);
            else if (ConfigurationConstants.MERGE_INTERFACES_AGGRESSIVELY_OPTION             .startsWith(nextWord)) configuration.mergeInterfacesAggressively           = super.parseNoArgument(true);

            else if (ConfigurationConstants.DONT_OBFUSCATE_OPTION                            .startsWith(nextWord)) configuration.obfuscate                             = super.parseNoArgument(false);
            else if (ConfigurationConstants.PRINT_MAPPING_OPTION                             .startsWith(nextWord)) configuration.printMapping                          = super.parseOptionalFile();
            else if (ConfigurationConstants.APPLY_MAPPING_OPTION                             .startsWith(nextWord)) configuration.applyMapping                          = super.parseFile();
            else if (ConfigurationConstants.OBFUSCATION_DICTIONARY_OPTION                    .startsWith(nextWord)) configuration.obfuscationDictionary                 = super.parseURL();
            else if (ConfigurationConstants.CLASS_OBFUSCATION_DICTIONARY_OPTION              .startsWith(nextWord)) configuration.classObfuscationDictionary            = super.parseURL();
            else if (ConfigurationConstants.PACKAGE_OBFUSCATION_DICTIONARY_OPTION            .startsWith(nextWord)) configuration.packageObfuscationDictionary          = super.parseURL();
            else if (ConfigurationConstants.OVERLOAD_AGGRESSIVELY_OPTION                     .startsWith(nextWord)) configuration.overloadAggressively                  = super.parseNoArgument(true);
            else if (ConfigurationConstants.USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION             .startsWith(nextWord)) configuration.useUniqueClassMemberNames             = super.parseNoArgument(true);
            else if (ConfigurationConstants.DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION           .startsWith(nextWord)) configuration.useMixedCaseClassNames                = super.parseNoArgument(false);
            else if (ConfigurationConstants.KEEP_PACKAGE_NAMES_OPTION                        .startsWith(nextWord)) configuration.keepPackageNames                      = super.parseCommaSeparatedList("package name", true, true, false, false, true, false, false, true, false, configuration.keepPackageNames);
            else if (ConfigurationConstants.FLATTEN_PACKAGE_HIERARCHY_OPTION                 .startsWith(nextWord)) configuration.flattenPackageHierarchy               = ClassUtil.internalClassName(super.parseOptionalArgument());
            else if (ConfigurationConstants.REPACKAGE_CLASSES_OPTION                         .startsWith(nextWord) ||
                     ConfigurationConstants.DEFAULT_PACKAGE_OPTION                           .startsWith(nextWord)) configuration.repackageClasses                      = ClassUtil.internalClassName(super.parseOptionalArgument());
            else if (ConfigurationConstants.KEEP_ATTRIBUTES_OPTION                           .startsWith(nextWord)) configuration.keepAttributes                        = super.parseCommaSeparatedList("attribute name", true, true, false, false, true, false, false, false, false, configuration.keepAttributes);
            else if (ConfigurationConstants.KEEP_PARAMETER_NAMES_OPTION                      .startsWith(nextWord)) configuration.keepParameterNames                    = super.parseNoArgument(true);
            else if (ConfigurationConstants.RENAME_SOURCE_FILE_ATTRIBUTE_OPTION              .startsWith(nextWord)) configuration.newSourceFileAttribute                = super.parseOptionalArgument();
            else if (ConfigurationConstants.ADAPT_CLASS_STRINGS_OPTION                       .startsWith(nextWord)) configuration.adaptClassStrings                     = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.adaptClassStrings);
            else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_NAMES_OPTION                 .startsWith(nextWord)) configuration.adaptResourceFileNames                = super.parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileNames);
            else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_CONTENTS_OPTION              .startsWith(nextWord)) configuration.adaptResourceFileContents             = super.parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileContents);
            else if (ConfigurationConstants.DONT_PROCESS_KOTLIN_METADATA                     .startsWith(nextWord)) configuration.dontProcessKotlinMetadata             = parseNoArgument(true);
            else if (ConfigurationConstants.KEEP_KOTLIN_METADATA                             .startsWith(nextWord)) configuration.keepKotlinMetadata                    = parseKeepKotlinMetadata();

            else if (ConfigurationConstants.DONT_PREVERIFY_OPTION                            .startsWith(nextWord)) configuration.preverify                             = super.parseNoArgument(false);
            else if (ConfigurationConstants.MICRO_EDITION_OPTION                             .startsWith(nextWord)) configuration.microEdition                          = super.parseNoArgument(true);
            else if (ConfigurationConstants.ANDROID_OPTION                                   .startsWith(nextWord)) configuration.android                               = super.parseNoArgument(true);

            else if (ConfigurationConstants.KEY_STORE_OPTION                                 .startsWith(nextWord)) configuration.keyStores                             = super.parseFiles(configuration.keyStores);
            else if (ConfigurationConstants.KEY_STORE_PASSWORD_OPTION                        .startsWith(nextWord)) configuration.keyStorePasswords                     = super.parseCommaSeparatedList("keystore password", true, false, false, false, false, false, true, false, false, configuration.keyStorePasswords);
            else if (ConfigurationConstants.KEY_ALIAS_OPTION                                 .startsWith(nextWord)) configuration.keyAliases                            = super.parseCommaSeparatedList("key", true, false, false, false, false, false, true, false, false, configuration.keyAliases);
            else if (ConfigurationConstants.KEY_PASSWORD_OPTION                              .startsWith(nextWord)) configuration.keyPasswords                          = super.parseCommaSeparatedList("key password", true, false, false, false, false, false, true, false, false, configuration.keyPasswords);

            else if (ConfigurationConstants.VERBOSE_OPTION                                   .startsWith(nextWord)) configuration.verbose                               = super.parseNoArgument(true);
            else if (ConfigurationConstants.DONT_NOTE_OPTION                                 .startsWith(nextWord)) configuration.note                                  = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.note);
            else if (ConfigurationConstants.DONT_WARN_OPTION                                 .startsWith(nextWord)) configuration.warn                                  = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.warn);
            else if (ConfigurationConstants.IGNORE_WARNINGS_OPTION                           .startsWith(nextWord)) configuration.ignoreWarnings                        = super.parseNoArgument(true);
            else if (ConfigurationConstants.PRINT_CONFIGURATION_OPTION                       .startsWith(nextWord)) configuration.printConfiguration                    = super.parseOptionalFile();
            else if (ConfigurationConstants.DUMP_OPTION                                      .startsWith(nextWord)) configuration.dump                                  = super.parseOptionalFile();
            else if (ConfigurationConstants.ADD_CONFIGURATION_DEBUGGING_OPTION               .startsWith(nextWord)) configuration.addConfigurationDebugging             = super.parseNoArgument(true);
            else if (ConfigurationConstants.OPTIMIZE_AGGRESSIVELY                            .startsWith(nextWord)) configuration.optimizeConservatively                = parseNoArgument(false);
            else
            {
                parseObfuscationConfig(configuration);
            }
        }
    }

    public void parseObfuscationConfig(Configuration configuration)
    throws ParseException, IOException
    {
        if      (ConfigurationConstants.DEOBFUSCATE_XOR_STRINGS_DECODE_NAME              .startsWith(nextWord)) configuration.deobfStrDecodeName                    = super.parseClassSpecificationArguments(true, true, true);
        else if (ConfigurationConstants.DEOBFUSCATE_XOR_STRINGS_KEY                      .startsWith(nextWord)) configuration.deobfStrXorKey                        = super.parseOptionalArgument();

        else if (ConfigurationConstants.OBFUSCATIONS                                     .startsWith(nextWord)) configuration.obfuscations                          = super.parseCommaSeparatedList("obfuscations name", true, false, false, false, false, true, false, false, false, configuration.obfuscations);
        else if (ConfigurationConstants.OBFUSCATION_SEED                                 .startsWith(nextWord)) configuration.seed                                  = super.parseIntegerArgument();
        else if (ConfigurationConstants.OBFUSCATE_STRING                                 .startsWith(nextWord)) parseStringOpt(configuration);
        else if (ConfigurationConstants.OBFUSCATE_ARITHMETIC                             .startsWith(nextWord)) parseArithmeticOpt(configuration);
        else if (ConfigurationConstants.OBFUSCATE_CONSTANTS                              .startsWith(nextWord)) parseConstantsOpt(configuration);
        else if (ConfigurationConstants.OBFUSCATE_CONTROL_FLOW                           .startsWith(nextWord)) parseControlFlowOpt(configuration);
        else
        {
            throw new ParseException("Unknown option " + reader.locationDescription());
        }
    }

    private void parseStringOpt(Configuration configuration)
    throws ParseException, IOException
    {
        configuration.obfuscateStringsList = new ArrayList<String>();
        super.readNextWord("", false, false, false);
        if (ConfigurationConstants.CLASS_KEYWORD.startsWith(nextWord) ||
            JavaAccessConstants.INTERFACE.startsWith(nextWord)        ||
            JavaAccessConstants.ENUM.startsWith(nextWord))
        {
            if (configuration.obfuscateStrings == null) {
                configuration.obfuscateStrings = new ArrayList();
            }
            configuration.obfuscateStrings.add(super.parseClassSpecificationArguments(false, true, true));
        }
        else
        {
            configuration.obfuscateStringsList =
                super.parseCommaSeparatedList("strings to obfuscate",
                                        /* readFirstWord             */ false,
                                        /* allowEmptyList            */ false,
                                        /* defaultIfEmpty            */ null,
                                        /* expectClosingParenthesis  */ false,
                                        /* isFileName                */ false,
                                        /* checkJavaIdentifiers      */ false,
                                        /* allowGenerics             */ true,
                                        /* replaceSystemProperties   */ false,
                                        /* replaceExternalClassNames */ false,
                                        /* replaceExternalTypes      */ false,
                                        configuration.obfuscateStringsList);
        }
    }

    /*
     * Parse the -obfuscate-arithmetic option and its specifier.
     * The code of this pass is highly inspired from
     * proguard.ConfigurationParser.parseKeepClassSpecificationArguments
     */
    private void parseArithmeticOpt(Configuration configuration)
    throws ParseException, IOException
    {
        boolean skipFloat                         = false;
        ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;
        while (true)
        {
            readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
                         "', '"      + JavaAccessConstants.INTERFACE +
                         "', or '"   + JavaAccessConstants.ENUM + "'",
                         false, false, true);

            if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord))
            {
                // Not a comma. Stop parsing the keep modifiers.
                break;
            }

            readNextWord("keyword '" + ConfigurationConstants.OBFUCATION_LEVEL_LOW +
                         "', '"      + ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM +
                         "', '"      + ConfigurationConstants.OBFUCATION_LEVEL_HIGH +
                         "', or '"   + ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT + "'");

            if      (ConfigurationConstants.OBFUCATION_LEVEL_LOW.startsWith(nextWord))
            {
                level = ObfuscationClassSpecification.Level.LOW;
            }
            else if (ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM.startsWith(nextWord))
            {
                level = ObfuscationClassSpecification.Level.MEDIUM;
            }
            else if (ConfigurationConstants.OBFUCATION_LEVEL_HIGH.startsWith(nextWord))
            {
                level = ObfuscationClassSpecification.Level.HIGH;
            }
            else if (ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT.startsWith(nextWord))
            {
                skipFloat = true;
            }
            else
            {
                throw new ParseException("Expecting keyword '" + ConfigurationConstants.OBFUCATION_LEVEL_LOW +
                                         "', '"                + ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM +
                                         "', '"                + ConfigurationConstants.OBFUCATION_LEVEL_HIGH +
                                         "', or '"             + ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT +
                                         "' before " + reader.locationDescription());
            }
        }

        ClassSpecification classSpecification =
            parseClassSpecificationArguments(false, true, false);

        if (configuration.obfuscateArithmetic == null) {
            configuration.obfuscateArithmetic = new ArrayList<ArithmeticObfuscationClassSpecification>();
        }

        configuration.obfuscateArithmetic.add(
                new ArithmeticObfuscationClassSpecification(classSpecification,
                                                            level, skipFloat));
    }

    /*
     * Parse the -obfuscate-constants option. This option does not currently support extra modifiers
     * but the there is a free room for that.
     *
     * The code of this pass is highly inspired from
     * proguard.ConfigurationParser.parseKeepClassSpecificationArguments
     */
    private void parseConstantsOpt(Configuration configuration)
    throws ParseException, IOException
    {
        ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;

        readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
                     "', '"      + JavaAccessConstants.INTERFACE +
                     "', or '"   + JavaAccessConstants.ENUM + "'",
                     false, false, true);

        ClassSpecification classSpecification =
            parseClassSpecificationArguments(false, true, false);

        if (configuration.obfuscateConstants == null) {
            configuration.obfuscateConstants = new ArrayList<ConstantObfuscationClassSpecification>();
        }

        configuration.obfuscateConstants.add(
                new ConstantObfuscationClassSpecification(classSpecification, level));
    }


    /*
     * Parse the -obfuscate-control-flow option. This option does not currently support extra modifiers
     * but the there is a free room for that.
     *
     * The code of this pass is highly inspired from
     * proguard.ConfigurationParser.parseKeepClassSpecificationArguments
     */
    private void parseControlFlowOpt(Configuration configuration)
    throws ParseException, IOException
    {
        ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;

        readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
                     "', '"      + JavaAccessConstants.INTERFACE +
                     "', or '"   + JavaAccessConstants.ENUM + "'",
                     false, false, true);

        ClassSpecification classSpecification =
            parseClassSpecificationArguments(false, true, false);

        if (configuration.obfuscateControlFlow == null) {
            configuration.obfuscateControlFlow = new ArrayList<CFObfuscationClassSpecification>();
        }

        configuration.obfuscateControlFlow.add(
                new CFObfuscationClassSpecification(classSpecification, level));
    }

}


================================================
FILE: base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;

public class ConstantObfuscationClassSpecification extends ObfuscationClassSpecification
{
    public ConstantObfuscationClassSpecification(ClassSpecification classSpecification,
                                                 Level              level)
    {
        super(classSpecification, level);
    }

    @Override
    public boolean equals(Object object)
    {
        if (object == null ||
            this.getClass() != object.getClass())
        {
            return false;
        }

        ConstantObfuscationClassSpecification other = (ConstantObfuscationClassSpecification)object;
        return super.equals(other);
    }

    @Override
    public int hashCode()
    {
        return super.hashCode();
    }


    @Override
    public Object clone()
    {
        return super.clone();
    }
}



================================================
FILE: base/src/main/java/dprotect/DProtect.java
================================================
package dprotect;

import dprotect.obfuscation.CodeObfuscator;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.AfterInitConfigurationVerifier;
import proguard.AppView;
import proguard.ConfigurationVerifier;
import proguard.ConfigurationWriter;
import proguard.Dumper;
import proguard.GPL;
import proguard.Initializer;
import proguard.InputReader;
import proguard.KotlinMetadataAdapter;
import proguard.OutputWriter;
import proguard.SeedPrinter;
import proguard.Targeter;
import proguard.UpToDateChecker;
import proguard.backport.Backporter;
import proguard.classfile.editor.*;
import proguard.classfile.pass.PrimitiveArrayConstantIntroducer;
import proguard.classfile.util.*;
import proguard.configuration.ConfigurationLoggingAdder;
import proguard.configuration.InitialStateInfo;
import proguard.evaluation.IncompleteClassHierarchyException;
import proguard.logging.Logging;
import proguard.mark.Marker;
import proguard.obfuscate.NameObfuscationReferenceFixer;
import proguard.obfuscate.ObfuscationPreparation;
import proguard.obfuscate.Obfuscator;
import proguard.obfuscate.ResourceFileNameAdapter;
import proguard.optimize.LineNumberTrimmer;
import proguard.optimize.Optimizer;
import proguard.optimize.gson.GsonOptimizer;
import proguard.optimize.peephole.LineNumberLinearizer;
import proguard.pass.PassRunner;
import proguard.preverify.*;
import proguard.shrink.Shrinker;
import proguard.strip.KotlinAnnotationStripper;
import proguard.util.*;
import proguard.util.kotlin.KotlinUnsupportedVersionChecker;
import proguard.util.kotlin.asserter.KotlinMetadataVerifier;

import java.io.*;

/**
 * This class wraps the dProtect obfuscation pipeline.
 * This is almost an exact copy of Proguard.java except that it also
 * invokes the obfuscation pipeline:
 *
 * + CodeObfuscator codeObfuscator = new CodeObfuscator(configuration);
 * + passRunner.run(codeObfuscator, appView);
 */
public class DProtect
{
    private static final Logger logger = LogManager.getLogger(DProtect.class);
    public static final String VERSION = "dProtect, version " + getVersion();

    /**
     * A data object containing pass inputs in a centralized location. Passes can access and update the information
     * at any point in the pipeline.
     */
    private final AppView       appView;
    private final PassRunner    passRunner;
    private final Configuration configuration;

    /**
     * Creates a new ProGuard object to process jars as specified by the given
     * configuration.
     */
    public DProtect(Configuration configuration)
    {
        this.appView       = new AppView();
        this.passRunner    = new PassRunner();
        this.configuration = configuration;
    }

    /**
     * Performs all subsequent ProGuard operations.
     */
    public void execute() throws Exception
    {
        Logging.configureVerbosity(configuration.verbose);

        logger.always().log(VERSION);

        try
        {
            checkGpl();

            // Set the -keepkotlinmetadata option if necessary.
            if (!configuration.dontProcessKotlinMetadata)
            {
                configuration.keepKotlinMetadata = requiresKotlinMetadata();
            }

            if (configuration.printConfiguration != null)
            {
                printConfiguration();
            }

            checkConfiguration();

            if (configuration.programJars.hasOutput())
            {
                checkUpToDate();
            }

            if (configuration.targetClassVersion != 0)
            {
                configuration.backport = true;
            }

            readInput();

            if (configuration.shrink    ||
                configuration.optimize  ||
                configuration.obfuscate ||
                configuration.preverify)
            {
                clearPreverification();
            }

            if (configuration.printSeeds != null        ||
                configuration.backport                  ||
                configuration.shrink                    ||
                configuration.optimize                  ||
                configuration.obfuscate                 ||
                configuration.preverify                 ||
                configuration.addConfigurationDebugging ||
                configuration.keepKotlinMetadata)
            {
                initialize();
                mark();
            }

            checkConfigurationAfterInitialization();

            if (configuration.addConfigurationDebugging)
            {
                // Remember the initial state of the program classpool and resource filepool
                // before shrinking / obfuscation / optimization.
                appView.initialStateInfo = new InitialStateInfo(appView.programClassPool);
            }

            if (configuration.keepKotlinMetadata)
            {
                stripKotlinMetadataAnnotations();
            }

            if (configuration.optimize ||
                configuration.obfuscate)
            {
                introducePrimitiveArrayConstants();
            }

            if (configuration.backport)
            {
                backport();
            }

            if (configuration.addConfigurationDebugging)
            {
                addConfigurationLogging();
            }

            if (configuration.printSeeds != null)
            {
                printSeeds();
            }

            if (configuration.preverify ||
                configuration.android)
            {
                inlineSubroutines();
            }

            if (configuration.shrink)
            {
                shrink(false);
            }

            // Create a matcher for filtering optimizations.
            StringMatcher filter = configuration.optimizations != null ?
                new ListParser(new NameParser()).parse(configuration.optimizations) :
                new ConstantMatcher(true);

            if (configuration.optimize &&
                filter.matches(Optimizer.LIBRARY_GSON))
            {
                optimizeGson();
            }

            if (configuration.optimize)
            {
                optimize();
                linearizeLineNumbers();
            }

            if (configuration.obfuscate)
            {
                markObfuscation();
                obfuscate();
            }

            if (configuration.keepKotlinMetadata)
            {
                adaptKotlinMetadata();
            }

            if (configuration.optimize ||
                configuration.obfuscate)
            {
                expandPrimitiveArrayConstants();
            }

            if (configuration.targetClassVersion != 0)
            {
                target();
            }

            if (configuration.preverify)
            {
                preverify();
            }

            // Trim line numbers after preverification as this might
            // also remove some instructions.
            if (configuration.optimize ||
                configuration.preverify)
            {
                trimLineNumbers();
            }

            if (configuration.shrink    ||
                configuration.optimize  ||
                configuration.obfuscate ||
                configuration.preverify)
            {
                sortClassElements();
            }

            if (configuration.programJars.hasOutput())
            {
                writeOutput();
            }

            if (configuration.dump != null)
            {
                dump();
            }
        }
        catch (UpToDateChecker.UpToDateException ignore) {}
        catch (IncompleteClassHierarchyException e)
        {
            throw new RuntimeException(
                System.lineSeparator() + System.lineSeparator() +
                "It appears you are missing some classes resulting in an incomplete class hierarchy, " + System.lineSeparator() +
                "please refer to the troubleshooting page in the manual: " + System.lineSeparator() +
                "https://www.guardsquare.com/en/products/proguard/manual/troubleshooting#superclass" + System.lineSeparator()
            );
        }
    }


    /**
     * Checks the GPL.
     */
    private void checkGpl()
    {
        GPL.check();
    }

    private boolean requiresKotlinMetadata()
    {
        return configuration.keepKotlinMetadata ||
            (configuration.keep != null &&
                configuration.keep.stream().anyMatch(
                    keepClassSpecification -> ! keepClassSpecification.allowObfuscation &&
                                              ! keepClassSpecification.allowShrinking   &&
                                              "kotlin/Metadata".equals(keepClassSpecification.className)
                ));
    }


    /**
     * Prints out the configuration that ProGuard is using.
     */
    private void printConfiguration() throws IOException
    {
        PrintWriter pw = PrintWriterUtil.createPrintWriterOut(configuration.printConfiguration);

        try (ConfigurationWriter configurationWriter = new ConfigurationWriter(pw))
        {
            configurationWriter.write(configuration);
        }
    }


    /**
     * Checks the configuration for conflicts and inconsistencies.
     */
    private void checkConfiguration() throws IOException
    {
        new ConfigurationVerifier(configuration).check();
    }


    /**
     * Checks whether the output is up-to-date.
     */
    private void checkUpToDate()
    {
        new UpToDateChecker(configuration).check();
    }


    /**
     * Reads the input class files.
     */
    private void readInput() throws Exception
    {
        // Fill the program class pool and the library class pool.
        passRunner.run(new InputReader(configuration), appView);
    }


    /**
     * Clears any JSE preverification information from the program classes.
     */
    private void clearPreverification() throws Exception
    {
        passRunner.run(new PreverificationClearer(), appView);
    }


    /**
     * Initializes the cross-references between all classes, performs some
     * basic checks, and shrinks the library class pool.
     */
    private void initialize() throws Exception
    {
        if (configuration.keepKotlinMetadata)
        {
            passRunner.run(new KotlinUnsupportedVersionChecker(), appView);
        }
        passRunner.run(new Initializer(configuration), appView);

        if (configuration.keepKotlinMetadata &&
            configuration.enableKotlinAsserter)
        {
            passRunner.run(new KotlinMetadataVerifier(configuration), appView);
        }
    }


    /**
     * Marks the classes, class members and attributes to be kept or encrypted,
     * by setting the appropriate access flags.
     */
    private void mark() throws Exception
    {
        passRunner.run(new Marker(configuration), appView);
    }


    /**
     * Strips the Kotlin metadata annotation where possible.
     */
    private void stripKotlinMetadataAnnotations() throws Exception
    {
        passRunner.run(new KotlinAnnotationStripper(configuration), appView);
    }

    /**
     * Checks the configuration after it has been initialized.
     */
    private void checkConfigurationAfterInitialization() throws Exception
    {
        passRunner.run(new AfterInitConfigurationVerifier(configuration), appView);
    }

    /**
     * Replaces primitive array initialization code by primitive array constants.
     */
    private void introducePrimitiveArrayConstants() throws Exception
    {
        passRunner.run(new PrimitiveArrayConstantIntroducer(), appView);
    }


    /**
     * Backports java language features to the specified target version.
     */
    private void backport() throws Exception
    {
        passRunner.run(new Backporter(configuration), appView);
    }


    /**
     * Adds configuration logging code, providing suggestions on improving
     * the ProGuard configuration.
     */
    private void addConfigurationLogging() throws Exception
    {
        passRunner.run(new ConfigurationLoggingAdder(), appView);
    }


    /**
     * Prints out classes and class members that are used as seeds in the
     * shrinking and obfuscation steps.
     */
    private void printSeeds() throws Exception
    {
        passRunner.run(new SeedPrinter(configuration), appView);
    }


    /**
     * Performs the subroutine inlining step.
     */
    private void inlineSubroutines() throws Exception
    {
        // Perform the actual inlining.
        passRunner.run(new SubroutineInliner(configuration), appView);
    }


    /**
     * Performs the shrinking step.
     */
    private void shrink(boolean afterOptimizer) throws Exception
    {
        // Perform the actual shrinking.
        passRunner.run(new Shrinker(configuration, afterOptimizer), appView);

        if (configuration.keepKotlinMetadata &&
            configuration.enableKotlinAsserter)
        {
            passRunner.run(new KotlinMetadataVerifier(configuration), appView);
        }
    }


    /**
     * Optimizes usages of the Gson library.
     */
    private void optimizeGson() throws Exception
    {
        // Perform the Gson optimization.
        passRunner.run(new GsonOptimizer(configuration), appView);
    }


    /**
     * Performs the optimization step.
     */
    private void optimize() throws Exception
    {
        Optimizer optimizer = new Optimizer(configuration);

        for (int optimizationPass = 0; optimizationPass < configuration.optimizationPasses; optimizationPass++)
        {
            // Perform the actual optimization.
            passRunner.run(optimizer, appView);

            // Shrink again, if we may.
            if (configuration.shrink)
            {
                shrink(true);
            }
        }
    }


    /**
     * Disambiguates the line numbers of all program classes, after
     * optimizations like method inlining and class merging.
     */
    private void linearizeLineNumbers() throws Exception
    {
        passRunner.run(new LineNumberLinearizer(), appView);
    }


    /**
     * Marks the classes, class members and attributes which are set to
     * be obfuscated (from the user configuration)
     */
    private void markObfuscation() throws Exception
    {
        passRunner.run(new dprotect.obfuscation.Marker(configuration), appView);
    }


    /**
     * Performs the obfuscation step.
     */
    private void obfuscate() throws Exception
    {

        CodeObfuscator codeObfuscator = new CodeObfuscator(configuration);

        passRunner.run(codeObfuscator, appView);

        // Shrink again, if we may.
        if (configuration.shrink)
        {
            shrink(true);
        }

        passRunner.run(new ObfuscationPreparation(configuration), appView);

        // Perform the actual obfuscation.
        passRunner.run(new Obfuscator(configuration), appView);

        // Adapt resource file names that correspond to class names, if necessary.
        if (configuration.adaptResourceFileNames != null)
        {
            passRunner.run(new ResourceFileNameAdapter(configuration), appView);
        }

        // Fix the Kotlin modules so the filename matches and the class names match.
        passRunner.run(new NameObfuscationReferenceFixer(configuration), appView);

        if (configuration.keepKotlinMetadata &&
            configuration.enableKotlinAsserter)
        {
            passRunner.run(new KotlinMetadataVerifier(configuration), appView);
        }
    }


    /**
     * Adapts Kotlin Metadata annotations.
     */
    private void adaptKotlinMetadata() throws Exception
    {
        passRunner.run(new KotlinMetadataAdapter(), appView);
    }


    /**
     * Expands primitive array constants back to traditional primitive array
     * initialization code.
     */
    private void expandPrimitiveArrayConstants()
    {
        appView.programClassPool.classesAccept(new PrimitiveArrayConstantReplacer());
    }


    /**
     * Sets that target versions of the program classes.
     */
    private void target() throws Exception
    {
        passRunner.run(new Targeter(configuration), appView);
    }


    /**
     * Performs the preverification step.
     */
    private void preverify() throws Exception
    {
        // Perform the actual preverification.
        passRunner.run(new Preverifier(configuration), appView);
    }


    /**
     * Trims the line number table attributes of all program classes.
     */
    private void trimLineNumbers() throws Exception
    {
        passRunner.run(new LineNumberTrimmer(), appView);
    }


    /**
     * Sorts the elements of all program classes.
     */
    private void sortClassElements()
    {
        appView.programClassPool.classesAccept(
            new ClassElementSorter(
                /* sortInterfaces = */ true,
                /* sortConstants = */ true,
                // Sorting members can cause problems with code such as clazz.getMethods()[1]
                /* sortMembers = */ false,
                // PGD-192: Sorting attributes can cause problems for some compilers
                /* sortAttributes = */ false
            )
        );
    }


    /**
     * Writes the output class files.
     */
    private void writeOutput() throws Exception
    {
        // Write out the program class pool.
        passRunner.run(new OutputWriter(configuration), appView);
    }


    /**
     * Prints out the contents of the program classes.
     */
    private void dump() throws Exception
    {
        passRunner.run(new Dumper(configuration), appView);
    }


    /**
     * Returns the implementation version from the manifest.
     */
    public static String getVersion()
    {
        Package pack = DProtect.class.getPackage();
        if (pack != null)
        {
            String version = pack.getImplementationVersion();
            if (version != null)
            {
                return version;
            }
        }

        return "undefined";
    }


    /**
     * The main method for dProtect.
     */
    public static void main(String[] args)
    {
        if (args.length == 0)
        {
            logger.warn(VERSION);
            logger.warn("Usage: java dprotect.DProtect [options ...]");
            System.exit(1);
        }

        // Create the default options.
        Configuration configuration = new Configuration();

        try
        {
            // Parse the options specified in the command line arguments.
            try (ConfigurationParser parser = new ConfigurationParser(args, System.getProperties()))
            {
                parser.parse(configuration);
            }

            // Execute ProGuard with these options.
            new DProtect(configuration).execute();
        }
        catch (Exception ex)
        {
            logger.error("Unexpected error", ex);

            System.exit(1);
        }

        System.exit(0);
    }
}


================================================
FILE: base/src/main/java/dprotect/ObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;


public class ObfuscationClassSpecification extends ClassSpecification
{
    public static enum Level {
        NONE, LOW, MEDIUM, HIGH
    };

    public final Level obfuscationLvl;

    public ObfuscationClassSpecification(ClassSpecification classSpecification,
                                         Level level)
    {
        super(classSpecification);
        this.obfuscationLvl = level;
    }

    public ObfuscationClassSpecification(ClassSpecification classSpecification)
    {
        this(classSpecification, Level.NONE);
    }

    @Override
    public boolean equals(Object object)
    {
        if (object == null ||
            this.getClass() != object.getClass())
        {
            return false;
        }

        ObfuscationClassSpecification other = (ObfuscationClassSpecification)object;
        return
            this.obfuscationLvl == other.obfuscationLvl &&
            super.equals(other);
    }

    @Override
    public int hashCode()
    {
        return obfuscationLvl.hashCode() ^ super.hashCode();
    }

    @Override
    public Object clone()
    {
        return super.clone();
    }
}



================================================
FILE: base/src/main/java/dprotect/deobfuscation/Deobfuscator.java
================================================
package dprotect.deobfuscation;

import dprotect.Configuration;
import dprotect.obfuscation.arithmetic.*;
import dprotect.obfuscation.constants.*;
import dprotect.obfuscation.controlflow.*;
import dprotect.obfuscation.info.ObfuscationInfo;
import dprotect.obfuscation.strings.*;

import java.io.*;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import proguard.AppView;
import proguard.classfile.*;
import proguard.classfile.attribute.visitor.AllAttributeVisitor;
import proguard.classfile.instruction.visitor.AllInstructionVisitor;
import proguard.classfile.util.PrimitiveArrayConstantReplacer;
import proguard.classfile.util.ClassReferenceInitializer;
import proguard.classfile.visitor.*;
import proguard.classfile.constant.visitor.AllConstantVisitor;
import proguard.io.ExtraDataEntryNameMap;
import proguard.obfuscate.util.InstructionSequenceObfuscator;
import proguard.pass.Pass;
import proguard.util.*;

public class Deobfuscator implements Pass
{
    private static final Logger logger = LogManager.getLogger(Deobfuscator.class);

    private static final String DEOBFUSCATION_STRING         = "deobfuscation/string";

    private final Configuration configuration;

    private boolean codeObfuscationString;
    private boolean codeObfuscationArithmeticMba;
    private boolean codeObfuscationConstants;
    private boolean codeObfuscationControlFlow;

    public Deobfuscator(Configuration configuration)
    {
        this.configuration = configuration;
    }

    /**
     * Performs obfuscation of the given program class pool.
     */
    @Override
    public void execute(AppView appView) throws IOException
    {
        // Create a matcher for filtering optimizations.
        StringMatcher filter = configuration.optimizations != null ?
                               new ListParser(new NameParser()).parse(configuration.obfuscations) :
                               new ConstantMatcher(true);

        //codeObfuscationString        = filter.matches(OBFUSCATION_STRING);
        //codeObfuscationArithmeticMba = filter.matches(OBFUSCATION_ARITHMETIC_MBA);
        //codeObfuscationConstants     = filter.matches(OBFUSCATION_CONSTANTS);
        //codeObfuscationControlFlow   = filter.matches(OBFUSCATION_CONTROL_FLOW);

        //logger.info("Applying code obfuscation ...");

        //if (configuration.seed == null)
        //{
        //    configuration.seed = (int)System.currentTimeMillis();
        //}

        //logger.info("Using obfuscation seed: {}", configuration.seed);

        //obfuscate(configuration,
        //          appView.programClassPool,
        //          appView.libraryClassPool,
        //          appView.extraDataEntryNameMap);
    }


    private void deobfuscate(Configuration         configuration,
                             ClassPool             programClassPool,
                             ClassPool             libraryClassPool,
                             ExtraDataEntryNameMap extraDataEntryNameMap)
    throws IOException
    {
    }
}



================================================
FILE: base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java
================================================
package dprotect.deobfuscation.strings;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import proguard.ClassSpecification;
import proguard.MemberSpecification;
import proguard.classfile.*;
import proguard.classfile.attribute.*;
import proguard.classfile.attribute.visitor.*;
import proguard.classfile.constant.*;
import proguard.classfile.constant.visitor.ConstantVisitor;
import proguard.classfile.editor.*;
import proguard.classfile.instruction.*;
import proguard.classfile.instruction.visitor.*;

import java.util.Base64;


public class XoredStrings
implements   AttributeVisitor,
             InstructionVisitor,
             ConstantVisitor

{
  private final byte[]              KEY;
  private final ClassSpecification  decodeSpecifier;
  private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor();
  private       ConstantPoolEditor  constantPoolEditor  = null;
  private       String              stackedString       = null;
  private       LdcInfo             ldcString           = null;

  private static final Logger logger = LogManager.getLogger(XoredStrings.class);

  private class LdcInfo
  {
    public int offset;
    public byte opcode;
    LdcInfo(int offset, byte opcode)
    {
      this.offset = offset;
      this.opcode = opcode;
    }
  }

  public XoredStrings(String talsecKey, ClassSpecification decodeInfo)
  {
    decodeSpecifier = decodeInfo;
    KEY = Base64.getDecoder().decode(talsecKey);
  }

  private boolean isDecodeMethod(String clazz, String method)
  {
    if (!decodeSpecifier.className.equals(clazz))
    {
      return false;
    }
    if (decodeSpecifier.methodSpecifications.isEmpty())
    {
      return false;
    }

    Object spec = decodeSpecifier.methodSpecifications.get(0);

    if (!(spec instanceof MemberSpecification))
    {
      return false;
    }
    MemberSpecification memberSpec = (MemberSpecification)spec;
    return memberSpec.name.equals(method);
  }

  public static byte[] hex2bytes(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i),     16) << 4)
                             + Character.digit(s.charAt(i + 1), 16)     );
    }
    return data;
  }

  private String decode(byte[] bytes) {
    byte[] decoded = new byte[bytes.length];
    for (int i = 0; i < decoded.length; ++i) {
      decoded[i] = (byte)((bytes[i]) ^ KEY[i % KEY.length]);
    }
    return new String(decoded);
  }

  private String decode(String enc)
  {
    return decode(hex2bytes(enc));
  }

  // Implementations for AttributeVisitor.

  @Override
  public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}

  @Override
  public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
  {
    this.constantPoolEditor = new ConstantPoolEditor((ProgramClass)clazz);
    codeAttributeEditor.reset(codeAttribute.u4codeLength);
    codeAttribute.instructionsAccept(clazz, method, this);
    codeAttribute.accept(clazz, method, codeAttributeEditor);
  }

  // Implementations for InstructionVisitor.
  @Override
  public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {}

  @Override
  public void visitConstantInstruction(Clazz clazz,
                                       Method method,
                                       CodeAttribute codeAttribute,
                                       int offset,
                                       ConstantInstruction constantInstruction)
  {
    byte opcode = constantInstruction.opcode;
    if (opcode == Instruction.OP_LDC || opcode == Instruction.OP_LDC_W)
    {
      this.ldcString = new LdcInfo(offset, opcode);
      clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this);
    }

    if (opcode == Instruction.OP_INVOKESTATIC) {
      ProgramClass programClass = (ProgramClass) clazz;
      Constant ref = programClass.getConstant(constantInstruction.constantIndex);
      if (!(ref instanceof MethodrefConstant)) {
        return;
      }

      MethodrefConstant methodRef = (MethodrefConstant)ref;
      String className  = methodRef.getClassName(clazz);
      String methodName = methodRef.getName(clazz);
      if (isDecodeMethod(className, methodName)) {
        if (this.stackedString != null) {
          //logger.info("{} -> {}", stackedString, decode(stackedString));
          this.codeAttributeEditor.deleteInstruction(offset);
          int idx = this.constantPoolEditor.addStringConstant(decode(this.stackedString));
          ConstantInstruction replacedLdc = new ConstantInstruction(this.ldcString.opcode, idx);
          this.codeAttributeEditor.replaceInstruction(this.ldcString.offset, replacedLdc);
          this.stackedString = null;
        }
      }
    }
  }

  // Implementations for ConstantVisitor.

  @Override
  public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
  {
    clazz.constantPoolEntryAccept(stringConstant.u2stringIndex, this);
  }

  @Override
  public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant)
  {
    this.stackedString = utf8Constant.getString();
  }

  @Override
  public void visitAnyConstant(Clazz clazz, Constant constant) {}
}


================================================
FILE: base/src/main/java/dprotect/obfuscation/CodeObfuscator.java
================================================
package dprotect.obfuscation;

import dprotect.Configuration;
import dprotect.obfuscation.arithmetic.*;
import dprotect.obfuscation.constants.*;
import dprotect.obfuscation.controlflow.*;
import dprotect.obfuscation.info.ObfuscationInfo;
import dprotect.obfuscation.strings.*;

import java.io.*;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import proguard.AppView;
import proguard.classfile.*;
import proguard.classfile.attribute.visitor.AllAttributeVisitor;
import proguard.classfile.instruction.visitor.AllInstructionVisitor;
import proguard.classfile.util.PrimitiveArrayConstantReplacer;
import proguard.classfile.util.ClassReferenceInitializer;
import proguard.classfile.visitor.*;
import proguard.classfile.constant.visitor.AllConstantVisitor;
import proguard.io.ExtraDataEntryNameMap;
import proguard.obfuscate.util.InstructionSequenceObfuscator;
import proguard.pass.Pass;
import proguard.util.*;

public class CodeObfuscator implements Pass
{
    private static final Logger logger = LogManager.getLogger(CodeObfuscator.class);

    private static final String OBFUSCATION_STRING         = "obfuscation/string";
    private static final String OBFUSCATION_ARITHMETIC_MBA = "obfuscation/arithmetic/mba";
    private static final String OBFUSCATION_CONSTANTS      = "obfuscation/constants";
    private static final String OBFUSCATION_CONTROL_FLOW   = "obfuscation/controlflow";

    private final Configuration configuration;

    private boolean codeObfuscationString;
    private boolean codeObfuscationArithmeticMba;
    private boolean codeObfuscationConstants;
    private boolean codeObfuscationControlFlow;

    public CodeObfuscator(Configuration configuration)
    {
        this.configuration = configuration;
    }

    /**
     * Performs obfuscation of the given program class pool.
     */
    @Override
    public void execute(AppView appView) throws IOException
    {
        // Create a matcher for filtering optimizations.
        StringMatcher filter = configuration.optimizations != null ?
                               new ListParser(new NameParser()).parse(configuration.obfuscations) :
                               new ConstantMatcher(true);

        codeObfuscationString        = filter.matches(OBFUSCATION_STRING);
        codeObfuscationArithmeticMba = filter.matches(OBFUSCATION_ARITHMETIC_MBA);
        codeObfuscationConstants     = filter.matches(OBFUSCATION_CONSTANTS);
        codeObfuscationControlFlow   = filter.matches(OBFUSCATION_CONTROL_FLOW);

        logger.info("Applying code obfuscation ...");

        if (configuration.seed == null)
        {
            configuration.seed = (int)System.currentTimeMillis();
        }

        logger.info("Using obfuscation seed: {}", configuration.seed);

        obfuscate(configuration,
                  appView.programClassPool,
                  appView.libraryClassPool,
                  appView.extraDataEntryNameMap);
    }


    private void obfuscate(Configuration         configuration,
                           ClassPool             programClassPool,
                           ClassPool             libraryClassPool,
                           ExtraDataEntryNameMap extraDataEntryNameMap)
    throws IOException
    {
        /* Make sure that PrimitiveArrayConstant are correctly expanded before running
         * the pass.
         *
         * This PrimitiveArrayConstantReplacer is also run in the main DProtect.java/Proguard.java
         * but it comes after the optimization/obfuscation pipeline. I don't know if it is a bug
         * but for this pass, it needs to be run **before**
         */
        {
            programClassPool.classesAccept(new PrimitiveArrayConstantReplacer());
        }

        if (codeObfuscationString)
        {
            runStringObfuscation(configuration,
                                 programClassPool, libraryClassPool,
                                 extraDataEntryNameMap);
        }

        if (codeObfuscationControlFlow)
        {
            runControlFlowObfuscation(configuration,
                                      programClassPool, libraryClassPool,
                                      extraDataEntryNameMap);
        }

        if (codeObfuscationArithmeticMba)
        {
            runArithmeticObfuscation(configuration,
                                     programClassPool, libraryClassPool,
                                     extraDataEntryNameMap);
        }

        if (codeObfuscationConstants)
        {
            runConstantsObfuscation(configuration,
                                    programClassPool, libraryClassPool,
                                    extraDataEntryNameMap);
        }

        programClassPool.accept(new AllClassVisitor(
                                new AllFieldVisitor(
                                new ClassReferenceInitializer(programClassPool, libraryClassPool))));

        programClassPool.accept(new AllClassVisitor(
                                new AllConstantVisitor(
                                new ClassReferenceInitializer(programClassPool, libraryClassPool))));
    }

    private void runStringObfuscation(Configuration       configuration,
                                      ClassPool             programClassPool,
                                      ClassPool             libraryClassPool,
                                      ExtraDataEntryNameMap extraDataEntryNameMap)
    {
        logger.info("dProtect: Applying strings encoding ...");

        programClassPool.accept(
                new AllClassVisitor(
                new ClassVisitor() {
                    /*
                     * The purpose of this visitor is to early filter
                     * on the classes that are flagged with the obfuscate-strings options
                     */
                    public ClassVisitor obfuscator;
                    @Override
                    public void visitAnyClass(Clazz clazz)
                    {
                        if (ObfuscationInfo.getObfuscationInfo(clazz).encodeStrings)
                        {
                            /*
                             * StringFieldMarker is used to flag the strings
                             * that are associated with field write accesses
                             */
                            clazz.accept(
                                new AllMethodVisitor(
                                new AllAttributeVisitor(
                                new AllInstructionVisitor(
                                new StringFieldMarker()))));
                            /*
                             * Run the obfuscation pass
                             */
                            obfuscator.visitAnyClass(clazz);
                        }
                    }
                    ClassVisitor apply(ClassVisitor obfuscator) { this.obfuscator = obfuscator; return this; }
                }.apply(new StringObfuscator(configuration.obfuscateStringsList, configuration.seed))));
    }
    private void runArithmeticObfuscation(Configuration       configuration,
                                          ClassPool             programClassPool,
                                          ClassPool             libraryClassPool,
                                          ExtraDataEntryNameMap extraDataEntryNameMap)
    {

        MBANormalizer     normalizer = new MBANormalizer    (programClassPool, libraryClassPool);
        MBAObfuscationAdd mbaAdd     = new MBAObfuscationAdd(programClassPool, libraryClassPool);
        MBAObfuscationXor mbaXor     = new MBAObfuscationXor(programClassPool, libraryClassPool);
        MBAObfuscationAnd mbaAnd     = new MBAObfuscationAnd(programClassPool, libraryClassPool);
        MBAObfuscationOr  mbaOr      = new MBAObfuscationOr (programClassPool, libraryClassPool);
        MBAObfuscationSub mbaSub     = new MBAObfuscationSub(programClassPool, libraryClassPool);

        logger.info("dProtect: Applying Mixed Boolean-Arithmetic expressions ...");
        programClassPool.accept(
            new AllClassVisitor(
            new ClassVisitor() {
                /*
                 * Early filter
                 * on the classes that are flagged with obfuscate-arithmetic
                 */
                public MemberVisitor obfuscator;
                @Override
                public void visitAnyClass(Clazz clazz)
                {
                    if (ObfuscationInfo.getObfuscationInfo(clazz).arithmetic != null)
                    {
                        clazz.methodsAccept(new ArithmeticObfuscationFilter(obfuscator));
                    }
                }
             
Download .txt
gitextract_i4svht9p/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── scripts/
│   │   └── s3-deploy.py
│   └── workflows/
│       ├── continuous_integration.yml
│       └── main.yml
├── .gitignore
├── .hgignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── annotations/
│   ├── annotations.pro
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── annotation/
│               ├── Keep.java
│               ├── KeepApplication.java
│               ├── KeepClassMemberNames.java
│               ├── KeepClassMembers.java
│               ├── KeepGettersSetters.java
│               ├── KeepImplementations.java
│               ├── KeepName.java
│               ├── KeepPublicClassMemberNames.java
│               ├── KeepPublicClassMembers.java
│               ├── KeepPublicGettersSetters.java
│               ├── KeepPublicImplementations.java
│               ├── KeepPublicProtectedClassMemberNames.java
│               └── KeepPublicProtectedClassMembers.java
├── ant/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── ant/
│               ├── ClassPathElement.java
│               ├── ClassSpecificationElement.java
│               ├── ConfigurationElement.java
│               ├── ConfigurationTask.java
│               ├── FilterElement.java
│               ├── KeepSpecificationElement.java
│               ├── MemberSpecificationElement.java
│               ├── ProGuardTask.java
│               ├── package.html
│               └── task.properties
├── base/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── dprotect/
│       │   │   │   ├── ArithmeticObfuscationClassSpecification.java
│       │   │   │   ├── CFObfuscationClassSpecification.java
│       │   │   │   ├── ClassObfuSpecVisitorFactory.java
│       │   │   │   ├── Configuration.java
│       │   │   │   ├── ConfigurationConstants.java
│       │   │   │   ├── ConfigurationParser.java
│       │   │   │   ├── ConstantObfuscationClassSpecification.java
│       │   │   │   ├── DProtect.java
│       │   │   │   ├── ObfuscationClassSpecification.java
│       │   │   │   ├── deobfuscation/
│       │   │   │   │   ├── Deobfuscator.java
│       │   │   │   │   └── strings/
│       │   │   │   │       └── XoredStrings.java
│       │   │   │   ├── obfuscation/
│       │   │   │   │   ├── CodeObfuscator.java
│       │   │   │   │   ├── Marker.java
│       │   │   │   │   ├── arithmetic/
│       │   │   │   │   │   ├── ArithmeticObfuscationFilter.java
│       │   │   │   │   │   ├── ArithmeticObfuscationInfo.java
│       │   │   │   │   │   ├── ArithmeticObfuscationMarker.java
│       │   │   │   │   │   ├── MBANormalizer.java
│       │   │   │   │   │   ├── MBAObfuscationAdd.java
│       │   │   │   │   │   ├── MBAObfuscationAnd.java
│       │   │   │   │   │   ├── MBAObfuscationOr.java
│       │   │   │   │   │   ├── MBAObfuscationSub.java
│       │   │   │   │   │   └── MBAObfuscationXor.java
│       │   │   │   │   ├── constants/
│       │   │   │   │   │   ├── ConstantFieldMarker.java
│       │   │   │   │   │   ├── ConstantObfuscationInfo.java
│       │   │   │   │   │   ├── ConstantObfuscationMarker.java
│       │   │   │   │   │   └── ConstantsObfuscator.java
│       │   │   │   │   ├── controlflow/
│       │   │   │   │   │   ├── ControlFlowObfuscation.java
│       │   │   │   │   │   ├── ControlFlowObfuscationInfo.java
│       │   │   │   │   │   └── ControlFlowObfuscationMarker.java
│       │   │   │   │   ├── info/
│       │   │   │   │   │   ├── ObfuscationInfo.java
│       │   │   │   │   │   └── ObfuscationInfoSetter.java
│       │   │   │   │   └── strings/
│       │   │   │   │       ├── StringFieldMarker.java
│       │   │   │   │       ├── StringObfuscationMarker.java
│       │   │   │   │       └── StringObfuscator.java
│       │   │   │   └── runtime/
│       │   │   │       ├── strings/
│       │   │   │       │   └── StringEncoding.java
│       │   │   │       └── util/
│       │   │   │           ├── Helpers.java
│       │   │   │           └── Loader.java
│       │   │   └── proguard/
│       │   │       ├── AfterInitConfigurationVerifier.java
│       │   │       ├── AppView.java
│       │   │       ├── ArgumentWordReader.java
│       │   │       ├── AssumeNoSideEffectsChecker.java
│       │   │       ├── ClassMemberChecker.java
│       │   │       ├── ClassPath.java
│       │   │       ├── ClassPathEntry.java
│       │   │       ├── ClassSpecification.java
│       │   │       ├── ClassSpecificationVisitorFactory.java
│       │   │       ├── Configuration.java
│       │   │       ├── ConfigurationConstants.java
│       │   │       ├── ConfigurationParser.java
│       │   │       ├── ConfigurationVerifier.java
│       │   │       ├── ConfigurationWriter.java
│       │   │       ├── DataEntryReaderFactory.java
│       │   │       ├── DataEntryWriterFactory.java
│       │   │       ├── DescriptorKeepChecker.java
│       │   │       ├── Dumper.java
│       │   │       ├── DuplicateClassPrinter.java
│       │   │       ├── DuplicateResourceFilePrinter.java
│       │   │       ├── FileWordReader.java
│       │   │       ├── FullyQualifiedClassNameChecker.java
│       │   │       ├── GPL.java
│       │   │       ├── GetAnnotationChecker.java
│       │   │       ├── GetEnclosingClassChecker.java
│       │   │       ├── GetEnclosingMethodChecker.java
│       │   │       ├── GetSignatureChecker.java
│       │   │       ├── Initializer.java
│       │   │       ├── InputReader.java
│       │   │       ├── KeepClassMemberChecker.java
│       │   │       ├── KeepClassSpecification.java
│       │   │       ├── KeepClassSpecificationVisitorFactory.java
│       │   │       ├── KotlinMetadataAdapter.java
│       │   │       ├── LibraryKeepChecker.java
│       │   │       ├── LineWordReader.java
│       │   │       ├── MemberSpecification.java
│       │   │       ├── MemberValueSpecification.java
│       │   │       ├── OutputWriter.java
│       │   │       ├── ParseException.java
│       │   │       ├── ProGuard.java
│       │   │       ├── SeedPrinter.java
│       │   │       ├── SubclassedClassFilter.java
│       │   │       ├── Targeter.java
│       │   │       ├── UpToDateChecker.java
│       │   │       ├── WordReader.java
│       │   │       ├── backport/
│       │   │       │   ├── AbstractAPIConverter.java
│       │   │       │   ├── Backporter.java
│       │   │       │   ├── DefaultInterfaceMethodConverter.java
│       │   │       │   ├── JSR310Converter.java
│       │   │       │   ├── LambdaExpression.java
│       │   │       │   ├── LambdaExpressionCollector.java
│       │   │       │   ├── LambdaExpressionConverter.java
│       │   │       │   ├── StaticInterfaceMethodConverter.java
│       │   │       │   ├── StreamSupportConverter.java
│       │   │       │   └── StringConcatenationConverter.java
│       │   │       ├── classfile/
│       │   │       │   ├── ClassMemberPair.java
│       │   │       │   ├── pass/
│       │   │       │   │   └── PrimitiveArrayConstantIntroducer.java
│       │   │       │   └── visitor/
│       │   │       │       └── InjectedClassFilter.java
│       │   │       ├── configuration/
│       │   │       │   ├── ConfigurationLogger.java
│       │   │       │   ├── ConfigurationLoggingAdder.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequenceConstants.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequenceReplacer.java
│       │   │       │   ├── ConfigurationLoggingInstructionSequencesReplacer.java
│       │   │       │   └── InitialStateInfo.java
│       │   │       ├── evaluation/
│       │   │       │   └── AssumeClassSpecificationVisitorFactory.java
│       │   │       ├── fixer/
│       │   │       │   └── kotlin/
│       │   │       │       ├── KotlinAnnotationCounter.java
│       │   │       │       └── KotlinAnnotationFlagFixer.java
│       │   │       ├── io/
│       │   │       │   ├── ClassMapDataEntryReplacer.java
│       │   │       │   ├── ExtraDataEntryNameMap.java
│       │   │       │   ├── ExtraDataEntryReader.java
│       │   │       │   ├── KotlinModuleRewriter.java
│       │   │       │   └── UniqueDataEntryWriter.java
│       │   │       ├── logging/
│       │   │       │   └── Logging.java
│       │   │       ├── mark/
│       │   │       │   └── Marker.java
│       │   │       ├── obfuscate/
│       │   │       │   ├── AttributeShrinker.java
│       │   │       │   ├── AttributeUsageMarker.java
│       │   │       │   ├── ClassNameAdapterFunction.java
│       │   │       │   ├── ClassObfuscator.java
│       │   │       │   ├── ClassRenamer.java
│       │   │       │   ├── DictionaryNameFactory.java
│       │   │       │   ├── MapCleaner.java
│       │   │       │   ├── MappingKeeper.java
│       │   │       │   ├── MappingPrinter.java
│       │   │       │   ├── MappingProcessor.java
│       │   │       │   ├── MappingReader.java
│       │   │       │   ├── MemberNameCleaner.java
│       │   │       │   ├── MemberNameCollector.java
│       │   │       │   ├── MemberNameConflictFixer.java
│       │   │       │   ├── MemberObfuscator.java
│       │   │       │   ├── MemberSpecialNameFilter.java
│       │   │       │   ├── MultiMappingProcessor.java
│       │   │       │   ├── NameFactory.java
│       │   │       │   ├── NameFactoryResetter.java
│       │   │       │   ├── NameMarker.java
│       │   │       │   ├── NameObfuscationReferenceFixer.java
│       │   │       │   ├── NewMemberNameFilter.java
│       │   │       │   ├── NumericNameFactory.java
│       │   │       │   ├── ObfuscationPreparation.java
│       │   │       │   ├── Obfuscator.java
│       │   │       │   ├── OriginalClassNameFilter.java
│       │   │       │   ├── ParameterNameMarker.java
│       │   │       │   ├── PrefixingNameFactory.java
│       │   │       │   ├── RenamedFlagSetter.java
│       │   │       │   ├── ResourceFileNameAdapter.java
│       │   │       │   ├── ResourceFileNameObfuscator.java
│       │   │       │   ├── ResourceJavaReferenceFixer.java
│       │   │       │   ├── SimpleNameFactory.java
│       │   │       │   ├── SourceFileRenamer.java
│       │   │       │   ├── SpecialNameFactory.java
│       │   │       │   ├── UniqueMemberNameFactory.java
│       │   │       │   ├── kotlin/
│       │   │       │   │   ├── KotlinAliasNameObfuscator.java
│       │   │       │   │   ├── KotlinAliasReferenceFixer.java
│       │   │       │   │   ├── KotlinCallableReferenceFixer.java
│       │   │       │   │   ├── KotlinCompanionEqualizer.java
│       │   │       │   │   ├── KotlinDefaultImplsMethodNameEqualizer.java
│       │   │       │   │   ├── KotlinDefaultMethodNameEqualizer.java
│       │   │       │   │   ├── KotlinIntrinsicsReplacementSequences.java
│       │   │       │   │   ├── KotlinModuleFixer.java
│       │   │       │   │   ├── KotlinModuleNameObfuscator.java
│       │   │       │   │   ├── KotlinMultiFileFacadeFixer.java
│       │   │       │   │   ├── KotlinObjectFixer.java
│       │   │       │   │   ├── KotlinPropertyNameObfuscator.java
│       │   │       │   │   ├── KotlinPropertyRenamer.java
│       │   │       │   │   ├── KotlinSourceDebugExtensionAttributeObfuscator.java
│       │   │       │   │   ├── KotlinSyntheticClassFixer.java
│       │   │       │   │   ├── KotlinSyntheticToStringObfuscator.java
│       │   │       │   │   ├── KotlinUnsupportedExceptionReplacementSequences.java
│       │   │       │   │   ├── KotlinValueParameterNameShrinker.java
│       │   │       │   │   └── KotlinValueParameterUsageMarker.java
│       │   │       │   ├── obfuscate/
│       │   │       │   │   └── package.html
│       │   │       │   └── util/
│       │   │       │       ├── InstructionSequenceObfuscator.java
│       │   │       │       └── ReplacementSequences.java
│       │   │       ├── optimize/
│       │   │       │   ├── BootstrapMethodArgumentShrinker.java
│       │   │       │   ├── CalledMemberVisitor.java
│       │   │       │   ├── ChangedCodePrinter.java
│       │   │       │   ├── ConstantMemberFilter.java
│       │   │       │   ├── ConstantParameterFilter.java
│       │   │       │   ├── DuplicateInitializerFixer.java
│       │   │       │   ├── DuplicateInitializerInvocationFixer.java
│       │   │       │   ├── InfluenceFixpointVisitor.java
│       │   │       │   ├── KeepMarker.java
│       │   │       │   ├── KeptClassFilter.java
│       │   │       │   ├── KeptMemberFilter.java
│       │   │       │   ├── LineNumberTrimmer.java
│       │   │       │   ├── MemberDescriptorSpecializer.java
│       │   │       │   ├── MemberReferenceGeneralizer.java
│       │   │       │   ├── MethodDescriptorShrinker.java
│       │   │       │   ├── MethodStaticizer.java
│       │   │       │   ├── OptimizationInfoClassFilter.java
│       │   │       │   ├── OptimizationInfoMemberFilter.java
│       │   │       │   ├── Optimizer.java
│       │   │       │   ├── ParameterShrinker.java
│       │   │       │   ├── ReverseDependencyCalculator.java
│       │   │       │   ├── ReverseDependencyStore.java
│       │   │       │   ├── SideEffectVisitorMarkerFactory.java
│       │   │       │   ├── TailRecursionSimplifier.java
│       │   │       │   ├── TimedClassPoolVisitor.java
│       │   │       │   ├── WriteOnlyFieldFilter.java
│       │   │       │   ├── evaluation/
│       │   │       │   │   ├── EvaluationShrinker.java
│       │   │       │   │   ├── EvaluationSimplifier.java
│       │   │       │   │   ├── InstructionUsageMarker.java
│       │   │       │   │   ├── LoadingInvocationUnit.java
│       │   │       │   │   ├── ParameterTracingInvocationUnit.java
│       │   │       │   │   ├── SimpleEnumArrayPropagator.java
│       │   │       │   │   ├── SimpleEnumClassChecker.java
│       │   │       │   │   ├── SimpleEnumClassSimplifier.java
│       │   │       │   │   ├── SimpleEnumDescriptorSimplifier.java
│       │   │       │   │   ├── SimpleEnumUseChecker.java
│       │   │       │   │   ├── SimpleEnumUseSimplifier.java
│       │   │       │   │   ├── StoringInvocationUnit.java
│       │   │       │   │   └── VariableOptimizer.java
│       │   │       │   ├── gson/
│       │   │       │   │   ├── DuplicateJsonFieldNameChecker.java
│       │   │       │   │   ├── FieldSignatureCollector.java
│       │   │       │   │   ├── GsonAnnotationCleaner.java
│       │   │       │   │   ├── GsonBuilderInvocationFinder.java
│       │   │       │   │   ├── GsonClassConstants.java
│       │   │       │   │   ├── GsonConstructorPatcher.java
│       │   │       │   │   ├── GsonContext.java
│       │   │       │   │   ├── GsonDeserializationInvocationFinder.java
│       │   │       │   │   ├── GsonDeserializationOptimizer.java
│       │   │       │   │   ├── GsonDomainClassFinder.java
│       │   │       │   │   ├── GsonInstrumentationAdder.java
│       │   │       │   │   ├── GsonOptimizer.java
│       │   │       │   │   ├── GsonRuntimeSettings.java
│       │   │       │   │   ├── GsonSerializationInvocationFinder.java
│       │   │       │   │   ├── GsonSerializationOptimizer.java
│       │   │       │   │   ├── InlineDeserializer.java
│       │   │       │   │   ├── InlineDeserializers.java
│       │   │       │   │   ├── InlineSerializer.java
│       │   │       │   │   ├── InlineSerializers.java
│       │   │       │   │   ├── LocalOrAnonymousClassChecker.java
│       │   │       │   │   ├── MarkedAnnotationDeleter.java
│       │   │       │   │   ├── OptimizedClassConstants.java
│       │   │       │   │   ├── OptimizedJsonFieldCollector.java
│       │   │       │   │   ├── OptimizedJsonFieldVisitor.java
│       │   │       │   │   ├── OptimizedJsonInfo.java
│       │   │       │   │   ├── OptimizedJsonReaderImplInitializer.java
│       │   │       │   │   ├── OptimizedJsonWriterImplInitializer.java
│       │   │       │   │   ├── OptimizedTypeAdapterAdder.java
│       │   │       │   │   ├── OptimizedTypeAdapterFactoryInitializer.java
│       │   │       │   │   ├── OptimizedTypeAdapterInitializer.java
│       │   │       │   │   ├── TypeArgumentFinder.java
│       │   │       │   │   ├── TypeParameterClassChecker.java
│       │   │       │   │   ├── TypeTokenClassBuilder.java
│       │   │       │   │   ├── _GsonUtil.java
│       │   │       │   │   ├── _OptimizedJsonReader.java
│       │   │       │   │   ├── _OptimizedJsonReaderImpl.java
│       │   │       │   │   ├── _OptimizedJsonWriter.java
│       │   │       │   │   ├── _OptimizedJsonWriterImpl.java
│       │   │       │   │   ├── _OptimizedTypeAdapter.java
│       │   │       │   │   ├── _OptimizedTypeAdapterFactory.java
│       │   │       │   │   ├── _OptimizedTypeAdapterImpl.java
│       │   │       │   │   └── package.html
│       │   │       │   ├── info/
│       │   │       │   │   ├── AccessMethodMarker.java
│       │   │       │   │   ├── BackwardBranchMarker.java
│       │   │       │   │   ├── CatchExceptionMarker.java
│       │   │       │   │   ├── CaughtClassFilter.java
│       │   │       │   │   ├── CaughtClassMarker.java
│       │   │       │   │   ├── ClassOptimizationInfo.java
│       │   │       │   │   ├── CodeAttributeOptimizationInfo.java
│       │   │       │   │   ├── ContainsConstructorsMarker.java
│       │   │       │   │   ├── DotClassFilter.java
│       │   │       │   │   ├── DotClassMarker.java
│       │   │       │   │   ├── DynamicInvocationMarker.java
│       │   │       │   │   ├── EscapingClassFilter.java
│       │   │       │   │   ├── EscapingClassMarker.java
│       │   │       │   │   ├── ExceptionInstructionChecker.java
│       │   │       │   │   ├── FieldOptimizationInfo.java
│       │   │       │   │   ├── FinalFieldAssignmentMarker.java
│       │   │       │   │   ├── InstanceofClassFilter.java
│       │   │       │   │   ├── InstanceofClassMarker.java
│       │   │       │   │   ├── InstantiationClassFilter.java
│       │   │       │   │   ├── InstantiationClassMarker.java
│       │   │       │   │   ├── MethodInvocationMarker.java
│       │   │       │   │   ├── MethodOptimizationInfo.java
│       │   │       │   │   ├── MutableBoolean.java
│       │   │       │   │   ├── NoEscapingParametersMethodMarker.java
│       │   │       │   │   ├── NoExternalReturnValuesMethodMarker.java
│       │   │       │   │   ├── NoExternalSideEffectMethodMarker.java
│       │   │       │   │   ├── NoSideEffectClassMarker.java
│       │   │       │   │   ├── NoSideEffectMethodMarker.java
│       │   │       │   │   ├── NonEmptyStackReturnMarker.java
│       │   │       │   │   ├── NonPrivateMemberMarker.java
│       │   │       │   │   ├── OptimizationCodeAttributeFilter.java
│       │   │       │   │   ├── PackageVisibleMemberContainingClassMarker.java
│       │   │       │   │   ├── PackageVisibleMemberInvokingClassMarker.java
│       │   │       │   │   ├── ParameterEscapeMarker.java
│       │   │       │   │   ├── ParameterEscapedMarker.java
│       │   │       │   │   ├── ParameterUsageMarker.java
│       │   │       │   │   ├── ProgramClassOptimizationInfo.java
│       │   │       │   │   ├── ProgramClassOptimizationInfoSetter.java
│       │   │       │   │   ├── ProgramFieldOptimizationInfo.java
│       │   │       │   │   ├── ProgramMemberOptimizationInfoSetter.java
│       │   │       │   │   ├── ProgramMethodOptimizationInfo.java
│       │   │       │   │   ├── ReadWriteFieldMarker.java
│       │   │       │   │   ├── ReferenceEscapeChecker.java
│       │   │       │   │   ├── RepeatedClassPoolVisitor.java
│       │   │       │   │   ├── SideEffectClassChecker.java
│       │   │       │   │   ├── SideEffectClassFilter.java
│       │   │       │   │   ├── SideEffectClassMarker.java
│       │   │       │   │   ├── SideEffectInstructionChecker.java
│       │   │       │   │   ├── SideEffectMethodFilter.java
│       │   │       │   │   ├── SideEffectMethodMarker.java
│       │   │       │   │   ├── SimpleEnumFilter.java
│       │   │       │   │   ├── SimpleEnumMarker.java
│       │   │       │   │   ├── SuperInvocationMarker.java
│       │   │       │   │   ├── SynchronizedBlockMethodMarker.java
│       │   │       │   │   ├── UnusedParameterMethodFilter.java
│       │   │       │   │   ├── UnusedParameterOptimizationInfoUpdater.java
│       │   │       │   │   ├── UsedParameterFilter.java
│       │   │       │   │   ├── VariableUsageMarker.java
│       │   │       │   │   └── WrapperClassMarker.java
│       │   │       │   ├── kotlin/
│       │   │       │   │   └── KotlinContextReceiverUsageMarker.java
│       │   │       │   └── peephole/
│       │   │       │       ├── ClassFinalizer.java
│       │   │       │       ├── ClassMerger.java
│       │   │       │       ├── GotoCommonCodeReplacer.java
│       │   │       │       ├── GotoGotoReplacer.java
│       │   │       │       ├── GotoReturnReplacer.java
│       │   │       │       ├── HorizontalClassMerger.java
│       │   │       │       ├── InstructionSequenceConstants.java
│       │   │       │       ├── LineNumberLinearizer.java
│       │   │       │       ├── MemberPrivatizer.java
│       │   │       │       ├── MethodFinalizer.java
│       │   │       │       ├── MethodInliner.java
│       │   │       │       ├── NoConstructorReferenceReplacer.java
│       │   │       │       ├── NopRemover.java
│       │   │       │       ├── ReachableCodeMarker.java
│       │   │       │       ├── RetargetedClassFilter.java
│       │   │       │       ├── RetargetedInnerClassAttributeRemover.java
│       │   │       │       ├── ShortMethodInliner.java
│       │   │       │       ├── SingleInvocationMethodInliner.java
│       │   │       │       ├── TargetClassChanger.java
│       │   │       │       ├── UnreachableCodeRemover.java
│       │   │       │       ├── UnreachableExceptionRemover.java
│       │   │       │       ├── VariableShrinker.java
│       │   │       │       ├── VerticalClassMerger.java
│       │   │       │       ├── WrapperClassMerger.java
│       │   │       │       └── WrapperClassUseSimplifier.java
│       │   │       ├── pass/
│       │   │       │   ├── Pass.java
│       │   │       │   └── PassRunner.java
│       │   │       ├── preverify/
│       │   │       │   ├── PreverificationClearer.java
│       │   │       │   ├── Preverifier.java
│       │   │       │   └── SubroutineInliner.java
│       │   │       ├── shrink/
│       │   │       │   ├── AnnotationUsageMarker.java
│       │   │       │   ├── ClassShrinker.java
│       │   │       │   ├── ClassUsageMarker.java
│       │   │       │   ├── InnerUsageMarker.java
│       │   │       │   ├── InterfaceUsageMarker.java
│       │   │       │   ├── KotlinModuleShrinker.java
│       │   │       │   ├── KotlinModuleUsageMarker.java
│       │   │       │   ├── KotlinShrinker.java
│       │   │       │   ├── LocalVariableTypeUsageMarker.java
│       │   │       │   ├── NestUsageMarker.java
│       │   │       │   ├── RecordComponentUsageMarker.java
│       │   │       │   ├── ShortestClassUsageMarker.java
│       │   │       │   ├── ShortestUsageMark.java
│       │   │       │   ├── ShortestUsageMarker.java
│       │   │       │   ├── ShortestUsagePrinter.java
│       │   │       │   ├── Shrinker.java
│       │   │       │   ├── SimpleUsageMarker.java
│       │   │       │   ├── UsageMarker.java
│       │   │       │   ├── UsagePrinter.java
│       │   │       │   ├── UsedClassFilter.java
│       │   │       │   ├── UsedMemberFilter.java
│       │   │       │   └── shrink/
│       │   │       │       └── package.html
│       │   │       ├── strip/
│       │   │       │   └── KotlinAnnotationStripper.java
│       │   │       └── util/
│       │   │           ├── Benchmark.java
│       │   │           ├── HashUtil.java
│       │   │           ├── PrintWriterUtil.java
│       │   │           ├── TimeUtil.java
│       │   │           ├── TransformedStringMatcher.java
│       │   │           └── kotlin/
│       │   │               ├── KotlinUnsupportedVersionChecker.java
│       │   │               └── asserter/
│       │   │                   ├── KotlinMetadataVerifier.java
│       │   │                   └── Reporter.java
│       │   └── resources/
│       │       └── log4j2.xml
│       └── test/
│           └── kotlin/
│               ├── proguard/
│               │   ├── AfterInitConfigurationVerifierTest.kt
│               │   ├── ClassMergerTest.kt
│               │   ├── ClassSpecificationVisitorFactoryTest.kt
│               │   ├── ConfigurationParserTest.kt
│               │   ├── Java19RecordPatternTest.kt
│               │   ├── Java20RecordPatternTest.kt
│               │   ├── LoggingTest.kt
│               │   ├── MarkerTest.kt
│               │   ├── obfuscate/
│               │   │   ├── SimpleNameFactoryTest.kt
│               │   │   └── kotlin/
│               │   │       ├── KotlinCallableReferenceFixerTest.kt
│               │   │       ├── KotlinIntrinsicsReplacementSequencesTest.kt
│               │   │       └── KotlinValueParameterNameShrinkerTest.kt
│               │   ├── optimize/
│               │   │   ├── KotlinContextReceiverParameterShrinkingTest.kt
│               │   │   ├── MemberDescriptorSpecializerTest.kt
│               │   │   ├── SimpleEnumClassCheckerTest.kt
│               │   │   ├── gson/
│               │   │   │   ├── MarkedAnnotationDeleterTest.kt
│               │   │   │   └── TypeArgumentFinderTest.kt
│               │   │   ├── info/
│               │   │   │   └── InstantiationClassMarkerTest.kt
│               │   │   └── peephole/
│               │   │       └── MethodInlinerTest.kt
│               │   ├── shrink/
│               │   │   └── ClassUsageMarkerTest.kt
│               │   └── util/
│               │       └── ProguardAssemblerTest.kt
│               └── testutils/
│                   ├── ConfigurationUtil.kt
│                   ├── JavaUtil.kt
│                   ├── LogUtils.kt
│                   ├── ProcessingFlagUtil.kt
│                   └── TestConfig.kt
├── bin/
│   ├── dprotect.sh
│   ├── proguard.bat
│   ├── proguard.sh
│   ├── proguardgui.bat
│   ├── proguardgui.sh
│   ├── retrace.bat
│   └── retrace.sh
├── build.gradle
├── docs/
│   ├── md/
│   │   ├── css/
│   │   │   ├── admonition.css
│   │   │   └── extra.css
│   │   ├── downloads.md
│   │   ├── index.md
│   │   ├── manual/
│   │   │   ├── FAQ.md
│   │   │   ├── building.md
│   │   │   ├── configuration/
│   │   │   │   ├── attributes.md
│   │   │   │   ├── examples.md
│   │   │   │   ├── optimizations.md
│   │   │   │   └── usage.md
│   │   │   ├── feedback.md
│   │   │   ├── home.md
│   │   │   ├── languages/
│   │   │   │   ├── java.md
│   │   │   │   └── kotlin.md
│   │   │   ├── license/
│   │   │   │   ├── gpl.md
│   │   │   │   ├── gplexception.md
│   │   │   │   └── license.md
│   │   │   ├── quickstart.md
│   │   │   ├── refcard.md
│   │   │   ├── releasenotes.md
│   │   │   ├── setup/
│   │   │   │   ├── ant.md
│   │   │   │   ├── gradle.md
│   │   │   │   ├── gradleplugin.md
│   │   │   │   └── standalone.md
│   │   │   ├── tools/
│   │   │   │   ├── appsweep.md
│   │   │   │   ├── playground.md
│   │   │   │   └── retrace.md
│   │   │   └── troubleshooting/
│   │   │       ├── limitations.md
│   │   │       └── troubleshooting.md
│   │   └── results.md
│   ├── mkdocs.yml
│   └── notices/
│       └── Gson
├── dprotect/
│   └── build.gradle
├── examples/
│   ├── android-agp3-agp4/
│   │   ├── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── debug.keystore
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard-project.txt
│   │   ├── res/
│   │   │   └── values/
│   │   │       ├── colors.xml
│   │   │       ├── strings.xml
│   │   │       └── styles.xml
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── com/
│   │           └── example/
│   │               └── HelloWorldActivity.java
│   ├── android-plugin/
│   │   ├── AndroidManifest.xml
│   │   ├── build.gradle
│   │   ├── debug.keystore
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard-project.txt
│   │   ├── res/
│   │   │   └── values/
│   │   │       ├── colors.xml
│   │   │       ├── strings.xml
│   │   │       └── styles.xml
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── com/
│   │           └── example/
│   │               └── HelloWorldActivity.java
│   ├── annotations/
│   │   ├── examples/
│   │   │   ├── Applet.java
│   │   │   ├── Application.java
│   │   │   ├── Bean.java
│   │   │   └── NativeCallBack.java
│   │   └── examples.pro
│   ├── ant/
│   │   ├── applets.xml
│   │   ├── applications1.xml
│   │   ├── applications2.xml
│   │   ├── applications3.xml
│   │   ├── library.xml
│   │   ├── midlets.xml
│   │   ├── proguard.xml
│   │   └── servlets.xml
│   ├── application/
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard.pro
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── example/
│   │                       └── App.java
│   ├── application-kotlin/
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── proguard.pro
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           └── kotlin/
│   │               └── App.kt
│   ├── dictionaries/
│   │   ├── compact.txt
│   │   ├── keywords.txt
│   │   ├── shakespeare.txt
│   │   └── windows.txt
│   ├── gradle/
│   │   ├── android.gradle
│   │   ├── applets.gradle
│   │   ├── applications.gradle
│   │   ├── library.gradle
│   │   ├── midlets.gradle
│   │   ├── proguard.gradle
│   │   ├── proguardgui.gradle
│   │   ├── retrace.gradle
│   │   ├── scala.gradle
│   │   ├── servlets.gradle
│   │   └── settings.gradle
│   ├── gradle-kotlin-dsl/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── settings.gradle.kts
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── gradlekotlindsl/
│   │       │           └── App.java
│   │       └── test/
│   │           └── java/
│   │               └── gradlekotlindsl/
│   │                   └── AppTest.java
│   ├── spring-boot/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── settings.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── example/
│   │           │           └── demo/
│   │           │               ├── DemoApplication.java
│   │           │               ├── TestComponent.java
│   │           │               └── sub/
│   │           │                   └── TestComponent2.java
│   │           └── resources/
│   │               └── application.properties
│   └── standalone/
│       ├── android.pro
│       ├── applets.pro
│       ├── applications.pro
│       ├── library.pro
│       ├── midlets.pro
│       ├── proguard.pro
│       ├── proguardgui.pro
│       ├── retrace.pro
│       ├── scala.pro
│       └── servlets.pro
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle-plugin/
│   ├── .gitignore
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── proguard/
│       │   │       └── gradle/
│       │   │           └── ProGuardTask.java
│       │   ├── kotlin/
│       │   │   └── proguard/
│       │   │       └── gradle/
│       │   │           └── plugin/
│       │   │               ├── ProGuardPlugin.kt
│       │   │               └── android/
│       │   │                   ├── AndroidPlugin.kt
│       │   │                   ├── ProGuardTransform.kt
│       │   │                   ├── dsl/
│       │   │                   │   ├── ProGuardAndroidExtension.kt
│       │   │                   │   ├── ProGuardConfiguration.kt
│       │   │                   │   └── VariantConfiguration.kt
│       │   │                   ├── tasks/
│       │   │                   │   ├── CollectConsumerRulesTask.kt
│       │   │                   │   └── PrepareProguardConfigDirectoryTask.kt
│       │   │                   └── transforms/
│       │   │                       ├── AndroidConsumerRulesTransform.kt
│       │   │                       └── ArchiveConsumerRulesTransform.kt
│       │   └── resources/
│       │       └── lib/
│       │           ├── proguard-android-common.txt
│       │           ├── proguard-android-debug.txt
│       │           ├── proguard-android-optimize.txt
│       │           └── proguard-android.txt
│       └── test/
│           └── kotlin/
│               ├── proguard/
│               │   └── gradle/
│               │       ├── AgpVersionParserTest.kt
│               │       ├── ConsumerRulesCollectionTest.kt
│               │       ├── ConsumerRulesFilterTest.kt
│               │       ├── GradlePluginIntegrationTest.kt
│               │       ├── ProGuardPluginLegacyAGPIntegrationTest.kt
│               │       ├── ProGuardPluginTest.kt
│               │       ├── ProguardCacheRelocateabilityIntegrationTest.kt
│               │       └── plugin/
│               │           └── android/
│               │               └── dsl/
│               │                   ├── AaptRulesTest.kt
│               │                   ├── ConfigurationOrderTest.kt
│               │                   ├── ConfigurationTest.kt
│               │                   ├── DefaultConfigurationTest.kt
│               │                   └── FlavorsConfigurationTest.kt
│               └── testutils/
│                   ├── AndroidProjectBuilder.kt
│                   ├── GradleRunnerUtil.kt
│                   └── TestPluginClasspath.kt
├── gradle.properties
├── gradlew
├── gradlew.bat
├── gui/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── gui/
│               ├── ClassPathPanel.java
│               ├── ClassSpecificationDialog.java
│               ├── ClassSpecificationsPanel.java
│               ├── ExtensionFileFilter.java
│               ├── FilterBuilder.java
│               ├── FilterDialog.java
│               ├── GUIResources.java
│               ├── GUIResources.properties
│               ├── JavaUtil.java
│               ├── KeepSpecificationsPanel.java
│               ├── ListPanel.java
│               ├── MemberSpecificationDialog.java
│               ├── MemberSpecificationsPanel.java
│               ├── MessageDialogRunnable.java
│               ├── OptimizationsDialog.java
│               ├── ProGuardGUI.java
│               ├── ProGuardRunnable.java
│               ├── ReTraceRunnable.java
│               ├── SwingUtil.java
│               ├── TabbedPane.java
│               ├── TextAreaOutputStream.java
│               ├── TextAreaWriter.java
│               ├── boilerplate.pro
│               ├── default.pro
│               ├── package.html
│               └── splash/
│                   ├── BufferedSprite.java
│                   ├── CircleSprite.java
│                   ├── ClipSprite.java
│                   ├── ColorSprite.java
│                   ├── CompositeSprite.java
│                   ├── ConstantColor.java
│                   ├── ConstantDouble.java
│                   ├── ConstantFont.java
│                   ├── ConstantInt.java
│                   ├── ConstantString.java
│                   ├── ConstantTiming.java
│                   ├── FontSprite.java
│                   ├── ImageSprite.java
│                   ├── LinearColor.java
│                   ├── LinearDouble.java
│                   ├── LinearInt.java
│                   ├── LinearTiming.java
│                   ├── OverrideGraphics2D.java
│                   ├── RectangleSprite.java
│                   ├── SawToothTiming.java
│                   ├── ShadowedSprite.java
│                   ├── SineTiming.java
│                   ├── SmoothTiming.java
│                   ├── SplashPanel.java
│                   ├── Sprite.java
│                   ├── TextSprite.java
│                   ├── TimeSwitchSprite.java
│                   ├── Timing.java
│                   ├── TypeWriterString.java
│                   ├── VariableColor.java
│                   ├── VariableDouble.java
│                   ├── VariableFont.java
│                   ├── VariableInt.java
│                   ├── VariableSizeFont.java
│                   ├── VariableString.java
│                   └── package.html
├── proguard-app/
│   └── build.gradle
├── retrace/
│   ├── build.gradle
│   └── src/
│       └── proguard/
│           └── retrace/
│               ├── FrameInfo.java
│               ├── FramePattern.java
│               ├── FrameRemapper.java
│               ├── ReTrace.java
│               └── package.html
├── scripts/
│   ├── docker/
│   │   ├── gh_action.sh
│   │   └── publish_gradle_plugin.sh
│   └── fetch_dprotect_core.py
└── settings.gradle
Download .txt
Showing preview only (420K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4392 symbols across 451 files)

FILE: .github/scripts/s3-deploy.py
  class CI (line 12) | class CI(Enum):
  function pretty_ci_name (line 16) | def pretty_ci_name(ci):
  function is_pr (line 19) | def is_pr(ci):
  function get_branch (line 26) | def get_branch(ci):
  function get_ci_workdir (line 31) | def get_ci_workdir(ci):
  function get_tag (line 37) | def get_tag(ci):
  function push (line 133) | def push(file: str, dir_name: str):
  function filename (line 146) | def filename(object):
  function generate_index (line 149) | def generate_index(dir_name: str):

FILE: ant/src/proguard/ant/ClassPathElement.java
  class ClassPathElement (line 36) | public class ClassPathElement extends Path
    method ClassPathElement (line 50) | public ClassPathElement(Project project)
    method appendClassPathEntriesTo (line 61) | public void appendClassPathEntriesTo(ClassPath classPath, boolean output)
    method setFile (line 143) | public void setFile(File file)
    method setDir (line 152) | public void setDir(File file)
    method setName (line 161) | public void setName(File file)
    method setFilter (line 167) | public void setFilter(String filter)
    method setApkfilter (line 173) | public void setApkfilter(String apkFilter)
    method setJarfilter (line 179) | public void setJarfilter(String jarFilter)
    method setAarfilter (line 185) | public void setAarfilter(String aarFilter)
    method setWarfilter (line 191) | public void setWarfilter(String warFilter)
    method setEarfilter (line 197) | public void setEarfilter(String earFilter)
    method setZipfilter (line 203) | public void setZipfilter(String zipFilter)

FILE: ant/src/proguard/ant/ClassSpecificationElement.java
  class ClassSpecificationElement (line 36) | public class ClassSpecificationElement extends DataType
    method appendTo (line 54) | public void appendTo(List classSpecifications)
    method createClassSpecification (line 74) | protected ClassSpecification createClassSpecification(ClassSpecificati...
    method setAccess (line 116) | public void setAccess(String access)
    method setAnnotation (line 122) | public void setAnnotation(String annotation)
    method setType (line 128) | public void setType(String type)
    method setName (line 134) | public void setName(String name)
    method setExtendsannotation (line 140) | public void setExtendsannotation(String extendsAnnotation)
    method setExtends (line 146) | public void setExtends(String extends_)
    method setImplements (line 152) | public void setImplements(String implements_)
    method addConfiguredField (line 160) | public void addConfiguredField(MemberSpecificationElement memberSpecif...
    method addConfiguredMethod (line 173) | public void addConfiguredMethod(MemberSpecificationElement memberSpeci...
    method addConfiguredConstructor (line 186) | public void addConfiguredConstructor(MemberSpecificationElement member...
    method requiredAccessFlags (line 201) | private int requiredAccessFlags(boolean set,

FILE: ant/src/proguard/ant/ConfigurationElement.java
  class ConfigurationElement (line 36) | public class ConfigurationElement extends FileSet
    method appendTo (line 43) | public void appendTo(Configuration configuration)

FILE: ant/src/proguard/ant/ConfigurationTask.java
  class ConfigurationTask (line 34) | public class ConfigurationTask extends Task
    method appendTo (line 43) | public void appendTo(Configuration configuration)
    method addConfiguredInjar (line 104) | public void addConfiguredInjar(ClassPathElement classPathElement)
    method addConfiguredOutjar (line 112) | public void addConfiguredOutjar(ClassPathElement classPathElement)
    method addConfiguredLibraryjar (line 120) | public void addConfiguredLibraryjar(ClassPathElement classPathElement)
    method addConfiguredKeepdirectory (line 128) | public void addConfiguredKeepdirectory(FilterElement filterElement)
    method addConfiguredKeepdirectories (line 135) | public void addConfiguredKeepdirectories(FilterElement filterElement)
    method addConfiguredKeep (line 142) | public void addConfiguredKeep(KeepSpecificationElement keepSpecificati...
    method addConfiguredKeepclassmembers (line 152) | public void addConfiguredKeepclassmembers(KeepSpecificationElement kee...
    method addConfiguredKeepclasseswithmembers (line 162) | public void addConfiguredKeepclasseswithmembers(KeepSpecificationEleme...
    method addConfiguredKeepnames (line 172) | public void addConfiguredKeepnames(KeepSpecificationElement keepSpecif...
    method addConfiguredKeepclassmembernames (line 185) | public void addConfiguredKeepclassmembernames(KeepSpecificationElement...
    method addConfiguredKeepclasseswithmembernames (line 198) | public void addConfiguredKeepclasseswithmembernames(KeepSpecificationE...
    method addConfiguredWhyareyoukeeping (line 211) | public void addConfiguredWhyareyoukeeping(ClassSpecificationElement cl...
    method addConfiguredAssumenosideeffects (line 218) | public void addConfiguredAssumenosideeffects(ClassSpecificationElement...
    method addConfiguredAssumenoexternalsideeffects (line 225) | public void addConfiguredAssumenoexternalsideeffects(ClassSpecificatio...
    method addConfiguredAssumenoescapingparameters (line 232) | public void addConfiguredAssumenoescapingparameters(ClassSpecification...
    method addConfiguredAssumenoexternalreturnvalues (line 239) | public void addConfiguredAssumenoexternalreturnvalues(ClassSpecificati...
    method addConfiguredAssumevalues (line 246) | public void addConfiguredAssumevalues(ClassSpecificationElement classS...
    method addConfiguredOptimizations (line 253) | public void addConfiguredOptimizations(FilterElement filterElement)
    method addConfiguredOptimization (line 259) | public void addConfiguredOptimization(FilterElement filterElement)
    method addConfiguredKeeppackagename (line 266) | public void addConfiguredKeeppackagename(FilterElement filterElement)
    method addConfiguredKeeppackagenames (line 274) | public void addConfiguredKeeppackagenames(FilterElement filterElement)
    method addConfiguredKeepattributes (line 282) | public void addConfiguredKeepattributes(FilterElement filterElement)
    method addConfiguredKeepattribute (line 288) | public void addConfiguredKeepattribute(FilterElement filterElement)
    method addConfiguredAdaptclassstrings (line 295) | public void addConfiguredAdaptclassstrings(FilterElement filterElement)
    method addConfiguredAdaptresourcefilenames (line 302) | public void addConfiguredAdaptresourcefilenames(FilterElement filterEl...
    method addConfiguredAdaptresourcefilecontents (line 309) | public void addConfiguredAdaptresourcefilecontents(FilterElement filte...
    method addConfiguredDontnote (line 316) | public void addConfiguredDontnote(FilterElement filterElement)
    method addConfiguredDontwarn (line 322) | public void addConfiguredDontwarn(FilterElement filterElement)
    method addConfiguredConfiguration (line 328) | public void addConfiguredConfiguration(ConfigurationElement configurat...
    method addText (line 336) | public void addText(String text) throws BuildException
    method extendClassPath (line 371) | private ClassPath extendClassPath(ClassPath        classPath,
    method extendClassPath (line 387) | private ClassPath extendClassPath(ClassPath classPath,
    method extendKeepSpecifications (line 404) | private List extendKeepSpecifications(List                     keepSpe...
    method extendClassSpecifications (line 424) | private List extendClassSpecifications(List                      class...
    method extendClassSpecifications (line 438) | private List extendClassSpecifications(List classSpecifications,
    method extendFilter (line 455) | private List extendFilter(List          filter,
    method extendFilter (line 462) | private List extendFilter(List          filter,
    method extendList (line 477) | private List extendList(List list,

FILE: ant/src/proguard/ant/FilterElement.java
  class FilterElement (line 34) | public class FilterElement extends DataType
    method appendTo (line 45) | public void appendTo(List filter, boolean internal)
    method setName (line 75) | public void setName(String name)
    method setFilter (line 81) | public void setFilter(String filter)

FILE: ant/src/proguard/ant/KeepSpecificationElement.java
  class KeepSpecificationElement (line 32) | public class KeepSpecificationElement extends ClassSpecificationElement
    method appendTo (line 48) | public void appendTo(List    keepSpecifications,
    method setIncludedescriptorclasses (line 78) | public void setIncludedescriptorclasses(boolean markDescriptorClasses)
    method setIncludecode (line 84) | public void setIncludecode(boolean markCodeAttributes)
    method setAllowshrinking (line 90) | public void setAllowshrinking(boolean allowShrinking)
    method setAllowoptimization (line 96) | public void setAllowoptimization(boolean allowOptimization)
    method setAllowobfuscation (line 102) | public void setAllowobfuscation(boolean allowObfuscation)

FILE: ant/src/proguard/ant/MemberSpecificationElement.java
  class MemberSpecificationElement (line 37) | public class MemberSpecificationElement extends DataType
    method appendTo (line 57) | public void appendTo(List    memberSpecifications,
    method setAccess (line 152) | public void setAccess(String access)
    method setAnnotation (line 158) | public void setAnnotation(String annotation)
    method setType (line 164) | public void setType(String type)
    method setName (line 170) | public void setName(String name)
    method setParameters (line 176) | public void setParameters(String parameters)
    method setParam (line 185) | public void setParam(String parameters)
    method setValues (line 191) | public void setValues(String values)
    method requiredAccessFlags (line 199) | private int requiredAccessFlags(boolean set,
    method parseValues (line 253) | private Number[] parseValues(String externalType,
    method parseValue (line 277) | private Number parseValue(String externalType,
    method parseBoolean (line 325) | private Integer parseBoolean(String string)

FILE: ant/src/proguard/ant/ProGuardTask.java
  class ProGuardTask (line 36) | public class ProGuardTask extends ConfigurationTask
    method setConfiguration (line 40) | public void setConfiguration(File configurationFile) throws BuildExcep...
    method setOutjar (line 73) | public void setOutjar(String parameters)
    method setSkipnonpubliclibraryclasses (line 79) | public void setSkipnonpubliclibraryclasses(boolean skipNonPublicLibrar...
    method setSkipnonpubliclibraryclassmembers (line 85) | public void setSkipnonpubliclibraryclassmembers(boolean skipNonPublicL...
    method setTarget (line 91) | public void setTarget(String target)
    method setForceprocessing (line 101) | public void setForceprocessing(boolean forceProcessing)
    method setPrintseeds (line 107) | public void setPrintseeds(File printSeeds)
    method setShrink (line 113) | public void setShrink(boolean shrink)
    method setPrintusage (line 119) | public void setPrintusage(File printUsage)
    method setOptimize (line 125) | public void setOptimize(boolean optimize)
    method setOptimizationpasses (line 131) | public void setOptimizationpasses(int optimizationPasses)
    method setAllowaccessmodification (line 137) | public void setAllowaccessmodification(boolean allowAccessModification)
    method setMergeinterfacesaggressively (line 143) | public void setMergeinterfacesaggressively(boolean mergeinterfacesaggr...
    method setObfuscate (line 149) | public void setObfuscate(boolean obfuscate)
    method setPrintmapping (line 155) | public void setPrintmapping(File printMapping)
    method setApplymapping (line 161) | public void setApplymapping(File applyMapping)
    method setObfuscationdictionary (line 167) | public void setObfuscationdictionary(File obfuscationDictionary)
    method setClassobfuscationdictionary (line 173) | public void setClassobfuscationdictionary(File classObfuscationDiction...
    method setPackageobfuscationdictionary (line 179) | public void setPackageobfuscationdictionary(File packageObfuscationDic...
    method setOverloadaggressively (line 185) | public void setOverloadaggressively(boolean overloadAggressively)
    method setUseuniqueclassmembernames (line 191) | public void setUseuniqueclassmembernames(boolean useUniqueClassMemberN...
    method setUsemixedcaseclassnames (line 197) | public void setUsemixedcaseclassnames(boolean useMixedCaseClassNames)
    method setFlattenpackagehierarchy (line 203) | public void setFlattenpackagehierarchy(String flattenPackageHierarchy)
    method setRepackageclasses (line 209) | public void setRepackageclasses(String repackageClasses)
    method setDefaultpackage (line 217) | public void setDefaultpackage(String defaultPackage)
    method setKeepparameternames (line 223) | public void setKeepparameternames(boolean keepParameterNames)
    method setRenamesourcefileattribute (line 229) | public void setRenamesourcefileattribute(String newSourceFileAttribute)
    method setPreverify (line 235) | public void setPreverify(boolean preverify)
    method setMicroedition (line 241) | public void setMicroedition(boolean microEdition)
    method setAndroid (line 247) | public void setAndroid(boolean android)
    method setVerbose (line 253) | public void setVerbose(boolean verbose)
    method setNote (line 259) | public void setNote(boolean note)
    method setWarn (line 278) | public void setWarn(boolean warn)
    method setIgnorewarnings (line 297) | public void setIgnorewarnings(boolean ignoreWarnings)
    method setPrintconfiguration (line 303) | public void setPrintconfiguration(File printConfiguration)
    method setDump (line 309) | public void setDump(File dump)
    method setAddconfigurationdebugging (line 315) | public void setAddconfigurationdebugging(boolean addConfigurationDebug...
    method setKeepkotlinmetadata (line 320) | public void setKeepkotlinmetadata(boolean keepKotlinMetadata)
    method execute (line 328) | public void execute() throws BuildException
    method optionalFile (line 349) | private File optionalFile(File file)
    method resolvedURL (line 368) | private URL resolvedURL(File file)
    method resolvedFile (line 385) | private File resolvedFile(File file)

FILE: base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java
  class ArithmeticObfuscationClassSpecification (line 4) | public class ArithmeticObfuscationClassSpecification extends Obfuscation...
    method ArithmeticObfuscationClassSpecification (line 8) | public ArithmeticObfuscationClassSpecification(ClassSpecification clas...
    method equals (line 16) | @Override
    method hashCode (line 31) | @Override
    method clone (line 40) | @Override

FILE: base/src/main/java/dprotect/CFObfuscationClassSpecification.java
  class CFObfuscationClassSpecification (line 4) | public class CFObfuscationClassSpecification extends ObfuscationClassSpe...
    method CFObfuscationClassSpecification (line 6) | public CFObfuscationClassSpecification(ClassSpecification classSpecifi...
    method equals (line 12) | @Override
    method hashCode (line 25) | @Override
    method clone (line 32) | @Override

FILE: base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java
  class ClassObfuSpecVisitorFactory (line 10) | public class ClassObfuSpecVisitorFactory extends ClassSpecificationVisit...
    method createClassPoolVisitor (line 12) | public ClassPoolVisitor createClassPoolVisitor(List classSpecifications,

FILE: base/src/main/java/dprotect/Configuration.java
  class Configuration (line 13) | public class Configuration extends proguard.Configuration

FILE: base/src/main/java/dprotect/ConfigurationConstants.java
  class ConfigurationConstants (line 3) | public class ConfigurationConstants extends proguard.ConfigurationConstants

FILE: base/src/main/java/dprotect/ConfigurationParser.java
  class ConfigurationParser (line 16) | public class ConfigurationParser extends proguard.ConfigurationParser
    method ConfigurationParser (line 21) | public ConfigurationParser(String[]   args,
    method ConfigurationParser (line 29) | public ConfigurationParser(String[]   args,
    method ConfigurationParser (line 38) | public ConfigurationParser(String     lines,
    method ConfigurationParser (line 48) | public ConfigurationParser(File file) throws IOException
    method ConfigurationParser (line 55) | public ConfigurationParser(File       file,
    method ConfigurationParser (line 63) | public ConfigurationParser(URL        url,
    method ConfigurationParser (line 71) | public ConfigurationParser(WordReader reader,
    method parse (line 78) | public void parse(Configuration configuration)
    method parseObfuscationConfig (line 177) | public void parseObfuscationConfig(Configuration configuration)
    method parseStringOpt (line 195) | private void parseStringOpt(Configuration configuration)
    method parseArithmeticOpt (line 232) | private void parseArithmeticOpt(Configuration configuration)
    method parseConstantsOpt (line 300) | private void parseConstantsOpt(Configuration configuration)
    method parseControlFlowOpt (line 329) | private void parseControlFlowOpt(Configuration configuration)

FILE: base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java
  class ConstantObfuscationClassSpecification (line 4) | public class ConstantObfuscationClassSpecification extends ObfuscationCl...
    method ConstantObfuscationClassSpecification (line 6) | public ConstantObfuscationClassSpecification(ClassSpecification classS...
    method equals (line 12) | @Override
    method hashCode (line 25) | @Override
    method clone (line 32) | @Override

FILE: base/src/main/java/dprotect/DProtect.java
  class DProtect (line 55) | public class DProtect
    method DProtect (line 72) | public DProtect(Configuration configuration)
    method execute (line 82) | public void execute() throws Exception
    method checkGpl (line 270) | private void checkGpl()
    method requiresKotlinMetadata (line 275) | private boolean requiresKotlinMetadata()
    method printConfiguration (line 290) | private void printConfiguration() throws IOException
    method checkConfiguration (line 304) | private void checkConfiguration() throws IOException
    method checkUpToDate (line 313) | private void checkUpToDate()
    method readInput (line 322) | private void readInput() throws Exception
    method clearPreverification (line 332) | private void clearPreverification() throws Exception
    method initialize (line 342) | private void initialize() throws Exception
    method mark (line 362) | private void mark() throws Exception
    method stripKotlinMetadataAnnotations (line 371) | private void stripKotlinMetadataAnnotations() throws Exception
    method checkConfigurationAfterInitialization (line 379) | private void checkConfigurationAfterInitialization() throws Exception
    method introducePrimitiveArrayConstants (line 387) | private void introducePrimitiveArrayConstants() throws Exception
    method backport (line 396) | private void backport() throws Exception
    method addConfigurationLogging (line 406) | private void addConfigurationLogging() throws Exception
    method printSeeds (line 416) | private void printSeeds() throws Exception
    method inlineSubroutines (line 425) | private void inlineSubroutines() throws Exception
    method shrink (line 435) | private void shrink(boolean afterOptimizer) throws Exception
    method optimizeGson (line 451) | private void optimizeGson() throws Exception
    method optimize (line 461) | private void optimize() throws Exception
    method linearizeLineNumbers (line 483) | private void linearizeLineNumbers() throws Exception
    method markObfuscation (line 493) | private void markObfuscation() throws Exception
    method obfuscate (line 502) | private void obfuscate() throws Exception
    method adaptKotlinMetadata (line 540) | private void adaptKotlinMetadata() throws Exception
    method expandPrimitiveArrayConstants (line 550) | private void expandPrimitiveArrayConstants()
    method target (line 559) | private void target() throws Exception
    method preverify (line 568) | private void preverify() throws Exception
    method trimLineNumbers (line 578) | private void trimLineNumbers() throws Exception
    method sortClassElements (line 587) | private void sortClassElements()
    method writeOutput (line 605) | private void writeOutput() throws Exception
    method dump (line 615) | private void dump() throws Exception
    method getVersion (line 624) | public static String getVersion()
    method main (line 643) | public static void main(String[] args)

FILE: base/src/main/java/dprotect/ObfuscationClassSpecification.java
  class ObfuscationClassSpecification (line 5) | public class ObfuscationClassSpecification extends ClassSpecification
    type Level (line 7) | public static enum Level {
    method ObfuscationClassSpecification (line 13) | public ObfuscationClassSpecification(ClassSpecification classSpecifica...
    method ObfuscationClassSpecification (line 20) | public ObfuscationClassSpecification(ClassSpecification classSpecifica...
    method equals (line 25) | @Override
    method hashCode (line 40) | @Override
    method clone (line 46) | @Override

FILE: base/src/main/java/dprotect/deobfuscation/Deobfuscator.java
  class Deobfuscator (line 28) | public class Deobfuscator implements Pass
    method Deobfuscator (line 41) | public Deobfuscator(Configuration configuration)
    method execute (line 49) | @Override
    method deobfuscate (line 78) | private void deobfuscate(Configuration         configuration,

FILE: base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java
  class XoredStrings (line 20) | public class XoredStrings
    class LdcInfo (line 35) | private class LdcInfo
      method LdcInfo (line 39) | LdcInfo(int offset, byte opcode)
    method XoredStrings (line 46) | public XoredStrings(String talsecKey, ClassSpecification decodeInfo)
    method isDecodeMethod (line 52) | private boolean isDecodeMethod(String clazz, String method)
    method hex2bytes (line 73) | public static byte[] hex2bytes(String s) {
    method decode (line 83) | private String decode(byte[] bytes) {
    method decode (line 91) | private String decode(String enc)
    method visitAnyAttribute (line 98) | @Override
    method visitCodeAttribute (line 101) | @Override
    method visitAnyInstruction (line 111) | @Override
    method visitConstantInstruction (line 114) | @Override
    method visitStringConstant (line 153) | @Override
    method visitUtf8Constant (line 159) | @Override
    method visitAnyConstant (line 165) | @Override

FILE: base/src/main/java/dprotect/obfuscation/CodeObfuscator.java
  class CodeObfuscator (line 28) | public class CodeObfuscator implements Pass
    method CodeObfuscator (line 44) | public CodeObfuscator(Configuration configuration)
    method execute (line 52) | @Override
    method obfuscate (line 81) | private void obfuscate(Configuration         configuration,
    method runStringObfuscation (line 135) | private void runStringObfuscation(Configuration       configuration,
    method runArithmeticObfuscation (line 173) | private void runArithmeticObfuscation(Configuration       configuration,
    method runControlFlowObfuscation (line 213) | private void runControlFlowObfuscation(Configuration         configura...
    method runConstantsObfuscation (line 241) | private void runConstantsObfuscation(Configuration         configuration,

FILE: base/src/main/java/dprotect/obfuscation/Marker.java
  class Marker (line 20) | public class Marker implements Pass
    method Marker (line 26) | public Marker(Configuration configuration)
    method execute (line 31) | @Override
    method createStringObfuscationMarker (line 55) | private ClassPoolVisitor createStringObfuscationMarker(Configuration c...
    method createArithmeticObfuscationMarker (line 64) | private ClassPoolVisitor createArithmeticObfuscationMarker(Configurati...
    method createConstantsObfuscationMarker (line 74) | private ClassPoolVisitor createConstantsObfuscationMarker(Configuratio...
    method createCFObfuscationMarker (line 84) | private ClassPoolVisitor createCFObfuscationMarker(Configuration confi...

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationFilter.java
  class ArithmeticObfuscationFilter (line 11) | public class ArithmeticObfuscationFilter
    method ArithmeticObfuscationFilter (line 19) | public ArithmeticObfuscationFilter(MemberVisitor visitor)
    method visitAnyMember (line 24) | @Override
    method visitProgramMethod (line 28) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationInfo.java
  class ArithmeticObfuscationInfo (line 4) | public class ArithmeticObfuscationInfo
    method ArithmeticObfuscationInfo (line 9) | public ArithmeticObfuscationInfo(Level level)

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationMarker.java
  class ArithmeticObfuscationMarker (line 13) | public class ArithmeticObfuscationMarker
    method ArithmeticObfuscationMarker (line 21) | public ArithmeticObfuscationMarker(ObfuscationClassSpecification spec)
    method visitAnyClass (line 28) | @Override
    method visitProgramClass (line 31) | @Override
    method visitAnyMember (line 43) | @Override
    method visitProgramMethod (line 46) | @Override
    method visitProgramField (line 57) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBANormalizer.java
  class MBANormalizer (line 10) | public class MBANormalizer
    method MBANormalizer (line 21) | public MBANormalizer(ClassPool programClassPool,
    method getSequences (line 70) | @Override
    method getConstants (line 75) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAdd.java
  class MBAObfuscationAdd (line 11) | public class MBAObfuscationAdd
    method MBAObfuscationAdd (line 22) | public MBAObfuscationAdd(ClassPool programClassPool,
    method getSequences (line 315) | @Override
    method getConstants (line 320) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAnd.java
  class MBAObfuscationAnd (line 10) | public class MBAObfuscationAnd
    method MBAObfuscationAnd (line 19) | public MBAObfuscationAnd(ClassPool programClassPool,
    method getSequences (line 145) | @Override
    method getConstants (line 150) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationOr.java
  class MBAObfuscationOr (line 11) | public class MBAObfuscationOr
    method MBAObfuscationOr (line 21) | public MBAObfuscationOr(ClassPool programClassPool,
    method getSequences (line 189) | @Override
    method getConstants (line 194) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationSub.java
  class MBAObfuscationSub (line 11) | public class MBAObfuscationSub
    method MBAObfuscationSub (line 20) | public MBAObfuscationSub(ClassPool programClassPool,
    method getSequences (line 176) | @Override
    method getConstants (line 181) | @Override

FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationXor.java
  class MBAObfuscationXor (line 11) | public class MBAObfuscationXor
    method MBAObfuscationXor (line 25) | public MBAObfuscationXor(ClassPool programClassPool,
    method getSequences (line 199) | @Override
    method getConstants (line 204) | @Override

FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantFieldMarker.java
  class ConstantFieldMarker (line 17) | public class ConstantFieldMarker
    method visitAnyInstruction (line 25) | @Override
    method visitConstantInstruction (line 28) | @Override
    method visitFieldrefConstant (line 40) | @Override
    method visitStringConstant (line 45) | @Override
    method visitAnyConstant (line 50) | @Override

FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationInfo.java
  class ConstantObfuscationInfo (line 4) | public class ConstantObfuscationInfo
    method ConstantObfuscationInfo (line 8) | public ConstantObfuscationInfo(Level level)

FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationMarker.java
  class ConstantObfuscationMarker (line 15) | public class ConstantObfuscationMarker
    method ConstantObfuscationMarker (line 22) | public ConstantObfuscationMarker(ObfuscationClassSpecification spec)
    method visitAnyClass (line 29) | @Override
    method visitProgramClass (line 32) | @Override
    method visitAnyMember (line 46) | @Override
    method visitProgramMethod (line 49) | @Override
    method visitProgramField (line 59) | @Override

FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantsObfuscator.java
  class ConstantsObfuscator (line 21) | public class ConstantsObfuscator
    method ConstantsObfuscator (line 37) | public ConstantsObfuscator(int seed)
    method visitAnyClass (line 43) | @Override
    method visitProgramClass (line 51) | @Override
    method visitAnyAttribute (line 97) | @Override
    method visitCodeAttribute (line 100) | @Override
    method visitAnyInstruction (line 110) | @Override
    method visitSimpleInstruction (line 113) | @Override
    method visitConstantInstruction (line 206) | @Override
    method visitIntegerConstant (line 266) | @Override
    method visitLongConstant (line 272) | @Override
    method visitAnyConstant (line 278) | @Override
    method getOrInsert (line 284) | int getOrInsert(Long value)

FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscation.java
  class ControlFlowObfuscation (line 21) | public class ControlFlowObfuscation
    method ControlFlowObfuscation (line 39) | public ControlFlowObfuscation(int seed)
    method visitAnyClass (line 46) | @Override
    method visitProgramClass (line 54) | @Override
    method visitAnyAttribute (line 70) | @Override
    method visitCodeAttribute (line 73) | @Override
    method visitAnyInstruction (line 101) | @Override
    method visitBranchInstruction (line 104) | @Override
    method getInvariantValue (line 164) | int getInvariantValue(int range)
    method insertOpaquePredicate (line 171) | private InstructionSequenceBuilder insertOpaquePredicate(Clazz clazz, ...
    method prepareClassFields (line 245) | private void prepareClassFields(ProgramClass programClass)
    class FrameFinder (line 270) | private static class FrameFinder
      method FrameFinder (line 279) | public FrameFinder(PartialEvaluator evaluator,
      method visitAnyInstruction (line 288) | @Override
    method showInst (line 341) | private void showInst(Clazz clazz, Method method, CodeAttribute codeAt...
    method showEvaluatedInst (line 353) | private void showEvaluatedInst(Clazz clazz, Method method, CodeAttribu...

FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationInfo.java
  class ControlFlowObfuscationInfo (line 4) | public class ControlFlowObfuscationInfo
    method ControlFlowObfuscationInfo (line 8) | public ControlFlowObfuscationInfo(Level level)

FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationMarker.java
  class ControlFlowObfuscationMarker (line 15) | public class ControlFlowObfuscationMarker
    method ControlFlowObfuscationMarker (line 22) | public ControlFlowObfuscationMarker(ObfuscationClassSpecification spec)
    method visitAnyClass (line 29) | @Override
    method visitProgramClass (line 32) | @Override
    method visitAnyMember (line 46) | @Override
    method visitProgramMethod (line 49) | @Override
    method visitProgramField (line 59) | @Override

FILE: base/src/main/java/dprotect/obfuscation/info/ObfuscationInfo.java
  class ObfuscationInfo (line 12) | public class ObfuscationInfo
    method setClassObfuscationInfo (line 19) | public static void setClassObfuscationInfo(Clazz clazz) {
    method setMethodObfuscationInfo (line 23) | public static void setMethodObfuscationInfo(Method meth) {
    method setFieldObfuscationInfo (line 27) | public static void setFieldObfuscationInfo(Field field) {
    method setConstantObfuscationInfo (line 31) | public static void setConstantObfuscationInfo(Constant constant) {
    method getObfuscationInfo (line 35) | public static ObfuscationInfo getObfuscationInfo(Clazz clazz) {
    method getObfuscationInfo (line 39) | public static ObfuscationInfo getObfuscationInfo(Method meth) {
    method getObfuscationInfo (line 43) | public static ObfuscationInfo getObfuscationInfo(Field field) {
    method getObfuscationInfo (line 47) | public static ObfuscationInfo getObfuscationInfo(Constant constant) {

FILE: base/src/main/java/dprotect/obfuscation/info/ObfuscationInfoSetter.java
  class ObfuscationInfoSetter (line 10) | public class ObfuscationInfoSetter
    method ObfuscationInfoSetter (line 17) | public ObfuscationInfoSetter()
    method ObfuscationInfoSetter (line 22) | public ObfuscationInfoSetter(boolean overwrite)
    method visitAnyClass (line 29) | @Override
    method visitProgramClass (line 32) | @Override
    method visitAnyMember (line 45) | @Override
    method visitProgramMethod (line 48) | @Override
    method visitProgramField (line 57) | @Override
    method visitAnyConstant (line 66) | @Override

FILE: base/src/main/java/dprotect/obfuscation/strings/StringFieldMarker.java
  class StringFieldMarker (line 16) | public class StringFieldMarker
    method visitAnyInstruction (line 26) | @Override
    method visitConstantInstruction (line 29) | @Override
    method visitFieldrefConstant (line 48) | @Override
    method visitStringConstant (line 60) | @Override
    method visitAnyConstant (line 66) | @Override

FILE: base/src/main/java/dprotect/obfuscation/strings/StringObfuscationMarker.java
  class StringObfuscationMarker (line 12) | public class StringObfuscationMarker
    method visitAnyClass (line 21) | @Override
    method visitProgramClass (line 24) | @Override
    method visitAnyMember (line 34) | @Override
    method visitProgramMethod (line 37) | @Override
    method visitProgramField (line 43) | @Override

FILE: base/src/main/java/dprotect/obfuscation/strings/StringObfuscator.java
  class StringObfuscator (line 32) | public class StringObfuscator
    method StringObfuscator (line 52) | public StringObfuscator(List<String> strings, int seed)
    method visitAnyClass (line 65) | @Override
    method visitAnyAttribute (line 85) | @Override
    method visitCodeAttribute (line 88) | @Override
    method visitAnyInstruction (line 101) | @Override
    method visitConstantInstruction (line 104) | @Override
    method visitStringConstant (line 131) | @Override
    method visitUtf8Constant (line 139) | @Override
    method visitAnyConstant (line 159) | @Override
    method addDecodeMethod (line 162) | void addDecodeMethod(ProgramClass target, Clazz src) {
    method markDecodeMethod (line 188) | void markDecodeMethod(Method method) {
    class KeyChanger (line 195) | static private class KeyChanger
      method KeyChanger (line 206) | public KeyChanger(char newKey)
      method visitAnyAttribute (line 213) | @Override
      method visitCodeAttribute (line 216) | @Override
      method visitAnyInstruction (line 226) | @Override
      method visitConstantInstruction (line 229) | @Override
      method visitIntegerConstant (line 252) | @Override

FILE: base/src/main/java/dprotect/runtime/strings/StringEncoding.java
  class StringEncoding (line 10) | public class StringEncoding {
    class EncodingPair (line 11) | public static class EncodingPair {
      method EncodingPair (line 14) | public EncodingPair(Method encode, Method decode)
    method simpleXorDecode (line 49) | public static String simpleXorDecode(String str)
    method simpleXorEncode (line 59) | public static String simpleXorEncode(String str, char key)
    method simpleIndexedXorDecode (line 72) | public static String simpleIndexedXorDecode(String str)
    method simpleIndexedXorEncode (line 82) | public static String simpleIndexedXorEncode(String str, char key)
    method fibonnaciLFSRDecode (line 95) | public static String fibonnaciLFSRDecode(String str)
    method fibonnaciLFSREncode (line 111) | public static String fibonnaciLFSREncode(String str, char key)

FILE: base/src/main/java/dprotect/runtime/util/Helpers.java
  class Helpers (line 3) | public class Helpers {
    method getNormalizedClassName (line 4) | public static String getNormalizedClassName(Class cls)

FILE: base/src/main/java/dprotect/runtime/util/Loader.java
  class Loader (line 14) | public class Loader {
    method currentJar (line 15) | public static File currentJar() throws URISyntaxException {
    method getRuntimeClasses (line 19) | public static ClassPool getRuntimeClasses() {

FILE: base/src/main/java/proguard/AfterInitConfigurationVerifier.java
  class AfterInitConfigurationVerifier (line 21) | public class AfterInitConfigurationVerifier implements Pass
    method AfterInitConfigurationVerifier (line 27) | public AfterInitConfigurationVerifier(Configuration configuration)
    method execute (line 32) | @Override
    class BackportMaxVersionVisitor (line 43) | private static class BackportMaxVersionVisitor implements ClassVisitor {
      method BackportMaxVersionVisitor (line 49) | private BackportMaxVersionVisitor(int maxClassFileVersion, int target)
      method visitProgramClass (line 57) | @Override
      method visitAnyClass (line 77) | @Override

FILE: base/src/main/java/proguard/AppView.java
  class AppView (line 15) | public class AppView
    method AppView (line 29) | public AppView(ClassPool programClassPool, ClassPool libraryClassPool)
    method AppView (line 34) | public AppView()
    method AppView (line 39) | public AppView(ClassPool             programClassPool,

FILE: base/src/main/java/proguard/ArgumentWordReader.java
  class ArgumentWordReader (line 32) | public class ArgumentWordReader extends WordReader
    method ArgumentWordReader (line 52) | public ArgumentWordReader(String[] arguments, File baseDir)
    method nextLine (line 62) | protected String nextLine() throws IOException
    method lineLocationDescription (line 70) | protected String lineLocationDescription()
    method main (line 80) | public static void main(String[] args) {

FILE: base/src/main/java/proguard/AssumeNoSideEffectsChecker.java
  class AssumeNoSideEffectsChecker (line 33) | public class AssumeNoSideEffectsChecker
    method AssumeNoSideEffectsChecker (line 41) | public AssumeNoSideEffectsChecker(WarningPrinter notePrinter)
    method checkClassSpecifications (line 51) | public void checkClassSpecifications(List classSpecifications)

FILE: base/src/main/java/proguard/ClassMemberChecker.java
  class ClassMemberChecker (line 37) | public class ClassMemberChecker
    method ClassMemberChecker (line 48) | public ClassMemberChecker(ClassPool      programClassPool,
    method checkClassSpecifications (line 60) | public void checkClassSpecifications(List classSpecifications)
    method checkMemberSpecifications (line 90) | private void checkMemberSpecifications(Clazz   clazz,
    method containsWildCards (line 136) | private static boolean containsWildCards(String string)
    method visitProgramField (line 149) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 156) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/ClassPath.java
  class ClassPath (line 31) | public class ClassPath
    method hasOutput (line 39) | public boolean hasOutput()
    method clear (line 55) | public void clear()
    method add (line 60) | public void add(int index, ClassPathEntry classPathEntry)
    method add (line 65) | public boolean add(ClassPathEntry classPathEntry)
    method addAll (line 70) | public boolean addAll(ClassPath classPath)
    method get (line 75) | public ClassPathEntry get(int index)
    method remove (line 80) | public ClassPathEntry remove(int index)
    method isEmpty (line 85) | public boolean isEmpty()
    method size (line 90) | public int size()

FILE: base/src/main/java/proguard/ClassPathEntry.java
  class ClassPathEntry (line 42) | public class ClassPathEntry
    method ClassPathEntry (line 63) | public ClassPathEntry(File file, boolean isOutput)
    method ClassPathEntry (line 74) | public ClassPathEntry(File file, boolean isOutput, String featureName)
    method getName (line 85) | public String getName()
    method getUncachedName (line 99) | private String getUncachedName()
    method getFile (line 115) | public File getFile()
    method setFile (line 124) | public void setFile(File file)
    method isOutput (line 134) | public boolean isOutput()
    method setOutput (line 143) | public void setOutput(boolean output)
    method getFeatureName (line 152) | public String getFeatureName()
    method setFeatureName (line 161) | public void setFeatureName(String featureName)
    method isDex (line 170) | public boolean isDex()
    method isApk (line 179) | public boolean isApk()
    method isAab (line 189) | public boolean isAab()
    method isJar (line 198) | public boolean isJar()
    method isAar (line 207) | public boolean isAar()
    method isWar (line 216) | public boolean isWar()
    method isEar (line 225) | public boolean isEar()
    method isJmod (line 234) | public boolean isJmod()
    method isZip (line 243) | public boolean isZip()
    method hasExtension (line 252) | private boolean hasExtension(String extension)
    method endsWithIgnoreCase (line 262) | private static boolean endsWithIgnoreCase(String string, String suffix)
    method isFiltered (line 275) | public boolean isFiltered()
    method getFilter (line 292) | public List<String> getFilter()
    method setFilter (line 300) | public void setFilter(List<String> filter)
    method getApkFilter (line 309) | public List<String> getApkFilter()
    method setApkFilter (line 317) | public void setApkFilter(List<String> filter)
    method getAabFilter (line 326) | public List<String> getAabFilter()
    method setAabFilter (line 334) | public void setAabFilter(List<String> filter)
    method getJarFilter (line 343) | public List<String> getJarFilter()
    method setJarFilter (line 351) | public void setJarFilter(List<String> filter)
    method getAarFilter (line 360) | public List<String> getAarFilter()
    method setAarFilter (line 368) | public void setAarFilter(List<String> filter)
    method getWarFilter (line 377) | public List<String> getWarFilter()
    method setWarFilter (line 385) | public void setWarFilter(List<String> filter)
    method getEarFilter (line 394) | public List<String> getEarFilter()
    method setEarFilter (line 402) | public void setEarFilter(List<String> filter)
    method getJmodFilter (line 411) | public List<String> getJmodFilter()
    method setJmodFilter (line 419) | public void setJmodFilter(List<String> filter)
    method getZipFilter (line 427) | public List<String> getZipFilter()
    method setZipFilter (line 435) | public void setZipFilter(List<String> filter)
    method toString (line 443) | public String toString()

FILE: base/src/main/java/proguard/ClassSpecification.java
  class ClassSpecification (line 33) | public class ClassSpecification implements Cloneable
    method ClassSpecification (line 53) | public ClassSpecification()
    method ClassSpecification (line 68) | public ClassSpecification(ClassSpecification classSpecification)
    method ClassSpecification (line 109) | public ClassSpecification(String comments,
    method ClassSpecification (line 158) | public ClassSpecification(String comments,
    method addField (line 185) | public void addField(MemberSpecification fieldSpecification)
    method addMethod (line 201) | public void addMethod(MemberSpecification methodSpecification)
    method equals (line 215) | public boolean equals(Object object)
    method hashCode (line 236) | public int hashCode()
    method clone (line 250) | public Object clone()

FILE: base/src/main/java/proguard/ClassSpecificationVisitorFactory.java
  class ClassSpecificationVisitorFactory (line 36) | public class ClassSpecificationVisitorFactory
    method createClassPoolVisitor (line 50) | public ClassPoolVisitor createClassPoolVisitor(List          classSpec...
    method createClassPoolVisitor (line 78) | public ClassPoolVisitor createClassPoolVisitor(List             classS...
    method createClassPoolVisitor (line 124) | protected ClassPoolVisitor createClassPoolVisitor(ClassSpecification c...
    method createCombinedClassVisitor (line 276) | protected ClassVisitor createCombinedClassVisitor(List             att...
    method createClassVisitor (line 367) | private ClassVisitor createClassVisitor(List             fieldSpecific...
    method addMemberVisitors (line 390) | private void addMemberVisitors(List              memberSpecifications,
    method createNonTestingClassVisitor (line 427) | protected ClassVisitor createNonTestingClassVisitor(MemberSpecificatio...
    method createClassTester (line 446) | protected ClassPoolVisitor createClassTester(ClassSpecification classS...
    method createClassTester (line 472) | protected ClassPoolVisitor createClassTester(ClassSpecification classS...
    method createClassMemberTester (line 505) | private ClassVisitor createClassMemberTester(List            fieldSpec...
    method createClassMemberTester (line 526) | private ClassVisitor createClassMemberTester(List            memberSpe...
    method createClassVisitor (line 563) | private ClassVisitor createClassVisitor(MemberSpecification memberSpec...
    method containsWildCards (line 664) | private boolean containsWildCards(String string)
    method containsWildCardReferences (line 681) | private boolean containsWildCardReferences(String string)

FILE: base/src/main/java/proguard/Configuration.java
  class Configuration (line 34) | public class Configuration

FILE: base/src/main/java/proguard/ConfigurationConstants.java
  class ConfigurationConstants (line 28) | public class ConfigurationConstants

FILE: base/src/main/java/proguard/ConfigurationParser.java
  class ConfigurationParser (line 39) | public class ConfigurationParser implements AutoCloseable
    method ConfigurationParser (line 52) | public ConfigurationParser(String[]   args,
    method ConfigurationParser (line 63) | public ConfigurationParser(String[]   args,
    method ConfigurationParser (line 75) | public ConfigurationParser(String     lines,
    method ConfigurationParser (line 92) | public ConfigurationParser(File file) throws IOException
    method ConfigurationParser (line 102) | public ConfigurationParser(File       file,
    method ConfigurationParser (line 113) | public ConfigurationParser(URL        url,
    method ConfigurationParser (line 124) | public ConfigurationParser(WordReader reader,
    method parse (line 141) | public void parse(Configuration configuration)
    method close (line 245) | @Override
    method parseKeepKotlinMetadata (line 255) | protected boolean parseKeepKotlinMetadata() throws IOException
    method parseIncludeArgument (line 262) | protected long parseIncludeArgument(long lastModified) throws ParseExc...
    method parseBaseDirectoryArgument (line 314) | protected void parseBaseDirectoryArgument() throws ParseException, IOE...
    method parseClassPathArgument (line 325) | protected ClassPath parseClassPathArgument(ClassPath classPath,
    method parseClassVersion (line 467) | protected int parseClassVersion()
    method parseIntegerArgument (line 485) | protected int parseIntegerArgument()
    method parseURL (line 512) | protected URL parseURL()
    method parseFiles (line 527) | protected List parseFiles(List files)
    method parseFile (line 541) | protected File parseFile()
    method parseOptionalFile (line 556) | protected File parseOptionalFile()
    method parseOptionalArgument (line 577) | protected String parseOptionalArgument() throws IOException
    method parseNoArgument (line 596) | protected boolean parseNoArgument(boolean value) throws IOException
    method parseNoArgument (line 604) | protected long parseNoArgument(long value) throws IOException
    method parseIfCondition (line 620) | protected List parseIfCondition(List keepClassSpecifications)
    method parseKeepClassSpecificationArguments (line 656) | protected List parseKeepClassSpecificationArguments(List              ...
    method parseKeepClassSpecificationArguments (line 690) | protected KeepClassSpecification parseKeepClassSpecificationArguments(...
    method parseAssumeClassSpecificationArguments (line 777) | protected List parseAssumeClassSpecificationArguments(List classSpecif...
    method parseClassSpecificationArguments (line 800) | protected List<ClassSpecification> parseClassSpecificationArguments(Li...
    method parseClassSpecificationArguments (line 817) | public ClassSpecification parseClassSpecificationArguments()
    method parseClassSpecificationArguments (line 831) | public ClassSpecification parseClassSpecificationArguments(boolean rea...
    method parseMemberSpecificationArguments (line 1031) | protected void parseMemberSpecificationArguments(String             ex...
    method parseValues (line 1358) | protected Number[] parseValues(String externalType,
    method parseValue (line 1383) | protected Number parseValue(String externalType,
    method parseBoolean (line 1435) | protected Integer parseBoolean(String string)
    method parseCommaSeparatedLists (line 1457) | protected List parseCommaSeparatedLists(String  expectedDescription,
    method parseCommaSeparatedList (line 1512) | protected List parseCommaSeparatedList(String  expectedDescription,
    method parseCommaSeparatedList (line 1540) | protected List parseCommaSeparatedList(String  expectedDescription,
    method convertToClassSpecification (line 1662) | protected ClassSpecification convertToClassSpecification(List<String> ...
    method removeMemberSpecification (line 1678) | protected ClassSpecification removeMemberSpecification(ClassSpecificat...
    method unknownAccessFlag (line 1690) | protected int unknownAccessFlag() throws ParseException
    method url (line 1699) | protected URL url(String word) throws ParseException, MalformedURLExce...
    method file (line 1743) | protected File file(String word) throws ParseException
    method replaceSystemProperties (line 1762) | protected String replaceSystemProperties(String word) throws ParseExce...
    method readNextWord (line 1812) | protected void readNextWord(String expectedDescription)
    method readNextWord (line 1823) | protected void readNextWord(String  expectedDescription,
    method readNextWord (line 1841) | protected void readNextWord() throws IOException
    method readNextWord (line 1850) | protected void readNextWord(boolean isFileName,
    method configurationEnd (line 1860) | protected boolean configurationEnd()
    method configurationEnd (line 1869) | protected boolean configurationEnd(boolean expectingAtCharacter)
    method checkJavaIdentifier (line 1882) | protected void checkJavaIdentifier(String expectedDescription)
    method checkJavaIdentifier (line 1893) | protected void checkJavaIdentifier(String expectedDescription, boolean...
    method isJavaIdentifier (line 1914) | protected boolean isJavaIdentifier(String word)
    method containsGenerics (line 1948) | protected boolean containsGenerics(String word)
    method checkFieldAccessFlags (line 1988) | protected void checkFieldAccessFlags(int requiredSetMemberAccessFlags,
    method checkMethodAccessFlags (line 2006) | protected void checkMethodAccessFlags(int requiredSetMemberAccessFlags,
    method main (line 2023) | public static void main(String[] args)

FILE: base/src/main/java/proguard/ConfigurationVerifier.java
  class ConfigurationVerifier (line 35) | public class ConfigurationVerifier
    method ConfigurationVerifier (line 45) | public ConfigurationVerifier(Configuration configuration)
    method check (line 54) | public void check() throws IOException
    method checkInputJarFirst (line 81) | private void checkInputJarFirst(ClassPath programJars) throws IOException
    method checkOutputJarFilter (line 96) | private void checkOutputJarFilter(ClassPath programJars) throws IOExce...
    method checkConflicts (line 116) | private void checkConflicts(ClassPath classPath1,
    method printNotes (line 172) | private void printNotes(Configuration configuration, ClassPath program...

FILE: base/src/main/java/proguard/ConfigurationWriter.java
  class ConfigurationWriter (line 39) | public class ConfigurationWriter implements AutoCloseable
    method ConfigurationWriter (line 59) | public ConfigurationWriter(File configurationFile) throws IOException
    method ConfigurationWriter (line 70) | public ConfigurationWriter(PrintWriter writer) throws IOException
    method close (line 79) | @Override
    method write (line 91) | public void write(Configuration configuration) throws IOException
    method writeJarOptions (line 191) | private void writeJarOptions(String    inputEntryOptionName,
    method writeFilter (line 244) | private boolean writeFilter(boolean filtered, List filter)
    method writeOption (line 267) | private void writeOption(String optionName, boolean flag)
    method writeOption (line 276) | private void writeOption(String optionName, int argument)
    method writeOption (line 287) | private void writeOption(String optionName, List arguments)
    method writeOptions (line 293) | private void writeOptions(String  optionName,
    method writeOptions (line 309) | private void writeOptions(String optionName1, List<File>   arguments1,
    method writeOption (line 354) | private void writeOption(String  optionName,
    method writeOption (line 379) | private void writeOption(String optionName, String arguments)
    method writeOption (line 385) | private void writeOption(String  optionName,
    method writeOption (line 403) | private void writeOption(String optionName, URL url)
    method writeOption (line 434) | private void writeOption(String optionName, File file)
    method writeOptions (line 452) | private void writeOptions(String[] optionNames,
    method writeOption (line 465) | private void writeOption(String[]               optionNames,
    method writeOptions (line 516) | private void writeOptions(String optionName,
    method writeOption (line 529) | private void writeOption(String             optionName,
    method writeComments (line 616) | private void writeComments(String comments)
    method writeFieldSpecification (line 644) | private void writeFieldSpecification(List memberSpecifications)
    method writeMethodSpecification (line 689) | private void writeMethodSpecification(List memberSpecifications)
    method writeValueAssignment (line 735) | private void writeValueAssignment(String              assignmentKeyword,
    method externalClassNames (line 780) | private List externalClassNames(List internalClassNames)
    method relativeFileName (line 797) | private String relativeFileName(File file)
    method quotedString (line 818) | private String quotedString(String string)
    method main (line 837) | public static void main(String[] args)

FILE: base/src/main/java/proguard/DataEntryReaderFactory.java
  class DataEntryReaderFactory (line 53) | public class DataEntryReaderFactory
    method DataEntryReaderFactory (line 72) | public DataEntryReaderFactory(boolean android)
    method createDataEntryReader (line 85) | public DataEntryReader createDataEntryReader(ClassPathEntry classPathE...
    method wrapInJarReader (line 179) | private DataEntryReader wrapInJarReader(DataEntryReader reader,
    method getFilterExcludingVersionedClasses (line 248) | public static List<String> getFilterExcludingVersionedClasses(ClassPat...

FILE: base/src/main/java/proguard/DataEntryWriterFactory.java
  class DataEntryWriterFactory (line 42) | public class DataEntryWriterFactory
    method DataEntryWriterFactory (line 98) | public DataEntryWriterFactory(ClassPool                  programClassP...
    method DataEntryWriterFactory (line 141) | public DataEntryWriterFactory(ClassPool                  programClassP...
    method createDataEntryWriter (line 172) | public DataEntryWriter createDataEntryWriter(ClassPath       classPath,
    method outputFileOccurs (line 213) | private boolean outputFileOccurs(ClassPathEntry entry,
    method createClassPathEntryWriter (line 238) | private DataEntryWriter createClassPathEntryWriter(ClassPathEntry  cla...
    method wrapInJarWriter (line 388) | private DataEntryWriter wrapInJarWriter(File            file,
    method wrapInSignedJarWriter (line 490) | private DataEntryWriter wrapInSignedJarWriter(DataEntryWriter writer,

FILE: base/src/main/java/proguard/DescriptorKeepChecker.java
  class DescriptorKeepChecker (line 36) | public class DescriptorKeepChecker
    method DescriptorKeepChecker (line 53) | public DescriptorKeepChecker(ClassPool      programClassPool,
    method checkClassSpecifications (line 67) | public void checkClassSpecifications(List keepSpecifications)
    method visitProgramField (line 96) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 107) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitAnyClass (line 142) | @Override
    method visitProgramClass (line 146) | @Override

FILE: base/src/main/java/proguard/Dumper.java
  class Dumper (line 23) | public class Dumper implements Pass
    method Dumper (line 29) | public Dumper(Configuration configuration)
    method execute (line 35) | @Override

FILE: base/src/main/java/proguard/DuplicateClassPrinter.java
  class DuplicateClassPrinter (line 33) | public class DuplicateClassPrinter
    method DuplicateClassPrinter (line 42) | public DuplicateClassPrinter(WarningPrinter notePrinter)
    method visitAnyClass (line 50) | @Override
    method visitProgramClass (line 57) | @Override
    method visitLibraryClass (line 66) | @Override

FILE: base/src/main/java/proguard/DuplicateResourceFilePrinter.java
  class DuplicateResourceFilePrinter (line 34) | public class DuplicateResourceFilePrinter
    method DuplicateResourceFilePrinter (line 43) | public DuplicateResourceFilePrinter(WarningPrinter notePrinter)
    method visitResourceFile (line 51) | @Override
    method visitKotlinModule (line 60) | @Override

FILE: base/src/main/java/proguard/FileWordReader.java
  class FileWordReader (line 32) | public class FileWordReader extends LineWordReader
    method FileWordReader (line 37) | public FileWordReader(File file) throws IOException
    method FileWordReader (line 51) | public FileWordReader(URL url) throws IOException

FILE: base/src/main/java/proguard/FullyQualifiedClassNameChecker.java
  class FullyQualifiedClassNameChecker (line 37) | public class FullyQualifiedClassNameChecker
    method FullyQualifiedClassNameChecker (line 52) | public FullyQualifiedClassNameChecker(ClassPool      programClassPool,
    method checkClassSpecifications (line 66) | public void checkClassSpecifications(List classSpecifications)
    method checkMemberSpecifications (line 91) | private void checkMemberSpecifications(List memberSpecifications, bool...
    method checkDescriptor (line 119) | private void checkDescriptor(String descriptor)
    method checkType (line 140) | private void checkType(String type)
    method checkClassName (line 153) | private void checkClassName(String className)
    method containsWildCards (line 184) | private static boolean containsWildCards(String string)
    method visitAnyClass (line 198) | public void visitAnyClass(Clazz clazz)

FILE: base/src/main/java/proguard/GPL.java
  class GPL (line 34) | public class GPL
    method check (line 42) | public static void check()
    method unknownPackageNames (line 67) | private static Set unknownPackageNames(LineNumberReader reader)
    method uniquePackageNames (line 109) | private static String uniquePackageNames(Set packageNames)
    method trimSuffix (line 131) | private static String trimSuffix(String string, char separator)
    method containsPrefix (line 141) | private static boolean containsPrefix(Set set, String name)
    method isKnown (line 165) | private static boolean isKnown(String packageName)
    method main (line 189) | public static void main(String[] args)

FILE: base/src/main/java/proguard/GetAnnotationChecker.java
  class GetAnnotationChecker (line 34) | public class GetAnnotationChecker
    method GetAnnotationChecker (line 43) | public GetAnnotationChecker(WarningPrinter notePrinter)
    method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...

FILE: base/src/main/java/proguard/GetEnclosingClassChecker.java
  class GetEnclosingClassChecker (line 34) | public class GetEnclosingClassChecker
    method GetEnclosingClassChecker (line 43) | public GetEnclosingClassChecker(WarningPrinter notePrinter)
    method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...

FILE: base/src/main/java/proguard/GetEnclosingMethodChecker.java
  class GetEnclosingMethodChecker (line 34) | public class GetEnclosingMethodChecker
    method GetEnclosingMethodChecker (line 43) | public GetEnclosingMethodChecker(WarningPrinter notePrinter)
    method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...

FILE: base/src/main/java/proguard/GetSignatureChecker.java
  class GetSignatureChecker (line 34) | public class GetSignatureChecker
    method GetSignatureChecker (line 43) | public GetSignatureChecker(WarningPrinter notePrinter)
    method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...

FILE: base/src/main/java/proguard/Initializer.java
  class Initializer (line 47) | public class Initializer implements Pass
    method Initializer (line 52) | public Initializer(Configuration configuration)
    method execute (line 62) | @Override
    method createClassNoteExceptionMatcher (line 558) | private StringMatcher createClassNoteExceptionMatcher(List    noteExce...
    method createClassMemberNoteExceptionMatcher (line 601) | private StringMatcher createClassMemberNoteExceptionMatcher(List    no...
    method containsWildCardReferences (line 645) | private static boolean containsWildCardReferences(String string)

FILE: base/src/main/java/proguard/InputReader.java
  class InputReader (line 46) | public class InputReader implements Pass
    method InputReader (line 63) | public InputReader(Configuration configuration)
    method execute (line 73) | @Override
    method readInput (line 201) | private void readInput(String          messagePrefix,
    method readInput (line 217) | public void readInput(String          messagePrefix,
    method readInput (line 238) | private void readInput(String          messagePrefix,
    class MyResourceFileFeatureNameSetter (line 291) | private class MyResourceFileFeatureNameSetter
      method visitAnyResourceFile (line 296) | public void visitAnyResourceFile(ResourceFile resourceFile)

FILE: base/src/main/java/proguard/KeepClassMemberChecker.java
  class KeepClassMemberChecker (line 34) | public class KeepClassMemberChecker
    method KeepClassMemberChecker (line 42) | public KeepClassMemberChecker(WarningPrinter notePrinter)
    method checkClassSpecifications (line 52) | public void checkClassSpecifications(List keepClassSpecifications)

FILE: base/src/main/java/proguard/KeepClassSpecification.java
  class KeepClassSpecification (line 28) | public class KeepClassSpecification extends ClassSpecification
    method KeepClassSpecification (line 62) | public KeepClassSpecification(boolean            markClasses,
    method KeepClassSpecification (line 107) | @Deprecated
    method equals (line 132) | @Override
    method hashCode (line 157) | @Override
    method clone (line 173) | @Override

FILE: base/src/main/java/proguard/KeepClassSpecificationVisitorFactory.java
  class KeepClassSpecificationVisitorFactory (line 36) | public class KeepClassSpecificationVisitorFactory
    method KeepClassSpecificationVisitorFactory (line 55) | public KeepClassSpecificationVisitorFactory(boolean shrinking,
    method createClassPoolVisitor (line 82) | public ClassPoolVisitor createClassPoolVisitor(List             keepCl...
    method createClassPoolVisitor (line 130) | public ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification ...
    method createClassPoolVisitor (line 241) | private ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification...

FILE: base/src/main/java/proguard/KotlinMetadataAdapter.java
  class KotlinMetadataAdapter (line 19) | public class KotlinMetadataAdapter
    method execute (line 25) | @Override

FILE: base/src/main/java/proguard/LibraryKeepChecker.java
  class LibraryKeepChecker (line 36) | public class LibraryKeepChecker
    method LibraryKeepChecker (line 50) | public LibraryKeepChecker(ClassPool      programClassPool,
    method checkClassSpecifications (line 64) | public void checkClassSpecifications(List keepSpecifications)
    method visitAnyClass (line 112) | @Override
    method visitLibraryClass (line 116) | @Override

FILE: base/src/main/java/proguard/LineWordReader.java
  class LineWordReader (line 32) | public class LineWordReader extends WordReader
    method LineWordReader (line 41) | public LineWordReader(LineNumberReader lineNumberReader,
    method LineWordReader (line 55) | public LineWordReader(LineNumberReader lineNumberReader,
    method nextLine (line 68) | protected String nextLine() throws IOException
    method lineLocationDescription (line 74) | protected String lineLocationDescription()
    method close (line 80) | public void close() throws IOException

FILE: base/src/main/java/proguard/MemberSpecification.java
  class MemberSpecification (line 31) | public class MemberSpecification
    method MemberSpecification (line 44) | public MemberSpecification()
    method MemberSpecification (line 73) | public MemberSpecification(int    requiredSetAccessFlags,
    method equals (line 90) | public boolean equals(Object object)
    method hashCode (line 107) | public int hashCode()

FILE: base/src/main/java/proguard/MemberValueSpecification.java
  class MemberValueSpecification (line 31) | public class MemberValueSpecification extends MemberSpecification
    method MemberValueSpecification (line 39) | public MemberValueSpecification()
    method MemberValueSpecification (line 71) | public MemberValueSpecification(int      requiredSetAccessFlags,
    method equals (line 91) | public boolean equals(Object object)
    method hashCode (line 104) | public int hashCode()

FILE: base/src/main/java/proguard/OutputWriter.java
  class OutputWriter (line 52) | public class OutputWriter implements Pass
    method OutputWriter (line 57) | public OutputWriter(Configuration configuration)
    method execute (line 67) | @Override
    method retrievePrivateKeys (line 180) | private KeyStore.PrivateKeyEntry[] retrievePrivateKeys(Configuration c...
    method retrievePrivateKey (line 246) | private KeyStore.PrivateKeyEntry retrievePrivateKey(File   keyStoreFile,
    method writeOutput (line 278) | private void writeOutput(DataEntryWriterFactory dataEntryWriterFactory,
    method writeExtraConfigurationFiles (line 412) | private DataEntryReader writeExtraConfigurationFiles(Configuration    ...
    method renameResourceFiles (line 438) | private DataEntryWriter renameResourceFiles(ResourceFilePool resourceF...
    method adaptResourceFiles (line 453) | private DataEntryReader adaptResourceFiles(Configuration   configuration,
    method writeDirectories (line 474) | private DirectoryFilter writeDirectories(Configuration   configuration,
    method createPackagePrefixMap (line 503) | private static Map<String, String> createPackagePrefixMap(ClassPool cl...
    method log (line 528) | private static void log(ClassPath classPath, int fromIndex, int toInde...

FILE: base/src/main/java/proguard/ParseException.java
  class ParseException (line 30) | public class ParseException extends Exception {
    method ParseException (line 36) | public ParseException() {
    method ParseException (line 48) | public ParseException(String s) {

FILE: base/src/main/java/proguard/ProGuard.java
  class ProGuard (line 64) | public class ProGuard
    method ProGuard (line 81) | public ProGuard(Configuration configuration)
    method execute (line 91) | public void execute() throws Exception
    method checkGpl (line 278) | private void checkGpl()
    method requiresKotlinMetadata (line 283) | private boolean requiresKotlinMetadata()
    method printConfiguration (line 298) | private void printConfiguration() throws IOException
    method checkConfiguration (line 312) | private void checkConfiguration() throws IOException
    method checkUpToDate (line 321) | private void checkUpToDate()
    method readInput (line 330) | private void readInput() throws Exception
    method clearPreverification (line 340) | private void clearPreverification() throws Exception
    method initialize (line 350) | private void initialize() throws Exception
    method mark (line 370) | private void mark() throws Exception
    method stripKotlinMetadataAnnotations (line 379) | private void stripKotlinMetadataAnnotations() throws Exception
    method checkConfigurationAfterInitialization (line 387) | private void checkConfigurationAfterInitialization() throws Exception
    method introducePrimitiveArrayConstants (line 395) | private void introducePrimitiveArrayConstants() throws Exception
    method backport (line 404) | private void backport() throws Exception
    method addConfigurationLogging (line 414) | private void addConfigurationLogging() throws Exception
    method printSeeds (line 424) | private void printSeeds() throws Exception
    method inlineSubroutines (line 433) | private void inlineSubroutines() throws Exception
    method shrink (line 443) | private void shrink(boolean afterOptimizer) throws Exception
    method optimizeGson (line 459) | private void optimizeGson() throws Exception
    method optimize (line 469) | private void optimize() throws Exception
    method linearizeLineNumbers (line 491) | private void linearizeLineNumbers() throws Exception
    method obfuscate (line 500) | private void obfuscate() throws Exception
    method adaptKotlinMetadata (line 527) | private void adaptKotlinMetadata() throws Exception
    method expandPrimitiveArrayConstants (line 537) | private void expandPrimitiveArrayConstants()
    method target (line 546) | private void target() throws Exception
    method preverify (line 555) | private void preverify() throws Exception
    method trimLineNumbers (line 565) | private void trimLineNumbers() throws Exception
    method sortClassElements (line 574) | private void sortClassElements()
    method writeOutput (line 592) | private void writeOutput() throws Exception
    method dump (line 602) | private void dump() throws Exception
    method getVersion (line 611) | public static String getVersion()
    method main (line 630) | public static void main(String[] args)

FILE: base/src/main/java/proguard/SeedPrinter.java
  class SeedPrinter (line 37) | public class SeedPrinter implements Pass
    method SeedPrinter (line 43) | public SeedPrinter(Configuration configuration)
    method execute (line 54) | @Override

FILE: base/src/main/java/proguard/SubclassedClassFilter.java
  class SubclassedClassFilter (line 32) | final class SubclassedClassFilter
    method SubclassedClassFilter (line 38) | public SubclassedClassFilter(ClassVisitor classVisitor)
    method visitAnyClass (line 46) | @Override
    method visitProgramClass (line 53) | @Override
    method visitLibraryClass (line 63) | @Override

FILE: base/src/main/java/proguard/Targeter.java
  class Targeter (line 38) | public class Targeter implements Pass
    method Targeter (line 43) | public Targeter(Configuration configuration)
    method execute (line 52) | @Override

FILE: base/src/main/java/proguard/UpToDateChecker.java
  class UpToDateChecker (line 34) | public class UpToDateChecker
    method UpToDateChecker (line 43) | public UpToDateChecker(Configuration configuration)
    method check (line 53) | public void check() throws UpToDateException
    class ModificationTimeChecker (line 120) | private static class ModificationTimeChecker {
      method updateInputModificationTime (line 130) | public void updateInputModificationTime(URL url)
      method updateInputModificationTime (line 148) | public void updateInputModificationTime(File file)
      method updateOutputModificationTime (line 161) | public void updateOutputModificationTime(File file)
      method updateModificationTime (line 174) | public void updateModificationTime(File file, boolean isOutput)
      method updateModificationTime (line 206) | public void updateModificationTime(long time, boolean isOutput)
      method updateInputModificationTime (line 222) | public void updateInputModificationTime(long time)
      method updateOutputModificationTime (line 236) | public void updateOutputModificationTime(long time)
      method checkModificationTimes (line 247) | private void checkModificationTimes()
    class UpToDateException (line 259) | public static class UpToDateException extends RuntimeException {}

FILE: base/src/main/java/proguard/WordReader.java
  class WordReader (line 35) | public abstract class WordReader
    method WordReader (line 53) | protected WordReader(File baseDir)
    method WordReader (line 62) | protected WordReader(URL baseURL)
    method setBaseDir (line 71) | public void setBaseDir(File baseDir)
    method getBaseDir (line 87) | public File getBaseDir()
    method getBaseURL (line 98) | public URL getBaseURL()
    method includeWordReader (line 112) | public void includeWordReader(WordReader newIncludeWordReader)
    method nextWord (line 137) | public String nextWord(boolean isFileName,
    method lastComments (line 306) | public String lastComments() throws IOException
    method locationDescription (line 327) | public String locationDescription()
    method nextLine (line 346) | protected abstract String nextLine() throws IOException;
    method lineLocationDescription (line 354) | protected abstract String lineLocationDescription();
    method close (line 360) | public void close() throws IOException
    method isOption (line 373) | private boolean isOption(char character)
    method isComment (line 379) | private boolean isComment(char character)
    method isDelimiter (line 385) | private boolean isDelimiter(char character)
    method isStartDelimiter (line 391) | private boolean isStartDelimiter(char character)
    method isNonStartDelimiter (line 397) | private boolean isNonStartDelimiter(char character)
    method isFileDelimiter (line 409) | private boolean isFileDelimiter(char    character,
    method isQuote (line 421) | private boolean isQuote(char character)

FILE: base/src/main/java/proguard/backport/AbstractAPIConverter.java
  class AbstractAPIConverter (line 51) | class      AbstractAPIConverter
    method AbstractAPIConverter (line 87) | AbstractAPIConverter(ClassPool          programClassPool,
    method replace (line 101) | protected MethodReplacement replace(String className,
    method replace (line 118) | protected TypeReplacement replace(String className, String replacement...
    method missing (line 129) | protected MethodReplacement missing(String className, String methodNam...
    method missing (line 135) | protected TypeReplacement missing(String className)
    method setTypeReplacements (line 141) | protected void setTypeReplacements(TypeReplacement[] replacements)
    method setMethodReplacements (line 147) | protected void setMethodReplacements(MethodReplacement[] replacements)
    method visitAnyClass (line 155) | @Override
    method visitProgramClass (line 159) | @Override
    method visitAnyMember (line 200) | @Override
    method visitProgramField (line 204) | @Override
    method visitProgramMethod (line 213) | @Override
    method visitAnyAttribute (line 228) | @Override
    method visitCodeAttribute (line 232) | @Override
    method visitLocalVariableTableAttribute (line 249) | @Override
    method visitLocalVariableTypeTableAttribute (line 256) | @Override
    method visitSignatureAttribute (line 263) | @Override
    method visitAnyAnnotationsAttribute (line 270) | @Override
    method visitAnyParameterAnnotationsAttribute (line 277) | @Override
    method visitAnnotationDefaultAttribute (line 284) | @Override
    method visitLocalVariableInfo (line 293) | @Override
    method visitLocalVariableTypeInfo (line 302) | @Override
    method visitAnnotation (line 311) | @Override
    method visitAnyElementValue (line 322) | @Override
    method visitEnumConstantElementValue (line 326) | @Override
    method visitClassElementValue (line 333) | @Override
    method visitAnnotationElementValue (line 346) | @Override
    method visitArrayElementValue (line 353) | @Override
    method visitAnyInstruction (line 362) | @Override
    method visitConstantInstruction (line 366) | @Override
    method visitAnyConstant (line 408) | @Override
    method visitClassConstant (line 412) | @Override
    method visitFieldrefConstant (line 425) | @Override
    method visitAnyMethodrefConstant (line 441) | @Override
    method replaceClassName (line 469) | private String replaceClassName(Clazz clazz, String className)
    method replaceDescriptor (line 491) | private String replaceDescriptor(Clazz clazz, String descriptor)
    method updateDescriptor (line 524) | private int updateDescriptor(Clazz clazz, int descriptorIndex)
    method replaceMethodInvocation (line 544) | private boolean replaceMethodInvocation(int offset, Clazz clazz, Metho...
    class AbstractReplacement (line 566) | private abstract class AbstractReplacement
      method isStatic (line 568) | boolean isStatic(Method method)
      method isDefaultMethod (line 573) | boolean isDefaultMethod(Clazz clazz, Method method)
      method isInterface (line 580) | boolean isInterface(Clazz clazz)
      method findReferencedClass (line 585) | Clazz findReferencedClass(String className)
      method findReferencedMethod (line 591) | Method findReferencedMethod(Clazz clazz, String methodName, String m...
      method getReplacement (line 596) | String getReplacement(String original, String actual, String replace...
    class MethodReplacement (line 629) | protected class MethodReplacement extends AbstractReplacement
      method MethodReplacement (line 644) | MethodReplacement(String className,            String methodName,   ...
      method isValid (line 663) | private boolean isValid()
      method getDescReplacement (line 671) | private String getDescReplacement(String original, String actual, St...
      method matches (line 686) | boolean matches(Clazz clazz, AnyMethodrefConstant anyMethodrefConstant)
      method classPatternMatches (line 720) | private boolean classPatternMatches(String className, Clazz referenc...
      method methodPatternMatches (line 727) | private boolean methodPatternMatches(String methodName, Clazz refere...
      method descPatternMatches (line 737) | private boolean descPatternMatches(String methodDesc)
      method replaceInstruction (line 743) | void replaceInstruction(int offset, Clazz clazz, Method method, AnyM...
    class MissingMethodReplacement (line 819) | private class MissingMethodReplacement extends MethodReplacement
      method MissingMethodReplacement (line 821) | MissingMethodReplacement(String className, String methodName, String...
      method isValid (line 827) | boolean isValid()
      method replaceInstruction (line 833) | void replaceInstruction(int offset, Clazz clazz, Method method, RefC...
    class TypeReplacement (line 856) | protected class TypeReplacement extends AbstractReplacement
      method TypeReplacement (line 863) | TypeReplacement(String matchingClassName, String replacementClassName)
      method isValid (line 871) | boolean isValid()
      method matchesClassName (line 879) | boolean matchesClassName(String className)
      method replaceClassName (line 885) | String replaceClassName(Clazz clazz, String className)
    class MissingTypeReplacement (line 892) | private class MissingTypeReplacement extends TypeReplacement
      method MissingTypeReplacement (line 894) | MissingTypeReplacement(String className)
      method isValid (line 900) | boolean isValid()
      method replaceClassName (line 906) | String replaceClassName(Clazz clazz, String className)

FILE: base/src/main/java/proguard/backport/Backporter.java
  class Backporter (line 44) | public class Backporter implements Pass
    method Backporter (line 49) | public Backporter(Configuration configuration)
    method execute (line 55) | @Override

FILE: base/src/main/java/proguard/backport/DefaultInterfaceMethodConverter.java
  class DefaultInterfaceMethodConverter (line 44) | public class DefaultInterfaceMethodConverter
    method DefaultInterfaceMethodConverter (line 59) | public DefaultInterfaceMethodConverter(ClassVisitor  modifiedClassVisi...
    method visitAnyClass (line 69) | @Override
    method visitProgramClass (line 73) | @Override
    method visitAnyAttribute (line 101) | @Override
    method visitCodeAttribute (line 105) | @Override
    method hasInheritedMethod (line 162) | private boolean hasInheritedMethod(Clazz  clazz,
    method callsDefaultMethodUsingSuper (line 180) | private boolean callsDefaultMethodUsingSuper(Clazz  clazz,
    method replaceDefaultMethodInvocation (line 213) | private void replaceDefaultMethodInvocation(ProgramClass  targetClass,
    class SuperInvocationInstructionMatcher (line 264) | private static class SuperInvocationInstructionMatcher
      method SuperInvocationInstructionMatcher (line 276) | public SuperInvocationInstructionMatcher(Clazz  referencedClass,
      method visitAnyAttribute (line 286) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
      method visitCodeAttribute (line 289) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttri...
      method visitAnyInstruction (line 304) | @Override
      method visitConstantInstruction (line 308) | @Override
      method visitAnyConstant (line 328) | @Override
      method visitInterfaceMethodrefConstant (line 332) | @Override
      method superInvocation (line 347) | public void superInvocation(Clazz               clazz,

FILE: base/src/main/java/proguard/backport/JSR310Converter.java
  class JSR310Converter (line 34) | public class JSR310Converter
    method JSR310Converter (line 40) | public JSR310Converter(ClassPool          programClassPool,

FILE: base/src/main/java/proguard/backport/LambdaExpression.java
  class LambdaExpression (line 34) | public class LambdaExpression
    method LambdaExpression (line 73) | public LambdaExpression(ProgramClass        referencedClass,
    method getLambdaClassName (line 108) | public String getLambdaClassName()
    method getConstructorDescriptor (line 116) | public String getConstructorDescriptor()
    method isSerializable (line 134) | public boolean isSerializable()
    method isMethodReference (line 150) | public boolean isMethodReference()
    method isStateless (line 159) | public boolean isStateless()
    method invokesStaticInterfaceMethod (line 171) | public boolean invokesStaticInterfaceMethod()
    method referencesPrivateSyntheticInterfaceMethod (line 184) | boolean referencesPrivateSyntheticInterfaceMethod()
    method needsAccessorMethod (line 196) | public boolean needsAccessorMethod()
    method referencesPrivateConstructor (line 211) | public boolean referencesPrivateConstructor()
    method isLambdaMethod (line 223) | private static boolean isLambdaMethod(String methodName)

FILE: base/src/main/java/proguard/backport/LambdaExpressionCollector.java
  class LambdaExpressionCollector (line 40) | public class LambdaExpressionCollector
    method LambdaExpressionCollector (line 56) | public LambdaExpressionCollector(Map<Integer, LambdaExpression> lambda...
    method visitAnyClass (line 64) | @Override
    method visitProgramClass (line 68) | @Override
    method visitAnyConstant (line 80) | @Override
    method visitInvokeDynamicConstant (line 84) | @Override
    method visitAnyMethodrefConstant (line 93) | @Override
    method visitAnyAttribute (line 103) | @Override
    method visitBootstrapMethodsAttribute (line 107) | @Override
    method visitBootstrapMethodInfo (line 117) | @Override
    method isLambdaMetaFactory (line 223) | private static boolean isLambdaMetaFactory(String className)
    method isAlternateFactoryMethod (line 228) | private static boolean isAlternateFactoryMethod(String methodName)
    method getIntegerConstant (line 233) | private static int getIntegerConstant(ProgramClass programClass, int c...
    method getMethodTypeConstant (line 239) | private static MethodTypeConstant getMethodTypeConstant(ProgramClass p...

FILE: base/src/main/java/proguard/backport/LambdaExpressionConverter.java
  class LambdaExpressionConverter (line 75) | public class LambdaExpressionConverter
    method LambdaExpressionConverter (line 98) | public LambdaExpressionConverter(ClassPool             programClassPool,
    method visitAnyClass (line 116) | @Override
    method visitProgramClass (line 120) | @Override
    method visitAnyAttribute (line 171) | @Override
    method visitCodeAttribute (line 175) | @Override
    method visitAnyInstruction (line 191) | @Override
    method visitConstantInstruction (line 195) | @Override
    method visitAnyMember (line 309) | @Override
    method visitProgramMethod (line 313) | @Override
    method isDeserializationHook (line 328) | private static boolean isDeserializationHook(Clazz clazz, Method method)
    method hasFlag (line 337) | private static boolean hasFlag(Member member, int flag)
    method createLambdaClass (line 342) | private ProgramClass createLambdaClass(LambdaExpression lambdaExpression)
    method fixInterfaceLambdaMethod (line 406) | private void fixInterfaceLambdaMethod(ProgramClass     programClass,
    method addAccessorMethod (line 435) | private void addAccessorMethod(ProgramClass     programClass,
    method completeStatelessLambdaClass (line 537) | private void completeStatelessLambdaClass(ProgramClass     lambdaClass,
    method completeCapturingLambdaClass (line 647) | private void completeCapturingLambdaClass(ProgramClass     lambdaClass,
    method completeInterfaceMethod (line 749) | private void completeInterfaceMethod(LambdaExpression             lamb...
    method addBridgeMethods (line 882) | private void addBridgeMethods(ProgramClass lambdaClass, LambdaExpressi...
    method prependParameterToMethodDescriptor (line 945) | private static String prependParameterToMethodDescriptor(String method...
    method convertToTargetType (line 971) | private static void convertToTargetType(String                       s...

FILE: base/src/main/java/proguard/backport/StaticInterfaceMethodConverter.java
  class StaticInterfaceMethodConverter (line 43) | public class StaticInterfaceMethodConverter
    method StaticInterfaceMethodConverter (line 53) | public StaticInterfaceMethodConverter(ClassPool             programCla...
    method visitAnyClass (line 69) | @Override
    method visitProgramClass (line 73) | @Override
    method replaceInstructions (line 171) | private void replaceInstructions(ProgramClass interfaceClass,
    class MyReferencedClassFilter (line 227) | private static class MyReferencedClassFilter
      method MyReferencedClassFilter (line 236) | public MyReferencedClassFilter(Clazz        referencedClass,
      method visitAnyClass (line 246) | @Override
      method visitProgramClass (line 250) | @Override
      method visitAnyConstant (line 265) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
      method visitAnyRefConstant (line 268) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)

FILE: base/src/main/java/proguard/backport/StreamSupportConverter.java
  class StreamSupportConverter (line 34) | public class StreamSupportConverter
    method StreamSupportConverter (line 40) | public StreamSupportConverter(ClassPool          programClassPool,

FILE: base/src/main/java/proguard/backport/StringConcatenationConverter.java
  class StringConcatenationConverter (line 42) | public class StringConcatenationConverter
    method StringConcatenationConverter (line 76) | public StringConcatenationConverter(InstructionVisitor  extraInstructi...
    method visitAnyInstruction (line 86) | @Override
    method visitConstantInstruction (line 89) | @Override
    method visitAnyAttribute (line 216) | @Override
    method visitBootstrapMethodsAttribute (line 219) | @Override
    method visitBootstrapMethodInfo (line 229) | @Override
    method visitAnyConstant (line 251) | @Override
    method visitStringConstant (line 262) | @Override
    method isStringConcatFactory (line 275) | private static boolean isStringConcatFactory(String className)
    method isMakeConcat (line 280) | private static boolean isMakeConcat(String methodName)
    method isMakeConcatWithConstants (line 285) | private static boolean isMakeConcatWithConstants(String methodName)
    method typicalStringLengthFromType (line 290) | private static int typicalStringLengthFromType(String internalTypeName)
    method appendDescriptorFromInternalType (line 303) | private static String appendDescriptorFromInternalType(String internal...
    method nextArgIndex (line 317) | private static int nextArgIndex(String recipe, int fromIndex)

FILE: base/src/main/java/proguard/classfile/ClassMemberPair.java
  class ClassMemberPair (line 32) | public class ClassMemberPair
    method ClassMemberPair (line 38) | public ClassMemberPair(Clazz clazz, Member member)
    method accept (line 45) | public void accept(MemberVisitor memberVisitor)
    method getName (line 51) | public String getName()
    method equals (line 57) | @Override
    method hashCode (line 68) | @Override
    method toString (line 75) | @Override

FILE: base/src/main/java/proguard/classfile/pass/PrimitiveArrayConstantIntroducer.java
  class PrimitiveArrayConstantIntroducer (line 17) | public class PrimitiveArrayConstantIntroducer implements Pass
    method execute (line 19) | @Override

FILE: base/src/main/java/proguard/classfile/visitor/InjectedClassFilter.java
  class InjectedClassFilter (line 33) | public class InjectedClassFilter
    method InjectedClassFilter (line 40) | public InjectedClassFilter(ClassVisitor injectedClassVisitor,
    method visitAnyClass (line 50) | @Override
    method visitProgramClass (line 56) | @Override
    method visitLibraryClass (line 67) | @Override
    method delegateVisitor (line 79) | private ClassVisitor delegateVisitor(ProgramClass programClass)

FILE: base/src/main/java/proguard/configuration/ConfigurationLogger.java
  class ConfigurationLogger (line 42) | public class ConfigurationLogger implements Runnable
    method checkForName (line 140) | public static void checkForName(String reflectedClassName,
    method checkLoadClass (line 154) | public static void checkLoadClass(String reflectedClassName,
    method checkClass (line 168) | public static void checkClass(String reflectionClassName,
    method checkGetField (line 215) | public static void checkGetField(Class  reflectedClass,
    method checkGetDeclaredField (line 231) | public static void checkGetDeclaredField(Class  reflectedClass,
    method checkGetField (line 248) | private static void checkGetField(String reflectionMethodName,
    method checkGetDeclaredFields (line 281) | public static void checkGetDeclaredFields(Class  reflectedClass,
    method checkGetFields (line 307) | public static void checkGetFields(Class  reflectedClass,
    method checkGetDeclaredConstructor (line 332) | public static void checkGetDeclaredConstructor(Class   reflectedClass,
    method checkGetConstructor (line 344) | public static void checkGetConstructor(Class   reflectedClass,
    method checkGetConstructor (line 356) | public static void checkGetConstructor(String  reflectionMethodName,
    method checkGetDeclaredConstructors (line 393) | public static void checkGetDeclaredConstructors(Class reflectedClass,
    method checkGetConstructors (line 419) | public static void checkGetConstructors(Class reflectedClass,
    method checkGetDeclaredMethod (line 449) | public static void checkGetDeclaredMethod(Class   reflectedClass,
    method checkGetMethod (line 467) | public static void checkGetMethod(Class   reflectedClass,
    method checkGetMethod (line 486) | private static void checkGetMethod(String  reflectionMethodName,
    method checkGetDeclaredMethods (line 527) | public static void checkGetDeclaredMethods(Class reflectedClass,
    method checkGetMethods (line 553) | public static void checkGetMethods(Class reflectedClass,
    method isKept (line 578) | private static boolean isKept(MemberInfo memberInfo)
    method isShrunk (line 590) | private static boolean isShrunk(MemberInfo memberInfo)
    method isKept (line 601) | private static boolean isKept(ClassInfo classInfo)
    method isShrunk (line 612) | private static boolean isShrunk(ClassInfo classInfo)
    method getDeclaringClass (line 622) | private static MemberInfo getDeclaringClass(Class   reflectedClass,
    method getDeclaringClass (line 657) | private static MemberInfo getDeclaringClass(Class   reflectedClass,
    method allDeclaredFieldsKept (line 694) | private static boolean allDeclaredFieldsKept(Class clazz)
    method allPublicFieldsKept (line 705) | private static boolean allPublicFieldsKept(Class clazz)
    method allDeclaredConstructorsKept (line 716) | private static boolean allDeclaredConstructorsKept(Class clazz)
    method allPublicConstructorsKept (line 726) | private static boolean allPublicConstructorsKept(Class clazz)
    method allDeclaredMethodsKept (line 737) | private static boolean allDeclaredMethodsKept(Class clazz)
    method allPublicMethodsKept (line 748) | private static boolean allPublicMethodsKept(Class clazz)
    method signatureString (line 758) | private static String signatureString(String  methodName,
    method run (line 783) | public void run()
    method printConfiguration (line 789) | private static void printConfiguration()
    method keepClassRule (line 819) | private static String keepClassRule(String className)
    method keepConstructorRule (line 825) | private static String keepConstructorRule(String className,
    method keepMethodRule (line 834) | private static String keepMethodRule(String className,
    method keepFieldRule (line 843) | private static String keepFieldRule(String className,
    method keepAllConstructorsRule (line 852) | private static String keepAllConstructorsRule(Class className)
    method keepAllMethodsRule (line 860) | private static String keepAllMethodsRule(Class className)
    method keepAllPublicMethodsRule (line 868) | private static String keepAllPublicMethodsRule(Class className)
    method keepAllFieldsRule (line 876) | private static String keepAllFieldsRule(Class className)
    method keepAllPublicFieldsRule (line 883) | private static String keepAllPublicFieldsRule(Class className)
    method originalClassName (line 892) | private static String originalClassName(Class className)
    method originalClassName (line 898) | private static String originalClassName(String className)
    method addArrayBrackets (line 924) | private static String addArrayBrackets(String className, int arrayDime...
    method getExternalClassNameFromComponentType (line 947) | private static String getExternalClassNameFromComponentType(String com...
    method isLibraryClass (line 981) | private static boolean isLibraryClass(Class clazz)
    method getLogMethod (line 992) | private static Method getLogMethod()
    method initializeClassMap (line 1009) | private static void initializeClassMap() throws IOException
    method loadClassMap (line 1022) | public static void loadClassMap(InputStream inputStream, Map<String, C...
    method shouldLog (line 1076) | private static <T> boolean shouldLog(Class               reflectedClass,
    method shouldLog (line 1090) | private static boolean shouldLog(Set<String> classes,
    method shouldLog (line 1097) | private static <T> boolean shouldLog(Set<T> values,
    method computeIfAbsent (line 1104) | private static <T> Set<T> computeIfAbsent(Map<String, Set<T>> map,
    method log (line 1123) | private static void log(String message)
    method hashFnv1a32_UTF8 (line 1148) | private static int hashFnv1a32_UTF8(String string)
    method hash (line 1158) | private static int hash(String string, int init)
    method hash (line 1167) | private static int hash(byte[] data, int init)
    class ClassInfo (line 1183) | public static class ClassInfo
      method ClassInfo (line 1195) | ClassInfo(String originalClassName,
      method toString (line 1212) | @Override
    class MemberInfo (line 1228) | public static class MemberInfo
      method MemberInfo (line 1233) | MemberInfo(String declaringClassName,
      method toString (line 1240) | public String toString()

FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingAdder.java
  class ConfigurationLoggingAdder (line 58) | public class ConfigurationLoggingAdder implements Pass
    method execute (line 63) | @Override
    method initializeConfigurationLogger (line 111) | private void initializeConfigurationLogger(ClassPool programClassPool)
    class ExtraClassAdder (line 123) | private static class ExtraClassAdder
      method ExtraClassAdder (line 129) | ExtraClassAdder(ExtraDataEntryNameMap extraDataEntryNameMap)
      method visitAnyInstruction (line 137) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...

FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java
  class ConfigurationLoggingInstructionSequenceConstants (line 38) | public class ConfigurationLoggingInstructionSequenceConstants
    method ConfigurationLoggingInstructionSequenceConstants (line 59) | public ConfigurationLoggingInstructionSequenceConstants(ClassPool prog...

FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java
  class ConfigurationLoggingInstructionSequenceReplacer (line 49) | public class ConfigurationLoggingInstructionSequenceReplacer extends Ins...
    method ConfigurationLoggingInstructionSequenceReplacer (line 51) | public ConfigurationLoggingInstructionSequenceReplacer(InstructionSequ...
    method ConfigurationLoggingInstructionSequenceReplacer (line 71) | public ConfigurationLoggingInstructionSequenceReplacer(Constant[]     ...
    method ConfigurationLoggingInstructionSequenceReplacer (line 87) | public ConfigurationLoggingInstructionSequenceReplacer(Constant[]     ...
    method matchedArgument (line 105) | @Override
    method matchedConstantIndex (line 122) | @Override

FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java
  class ConfigurationLoggingInstructionSequencesReplacer (line 41) | public class ConfigurationLoggingInstructionSequencesReplacer
    method ConfigurationLoggingInstructionSequencesReplacer (line 64) | public ConfigurationLoggingInstructionSequencesReplacer(Constant[]    ...
    method ConfigurationLoggingInstructionSequencesReplacer (line 94) | public ConfigurationLoggingInstructionSequencesReplacer(Constant[]    ...
    method createInstructionSequenceReplacers (line 125) | private static InstructionVisitor[] createInstructionSequenceReplacers...

FILE: base/src/main/java/proguard/configuration/InitialStateInfo.java
  class InitialStateInfo (line 38) | public class InitialStateInfo
    method InitialStateInfo (line 46) | public InitialStateInfo(ClassPool classPool)
    method size (line 56) | public int size()
    method classNames (line 65) | public List<String> classNames()
    method getSuperClassName (line 78) | public String getSuperClassName(String className)
    method getMethodHashMap (line 90) | public Map<ProgramMethod, Integer> getMethodHashMap(String className)
    method getFieldHashMap (line 102) | public Map<ProgramField, Integer> getFieldHashMap(String className)
    method initialize (line 110) | private void initialize(ClassPool classPool)
    method hash (line 141) | private static int hash(Clazz clazz, Method method)
    method hash (line 147) | private static int hash(Clazz clazz, Field field)

FILE: base/src/main/java/proguard/evaluation/AssumeClassSpecificationVisitorFactory.java
  class AssumeClassSpecificationVisitorFactory (line 38) | public class AssumeClassSpecificationVisitorFactory
    method AssumeClassSpecificationVisitorFactory (line 44) | public AssumeClassSpecificationVisitorFactory(ValueFactory valueFactory)
    method createNonTestingClassVisitor (line 52) | protected ClassVisitor createNonTestingClassVisitor(MemberSpecificatio...
    method value (line 90) | private Value value(Number[] values)
    class MyMemberValueSetter (line 103) | private static class MyMemberValueSetter
      method MyMemberValueSetter (line 109) | public MyMemberValueSetter(Value value)
      method visitProgramField (line 117) | public void visitProgramField(ProgramClass programClass, ProgramFiel...
      method visitProgramMethod (line 125) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
      method visitLibraryField (line 133) | public void visitLibraryField(LibraryClass libraryClass, LibraryFiel...
      method visitLibraryMethod (line 141) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMet...

FILE: base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationCounter.java
  class KotlinAnnotationCounter (line 36) | public class KotlinAnnotationCounter
    method KotlinAnnotationCounter (line 46) | public KotlinAnnotationCounter(SimpleUsageMarker javaUsageMarker)
    method KotlinAnnotationCounter (line 52) | public KotlinAnnotationCounter() {}
    method getCount (line 60) | public int getCount()
    method getParameterAnnotationCount (line 72) | public int getParameterAnnotationCount(int index)
    method reset (line 81) | public KotlinAnnotationCounter reset()
    method visitAnyMember (line 91) | @Override
    method visitAnyAnnotationsAttribute (line 100) | @Override
    method visitAnyParameterAnnotationsAttribute (line 110) | @Override
    method visitAnyAttribute (line 124) | @Override
    method visitAnnotation (line 130) | @Override
    method visitAnnotation (line 140) | @Override

FILE: base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationFlagFixer.java
  class KotlinAnnotationFlagFixer (line 27) | public class KotlinAnnotationFlagFixer
    method KotlinAnnotationFlagFixer (line 43) | public KotlinAnnotationFlagFixer()
    method visitAnyKotlinMetadata (line 48) | @Override
    method visitKotlinDeclarationContainerMetadata (line 53) | @Override
    method visitKotlinClassMetadata (line 62) | @Override
    method visitKotlinFileFacadeMetadata (line 78) | @Override
    method visitKotlinSyntheticClassMetadata (line 84) | @Override
    method visitKotlinMultiFileFacadeMetadata (line 90) | @Override
    method visitKotlinMultiFilePartMetadata (line 95) | @Override
    method visitAnyProperty (line 103) | @Override
    method visitAnyFunction (line 148) | @Override
    method visitConstructor (line 164) | @Override
    method visitTypeAlias (line 185) | @Override
    method visitAnyType (line 199) | @Override
    method visitFunctionReceiverType (line 209) | @Override
    method visitAnyValueParameter (line 220) | @Override
    method visitAnyTypeParameter (line 224) | @Override
    method visitFunctionValParameter (line 234) | @Override
    method visitConstructorValParameter (line 253) | @Override
    method visitPropertyValParameter (line 275) | @Override
    method visitAnyVersionRequirement (line 294) | @Override

FILE: base/src/main/java/proguard/io/ClassMapDataEntryReplacer.java
  class ClassMapDataEntryReplacer (line 46) | public class ClassMapDataEntryReplacer
    method ClassMapDataEntryReplacer (line 54) | public ClassMapDataEntryReplacer(ClassPool        programClassPool,
    method read (line 65) | @Override
    method writeClassMap (line 86) | private void writeClassMap() throws IOException
    method writeMembers (line 125) | private <T extends Member> void writeMembers(Map<T, Integer> originalM...
    method isKept (line 139) | static boolean isKept(int processingFlags)
    method allDeclaredFieldsKept (line 149) | private static boolean allDeclaredFieldsKept(Clazz clazz)
    method allPublicFieldsKept (line 171) | private static boolean allPublicFieldsKept(Clazz clazz)
    method allDeclaredConstructorsKept (line 198) | private static boolean allDeclaredConstructorsKept(Clazz clazz)
    method allPublicConstructorsKept (line 223) | private static boolean allPublicConstructorsKept(Clazz clazz)
    method allDeclaredMethodsKept (line 249) | private static boolean allDeclaredMethodsKept(Clazz clazz)
    method allPublicMethodsKept (line 273) | private static boolean allPublicMethodsKept(Clazz clazz)

FILE: base/src/main/java/proguard/io/ExtraDataEntryNameMap.java
  class ExtraDataEntryNameMap (line 39) | public class ExtraDataEntryNameMap
    method clear (line 47) | public void clear()
    method clearExtraClasses (line 56) | public void clearExtraClasses()
    method addExtraDataEntry (line 74) | public void addExtraDataEntry(String extraDataEntryName)
    method addExtraClass (line 83) | public void addExtraClass(String extraDataEntryName)
    method addExtraDataEntry (line 92) | public void addExtraDataEntry(String keyDataEntryName,
    method addExtraDataEntryToClass (line 102) | public void addExtraDataEntryToClass(String keyClassName,
    method addExtraClassToClass (line 113) | public void addExtraClassToClass(Clazz keyClass,
    method addExtraClassToClass (line 124) | public void addExtraClassToClass(Clazz keyClass,
    method addExtraClassToClass (line 135) | public void addExtraClassToClass(Clazz  keyClass,
    method addExtraClassToClass (line 146) | public void addExtraClassToClass(String keyClassName,
    method addExtraClassToClass (line 157) | public void addExtraClassToClass(String keyClassName,
    method getKeyDataEntryNames (line 168) | public Set<String> getKeyDataEntryNames()
    method getAllExtraDataEntryNames (line 177) | public Set<String> getAllExtraDataEntryNames()
    method getDefaultExtraDataEntryNames (line 186) | public Set<String> getDefaultExtraDataEntryNames()
    method getExtraDataEntryNames (line 195) | public Set<String> getExtraDataEntryNames(String keyDataEntryName)
    method getClassDataEntryName (line 203) | private String getClassDataEntryName(Clazz clazz)
    method getClassDataEntryName (line 209) | private String getClassDataEntryName(Class clazz)
    method getClassDataEntryName (line 215) | public String getClassDataEntryName(String className)

FILE: base/src/main/java/proguard/io/ExtraDataEntryReader.java
  class ExtraDataEntryReader (line 32) | public class ExtraDataEntryReader implements DataEntryReader
    method ExtraDataEntryReader (line 49) | public ExtraDataEntryReader(String          extraEntryName,
    method ExtraDataEntryReader (line 66) | public ExtraDataEntryReader(String          extraEntryName,
    method ExtraDataEntryReader (line 86) | public ExtraDataEntryReader(ExtraDataEntryNameMap extraEntryNameMap,
    method ExtraDataEntryReader (line 105) | public ExtraDataEntryReader(ExtraDataEntryNameMap extraEntryNameMap,
    method read (line 117) | @Override
    method readExtraEntries (line 135) | private void readExtraEntries(DataEntry   parentEntry,

FILE: base/src/main/java/proguard/io/KotlinModuleRewriter.java
  class KotlinModuleRewriter (line 35) | public class KotlinModuleRewriter
    method KotlinModuleRewriter (line 43) | public KotlinModuleRewriter(ClassPool programClassPool, Charset charse...
    method read (line 50) | public void read(DataEntry dataEntry) throws IOException
    method copyData (line 56) | protected void copyData(InputStream inputStream, OutputStream outputSt...
    class PackageInformation (line 74) | private class PackageInformation
      method PackageInformation (line 81) | private PackageInformation(String fqName) {this.fqName = fqName;}
      method addToModule (line 84) | public void addToModule(KmModule out)
    class ModuleTransformer (line 90) | private class ModuleTransformer extends KmModuleVisitor
      method getPackageInformation (line 95) | private PackageInformation getPackageInformation(String fqName)
      method getPackageInformation (line 110) | private PackageInformation getPackageInformation(Clazz clazz)
      method visitPackageParts (line 116) | public void visitPackageParts(String fqName, List<String> fileFacade...
      method getResult (line 149) | public KmModule getResult()
      method visitAnnotation (line 160) | public void visitAnnotation(KmAnnotation annotation)
      method visitEnd (line 166) | public void visitEnd() {}

FILE: base/src/main/java/proguard/io/UniqueDataEntryWriter.java
  class UniqueDataEntryWriter (line 22) | public class UniqueDataEntryWriter implements DataEntryWriter
    method UniqueDataEntryWriter (line 28) | public UniqueDataEntryWriter(DataEntryWriter dataEntryWriter)
    method createDirectory (line 36) | @Override
    method sameOutputStream (line 54) | @Override
    method createOutputStream (line 61) | @Override
    method close (line 79) | @Override
    method println (line 86) | @Override

FILE: base/src/main/java/proguard/logging/Logging.java
  class Logging (line 15) | public class Logging
    method configureVerbosity (line 17) | public static void configureVerbosity(boolean verbose) {

FILE: base/src/main/java/proguard/mark/Marker.java
  class Marker (line 82) | public class Marker implements Pass
    method Marker (line 88) | public Marker(Configuration configuration)
    method execute (line 99) | @Override
    method createShrinkingMarker (line 145) | private ClassPoolVisitor createShrinkingMarker(Configuration configura...
    method createOptimizationMarker (line 167) | private ClassPoolVisitor createOptimizationMarker(Configuration config...
    method createObfuscationMarker (line 203) | private ClassPoolVisitor createObfuscationMarker(Configuration configu...
    method markSafeGeneralizationMembers (line 232) | private void markSafeGeneralizationMembers(ClassPool programClassPool,
    method disableOptimizationForKotlinFeatures (line 254) | private void disableOptimizationForKotlinFeatures(ClassPool programCla...
    class KotlinDontOptimizeMarker (line 267) | public static class KotlinDontOptimizeMarker
      method visitAnyKotlinMetadata (line 279) | @Override
      method visitKotlinDeclarationContainerMetadata (line 283) | @Override
      method visitKotlinClassMetadata (line 291) | @Override
      method visitKotlinSyntheticClassMetadata (line 324) | @Override
      method visitAnyFunction (line 353) | @Override
      method visitFunction (line 359) | @Override
      method visitSyntheticFunction (line 399) | @Override
    method hasAnyOf (line 418) | private static boolean hasAnyOf(int value, int ... flag)

FILE: base/src/main/java/proguard/obfuscate/AttributeShrinker.java
  class AttributeShrinker (line 39) | public class AttributeShrinker
    method visitAnyClass (line 47) | @Override
    method visitProgramClass (line 51) | @Override
    method visitProgramMember (line 70) | public void visitProgramMember(ProgramClass programClass, ProgramMembe...
    method visitAnyAttribute (line 84) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitRecordAttribute (line 87) | public void visitRecordAttribute(Clazz clazz, RecordAttribute recordAt...
    method visitCodeAttribute (line 94) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitRecordComponentInfo (line 105) | public void visitRecordComponentInfo(Clazz clazz, RecordComponentInfo ...
    method shrinkArray (line 121) | private static int shrinkArray(Processable[] array, int length)

FILE: base/src/main/java/proguard/obfuscate/AttributeUsageMarker.java
  class AttributeUsageMarker (line 35) | public class AttributeUsageMarker
    method visitAnyAttribute (line 44) | public void visitAnyAttribute(Clazz clazz, Attribute attribute)
    method markAsUsed (line 56) | private static void markAsUsed(Processable processable)
    method isUsed (line 66) | public static boolean isUsed(Processable processable)

FILE: base/src/main/java/proguard/obfuscate/ClassNameAdapterFunction.java
  class ClassNameAdapterFunction (line 36) | public class ClassNameAdapterFunction implements StringFunction
    method ClassNameAdapterFunction (line 45) | public ClassNameAdapterFunction(ClassPool classPool)
    method transform (line 54) | @Override
    method createPackagePrefixMap (line 135) | private static Map createPackagePrefixMap(ClassPool classPool)

FILE: base/src/main/java/proguard/obfuscate/ClassObfuscator.java
  class ClassObfuscator (line 46) | public class ClassObfuscator
    method ClassObfuscator (line 102) | public ClassObfuscator(ClassPool             programClassPool,
    method visitAnyClass (line 149) | @Override
    method visitProgramClass (line 156) | @Override
    method visitLibraryClass (line 185) | @Override
    method visitAnyAttribute (line 196) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitInnerClassesAttribute (line 199) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
    method visitEnclosingMethodAttribute (line 206) | public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethod...
    method visitInnerClassesInfo (line 220) | public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerC...
    method isSyntheticKotlinLambdaClass (line 245) | private boolean isSyntheticKotlinLambdaClass(Clazz innerClass)
    method isNumericClassName (line 266) | private boolean isNumericClassName(Clazz  innerClass,
    method visitClassConstant (line 297) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
    class MyKeepCollector (line 308) | private class MyKeepCollector
      method visitAnyClass (line 311) | @Override
      method visitProgramClass (line 315) | @Override
      method visitLibraryClass (line 343) | public void visitLibraryClass(LibraryClass libraryClass)
      method mapPackageName (line 376) | private void mapPackageName(String  className,
    method newPackagePrefix (line 409) | private String newPackagePrefix(String packagePrefix)
    method generateUniquePackagePrefix (line 450) | private String generateUniquePackagePrefix(String newSuperPackagePrefix)
    method generateUniquePackagePrefix (line 479) | private String generateUniquePackagePrefix(String      newSuperPackage...
    method generateUniqueClassName (line 500) | private String generateUniqueClassName(String newPackagePrefix)
    method generateUniqueNumericClassName (line 528) | private String generateUniqueNumericClassName(String newPackagePrefix)
    method generateUniqueClassName (line 551) | private String generateUniqueClassName(String      newPackagePrefix,
    method mixedCaseClassName (line 584) | private String mixedCaseClassName(String className)
    method setNewClassName (line 597) | public static void setNewClassName(Clazz clazz, String name)
    method hasOriginalClassName (line 609) | public static boolean hasOriginalClassName(Clazz clazz)
    method newClassName (line 621) | public static String newClassName(Clazz clazz)

FILE: base/src/main/java/proguard/obfuscate/ClassRenamer.java
  class ClassRenamer (line 39) | public class ClassRenamer
    method ClassRenamer (line 51) | public ClassRenamer()
    method ClassRenamer (line 65) | public ClassRenamer(ClassVisitor  extraClassVisitor,
    method visitAnyClass (line 75) | @Override
    method visitProgramClass (line 82) | @Override
    method visitLibraryClass (line 94) | @Override
    method visitProgramMember (line 118) | public void visitProgramMember(ProgramClass  programClass,
    method visitLibraryMember (line 136) | public void visitLibraryMember(LibraryClass  libraryClass,
    method visitClassConstant (line 156) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)

FILE: base/src/main/java/proguard/obfuscate/DictionaryNameFactory.java
  class DictionaryNameFactory (line 34) | public class DictionaryNameFactory implements NameFactory
    method DictionaryNameFactory (line 51) | public DictionaryNameFactory(URL         url,
    method DictionaryNameFactory (line 67) | public DictionaryNameFactory(URL         url,
    method DictionaryNameFactory (line 85) | public DictionaryNameFactory(File        file,
    method DictionaryNameFactory (line 101) | public DictionaryNameFactory(File        file,
    method DictionaryNameFactory (line 120) | public DictionaryNameFactory(Reader      reader,
    method DictionaryNameFactory (line 137) | public DictionaryNameFactory(Reader      reader,
    method DictionaryNameFactory (line 220) | public DictionaryNameFactory(DictionaryNameFactory dictionaryNameFactory,
    method reset (line 230) | public void reset()
    method nextName (line 238) | public String nextName()
    method main (line 262) | public static void main(String[] args)

FILE: base/src/main/java/proguard/obfuscate/MapCleaner.java
  class MapCleaner (line 33) | public class MapCleaner
    method MapCleaner (line 43) | public MapCleaner(Map map)
    method visitAnyClass (line 51) | public void visitAnyClass(Clazz clazz)

FILE: base/src/main/java/proguard/obfuscate/MappingKeeper.java
  class MappingKeeper (line 33) | public class MappingKeeper implements MappingProcessor
    method MappingKeeper (line 49) | public MappingKeeper(ClassPool      classPool,
    method processClassMapping (line 59) | public boolean processClassMapping(String className,
    method processFieldMapping (line 99) | public void processFieldMapping(String className,
    method processMethodMapping (line 138) | public void processMethodMapping(String className,

FILE: base/src/main/java/proguard/obfuscate/MappingPrinter.java
  class MappingPrinter (line 56) | public class MappingPrinter
    method MappingPrinter (line 73) | public MappingPrinter(PrintWriter printWriter)
    method visitAnyClass (line 81) | @Override
    method visitProgramClass (line 85) | @Override
    method visitProgramField (line 108) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 126) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitAnyAttribute (line 154) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 157) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitLineNumberTableAttribute (line 163) | public void visitLineNumberTableAttribute(Clazz clazz, Method method, ...
    method printInlinedMethodMapping (line 276) | private void printInlinedMethodMapping(String                className,
    method printEnclosingMethodMapping (line 336) | private void printEnclosingMethodMapping(String         className,
    class SourceFileNamePrinter (line 388) | private static class SourceFileNamePrinter implements AttributeVisitor
      method SourceFileNamePrinter (line 392) | public SourceFileNamePrinter(PrintWriter pw)
      method visitSourceFileAttribute (line 397) | @Override
      method visitAnyAttribute (line 414) | @Override

FILE: base/src/main/java/proguard/obfuscate/MappingProcessor.java
  type MappingProcessor (line 32) | public interface MappingProcessor
    method processClassMapping (line 42) | public boolean processClassMapping(String className,
    method processFieldMapping (line 53) | public void processFieldMapping(String className,
    method processMethodMapping (line 76) | public void processMethodMapping(String className,

FILE: base/src/main/java/proguard/obfuscate/MappingReader.java
  class MappingReader (line 32) | public class MappingReader
    method MappingReader (line 37) | public MappingReader(File mappingFile)
    method pump (line 47) | public void pump(MappingProcessor mappingProcessor) throws IOException
    method processClassMapping (line 112) | private String processClassMapping(String           line,
    method processClassMemberMapping (line 145) | private void processClassMemberMapping(String           className,

FILE: base/src/main/java/proguard/obfuscate/MemberNameCleaner.java
  class MemberNameCleaner (line 34) | public class MemberNameCleaner implements MemberVisitor
    method visitProgramField (line 38) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 44) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 50) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 56) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...

FILE: base/src/main/java/proguard/obfuscate/MemberNameCollector.java
  class MemberNameCollector (line 37) | public class MemberNameCollector
    method MemberNameCollector (line 51) | public MemberNameCollector(boolean allowAggressiveOverloading,
    method visitAnyMember (line 61) | public void visitAnyMember(Clazz clazz, Member member)

FILE: base/src/main/java/proguard/obfuscate/MemberNameConflictFixer.java
  class MemberNameConflictFixer (line 36) | public class MemberNameConflictFixer implements MemberVisitor
    method MemberNameConflictFixer (line 57) | public MemberNameConflictFixer(boolean          allowAggressiveOverloa...
    method visitProgramField (line 73) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 79) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 93) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 94) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitMember (line 103) | private void visitMember(Clazz   clazz,

FILE: base/src/main/java/proguard/obfuscate/MemberObfuscator.java
  class MemberObfuscator (line 41) | public class MemberObfuscator
    method MemberObfuscator (line 58) | public MemberObfuscator(boolean        allowAggressiveOverloading,
    method visitAnyMember (line 70) | public void visitAnyMember(Clazz clazz, Member member)
    method retrieveNameMap (line 127) | static Map retrieveNameMap(Map descriptorMap, String descriptor)
    method setFixedNewMemberName (line 148) | public static void setFixedNewMemberName(Member member, String name)
    method setNewMemberName (line 169) | public static void setNewMemberName(Member member, String name)
    method hasFixedNewMemberName (line 180) | static boolean hasFixedNewMemberName(Member member)
    method newMemberName (line 195) | public static String newMemberName(Member member)
    class MyFixedName (line 205) | private static class MyFixedName extends SimpleProcessable
      method MyFixedName (line 207) | public MyFixedName(String newName)

FILE: base/src/main/java/proguard/obfuscate/MemberSpecialNameFilter.java
  class MemberSpecialNameFilter (line 37) | public class MemberSpecialNameFilter implements MemberVisitor
    method MemberSpecialNameFilter (line 47) | public MemberSpecialNameFilter(MemberVisitor memberVisitor)
    method visitProgramField (line 55) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 64) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 73) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 82) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method hasSpecialName (line 97) | private static boolean hasSpecialName(Member member)

FILE: base/src/main/java/proguard/obfuscate/MultiMappingProcessor.java
  class MultiMappingProcessor (line 29) | public class MultiMappingProcessor
    method MultiMappingProcessor (line 40) | public MultiMappingProcessor(MappingProcessor[] mappingProcessors)
    method processClassMapping (line 48) | public boolean processClassMapping(String className,
    method processFieldMapping (line 63) | public void processFieldMapping(String className,
    method processMethodMapping (line 80) | public void processMethodMapping(String className,

FILE: base/src/main/java/proguard/obfuscate/NameFactory.java
  type NameFactory (line 29) | public interface NameFactory
    method reset (line 31) | public void reset();
    method nextName (line 33) | public String nextName();

FILE: base/src/main/java/proguard/obfuscate/NameFactoryResetter.java
  class NameFactoryResetter (line 32) | public class NameFactoryResetter
    method NameFactoryResetter (line 42) | public NameFactoryResetter(NameFactory nameFactory)
    method visitAnyClass (line 50) | @Override

FILE: base/src/main/java/proguard/obfuscate/NameMarker.java
  class NameMarker (line 42) | class      NameMarker
    method visitAnyClass (line 51) | @Override
    method visitProgramClass (line 58) | @Override
    method visitLibraryClass (line 68) | @Override
    method visitProgramField (line 77) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 83) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 89) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 95) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitAnyAttribute (line 103) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitInnerClassesAttribute (line 106) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
    method visitInnerClassesInfo (line 115) | public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerC...
    method visitClassConstant (line 131) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
    method keepClassName (line 143) | public void keepClassName(Clazz clazz)
    method keepFieldName (line 153) | private void keepFieldName(Clazz clazz, Field field)
    method keepMethodName (line 163) | private void keepMethodName(Clazz clazz, Method method)

FILE: base/src/main/java/proguard/obfuscate/NameObfuscationReferenceFixer.java
  class NameObfuscationReferenceFixer (line 24) | public class NameObfuscationReferenceFixer
    method NameObfuscationReferenceFixer (line 29) | public NameObfuscationReferenceFixer(Configuration configuration)
    method execute (line 35) | @Override

FILE: base/src/main/java/proguard/obfuscate/NewMemberNameFilter.java
  class NewMemberNameFilter (line 36) | public class NewMemberNameFilter implements MemberVisitor
    method NewMemberNameFilter (line 46) | public NewMemberNameFilter(MemberVisitor memberVisitor)
    method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 63) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 72) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 81) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method hasName (line 95) | private boolean hasName(Clazz clazz)
    method hasName (line 104) | private boolean hasName(Clazz clazz, Method method)
    method hasName (line 116) | private boolean hasName(Member member)

FILE: base/src/main/java/proguard/obfuscate/NumericNameFactory.java
  class NumericNameFactory (line 29) | public class NumericNameFactory implements NameFactory
    method reset (line 36) | public void reset()
    method nextName (line 42) | public String nextName()

FILE: base/src/main/java/proguard/obfuscate/ObfuscationPreparation.java
  class ObfuscationPreparation (line 20) | public class ObfuscationPreparation implements Pass
    method ObfuscationPreparation (line 26) | public ObfuscationPreparation(Configuration configuration)
    method execute (line 32) | @Override

FILE: base/src/main/java/proguard/obfuscate/Obfuscator.java
  class Obfuscator (line 119) | public class Obfuscator implements Pass
    method Obfuscator (line 124) | public Obfuscator(Configuration configuration)
    method execute (line 133) | @Override

FILE: base/src/main/java/proguard/obfuscate/OriginalClassNameFilter.java
  class OriginalClassNameFilter (line 34) | public class OriginalClassNameFilter
    method OriginalClassNameFilter (line 51) | public OriginalClassNameFilter(ClassVisitor acceptedClassVisitor,
    method visitAnyClass (line 61) | @Override
    method selectVisitor (line 73) | private ClassVisitor selectVisitor(Clazz clazz)

FILE: base/src/main/java/proguard/obfuscate/ParameterNameMarker.java
  class ParameterNameMarker (line 34) | public class ParameterNameMarker
    method ParameterNameMarker (line 45) | public ParameterNameMarker(AttributeVisitor attributeUsageMarker)
    method visitAnyAttribute (line 53) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitLocalVariableTableAttribute (line 56) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
    method visitLocalVariableTypeTableAttribute (line 88) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
    method hasParameters (line 122) | private boolean hasParameters(Clazz clazz, Method method)

FILE: base/src/main/java/proguard/obfuscate/PrefixingNameFactory.java
  class PrefixingNameFactory (line 30) | public class PrefixingNameFactory implements NameFactory
    method PrefixingNameFactory (line 41) | public PrefixingNameFactory(NameFactory delegateNameFactory,
    method nextName (line 51) | public String nextName()
    method reset (line 56) | public void reset()

FILE: base/src/main/java/proguard/obfuscate/RenamedFlagSetter.java
  class RenamedFlagSetter (line 34) | public class RenamedFlagSetter
    method visitAnyClass (line 43) | @Override
    method visitProgramClass (line 47) | @Override
    method visitProgramMember (line 66) | public void visitProgramMember(ProgramClass programClass, ProgramMembe...

FILE: base/src/main/java/proguard/obfuscate/ResourceFileNameAdapter.java
  class ResourceFileNameAdapter (line 21) | public class ResourceFileNameAdapter
    method ResourceFileNameAdapter (line 26) | public ResourceFileNameAdapter(Configuration configuration)
    method execute (line 32) | @Override

FILE: base/src/main/java/proguard/obfuscate/ResourceFileNameObfuscator.java
  class ResourceFileNameObfuscator (line 33) | public class ResourceFileNameObfuscator
    method ResourceFileNameObfuscator (line 41) | public ResourceFileNameObfuscator(StringFunction nameObfuscationFunction,
    method ResourceFileNameObfuscator (line 48) | public ResourceFileNameObfuscator(StringFunction      nameObfuscationF...
    method visitAnyResourceFile (line 60) | @Override
    method setNewResourceFileName (line 84) | private static void setNewResourceFileName(ResourceFile resourceFile, ...
    method isObfuscated (line 97) | public static boolean isObfuscated(ResourceFile resourceFile)
    method getOriginalResourceFileName (line 109) | public static String getOriginalResourceFileName(ResourceFile resource...

FILE: base/src/main/java/proguard/obfuscate/ResourceJavaReferenceFixer.java
  class ResourceJavaReferenceFixer (line 37) | public class ResourceJavaReferenceFixer implements ResourceFileVisitor
    method visitResourceFile (line 41) | @Override
    method visitKotlinModule (line 61) | @Override

FILE: base/src/main/java/proguard/obfuscate/SimpleNameFactory.java
  class SimpleNameFactory (line 31) | public class SimpleNameFactory implements NameFactory
    method SimpleNameFactory (line 48) | public SimpleNameFactory()
    method SimpleNameFactory (line 59) | public SimpleNameFactory(boolean generateMixedCaseNames)
    method reset (line 67) | public void reset()
    method nextName (line 73) | public String nextName()
    method name (line 82) | private String name(int index)
    method newName (line 92) | private String newName(int index)
    method charAt (line 121) | private char charAt(int index)
    method main (line 128) | public static void main(String[] args)
    method printNameSamples (line 141) | private static void printNameSamples(SimpleNameFactory factory, int co...

FILE: base/src/main/java/proguard/obfuscate/SourceFileRenamer.java
  class SourceFileRenamer (line 36) | public class SourceFileRenamer
    method SourceFileRenamer (line 48) | public SourceFileRenamer(String newSourceFileAttribute)
    method visitAnyClass (line 56) | @Override
    method visitProgramClass (line 60) | @Override
    method visitAnyAttribute (line 70) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitSourceFileAttribute (line 73) | public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute ...
    method visitSourceDirAttribute (line 81) | public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute so...

FILE: base/src/main/java/proguard/obfuscate/SpecialNameFactory.java
  class SpecialNameFactory (line 29) | public class SpecialNameFactory implements NameFactory
    method SpecialNameFactory (line 42) | public SpecialNameFactory(NameFactory nameFactory)
    method reset (line 50) | public void reset()
    method nextName (line 56) | public String nextName()
    method isSpecialName (line 67) | static boolean isSpecialName(String name)
    method main (line 74) | public static void main(String[] args)

FILE: base/src/main/java/proguard/obfuscate/UniqueMemberNameFactory.java
  class UniqueMemberNameFactory (line 31) | public class UniqueMemberNameFactory implements NameFactory
    method newInjectedMemberNameFactory (line 47) | public static UniqueMemberNameFactory newInjectedMemberNameFactory(Cla...
    method UniqueMemberNameFactory (line 62) | public UniqueMemberNameFactory(NameFactory delegateNameFactory,
    method nextName (line 72) | public String nextName()
    method reset (line 89) | public void reset()

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasNameObfuscator.java
  class KotlinAliasNameObfuscator (line 29) | public class KotlinAliasNameObfuscator
    method KotlinAliasNameObfuscator (line 38) | public KotlinAliasNameObfuscator(NameFactory nameFactory)
    method visitAnyKotlinMetadata (line 45) | @Override
    method visitKotlinDeclarationContainerMetadata (line 49) | @Override
    method visitAnyType (line 57) | @Override
    method visitTypeAlias (line 60) | @Override
    method visitAliasExpandedType (line 68) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasReferenceFixer.java
  class KotlinAliasReferenceFixer (line 28) | public class KotlinAliasReferenceFixer
    method visitAnyType (line 34) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinCallableReferenceFixer.java
  class KotlinCallableReferenceFixer (line 47) | public class KotlinCallableReferenceFixer
    method KotlinCallableReferenceFixer (line 53) | public KotlinCallableReferenceFixer(ClassPool programClassPool, ClassP...
    method visitAnyKotlinMetadata (line 61) | @Override
    method visitKotlinSyntheticClassMetadata (line 64) | @Override
    class NameOrSignatureReplacementSequences (line 124) | public static final class NameOrSignatureReplacementSequences
      method NameOrSignatureReplacementSequences (line 130) | NameOrSignatureReplacementSequences(String name, ClassPool programCl...
      method getSequences (line 149) | @Override
      method getConstants (line 155) | @Override
    class NameAndSignatureReplacementSequences (line 162) | public static final class NameAndSignatureReplacementSequences
      method NameAndSignatureReplacementSequences (line 173) | NameAndSignatureReplacementSequences(String name, String signature, ...
      method getSequences (line 209) | @Override
      method getConstants (line 215) | @Override
    class OwnerReplacementSequences (line 222) | public static final class OwnerReplacementSequences
      method OwnerReplacementSequences (line 228) | OwnerReplacementSequences(String name, ClassPool programClassPool, C...
      method getSequences (line 253) | @Override
      method getConstants (line 259) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinCompanionEqualizer.java
  class KotlinCompanionEqualizer (line 32) | public class KotlinCompanionEqualizer
    method visitAnyKotlinMetadata (line 36) | @Override
    method visitKotlinClassMetadata (line 39) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultImplsMethodNameEqualizer.java
  class KotlinDefaultImplsMethodNameEqualizer (line 29) | public class KotlinDefaultImplsMethodNameEqualizer
    method visitAnyFunction (line 33) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultMethodNameEqualizer.java
  class KotlinDefaultMethodNameEqualizer (line 30) | public class KotlinDefaultMethodNameEqualizer
    method visitAnyFunction (line 34) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinIntrinsicsReplacementSequences.java
  class KotlinIntrinsicsReplacementSequences (line 32) | public final class KotlinIntrinsicsReplacementSequences
    method KotlinIntrinsicsReplacementSequences (line 43) | public KotlinIntrinsicsReplacementSequences(ClassPool programClassPool...
    method getSequences (line 195) | @Override
    method getConstants (line 201) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleFixer.java
  class KotlinModuleFixer (line 42) | public class KotlinModuleFixer
    method visitKotlinModule (line 47) | @Override
    class ModulePackageNameFixer (line 76) | private static class ModulePackageNameFixer
      method ModulePackageNameFixer (line 81) | ModulePackageNameFixer(List<String> packageNames)
      method visitKotlinModulePackage (line 86) | @Override
    class ToMoveCollector (line 127) | private static class ToMoveCollector
      method ToMoveCollector (line 133) | private ToMoveCollector(Map<String, KotlinFileFacadeKindMetadata>   ...
      method visitKotlinModulePackage (line 140) | @Override
    class ModulePartCleaner (line 167) | private static class ModulePartCleaner
      method ModulePartCleaner (line 173) | private ModulePartCleaner(Map<String, KotlinFileFacadeKindMetadata> ...
      method visitKotlinModulePackage (line 180) | @Override
    method createNewModulePackages (line 203) | private static void createNewModulePackages(KotlinModule              ...
    method addFileFacadesToModule (line 220) | private static void addFileFacadesToModule(KotlinModule               ...
    method addMultiFilePartsToModule (line 233) | private static void addMultiFilePartsToModule(KotlinModule            ...
    method moduleNameToFileName (line 248) | private static String moduleNameToFileName(String moduleName)

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleNameObfuscator.java
  class KotlinModuleNameObfuscator (line 34) | public class KotlinModuleNameObfuscator
    method KotlinModuleNameObfuscator (line 39) | public KotlinModuleNameObfuscator(NameFactory nameFactory)
    method visitKotlinModule (line 48) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinMultiFileFacadeFixer.java
  class KotlinMultiFileFacadeFixer (line 38) | public class KotlinMultiFileFacadeFixer
    method visitAnyKotlinMetadata (line 43) | @Override
    method visitKotlinMultiFileFacadeMetadata (line 46) | @Override
    method dontObfuscate (line 78) | private static boolean dontObfuscate(Processable processable)

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinObjectFixer.java
  class KotlinObjectFixer (line 36) | public class KotlinObjectFixer
    method visitAnyKotlinMetadata (line 39) | @Override
    method visitKotlinClassMetadata (line 43) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyNameObfuscator.java
  class KotlinPropertyNameObfuscator (line 29) | public class KotlinPropertyNameObfuscator
    method KotlinPropertyNameObfuscator (line 37) | public KotlinPropertyNameObfuscator(NameFactory nameFactory)
    method visitAnyKotlinMetadata (line 44) | @Override
    method visitKotlinDeclarationContainerMetadata (line 48) | @Override
    method visitAnyProperty (line 57) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyRenamer.java
  class KotlinPropertyRenamer (line 31) | public class KotlinPropertyRenamer implements KotlinPropertyVisitor
    method visitAnyProperty (line 33) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSourceDebugExtensionAttributeObfuscator.java
  class KotlinSourceDebugExtensionAttributeObfuscator (line 31) | public class KotlinSourceDebugExtensionAttributeObfuscator
    method visitSourceDebugExtensionAttribute (line 45) | @Override
    method visitAnyAttribute (line 53) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticClassFixer.java
  class KotlinSyntheticClassFixer (line 38) | public class KotlinSyntheticClassFixer
    method visitAnyKotlinMetadata (line 42) | @Override
    method visitKotlinClassMetadata (line 45) | @Override
    method visitKotlinSyntheticClassMetadata (line 63) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticToStringObfuscator.java
  class KotlinSyntheticToStringObfuscator (line 70) | public class KotlinSyntheticToStringObfuscator
    method visitAnyKotlinMetadata (line 83) | @Override
    method visitKotlinClassMetadata (line 86) | @Override
    class MyObfuscatedToStringFixer (line 121) | private static final class MyObfuscatedToStringFixer
      method MyObfuscatedToStringFixer (line 131) | private MyObfuscatedToStringFixer(Map<String, String> originalToNewN...
      method visitAnyAttribute (line 139) | @Override
      method visitCodeAttribute (line 142) | @Override
      method visitAnyInstruction (line 152) | @Override
      method visitConstantInstruction (line 155) | @Override
      method visitStringConstant (line 177) | @Override
      method visitUtf8Constant (line 183) | @Override
      method visitAnyConstant (line 208) | @Override
    class PropertyNameCollector (line 213) | private static final class PropertyNameCollector
      method PropertyNameCollector (line 218) | private PropertyNameCollector(Map<String, String> nameMap) {
      method visitAnyProperty (line 224) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinUnsupportedExceptionReplacementSequences.java
  class KotlinUnsupportedExceptionReplacementSequences (line 37) | public final class KotlinUnsupportedExceptionReplacementSequences
    method KotlinUnsupportedExceptionReplacementSequences (line 46) | public KotlinUnsupportedExceptionReplacementSequences(ClassPool progra...
    method getSequences (line 72) | @Override
    method getConstants (line 78) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinValueParameterNameShrinker.java
  class KotlinValueParameterNameShrinker (line 31) | public class   KotlinValueParameterNameShrinker
    method visitAnyKotlinMetadata (line 40) | @Override
    method visitKotlinDeclarationContainerMetadata (line 44) | @Override
    method visitKotlinClassMetadata (line 53) | @Override
    method visitKotlinSyntheticClassMetadata (line 61) | @Override
    method visitConstructor (line 72) | @Override
    method visitAnyProperty (line 86) | @Override
    method visitAnyFunction (line 100) | @Override
    class MyValueParameterShrinker (line 111) | private static class MyValueParameterShrinker implements KotlinValuePa...
      method visitAnyValueParameter (line 115) | @Override

FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinValueParameterUsageMarker.java
  class KotlinValueParameterUsageMarker (line 50) | public class KotlinValueParameterUsageMarker
    method visitAnyKotlinMetadata (line 67) | @Override
    method visitKotlinDeclarationContainerMetadata (line 70) | @Override
    method visitKotlinClassMetadata (line 79) | @Override
    method visitKotlinSyntheticClassMetadata (line 86) | @Override
    method visitConstructor (line 95) | @Override
    method visitAnyProperty (line 111) | @Override
    method visitAnyFunction (line 130) | @Override
    method visitAnyMember (line 146) | @Override
    method visitProgramMethod (line 150) | @Override
    method visitAnyValueParameter (line 158) | @Override
    method markAsUsed (line 171) | private static void markAsUsed(Processable processable)
    method isUsed (line 181) | static boolean isUsed(Processable processable)

FILE: base/src/main/java/proguard/obfuscate/util/InstructionSequenceObfuscator.java
  class InstructionSequenceObfuscator (line 35) | public class InstructionSequenceObfuscator
    method InstructionSequenceObfuscator (line 42) | public InstructionSequenceObfuscator(ReplacementSequences replacementS...
    method visitAnyClass (line 59) | @Override
    method visitProgramClass (line 63) | @Override
    method visitAnyMember (line 72) | @Override
    method visitProgramMethod (line 75) | @Override
    class MyInstructionSequenceReplacer (line 86) | private static class MyInstructionSequenceReplacer extends MultiInstru...
      method MyInstructionSequenceReplacer (line 89) | MyInstructionSequenceReplacer(Constant[]          constants,
      method createInstructionSequenceReplacers (line 97) | private static InstructionVisitor[] createInstructionSequenceReplace...

FILE: base/src/main/java/proguard/obfuscate/util/ReplacementSequences.java
  type ReplacementSequences (line 26) | public interface ReplacementSequences
    method getSequences (line 28) | Instruction[][][] getSequences();
    method getConstants (line 29) | Constant[]        getConstants();

FILE: base/src/main/java/proguard/optimize/BootstrapMethodArgumentShrinker.java
  class BootstrapMethodArgumentShrinker (line 41) | public class BootstrapMethodArgumentShrinker
    method visitBootstrapMethodInfo (line 51) | public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo ...
    method visitMethodHandleConstant (line 79) | public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstan...
    method visitAnyRefConstant (line 86) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
    method visitLibraryMethod (line 95) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitProgramMethod (line 98) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/CalledMemberVisitor.java
  class CalledMemberVisitor (line 33) | public class CalledMemberVisitor
    method CalledMemberVisitor (line 40) | public CalledMemberVisitor(MemberVisitor memberVisitor)
    method visitAnyInstruction (line 51) | public void visitAnyInstruction(Clazz clazz,
    method visitConstantInstruction (line 60) | public void visitConstantInstruction(Clazz clazz,

FILE: base/src/main/java/proguard/optimize/ChangedCodePrinter.java
  class ChangedCodePrinter (line 39) | public class ChangedCodePrinter
    method ChangedCodePrinter (line 46) | public ChangedCodePrinter(AttributeVisitor attributeVisitor)
    method visitUnknownAttribute (line 54) | public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknow...
    method visitSourceDebugExtensionAttribute (line 60) | public void visitSourceDebugExtensionAttribute(Clazz clazz, SourceDebu...
    method visitBootstrapMethodsAttribute (line 66) | public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMetho...
    method visitSourceFileAttribute (line 72) | public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute ...
    method visitSourceDirAttribute (line 78) | public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute so...
    method visitInnerClassesAttribute (line 84) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
    method visitEnclosingMethodAttribute (line 90) | public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethod...
    method visitNestHostAttribute (line 96) | public void visitNestHostAttribute(Clazz clazz, NestHostAttribute nest...
    method visitNestMembersAttribute (line 102) | public void visitNestMembersAttribute(Clazz clazz, NestMembersAttribut...
    method visitPermittedSubclassesAttribute (line 108) | public void visitPermittedSubclassesAttribute(Clazz clazz, PermittedSu...
    method visitModuleAttribute (line 114) | public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAt...
    method visitModuleMainClassAttribute (line 120) | public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClass...
    method visitModulePackagesAttribute (line 126) | public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAt...
    method visitDeprecatedAttribute (line 132) | public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute ...
    method visitSyntheticAttribute (line 138) | public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute sy...
    method visitSignatureAttribute (line 144) | public void visitSignatureAttribute(Clazz clazz, SignatureAttribute sy...
    method visitDeprecatedAttribute (line 150) | public void visitDeprecatedAttribute(Clazz clazz, Field field, Depreca...
    method visitSyntheticAttribute (line 156) | public void visitSyntheticAttribute(Clazz clazz, Field field, Syntheti...
    method visitSignatureAttribute (line 162) | public void visitSignatureAttribute(Clazz clazz, Field field, Signatur...
    method visitDeprecatedAttribute (line 168) | public void visitDeprecatedAttribute(Clazz clazz, Method method, Depre...
    method visitSyntheticAttribute (line 174) | public void visitSyntheticAttribute(Clazz clazz, Method method, Synthe...
    method visitSignatureAttribute (line 180) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
    method visitConstantValueAttribute (line 186) | public void visitConstantValueAttribute(Clazz clazz, Field field, Cons...
    method visitMethodParametersAttribute (line 192) | public void visitMethodParametersAttribute(Clazz clazz, Method method,...
    method visitExceptionsAttribute (line 198) | public void visitExceptionsAttribute(Clazz clazz, Method method, Excep...
    method visitStackMapAttribute (line 204) | public void visitStackMapAttribute(Clazz clazz, Method method, CodeAtt...
    method visitStackMapTableAttribute (line 210) | public void visitStackMapTableAttribute(Clazz clazz, Method method, Co...
    method visitLineNumberTableAttribute (line 216) | public void visitLineNumberTableAttribute(Clazz clazz, Method method, ...
    method visitLocalVariableTableAttribute (line 222) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
    method visitLocalVariableTypeTableAttribute (line 228) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
    method visitRuntimeVisibleAnnotationsAttribute (line 234) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Runti...
    method visitRuntimeInvisibleAnnotationsAttribute (line 240) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Run...
    method visitRuntimeVisibleAnnotationsAttribute (line 246) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field...
    method visitRuntimeInvisibleAnnotationsAttribute (line 252) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Fie...
    method visitRuntimeVisibleAnnotationsAttribute (line 258) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Metho...
    method visitRuntimeInvisibleAnnotationsAttribute (line 264) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Met...
    method visitRuntimeVisibleParameterAnnotationsAttribute (line 270) | public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz cla...
    method visitRuntimeInvisibleParameterAnnotationsAttribute (line 276) | public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz c...
    method visitRuntimeVisibleTypeAnnotationsAttribute (line 282) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, R...
    method visitRuntimeVisibleTypeAnnotationsAttribute (line 288) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, F...
    method visitRuntimeVisibleTypeAnnotationsAttribute (line 294) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, M...
    method visitRuntimeVisibleTypeAnnotationsAttribute (line 300) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, M...
    method visitRuntimeInvisibleTypeAnnotationsAttribute (line 306) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
    method visitRuntimeInvisibleTypeAnnotationsAttribute (line 312) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
    method visitRuntimeInvisibleTypeAnnotationsAttribute (line 318) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
    method visitRuntimeInvisibleTypeAnnotationsAttribute (line 324) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
    method visitAnnotationDefaultAttribute (line 330) | public void visitAnnotationDefaultAttribute(Clazz clazz, Method method...
    method visitCodeAttribute (line 336) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method codeHasChanged (line 357) | private boolean codeHasChanged(CodeAttribute codeAttribute, byte[] old...
    method printChangedCode (line 376) | private void printChangedCode(Clazz         clazz,

FILE: base/src/main/java/proguard/optimize/ConstantMemberFilter.java
  class ConstantMemberFilter (line 36) | public class ConstantMemberFilter
    method ConstantMemberFilter (line 47) | public ConstantMemberFilter(MemberVisitor constantMemberVisitor)
    method visitProgramField (line 55) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 66) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/ConstantParameterFilter.java
  class ConstantParameterFilter (line 37) | public class ConstantParameterFilter
    method ConstantParameterFilter (line 48) | public ConstantParameterFilter(MemberVisitor constantParameterVisitor)
    method visitProgramMethod (line 56) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/DuplicateInitializerFixer.java
  class DuplicateInitializerFixer (line 39) | public class DuplicateInitializerFixer
    method DuplicateInitializerFixer (line 61) | public DuplicateInitializerFixer()
    method DuplicateInitializerFixer (line 72) | public DuplicateInitializerFixer(MemberVisitor extraFixedInitializerVi...
    method visitProgramMethod (line 80) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitAnyAttribute (line 182) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 185) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitSignatureAttribute (line 199) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
    method visitAnyParameterAnnotationsAttribute (line 216) | public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method ...

FILE: base/src/main/java/proguard/optimize/DuplicateInitializerInvocationFixer.java
  class DuplicateInitializerInvocationFixer (line 40) | public class DuplicateInitializerInvocationFixer
    method DuplicateInitializerInvocationFixer (line 59) | public DuplicateInitializerInvocationFixer()
    method DuplicateInitializerInvocationFixer (line 70) | public DuplicateInitializerInvocationFixer(InstructionVisitor extraAdd...
    method visitAnyAttribute (line 78) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 81) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitAnyInstruction (line 98) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttrib...
    method visitConstantInstruction (line 101) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
    method visitAnyMethodrefConstant (line 137) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConstan...
    method visitLibraryMethod (line 151) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitProgramMethod (line 154) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/InfluenceFixpointVisitor.java
  class InfluenceFixpointVisitor (line 38) | public class InfluenceFixpointVisitor
    method InfluenceFixpointVisitor (line 77) | public InfluenceFixpointVisitor(MemberVisitorFactory memberVisitorFact...
    method visitClassPool (line 85) | @Override
    type MemberVisitorFactory (line 123) | public interface MemberVisitorFactory
      method createMemberVisitor (line 129) | MemberVisitor createMemberVisitor(MemberVisitor influencedMethodColl...
    class MyThreadFactory (line 136) | private class MyThreadFactory
      method newThread (line 141) | @Override
    class MyAnalysisThread (line 152) | private class MyAnalysisThread
      method MyAnalysisThread (line 162) | public MyAnalysisThread(Runnable runnable)
    class MyAnalysisSubmitter (line 172) | private class MyAnalysisSubmitter
      method visitAnyMember (line 177) | @Override
    class MyAnalysis (line 199) | private class MyAnalysis
      method MyAnalysis (line 206) | private MyAnalysis(Clazz clazz, Member member)
      method run (line 215) | @Override
      method equals (line 239) | @Override
      method hashCode (line 249) | @Override
    class CountLatch (line 262) | private static class CountLatch
      method increment (line 270) | public synchronized void increment()
      method decrement (line 279) | public synchronized void decrement()
      method await (line 294) | public synchronized void await()

FILE: base/src/main/java/proguard/optimize/KeepMarker.java
  class KeepMarker (line 38) | public class KeepMarker
    method visitAnyClass (line 45) | @Override
    method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 60) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 66) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 72) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitAnyAttribute (line 80) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 83) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method isKept (line 91) | public static boolean isKept(Clazz clazz)
    method isKept (line 100) | public static boolean isKept(Field field)
    method isKept (line 109) | public static boolean isKept(Method method)
    method isKept (line 118) | public static boolean isKept(CodeAttribute codeAttribute)

FILE: base/src/main/java/proguard/optimize/KeptClassFilter.java
  class KeptClassFilter (line 34) | public class KeptClassFilter
    method KeptClassFilter (line 47) | public KeptClassFilter(ClassVisitor acceptedVisitor)
    method KeptClassFilter (line 60) | public KeptClassFilter(ClassVisitor acceptedVisitor,
    method visitAnyClass (line 70) | @Override
    method selectVisitor (line 83) | private ClassVisitor selectVisitor(Clazz clazz)

FILE: base/src/main/java/proguard/optimize/KeptMemberFilter.java
  class KeptMemberFilter (line 34) | public class KeptMemberFilter
    method KeptMemberFilter (line 45) | public KeptMemberFilter(MemberVisitor memberVisitor)
    method visitProgramField (line 53) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 62) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitLibraryField (line 71) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 80) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...

FILE: base/src/main/java/proguard/optimize/LineNumberTrimmer.java
  class LineNumberTrimmer (line 20) | public class LineNumberTrimmer
    method execute (line 23) | @Override

FILE: base/src/main/java/proguard/optimize/MemberDescriptorSpecializer.java
  class MemberDescriptorSpecializer (line 53) | public class MemberDescriptorSpecializer
    method MemberDescriptorSpecializer (line 75) | public MemberDescriptorSpecializer(boolean specializeFieldTypes,
    method MemberDescriptorSpecializer (line 106) | public MemberDescriptorSpecializer(boolean       specializeFieldTypes,
    method visitProgramField (line 124) | @Override
    method visitProgramMethod (line 170) | @Override
    method valueType (line 314) | private String valueType(String type, Value value)
    method updateDescriptor (line 338) | private void updateDescriptor(ProgramClass  programClass,
    method newUniqueMemberName (line 362) | private String newUniqueMemberName(String name, String descriptor)

FILE: base/src/main/java/proguard/optimize/MemberReferenceGeneralizer.java
  class MemberReferenceGeneralizer (line 46) | public class MemberReferenceGeneralizer
    method MemberReferenceGeneralizer (line 77) | public MemberReferenceGeneralizer(boolean             fieldGeneralizat...
    method MemberReferenceGeneralizer (line 106) | public MemberReferenceGeneralizer(boolean             fieldGeneralizat...
    method visitAnyInstruction (line 122) | @Override
    method visitConstantInstruction (line 126) | @Override
    method visitAnyRefConstant (line 188) | @Override
    method visitClassConstant (line 264) | @Override
    method visitAnyClass (line 274) | @Override

FILE: base/src/main/java/proguard/optimize/MethodDescriptorShrinker.java
  class MethodDescriptorShrinker (line 55) | public class MethodDescriptorShrinker
    method MethodDescriptorShrinker (line 68) | public MethodDescriptorShrinker()
    method MethodDescriptorShrinker (line 79) | public MethodDescriptorShrinker(MemberVisitor extraMemberVisitor)
    method visitProgramMethod (line 87) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitAnyAttribute (line 148) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitSignatureAttribute (line 151) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
    method visitAnyParameterAnnotationsAttribute (line 187) | public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method ...
    method shrinkDescriptor (line 258) | private String shrinkDescriptor(Method method,
    method shrinkReferencedClasses (line 304) | private Clazz[] shrinkReferencedClasses(Method  method,

FILE: base/src/main/java/proguard/optimize/MethodStaticizer.java
  class MethodStaticizer (line 38) | public class MethodStaticizer
    method MethodStaticizer (line 47) | public MethodStaticizer()
    method MethodStaticizer (line 58) | public MethodStaticizer(MemberVisitor extraStaticMemberVisitor)
    method visitProgramMethod (line 66) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/OptimizationInfoClassFilter.java
  class OptimizationInfoClassFilter (line 36) | public class OptimizationInfoClassFilter
    method OptimizationInfoClassFilter (line 47) | public OptimizationInfoClassFilter(ClassVisitor classVisitor)
    method visitAnyClass (line 56) | @Override
    method visitProgramClass (line 63) | @Override
    method visitLibraryClass (line 74) | @Override

FILE: base/src/main/java/proguard/optimize/OptimizationInfoMemberFilter.java
  class OptimizationInfoMemberFilter (line 38) | public class OptimizationInfoMemberFilter
    method OptimizationInfoMemberFilter (line 50) | public OptimizationInfoMemberFilter(MemberVisitor memberVisitor)
    method OptimizationInfoMemberFilter (line 65) | public OptimizationInfoMemberFilter(MemberVisitor memberVisitor,
    method visitLibraryField (line 75) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
    method visitLibraryMethod (line 76) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitProgramField (line 78) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 91) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...

FILE: base/src/main/java/proguard/optimize/Optimizer.java
  class Optimizer (line 204) | public class Optimizer implements Pass
    method Optimizer (line 339) | public Optimizer(Configuration configuration)
    method execute (line 345) | @Override
    method optimize (line 446) | private void optimize(Configuration         configuration,
    method createPeepholeOptimizations (line 1771) | private List<InstructionVisitor> createPeepholeOptimizations(Configura...
    method disabled (line 1913) | private String disabled(boolean flag)
    method disabled (line 1923) | private String disabled(boolean flag1, boolean flag2)

FILE: base/src/main/java/proguard/optimize/ParameterShrinker.java
  class ParameterShrinker (line 42) | public class ParameterShrinker
    method ParameterShrinker (line 55) | public ParameterShrinker()
    method ParameterShrinker (line 66) | public ParameterShrinker(MemberVisitor extraUnusedParameterMethodVisitor)
    method visitAnyAttribute (line 74) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 77) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...

FILE: base/src/main/java/proguard/optimize/ReverseDependencyCalculator.java
  class ReverseDependencyCalculator (line 40) | public class ReverseDependencyCalculator
    method ReverseDependencyCalculator (line 47) | public ReverseDependencyCalculator(ClassPool classPool)
    method reverseDependencyStore (line 57) | public ReverseDependencyStore reverseDependencyStore()
    method isCalledBy (line 76) | private MultiValueMap<Method, ClassMemberPair> isCalledBy()
    method methodsByProgramMethodOptimizationInfo (line 91) | private MultiValueMap<ProgramMethodOptimizationInfo, Method> methodsBy...
    class FillMethodsByProgramMethodOptimizationInfo (line 103) | private static class FillMethodsByProgramMethodOptimizationInfo
      method FillMethodsByProgramMethodOptimizationInfo (line 109) | public FillMethodsByProgramMethodOptimizationInfo(MultiValueMap<Prog...
      method visitProgramField (line 115) | @Override
      method visitProgramMethod (line 119) | @Override
      method visitLibraryField (line 131) | @Override
      method visitLibraryMethod (line 135) | @Override
    class AddDependencies (line 142) | private static class AddDependencies
      method AddDependencies (line 148) | AddDependencies(MultiValueMap<Method, ClassMemberPair> isCalledBy)
      method visitAnyMember (line 154) | @Override
      class Adder (line 167) | private class Adder
        method Adder (line 173) | Adder(ClassMemberPair source)
        method visitAnyMember (line 179) | @Override
        method visitProgramMethod (line 183) | @Override

FILE: base/src/main/java/proguard/optimize/ReverseDependencyStore.java
  class ReverseDependencyStore (line 32) | public class ReverseDependencyStore
    method ReverseDependencyStore (line 44) | public ReverseDependencyStore(MultiValueMap<Method, ClassMemberPair>  ...
    class InfluencedMethodTraveller (line 62) | public class InfluencedMethodTraveller
      method InfluencedMethodTraveller (line 68) | public InfluencedMethodTraveller(MemberVisitor memberVisitor) {this....
      method visitProgramMethod (line 71) | @Override

FILE: base/src/main/java/proguard/optimize/SideEffectVisitorMarkerFactory.java
  class SideEffectVisitorMarkerFactory (line 34) | class SideEffectVisitorMarkerFactory
    method SideEffectVisitorMarkerFactory (line 43) | public SideEffectVisitorMarkerFactory(boolean optimizeConservatively)
    method createMemberVisitor (line 50) | public MemberVisitor createMemberVisitor(MemberVisitor influencedMetho...

FILE: base/src/main/java/proguard/optimize/TailRecursionSimplifier.java
  class TailRecursionSimplifier (line 41) | public class TailRecursionSimplifier
    method TailRecursionSimplifier (line 65) | public TailRecursionSimplifier()
    method TailRecursionSimplifier (line 76) | public TailRecursionSimplifier(InstructionVisitor extraTailRecursionVi...
    method visitAnyAttribute (line 84) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 87) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitAnyInstruction (line 135) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttrib...
    method visitConstantInstruction (line 142) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
    method visitExceptionInfo (line 230) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribu...
    class MyRecursionChecker (line 243) | private class MyRecursionChecker
      method isRecursive (line 254) | public boolean isRecursive()
      method visitAnyMethodrefConstant (line 261) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConst...
      method visitExceptionInfo (line 269) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttri...
    method storeParameters (line 282) | private void storeParameters(Clazz clazz, Method method)

FILE: base/src/main/java/proguard/optimize/TimedClassPoolVisitor.java
  class TimedClassPoolVisitor (line 32) | public class TimedClassPoolVisitor
    method TimedClassPoolVisitor (line 40) | public TimedClassPoolVisitor(String message, ClassVisitor classVisitor)
    method TimedClassPoolVisitor (line 45) | public TimedClassPoolVisitor(String message, ClassPoolVisitor classPoo...
    method visitClassPool (line 54) | public void visitClassPool(ClassPool classPool)
    method getPadding (line 67) | private String getPadding(int pos, int size)

FILE: base/src/main/java/proguard/optimize/WriteOnlyFieldFilter.java
  class WriteOnlyFieldFilter (line 35) | public class WriteOnlyFieldFilter
    method WriteOnlyFieldFilter (line 46) | public WriteOnlyFieldFilter(MemberVisitor writeOnlyFieldVisitor)
    method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...

FILE: base/src/main/java/proguard/optimize/evaluation/EvaluationShrinker.java
  class EvaluationShrinker (line 48) | public class EvaluationShrinker
    method EvaluationShrinker (line 115) | public EvaluationShrinker()
    method EvaluationShrinker (line 136) | public EvaluationShrinker(PartialEvaluator   partialEvaluator,
    method EvaluationShrinker (line 162) | public EvaluationShrinker(InstructionUsageMarker instructionUsageMarker,
    method visitAnyAttribute (line 176) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 179) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitCodeAttribute0 (line 215) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
    class MyStaticInvocationFixer (line 330) | private class MyStaticInvocationFixer
      method visitAnyInstruction (line 341) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitConstantInstruction (line 344) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
      method visitAnyRefConstant (line 361) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
      method visitAnyMember (line 369) | public void visitAnyMember(Clazz clazz, Member member) {}
      method visitProgramMethod (line 372) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
    class MyBackwardBranchFixer (line 390) | private class MyBackwardBranchFixer
      method visitAnyInstruction (line 395) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method isAllSmallerThanOrEqual (line 415) | private boolean isAllSmallerThanOrEqual(InstructionOffsetValue instr...
      method lastNecessaryInstructionOffset (line 445) | private int lastNecessaryInstructionOffset(int instructionOffset)
    class MyNonReturningSubroutineFixer (line 464) | private class MyNonReturningSubroutineFixer
      method visitAnyInstruction (line 469) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitBranchInstruction (line 472) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
    class MyStackConsistencyFixer (line 497) | private class MyStackConsistencyFixer
      method visitAnyInstruction (line 502) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitSimpleInstruction (line 678) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
      method visitBranchInstruction (line 700) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
      method visitAnySwitchInstruction (line 723) | public void visitAnySwitchInstruction(Clazz clazz, Method method, Co...
      method isDupOrSwap (line 750) | private boolean isDupOrSwap(Instruction instruction)
      method fixDupSwap (line 770) | private int fixDupSwap(int  instructionOffset,
      method fixedDup (line 789) | private int fixedDup(int instructionOffset, int topBefore, int topAf...
      method fixedDup_x1 (line 808) | private int fixedDup_x1(int instructionOffset, int topBefore, int to...
      method fixedDup_x2 (line 847) | private int fixedDup_x2(int instructionOffset, int topBefore, int to...
      method fixedDup2 (line 939) | private int fixedDup2(int instructionOffset, int topBefore, int topA...
      method fixedDup2_x1 (line 996) | private int fixedDup2_x1(int instructionOffset, int topBefore, int t...
      method fixedDup2_x2 (line 1137) | private int fixedDup2_x2(int instructionOffset, int topBefore, int t...
      method fixedSwap (line 1232) | private int fixedSwap(int instructionOffset, int topBefore, int topA...
      method complexPop (line 1259) | private int complexPop(int popMask)
    class MyInstructionDeleter (line 1278) | private class MyInstructionDeleter
      method visitAnyInstruction (line 1283) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
    method visitExceptionInfo (line 1303) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribu...
    method isAnyUnnecessaryInstructionBranchingOver (line 1320) | private boolean isAnyUnnecessaryInstructionBranchingOver(int instructi...
    method isAnyLargerThan (line 1343) | private boolean isAnyLargerThan(InstructionOffsetValue instructionOffs...
    method insertPushInstructions (line 1371) | private void insertPushInstructions(int     offset,
    method pushOpcode (line 1395) | private byte pushOpcode(int computationalType)
    method insertPopInstructions (line 1415) | private void insertPopInstructions(int     offset,
    method insertInstruction (line 1479) | private void insertInstruction(int         offset,
    method insertInstructions (line 1516) | private void insertInstructions(int           offset,
    method replaceByStaticInvocation (line 1564) | private void replaceByStaticInvocation(Clazz               clazz,
    method replaceByInfiniteLoop (line 1584) | private void replaceByInfiniteLoop(Clazz clazz,
    method replaceBySimpleInstructions (line 1604) | private void replaceBySimpleInstructions(int         offset,
    method simpleInstructions (line 1668) | private Instruction[] simpleInstructions(int opcodes)

FILE: base/src/main/java/proguard/optimize/evaluation/EvaluationSimplifier.java
  class EvaluationSimplifier (line 47) | public class EvaluationSimplifier
    method EvaluationSimplifier (line 70) | public EvaluationSimplifier(boolean predictNullPointerExceptions)
    method EvaluationSimplifier (line 86) | public EvaluationSimplifier(PartialEvaluator partialEvaluator,
    method visitAnyAttribute (line 100) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 103) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitCodeAttribute0 (line 137) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
    method visitSimpleInstruction (line 168) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeAtt...
    method visitVariableInstruction (line 437) | public void visitVariableInstruction(Clazz clazz, Method method, CodeA...
    method visitConstantInstruction (line 498) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
    method visitBranchInstruction (line 542) | public void visitBranchInstruction(Clazz clazz, Method method, CodeAtt...
    method visitTableSwitchInstruction (line 563) | public void visitTableSwitchInstruction(Clazz clazz, Method method, Co...
    method visitLookUpSwitchInstruction (line 587) | public void visitLookUpSwitchInstruction(Clazz clazz, Method method, C...
    method replaceAnyPushInstruction (line 617) | private void replaceAnyPushInstruction(Clazz       clazz,
    method replaceIntegerPushInstruction (line 650) | private void replaceIntegerPushInstruction(Clazz       clazz,
    method replaceIntegerPushInstruction (line 665) | private void replaceIntegerPushInstruction(Clazz       clazz,
    method replaceLongPushInstruction (line 719) | private void replaceLongPushInstruction(Clazz       clazz,
    method replaceLongPushInstruction (line 734) | private void replaceLongPushInstruction(Clazz       clazz,
    method replaceFloatPushInstruction (line 791) | private void replaceFloatPushInstruction(Clazz       clazz,
    method replaceFloatPushInstruction (line 806) | private void replaceFloatPushInstruction(Clazz       clazz,
    method replaceDoublePushInstruction (line 862) | private void replaceDoublePushInstruction(Clazz       clazz,
    method replaceDoublePushInstruction (line 877) | private void replaceDoublePushInstruction(Clazz       clazz,
    method replaceReferencePushInstruction (line 935) | private void replaceReferencePushInstruction(Clazz       clazz,
    method replaceConstantPushInstruction (line 956) | private void replaceConstantPushInstruction(Clazz       clazz,
    method replaceVariablePushInstruction (line 973) | private void replaceVariablePushInstruction(Clazz       clazz,
    method replaceJsrInstruction (line 991) | private void replaceJsrInstruction(Clazz             clazz,
    method deleteReferencePopInstruction (line 1018) | private void deleteReferencePopInstruction(Clazz       clazz,
    method replaceBranchInstruction (line 1038) | private void replaceBranchInstruction(Clazz       clazz,
    method replaceSimpleEnumSwitchInstruction (line 1071) | private void replaceSimpleEnumSwitchInstruction(Clazz                 ...
    method replaceSimpleEnumSwitchInstruction (line 1110) | private void replaceSimpleEnumSwitchInstruction(Clazz                 ...
    method replaceSimpleEnumSwitchInstruction (line 1157) | private void replaceSimpleEnumSwitchInstruction(Clazz                 ...
    method replaceSimpleEnumSwitchInstruction (line 1196) | private void replaceSimpleEnumSwitchInstruction(Clazz                 ...
    method cleanUpSwitchInstruction (line 1245) | private void cleanUpSwitchInstruction(Clazz             clazz,
    method trimSwitchInstruction (line 1293) | private void trimSwitchInstruction(Clazz                  clazz,
    method trimSwitchInstruction (line 1353) | private void trimSwitchInstruction(Clazz                   clazz,
    method isDivisionByZero (line 1417) | private boolean isDivisionByZero(int offset, int computationType)
    method isNullReference (line 1452) | private boolean isNullReference(int offset, int popStackEntryIndex)
    method replaceByException (line 1466) | private void replaceByException(Clazz       clazz,
    method replaceByInfiniteLoop (line 1506) | private void replaceByInfiniteLoop(Clazz       clazz,
    method replaceInstruction (line 1535) | private void replaceInstruction(Clazz       clazz,
    method insertPopInstructions (line 1569) | private void insertPopInstructions(int offset, int popCount)
    method replaceSimpleEnumSwitchInstruction (line 1631) | private void replaceSimpleEnumSwitchInstruction(Clazz             clazz,

FILE: base/src/main/java/proguard/optimize/evaluation/InstructionUsageMarker.java
  class InstructionUsageMarker (line 59) | public class InstructionUsageMarker
    method InstructionUsageMarker (line 92) | public InstructionUsageMarker(boolean markExternalSideEffects)
    method InstructionUsageMarker (line 104) | public InstructionUsageMarker(PartialEvaluator partialEvaluator,
    method InstructionUsageMarker (line 122) | public InstructionUsageMarker(PartialEvaluator partialEvaluator,
    method isTraced (line 147) | public boolean isTraced(int instructionOffset)
    method tracedInstructionFilter (line 157) | public InstructionVisitor tracedInstructionFilter(InstructionVisitor i...
    method tracedInstructionFilter (line 167) | public InstructionVisitor tracedInstructionFilter(boolean            t...
    method isInstructionNecessary (line 178) | public boolean isInstructionNecessary(int instructionOffset)
    method isExtraPushPopInstructionNecessary (line 188) | public boolean isExtraPushPopInstructionNecessary(int instructionOffset)
    method necessaryInstructionFilter (line 198) | public InstructionVisitor necessaryInstructionFilter(InstructionVisito...
    method necessaryInstructionFilter (line 208) | public InstructionVisitor necessaryInstructionFilter(boolean          ...
    method getStackBefore (line 219) | public TracedStack getStackBefore(int instructionOffset)
    method getStackAfter (line 229) | public TracedStack getStackAfter(int instructionOffset)
    method isStackEntryUnwantedBefore (line 240) | public boolean isStackEntryUnwantedBefore(int instructionOffset,
    method isStackEntriesPresentBefore (line 251) | public boolean isStackEntriesPresentBefore(int instructionOffset,
    method isStackEntryPresentBefore (line 274) | public boolean isStackEntryPresentBefore(int instructionOffset,
    method isStackEntriesNecessaryAfter (line 291) | public boolean isStackEntriesNecessaryAfter(int instructionOffset,
    method isAnyStackEntryNecessaryAfter (line 314) | public boolean isAnyStackEntryNecessaryAfter(InstructionOffsetValue in...
    method isStackEntryNecessaryAfter (line 339) | public boolean isStackEntryNecessaryAfter(int instructionOffset,
    method branchTargets (line 352) | public InstructionOffsetValue branchTargets(int instructionOffset)
    method visitAnyAttribute (line 360) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 363) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitCodeAttribute0 (line 394) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
    class MyParameterUsageMarker (line 577) | private class MyParameterUsageMarker
      method visitAnyInstruction (line 588) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitConstantInstruction (line 591) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
      method visitAnyRefConstant (line 632) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
      method visitAnyMember (line 640) | public void visitAnyMember(Clazz clazz, Member member) {}
      method visitProgramMethod (line 643) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
    class MyInitialUsageMarker (line 657) | private class MyInitialUsageMarker
      method visitAnyInstruction (line 671) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitSimpleInstruction (line 684) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
      method visitConstantInstruction (line 709) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
      method visitBranchInstruction (line 762) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
      method visitAnyConstant (line 779) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
      method visitStringConstant (line 782) | public void visitStringConstant(Clazz clazz, StringConstant stringCo...
      method visitClassConstant (line 798) | public void visitClassConstant(Clazz clazz, ClassConstant classConst...
      method visitFieldrefConstant (line 814) | public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fiel...
      method visitAnyMethodrefConstant (line 820) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConst...
      method visitParameter (line 875) | public void visitParameter(Clazz clazz, Member member, int parameter...
      method createReverseDependencies (line 900) | private void createReverseDependencies(Clazz       clazz,
      method createReverseDependencies (line 914) | private void createReverseDependencies(int offset,
      method createReverseDependencies (line 950) | private void createReverseDependencies(int                    offset,
    class MyProducerMarker (line 995) | private class MyProducerMarker
      method visitAnyInstruction (line 1000) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitSimpleInstruction (line 1006) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
      method visitVariableInstruction (line 1057) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
      method visitConstantInstruction (line 1071) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
      method visitBranchInstruction (line 1077) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
    class MyVariableInitializationMarker (line 1099) | private class MyVariableInitializationMarker
      method visitAnyInstruction (line 1104) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
      method visitVariableInstruction (line 1107) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
    class MyStackConsistencyMarker (line 1125) | private class MyStackConsistencyMarker
      method visitAnyInstruction (line 1130) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
    class MyExtraPushPopInstructionMarker (line 1156) | private class MyExtraPushPopInstructionMarker
      method visitAnyInstruction (line 1161) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
    method markVariableProducers (line 1201) | private void markVariableProducers(int consumerOffset,
    method markVariableInitializersBefore (line 1236) | private InstructionOffsetValue markVariableInitializersBefore(int     ...
    method markVariableInitializersAfter (line 1286) | private InstructionOffsetValue markVariableInitializersAfter(int      ...
    method markStackProducers (line 1324) | private void markStackProducers(Clazz       clazz,
    method conditionallyMarkStackEntryProducers (line 1352) | private void conditionallyMarkStackEntryProducers(int consumerOffset,
    method markStackEntryProducers (line 1376) | private void markStackEntryProducers(int     consumerOffset,
    method markStackEntryProducers (line 1398) | private void markStackEntryProducers(InstructionOffsetValue producerOf...
    method markReverseDependencies (line 1438) | private void markReverseDependencies(int instructionOffset)
    method markStraddlingBranches (line 1460) | private void markStraddlingBranches(int                    instruction...
    method markStraddlingBranch (line 1493) | private void markStraddlingBranch(int instructionOffsetStart,
    method initializeNecessary (line 1512) | private void initializeNecessary(CodeAttribute codeAttribute)
    method isVariableInitialization (line 1564) | private boolean isVariableInitialization(int instructionOffset,
    method markStackEntryAfter (line 1602) | private void markStackEntryAfter(int instructionOffset,
    method markStackEntryUnwantedBefore (line 1626) | private void markStackEntryUnwantedBefore(int instructionOffset,
    method markInstructions (line 1637) | private void markInstructions(InstructionOffsetValue instructionOffsets)
    method markInstruction (line 1652) | private void markInstruction(int instructionOffset)
    method markExtraPushPopInstruction (line 1673) | private void markExtraPushPopInstruction(int instructionOffset)
    method isAnyInstructionNecessary (line 1699) | private boolean isAnyInstructionNecessary(int startInstructionOffset,
    class MyNecessaryInstructionFilter (line 1722) | private class MyNecessaryInstructionFilter implements InstructionVisitor
      method MyNecessaryInstructionFilter (line 1728) | public MyNecessaryInstructionFilter(boolean            necessary,
      method visitSimpleInstruction (line 1738) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
      method visitVariableInstruction (line 1747) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
      method visitConstantInstruction (line 1756) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
      method visitBranchInstruction (line 1765) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
      method visitTableSwitchInstruction (line 1774) | public void visitTableSwitchInstruction(Clazz clazz, Method method, ...
      method visitLookUpSwitchInstruction (line 1783) | public void visitLookUpSwitchInstruction(Clazz clazz, Method method,...
      method shouldVisit (line 1798) | private boolean shouldVisit(int offset)

FILE: base/src/main/java/proguard/optimize/evaluation/LoadingInvocationUnit.java
  class LoadingInvocationUnit (line 35) | public class LoadingInvocationUnit
    method LoadingInvocationUnit (line 46) | public LoadingInvocationUnit(ValueFactory valueFactory)
    method LoadingInvocationUnit (line 56) | public LoadingInvocationUnit(ValueFactory valueFactory,
    method getFieldClassValue (line 71) | @Override
    method getFieldValue (line 95) | @Override
    method getMethodParameterValue (line 119) | @Override
    method getMethodReturnValue (line 144) | @Override

FILE: base/src/main/java/proguard/optimize/evaluation/ParameterTracingInvocationUnit.java
  class ParameterTracingInvocationUnit (line 42) | public class ParameterTracingInvocationUnit
    method ParameterTracingInvocationUnit (line 57) | public ParameterTracingInvocationUnit(SimplifiedInvocationUnit invocat...
    method setMethodParameterValue (line 65) | @Override
    method getMethodReturnValue (line 74) | @Override
    method mayReturnType (line 156) | private boolean mayReturnType(Clazz          clazz,

FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumArrayPropagator.java
  class SimpleEnumArrayPropagator (line 38) | public class SimpleEnumArrayPropagator
    method visitAnyClass (line 55) | @Override
    method visitProgramClass (line 59) | @Override
    method visitProgramField (line 77) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 83) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method setMethodReturnValue (line 105) | private static void setMethodReturnValue(Method method, Value value)

FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumClassChecker.java
  class SimpleEnumClassChecker (line 49) | public class SimpleEnumClassChecker
    method visitAnyClass (line 65) | @Override
    method visitProgramClass (line 69) | @Override
    class MemberCollectionFilter (line 99) | private static class MemberCollectionFilter
      method MemberCollectionFilter (line 114) | public MemberCollectionFilter(Set<Member>   members,
      method MemberCollectionFilter (line 129) | public MemberCollectionFilter(Set<Member>   members,
      method visitAnyMember (line 141) | public void visitAnyMember(Clazz clazz, Member member)
      method delegateVisitor (line 153) | private MemberVisitor delegateVisitor(Member member)

FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumClassSimplifier.java
  class SimpleEnumClassSimplifier (line 41) | public class SimpleEnumClassSimplifier
    method visitAnyClass (line 152) | @Override
    method visitProgramClass (line 156) | @Override
    method visitAnyAttribute (line 181) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 184) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...

FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumDescriptorSimplifier.java
  class SimpleEnumDescriptorSimplifier (line 45) | public class SimpleEnumDescriptorSimplifier
    method visitAnyClass (line 60) | @Override
    method visitProgramClass (line 64) | @Override
    method visitAnyConstant (line 83) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitStringConstant (line 86) | public void visitStringConstant(Clazz clazz, StringConstant stringCons...
    method visitInvokeDynamicConstant (line 112) | public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConst...
    method visitClassConstant (line 135) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
    method visitMethodTypeConstant (line 161) | public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant me...
    method visitProgramField (line 186) | public void visitProgramField(ProgramClass programClass, ProgramField ...
    method visitProgramMethod (line 234) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitAnyAttribute (line 292) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitCodeAttribute (line 295) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitLocalVariableTableAttribute (line 302) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
    method visitLocalVariableTypeTableAttribute (line 309) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
    method visitSignatureAttribute (line 316) | public void visitSignatureAttribute(Clazz clazz, SignatureAttribute si...
    method visitLocalVariableInfo (line 338) | public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAtt...
    method visitLocalVariableTypeInfo (line 358) | public void visitLocalVariableTypeInfo(Clazz clazz, Method method, Cod...
    method simplifyDescriptor (line 387) | private String simplifyDescriptor(String descriptor,
    method simplifyDescriptor (line 399) | private String simplifyDescriptor(String  descriptor,
    method simplifyReferencedClasses (line 601) | private Clazz[] simplifyReferencedClasses(String  descriptor,
    method isSimpleEnum (line 790) | private boolean isSimpleEnum(Clazz clazz)

FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumUseChecker.java
  class SimpleEnumUseChecker (line 46) | public class SimpleEnumUseChecker
    method SimpleEnumUseChecker (line 72) | public SimpleEnumUseChecker()
    method SimpleEnumUseChecker (line 83) | public SimpleEnumUseChecker(PartialEvaluator partialEvaluator)
    method visitAnyClass (line 91) | @Override
    method visitProgramClass (line 95) | @Override
    method visitAnyAttribute (line 116) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
    method visitBootstrapMethodsAttribute (line 119) | public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMetho...
    method visitCodeAttribute (line 126) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
    method visitBootstrapMethodInfo (line 157) | public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo ...
    method visitAnyConstant (line 169) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
    method visitStringConstant (line 172) | public void visitStringConstant(Clazz clazz, StringConstant stringCons...
    method visitMethodHandleConstant (line 179) | public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstan...
    method visitMethodTypeConstant (line 187) | public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant me...
    method visitAnyRefConstant (line 194) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
    method visitClassConstant (line 201) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
    method visitSimpleInstruction (line 210) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeAtt...
    method visitVariableInstruction (line 275) | public void visitVariableInstruction(Clazz clazz, Method method, CodeA...
    method visitConstantInstruction (line 280) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
    method visitBranchInstruction (line 390) | public void visitBranchInstruction(Clazz clazz, Method method, CodeAtt...
    method visitAnySwitchInstruction (line 432) | public void visitAnySwitchInstruction(Clazz clazz, Method method, Code...
    method visitLibraryMethod (line 439) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
    method visitProgramMethod (line 442) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
    method visitParameter (line 461) | public void visitParameter(Clazz clazz, Member member, int parameterIn...
    method isSupportedMethod (line 491) | private boolean isSupportedMethod(String name, String type)
    method isUnsupportedMethod (line 504) | private boolean isUnsupportedMethod(String name, String type)
    method isMethodSki
Condensed preview — 690 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,931K chars).
[
  {
    "path": ".editorconfig",
    "chars": 59,
    "preview": "root = true\n\n[*.java]\nindent_style = space\nindent_size = 4\n"
  },
  {
    "path": ".gitattributes",
    "chars": 32,
    "preview": "gradlew -text\ngradlew.bat -text\n"
  },
  {
    "path": ".github/scripts/s3-deploy.py",
    "chars": 5153,
    "preview": "#!/usr/bin/env python3\nimport sys\nimport os\nimport logging\nimport pathlib\nfrom mako.template import Template\nfrom enum i"
  },
  {
    "path": ".github/workflows/continuous_integration.yml",
    "chars": 881,
    "preview": "name: Continuous Integration\non:\n  pull_request:\n    branches:\n      - skip\n      - skip\n  push:\n    branches:\n      - s"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 1119,
    "preview": "name: 'dProtect Main'\non: [push, workflow_dispatch]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: "
  },
  {
    "path": ".gitignore",
    "chars": 68,
    "preview": ".gradle\n.hg/**\n.hgtags\n.idea\nbuild\nlocal.properties\n/lib/\ndocs/html\n"
  },
  {
    "path": ".hgignore",
    "chars": 20,
    "preview": "syntax: glob\n.git/*\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 10182,
    "preview": "# Contributing to ProGuard\n\nThank you for contributing!\n\n- You can report issues on our [issue tracker](issues) on GitHu"
  },
  {
    "path": "LICENSE",
    "chars": 18092,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
  },
  {
    "path": "README.md",
    "chars": 2821,
    "preview": "<p align=\"center\">\n  <br />\n  <br />\n  <a href=\"https://obfuscator.re/dprotect\">\n    <img src=\".github/img/banner.webp\" "
  },
  {
    "path": "annotations/annotations.pro",
    "chars": 3714,
    "preview": "#\n# This ProGuard configuration file specifies how annotations can be used\n# to configure the processing of other code.\n"
  },
  {
    "path": "annotations/build.gradle",
    "chars": 555,
    "preview": "plugins {\n    id 'java'\n    id 'maven-publish'\n}\n\nsourceSets.main {\n    java {\n        srcDirs = ['src']\n    }\n    resou"
  },
  {
    "path": "annotations/src/proguard/annotation/Keep.java",
    "chars": 494,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepApplication.java",
    "chars": 437,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepClassMemberNames.java",
    "chars": 463,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepClassMembers.java",
    "chars": 468,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepGettersSetters.java",
    "chars": 476,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepImplementations.java",
    "chars": 443,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepName.java",
    "chars": 498,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicClassMemberNames.java",
    "chars": 476,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicClassMembers.java",
    "chars": 481,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicGettersSetters.java",
    "chars": 489,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicImplementations.java",
    "chars": 456,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java",
    "chars": 498,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java",
    "chars": 506,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n */\npackage"
  },
  {
    "path": "ant/build.gradle",
    "chars": 1251,
    "preview": "import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\n\nplugins {\n    id 'com.github.johnrengelman.shadow'\n  "
  },
  {
    "path": "ant/src/proguard/ant/ClassPathElement.java",
    "chars": 5814,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/ClassSpecificationElement.java",
    "chars": 8683,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/ConfigurationElement.java",
    "chars": 4249,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/ConfigurationTask.java",
    "chars": 19098,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/FilterElement.java",
    "chars": 2437,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/KeepSpecificationElement.java",
    "chars": 3642,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/MemberSpecificationElement.java",
    "chars": 11962,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/ProGuardTask.java",
    "chars": 10220,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "ant/src/proguard/ant/package.html",
    "chars": 64,
    "preview": "<body>\nThis package contains the Ant task for ProGuard.\n</body>\n"
  },
  {
    "path": "ant/src/proguard/ant/task.properties",
    "chars": 105,
    "preview": "proguard              = proguard.ant.ProGuardTask\nproguardconfiguration = proguard.ant.ConfigurationTask\n"
  },
  {
    "path": "base/build.gradle",
    "chars": 3330,
    "preview": "plugins {\n    id 'java-library'\n    id 'java-test-fixtures'\n    id 'maven-publish'\n    id \"org.jetbrains.kotlin.jvm\" ver"
  },
  {
    "path": "base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java",
    "chars": 1135,
    "preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class ArithmeticObfuscationClassSpecification extends Obfu"
  },
  {
    "path": "base/src/main/java/dprotect/CFObfuscationClassSpecification.java",
    "chars": 838,
    "preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class CFObfuscationClassSpecification extends ObfuscationC"
  },
  {
    "path": "base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java",
    "chars": 1869,
    "preview": "package dprotect;\n\nimport proguard.ClassSpecificationVisitorFactory;\n\nimport proguard.classfile.visitor.*;\n\nimport java."
  },
  {
    "path": "base/src/main/java/dprotect/Configuration.java",
    "chars": 1716,
    "preview": "package dprotect;\n\nimport proguard.ClassSpecification;\n\nimport java.util.*;\n\n\n/**\n * The extended dProtect configuration"
  },
  {
    "path": "base/src/main/java/dprotect/ConfigurationConstants.java",
    "chars": 1052,
    "preview": "package dprotect;\n\npublic class ConfigurationConstants extends proguard.ConfigurationConstants\n{\n    public static final"
  },
  {
    "path": "base/src/main/java/dprotect/ConfigurationParser.java",
    "chars": 28034,
    "preview": "package dprotect;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n\nimport proguard."
  },
  {
    "path": "base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java",
    "chars": 868,
    "preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class ConstantObfuscationClassSpecification extends Obfusc"
  },
  {
    "path": "base/src/main/java/dprotect/DProtect.java",
    "chars": 19039,
    "preview": "package dprotect;\n\nimport dprotect.obfuscation.CodeObfuscator;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.a"
  },
  {
    "path": "base/src/main/java/dprotect/ObfuscationClassSpecification.java",
    "chars": 1183,
    "preview": "package dprotect;\nimport proguard.ClassSpecification;\n\n\npublic class ObfuscationClassSpecification extends ClassSpecific"
  },
  {
    "path": "base/src/main/java/dprotect/deobfuscation/Deobfuscator.java",
    "chars": 3048,
    "preview": "package dprotect.deobfuscation;\n\nimport dprotect.Configuration;\nimport dprotect.obfuscation.arithmetic.*;\nimport dprotec"
  },
  {
    "path": "base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java",
    "chars": 5328,
    "preview": "package dprotect.deobfuscation.strings;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Log"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/CodeObfuscator.java",
    "chars": 12451,
    "preview": "package dprotect.obfuscation;\n\nimport dprotect.Configuration;\nimport dprotect.obfuscation.arithmetic.*;\nimport dprotect."
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/Marker.java",
    "chars": 3796,
    "preview": "package dprotect.obfuscation;\n\nimport dprotect.ClassObfuSpecVisitorFactory;\nimport dprotect.Configuration;\nimport dprote"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationFilter.java",
    "chars": 1509,
    "preview": "package dprotect.obfuscation.arithmetic;\nimport dprotect.obfuscation.info.ObfuscationInfo;\nimport static dprotect.Obfusc"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationInfo.java",
    "chars": 317,
    "preview": "package dprotect.obfuscation.arithmetic;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Arith"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationMarker.java",
    "chars": 1805,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport dprotect.ArithmeticObfuscationClassSpecification;\nimport dprotect.Obfus"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBANormalizer.java",
    "chars": 2427,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAdd.java",
    "chars": 9211,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAnd.java",
    "chars": 4208,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationOr.java",
    "chars": 5494,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationSub.java",
    "chars": 5104,
    "preview": "package dprotect.obfuscation.arithmetic;\n\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationXor.java",
    "chars": 5561,
    "preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/constants/ConstantFieldMarker.java",
    "chars": 1714,
    "preview": "package dprotect.obfuscation.constants;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.lo"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationInfo.java",
    "chars": 268,
    "preview": "package dprotect.obfuscation.constants;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Consta"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationMarker.java",
    "chars": 2132,
    "preview": "package dprotect.obfuscation.constants;\n\nimport dprotect.ConstantObfuscationClassSpecification;\nimport dprotect.Obfuscat"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/constants/ConstantsObfuscator.java",
    "chars": 11023,
    "preview": "package dprotect.obfuscation.constants;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Random;\n"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscation.java",
    "chars": 14278,
    "preview": "package dprotect.obfuscation.controlflow;\n\nimport java.util.Random;\nimport java.util.ArrayList;\nimport java.util.HashMap"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationInfo.java",
    "chars": 276,
    "preview": "package dprotect.obfuscation.controlflow;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Cont"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationMarker.java",
    "chars": 2146,
    "preview": "package dprotect.obfuscation.controlflow;\n\nimport dprotect.CFObfuscationClassSpecification;\nimport dprotect.ObfuscationC"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/info/ObfuscationInfo.java",
    "chars": 1718,
    "preview": "package dprotect.obfuscation.info;\n\nimport dprotect.obfuscation.arithmetic.ArithmeticObfuscationInfo;\nimport dprotect.ob"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/info/ObfuscationInfoSetter.java",
    "chars": 1907,
    "preview": "package dprotect.obfuscation.info;\n\nimport proguard.classfile.*;\nimport proguard.classfile.constant.visitor.ConstantVisi"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/strings/StringFieldMarker.java",
    "chars": 2414,
    "preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.log4"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/strings/StringObfuscationMarker.java",
    "chars": 1393,
    "preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.log4"
  },
  {
    "path": "base/src/main/java/dprotect/obfuscation/strings/StringObfuscator.java",
    "chars": 10200,
    "preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\nimport dprotect.runtime.strings"
  },
  {
    "path": "base/src/main/java/dprotect/runtime/strings/StringEncoding.java",
    "chars": 4264,
    "preview": "package dprotect.runtime.strings;\nimport java.lang.reflect.Method;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimp"
  },
  {
    "path": "base/src/main/java/dprotect/runtime/util/Helpers.java",
    "chars": 185,
    "preview": "package dprotect.runtime.util;\n\npublic class Helpers {\n    public static String getNormalizedClassName(Class cls)\n    {\n"
  },
  {
    "path": "base/src/main/java/dprotect/runtime/util/Loader.java",
    "chars": 1309,
    "preview": "package dprotect.runtime.util;\n\nimport proguard.classfile.*;\nimport proguard.io.*;\nimport proguard.classfile.visitor.*;\n"
  },
  {
    "path": "base/src/main/java/proguard/AfterInitConfigurationVerifier.java",
    "chars": 2986,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/AppView.java",
    "chars": 1614,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ArgumentWordReader.java",
    "chars": 2792,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/AssumeNoSideEffectsChecker.java",
    "chars": 3888,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ClassMemberChecker.java",
    "chars": 6229,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ClassPath.java",
    "chars": 2352,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ClassPathEntry.java",
    "chars": 12052,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ClassSpecification.java",
    "chars": 11588,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ClassSpecificationVisitorFactory.java",
    "chars": 30631,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/Configuration.java",
    "chars": 15958,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ConfigurationConstants.java",
    "chars": 10208,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ConfigurationParser.java",
    "chars": 93005,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ConfigurationVerifier.java",
    "chars": 10436,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ConfigurationWriter.java",
    "chars": 32956,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/DataEntryReaderFactory.java",
    "chars": 10749,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/DataEntryWriterFactory.java",
    "chars": 24104,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/DescriptorKeepChecker.java",
    "chars": 6341,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/Dumper.java",
    "chars": 1245,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/DuplicateClassPrinter.java",
    "chars": 2264,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/DuplicateResourceFilePrinter.java",
    "chars": 2168,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/FileWordReader.java",
    "chars": 1819,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/FullyQualifiedClassNameChecker.java",
    "chars": 6783,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/GPL.java",
    "chars": 6782,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/GetAnnotationChecker.java",
    "chars": 2886,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/GetEnclosingClassChecker.java",
    "chars": 2563,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/GetEnclosingMethodChecker.java",
    "chars": 2572,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/GetSignatureChecker.java",
    "chars": 2694,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/Initializer.java",
    "chars": 31447,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/InputReader.java",
    "chars": 12029,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/KeepClassMemberChecker.java",
    "chars": 3213,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/KeepClassSpecification.java",
    "chars": 8361,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/KeepClassSpecificationVisitorFactory.java",
    "chars": 13585,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/KotlinMetadataAdapter.java",
    "chars": 1194,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/LibraryKeepChecker.java",
    "chars": 4639,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/LineWordReader.java",
    "chars": 2384,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/MemberSpecification.java",
    "chars": 4788,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/MemberValueSpecification.java",
    "chars": 3797,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/OutputWriter.java",
    "chars": 23742,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ParseException.java",
    "chars": 1625,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/ProGuard.java",
    "chars": 19060,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/SeedPrinter.java",
    "chars": 3774,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/SubclassedClassFilter.java",
    "chars": 2026,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/Targeter.java",
    "chars": 3156,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/UpToDateChecker.java",
    "chars": 8189,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/WordReader.java",
    "chars": 12365,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/AbstractAPIConverter.java",
    "chars": 33178,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/Backporter.java",
    "chars": 16103,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/DefaultInterfaceMethodConverter.java",
    "chars": 12818,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/JSR310Converter.java",
    "chars": 2542,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/LambdaExpression.java",
    "chars": 7996,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/LambdaExpressionCollector.java",
    "chars": 9495,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/LambdaExpressionConverter.java",
    "chars": 47172,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/StaticInterfaceMethodConverter.java",
    "chars": 9944,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/StreamSupportConverter.java",
    "chars": 19404,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/backport/StringConcatenationConverter.java",
    "chars": 16195,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/classfile/ClassMemberPair.java",
    "chars": 2087,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/classfile/pass/PrimitiveArrayConstantIntroducer.java",
    "chars": 618,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/classfile/visitor/InjectedClassFilter.java",
    "chars": 2510,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/ConfigurationLogger.java",
    "chars": 46054,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/ConfigurationLoggingAdder.java",
    "chars": 6306,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java",
    "chars": 11614,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java",
    "chars": 5990,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java",
    "chars": 7960,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/configuration/InitialStateInfo.java",
    "chars": 4651,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/evaluation/AssumeClassSpecificationVisitorFactory.java",
    "chars": 5080,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationCounter.java",
    "chars": 4529,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationFlagFixer.java",
    "chars": 14245,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/io/ClassMapDataEntryReplacer.java",
    "chars": 11228,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/io/ExtraDataEntryNameMap.java",
    "chars": 6154,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/io/ExtraDataEntryReader.java",
    "chars": 6137,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/io/KotlinModuleRewriter.java",
    "chars": 5704,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/io/UniqueDataEntryWriter.java",
    "chars": 2221,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/logging/Logging.java",
    "chars": 806,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/mark/Marker.java",
    "chars": 19021,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/AttributeShrinker.java",
    "chars": 4253,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/AttributeUsageMarker.java",
    "chars": 2142,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ClassNameAdapterFunction.java",
    "chars": 5278,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ClassObfuscator.java",
    "chars": 23330,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ClassRenamer.java",
    "chars": 5384,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/DictionaryNameFactory.java",
    "chars": 9772,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MapCleaner.java",
    "chars": 1470,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MappingKeeper.java",
    "chars": 7289,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MappingPrinter.java",
    "chars": 18279,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MappingProcessor.java",
    "chars": 3751,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MappingReader.java",
    "chars": 9242,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MemberNameCleaner.java",
    "chars": 1909,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MemberNameCollector.java",
    "chars": 3641,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MemberNameConflictFixer.java",
    "chars": 6588,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MemberObfuscator.java",
    "chars": 6717,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MemberSpecialNameFilter.java",
    "chars": 3069,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/MultiMappingProcessor.java",
    "chars": 4138,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NameFactory.java",
    "chars": 1146,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NameFactoryResetter.java",
    "chars": 1572,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NameMarker.java",
    "chars": 4966,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NameObfuscationReferenceFixer.java",
    "chars": 1231,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NewMemberNameFilter.java",
    "chars": 3391,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/NumericNameFactory.java",
    "chars": 1286,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ObfuscationPreparation.java",
    "chars": 1602,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/Obfuscator.java",
    "chars": 36396,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/OriginalClassNameFilter.java",
    "chars": 2610,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ParameterNameMarker.java",
    "chars": 4626,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/PrefixingNameFactory.java",
    "chars": 1812,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/RenamedFlagSetter.java",
    "chars": 2337,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ResourceFileNameAdapter.java",
    "chars": 1021,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ResourceFileNameObfuscator.java",
    "chars": 4207,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/ResourceJavaReferenceFixer.java",
    "chars": 2094,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/SimpleNameFactory.java",
    "chars": 4448,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/SourceFileRenamer.java",
    "chars": 2790,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/SpecialNameFactory.java",
    "chars": 2216,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/UniqueMemberNameFactory.java",
    "chars": 3003,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasNameObfuscator.java",
    "chars": 3101,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasReferenceFixer.java",
    "chars": 2396,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinCallableReferenceFixer.java",
    "chars": 10734,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinCompanionEqualizer.java",
    "chars": 2596,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultImplsMethodNameEqualizer.java",
    "chars": 1797,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultMethodNameEqualizer.java",
    "chars": 1845,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinIntrinsicsReplacementSequences.java",
    "chars": 8665,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleFixer.java",
    "chars": 11311,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleNameObfuscator.java",
    "chars": 1648,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinMultiFileFacadeFixer.java",
    "chars": 2991,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinObjectFixer.java",
    "chars": 2588,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyNameObfuscator.java",
    "chars": 3082,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyRenamer.java",
    "chars": 1808,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSourceDebugExtensionAttributeObfuscator.java",
    "chars": 2604,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticClassFixer.java",
    "chars": 4268,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  },
  {
    "path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticToStringObfuscator.java",
    "chars": 10078,
    "preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n *             of Java bytecode.\n *\n * Copyr"
  }
]

// ... and 490 more files (download for full content)

About this extraction

This page contains the full source code of the open-obfuscator/dProtect GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 690 files (4.5 MB), approximately 1.2M tokens, and a symbol index with 4392 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!