Skip to content

Commit

Permalink
issue-1168 - protobuf names that end with an _ (underscore) (scalapb#…
Browse files Browse the repository at this point in the history
…1169)

Support protobuf names that end with an _ (underscore)

Fixes scalapb#1168
  • Loading branch information
nikiforo authored Jun 2, 2021
1 parent 1944632 commit 2515709
Show file tree
Hide file tree
Showing 70 changed files with 142 additions and 131 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.vscode/
.bloop/
.metals/
project/.bloop/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1354,7 +1354,7 @@ class ProtobufGenerator(
s"def $clearMethod = copy(${field.scalaName.asSymbol} = ${field.collection.empty})"
)
).add(
s"""|def add${field.upperScalaName}(__vs: $singleType*): ${message.scalaType.nameSymbol} = addAll${field.upperScalaName}(__vs)
s"""|def add${field.upperScalaName}(__vs: $singleType *): ${message.scalaType.nameSymbol} = addAll${field.upperScalaName}(__vs)
|def addAll${field.upperScalaName}(__vs: Iterable[$singleType]): ${message.scalaType.nameSymbol} = copy(${field.scalaName.asSymbol} = $concat)""".stripMargin
)
}
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/scala/scalapb/docs/person/Person.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ final case class Person(
def withName(__v: _root_.scala.Predef.String): Person = copy(name = __v)
def withAge(__v: _root_.scala.Int): Person = copy(age = __v)
def clearAddresses = copy(addresses = _root_.scala.Seq.empty)
def addAddresses(__vs: scalapb.docs.person.Person.Address*): Person = addAllAddresses(__vs)
def addAddresses(__vs: scalapb.docs.person.Person.Address *): Person = addAllAddresses(__vs)
def addAllAddresses(__vs: Iterable[scalapb.docs.person.Person.Address]): Person = copy(addresses = addresses ++ __vs)
def withAddresses(__v: _root_.scala.Seq[scalapb.docs.person.Person.Address]): Person = copy(addresses = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/scala/scalapb/perf/protos/EnumVector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ final case class EnumVector(
unknownFields.writeTo(_output__)
}
def clearColors = copy(colors = _root_.scala.Seq.empty)
def addColors(__vs: scalapb.perf.protos.Color*): EnumVector = addAllColors(__vs)
def addColors(__vs: scalapb.perf.protos.Color *): EnumVector = addAllColors(__vs)
def addAllColors(__vs: Iterable[scalapb.perf.protos.Color]): EnumVector = copy(colors = colors ++ __vs)
def withColors(__v: _root_.scala.Seq[scalapb.perf.protos.Color]): EnumVector = copy(colors = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/scala/scalapb/perf/protos/IntVector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ final case class IntVector(
unknownFields.writeTo(_output__)
}
def clearInts = copy(ints = _root_.scala.Seq.empty)
def addInts(__vs: _root_.scala.Int*): IntVector = addAllInts(__vs)
def addInts(__vs: _root_.scala.Int *): IntVector = addAllInts(__vs)
def addAllInts(__vs: Iterable[_root_.scala.Int]): IntVector = copy(ints = ints ++ __vs)
def withInts(__v: _root_.scala.Seq[_root_.scala.Int]): IntVector = copy(ints = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ final case class MessageContainer(
def clearOpt: MessageContainer = copy(opt = _root_.scala.None)
def withOpt(__v: scalapb.perf.protos.SimpleMessage): MessageContainer = copy(opt = Option(__v))
def clearRep = copy(rep = _root_.scala.Seq.empty)
def addRep(__vs: scalapb.perf.protos.SimpleMessage*): MessageContainer = addAllRep(__vs)
def addRep(__vs: scalapb.perf.protos.SimpleMessage *): MessageContainer = addAllRep(__vs)
def addAllRep(__vs: Iterable[scalapb.perf.protos.SimpleMessage]): MessageContainer = copy(rep = rep ++ __vs)
def withRep(__v: _root_.scala.Seq[scalapb.perf.protos.SimpleMessage]): MessageContainer = copy(rep = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
10 changes: 10 additions & 0 deletions e2e/src/main/protobuf/nocode/issue1168.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
syntax = "proto2";
package sample;

message Stack_ {
required uint32 id = 1;
}

message Stacks {
repeated Stack_ Stack = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -160,19 +160,19 @@ final case class Api(
}
def withName(__v: _root_.scala.Predef.String): Api = copy(name = __v)
def clearMethods = copy(methods = _root_.scala.Seq.empty)
def addMethods(__vs: com.google.protobuf.api.Method*): Api = addAllMethods(__vs)
def addMethods(__vs: com.google.protobuf.api.Method *): Api = addAllMethods(__vs)
def addAllMethods(__vs: Iterable[com.google.protobuf.api.Method]): Api = copy(methods = methods ++ __vs)
def withMethods(__v: _root_.scala.Seq[com.google.protobuf.api.Method]): Api = copy(methods = __v)
def clearOptions = copy(options = _root_.scala.Seq.empty)
def addOptions(__vs: com.google.protobuf.`type`.OptionProto*): Api = addAllOptions(__vs)
def addOptions(__vs: com.google.protobuf.`type`.OptionProto *): Api = addAllOptions(__vs)
def addAllOptions(__vs: Iterable[com.google.protobuf.`type`.OptionProto]): Api = copy(options = options ++ __vs)
def withOptions(__v: _root_.scala.Seq[com.google.protobuf.`type`.OptionProto]): Api = copy(options = __v)
def withVersion(__v: _root_.scala.Predef.String): Api = copy(version = __v)
def getSourceContext: com.google.protobuf.source_context.SourceContext = sourceContext.getOrElse(com.google.protobuf.source_context.SourceContext.defaultInstance)
def clearSourceContext: Api = copy(sourceContext = _root_.scala.None)
def withSourceContext(__v: com.google.protobuf.source_context.SourceContext): Api = copy(sourceContext = Option(__v))
def clearMixins = copy(mixins = _root_.scala.Seq.empty)
def addMixins(__vs: com.google.protobuf.api.Mixin*): Api = addAllMixins(__vs)
def addMixins(__vs: com.google.protobuf.api.Mixin *): Api = addAllMixins(__vs)
def addAllMixins(__vs: Iterable[com.google.protobuf.api.Mixin]): Api = copy(mixins = mixins ++ __vs)
def withMixins(__v: _root_.scala.Seq[com.google.protobuf.api.Mixin]): Api = copy(mixins = __v)
def withSyntax(__v: com.google.protobuf.`type`.Syntax): Api = copy(syntax = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ final case class Method(
def withResponseTypeUrl(__v: _root_.scala.Predef.String): Method = copy(responseTypeUrl = __v)
def withResponseStreaming(__v: _root_.scala.Boolean): Method = copy(responseStreaming = __v)
def clearOptions = copy(options = _root_.scala.Seq.empty)
def addOptions(__vs: com.google.protobuf.`type`.OptionProto*): Method = addAllOptions(__vs)
def addOptions(__vs: com.google.protobuf.`type`.OptionProto *): Method = addAllOptions(__vs)
def addAllOptions(__vs: Iterable[com.google.protobuf.`type`.OptionProto]): Method = copy(options = options ++ __vs)
def withOptions(__v: _root_.scala.Seq[com.google.protobuf.`type`.OptionProto]): Method = copy(options = __v)
def withSyntax(__v: com.google.protobuf.`type`.Syntax): Method = copy(syntax = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,14 @@ final case class CodeGeneratorRequest(
unknownFields.writeTo(_output__)
}
def clearFileToGenerate = copy(fileToGenerate = _root_.scala.Seq.empty)
def addFileToGenerate(__vs: _root_.scala.Predef.String*): CodeGeneratorRequest = addAllFileToGenerate(__vs)
def addFileToGenerate(__vs: _root_.scala.Predef.String *): CodeGeneratorRequest = addAllFileToGenerate(__vs)
def addAllFileToGenerate(__vs: Iterable[_root_.scala.Predef.String]): CodeGeneratorRequest = copy(fileToGenerate = fileToGenerate ++ __vs)
def withFileToGenerate(__v: _root_.scala.Seq[_root_.scala.Predef.String]): CodeGeneratorRequest = copy(fileToGenerate = __v)
def getParameter: _root_.scala.Predef.String = parameter.getOrElse("")
def clearParameter: CodeGeneratorRequest = copy(parameter = _root_.scala.None)
def withParameter(__v: _root_.scala.Predef.String): CodeGeneratorRequest = copy(parameter = Option(__v))
def clearProtoFile = copy(protoFile = _root_.scala.Seq.empty)
def addProtoFile(__vs: com.google.protobuf.descriptor.FileDescriptorProto*): CodeGeneratorRequest = addAllProtoFile(__vs)
def addProtoFile(__vs: com.google.protobuf.descriptor.FileDescriptorProto *): CodeGeneratorRequest = addAllProtoFile(__vs)
def addAllProtoFile(__vs: Iterable[com.google.protobuf.descriptor.FileDescriptorProto]): CodeGeneratorRequest = copy(protoFile = protoFile ++ __vs)
def withProtoFile(__v: _root_.scala.Seq[com.google.protobuf.descriptor.FileDescriptorProto]): CodeGeneratorRequest = copy(protoFile = __v)
def getCompilerVersion: com.google.protobuf.compiler.plugin.Version = compilerVersion.getOrElse(com.google.protobuf.compiler.plugin.Version.defaultInstance)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ final case class CodeGeneratorResponse(
def clearSupportedFeatures: CodeGeneratorResponse = copy(supportedFeatures = _root_.scala.None)
def withSupportedFeatures(__v: _root_.scala.Long): CodeGeneratorResponse = copy(supportedFeatures = Option(__v))
def clearFile = copy(file = _root_.scala.Seq.empty)
def addFile(__vs: com.google.protobuf.compiler.plugin.CodeGeneratorResponse.File*): CodeGeneratorResponse = addAllFile(__vs)
def addFile(__vs: com.google.protobuf.compiler.plugin.CodeGeneratorResponse.File *): CodeGeneratorResponse = addAllFile(__vs)
def addAllFile(__vs: Iterable[com.google.protobuf.compiler.plugin.CodeGeneratorResponse.File]): CodeGeneratorResponse = copy(file = file ++ __vs)
def withFile(__v: _root_.scala.Seq[com.google.protobuf.compiler.plugin.CodeGeneratorResponse.File]): CodeGeneratorResponse = copy(file = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,38 +143,38 @@ final case class DescriptorProto(
def clearName: DescriptorProto = copy(name = _root_.scala.None)
def withName(__v: _root_.scala.Predef.String): DescriptorProto = copy(name = Option(__v))
def clearField = copy(field = _root_.scala.Seq.empty)
def addField(__vs: com.google.protobuf.descriptor.FieldDescriptorProto*): DescriptorProto = addAllField(__vs)
def addField(__vs: com.google.protobuf.descriptor.FieldDescriptorProto *): DescriptorProto = addAllField(__vs)
def addAllField(__vs: Iterable[com.google.protobuf.descriptor.FieldDescriptorProto]): DescriptorProto = copy(field = field ++ __vs)
def withField(__v: _root_.scala.Seq[com.google.protobuf.descriptor.FieldDescriptorProto]): DescriptorProto = copy(field = __v)
def clearExtension = copy(extension = _root_.scala.Seq.empty)
def addExtension(__vs: com.google.protobuf.descriptor.FieldDescriptorProto*): DescriptorProto = addAllExtension(__vs)
def addExtension(__vs: com.google.protobuf.descriptor.FieldDescriptorProto *): DescriptorProto = addAllExtension(__vs)
def addAllExtension(__vs: Iterable[com.google.protobuf.descriptor.FieldDescriptorProto]): DescriptorProto = copy(extension = extension ++ __vs)
def withExtension(__v: _root_.scala.Seq[com.google.protobuf.descriptor.FieldDescriptorProto]): DescriptorProto = copy(extension = __v)
def clearNestedType = copy(nestedType = _root_.scala.Seq.empty)
def addNestedType(__vs: com.google.protobuf.descriptor.DescriptorProto*): DescriptorProto = addAllNestedType(__vs)
def addNestedType(__vs: com.google.protobuf.descriptor.DescriptorProto *): DescriptorProto = addAllNestedType(__vs)
def addAllNestedType(__vs: Iterable[com.google.protobuf.descriptor.DescriptorProto]): DescriptorProto = copy(nestedType = nestedType ++ __vs)
def withNestedType(__v: _root_.scala.Seq[com.google.protobuf.descriptor.DescriptorProto]): DescriptorProto = copy(nestedType = __v)
def clearEnumType = copy(enumType = _root_.scala.Seq.empty)
def addEnumType(__vs: com.google.protobuf.descriptor.EnumDescriptorProto*): DescriptorProto = addAllEnumType(__vs)
def addEnumType(__vs: com.google.protobuf.descriptor.EnumDescriptorProto *): DescriptorProto = addAllEnumType(__vs)
def addAllEnumType(__vs: Iterable[com.google.protobuf.descriptor.EnumDescriptorProto]): DescriptorProto = copy(enumType = enumType ++ __vs)
def withEnumType(__v: _root_.scala.Seq[com.google.protobuf.descriptor.EnumDescriptorProto]): DescriptorProto = copy(enumType = __v)
def clearExtensionRange = copy(extensionRange = _root_.scala.Seq.empty)
def addExtensionRange(__vs: com.google.protobuf.descriptor.DescriptorProto.ExtensionRange*): DescriptorProto = addAllExtensionRange(__vs)
def addExtensionRange(__vs: com.google.protobuf.descriptor.DescriptorProto.ExtensionRange *): DescriptorProto = addAllExtensionRange(__vs)
def addAllExtensionRange(__vs: Iterable[com.google.protobuf.descriptor.DescriptorProto.ExtensionRange]): DescriptorProto = copy(extensionRange = extensionRange ++ __vs)
def withExtensionRange(__v: _root_.scala.Seq[com.google.protobuf.descriptor.DescriptorProto.ExtensionRange]): DescriptorProto = copy(extensionRange = __v)
def clearOneofDecl = copy(oneofDecl = _root_.scala.Seq.empty)
def addOneofDecl(__vs: com.google.protobuf.descriptor.OneofDescriptorProto*): DescriptorProto = addAllOneofDecl(__vs)
def addOneofDecl(__vs: com.google.protobuf.descriptor.OneofDescriptorProto *): DescriptorProto = addAllOneofDecl(__vs)
def addAllOneofDecl(__vs: Iterable[com.google.protobuf.descriptor.OneofDescriptorProto]): DescriptorProto = copy(oneofDecl = oneofDecl ++ __vs)
def withOneofDecl(__v: _root_.scala.Seq[com.google.protobuf.descriptor.OneofDescriptorProto]): DescriptorProto = copy(oneofDecl = __v)
def getOptions: com.google.protobuf.descriptor.MessageOptions = options.getOrElse(com.google.protobuf.descriptor.MessageOptions.defaultInstance)
def clearOptions: DescriptorProto = copy(options = _root_.scala.None)
def withOptions(__v: com.google.protobuf.descriptor.MessageOptions): DescriptorProto = copy(options = Option(__v))
def clearReservedRange = copy(reservedRange = _root_.scala.Seq.empty)
def addReservedRange(__vs: com.google.protobuf.descriptor.DescriptorProto.ReservedRange*): DescriptorProto = addAllReservedRange(__vs)
def addReservedRange(__vs: com.google.protobuf.descriptor.DescriptorProto.ReservedRange *): DescriptorProto = addAllReservedRange(__vs)
def addAllReservedRange(__vs: Iterable[com.google.protobuf.descriptor.DescriptorProto.ReservedRange]): DescriptorProto = copy(reservedRange = reservedRange ++ __vs)
def withReservedRange(__v: _root_.scala.Seq[com.google.protobuf.descriptor.DescriptorProto.ReservedRange]): DescriptorProto = copy(reservedRange = __v)
def clearReservedName = copy(reservedName = _root_.scala.Seq.empty)
def addReservedName(__vs: _root_.scala.Predef.String*): DescriptorProto = addAllReservedName(__vs)
def addReservedName(__vs: _root_.scala.Predef.String *): DescriptorProto = addAllReservedName(__vs)
def addAllReservedName(__vs: Iterable[_root_.scala.Predef.String]): DescriptorProto = copy(reservedName = reservedName ++ __vs)
def withReservedName(__v: _root_.scala.Seq[_root_.scala.Predef.String]): DescriptorProto = copy(reservedName = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,18 +92,18 @@ final case class EnumDescriptorProto(
def clearName: EnumDescriptorProto = copy(name = _root_.scala.None)
def withName(__v: _root_.scala.Predef.String): EnumDescriptorProto = copy(name = Option(__v))
def clearValue = copy(value = _root_.scala.Seq.empty)
def addValue(__vs: com.google.protobuf.descriptor.EnumValueDescriptorProto*): EnumDescriptorProto = addAllValue(__vs)
def addValue(__vs: com.google.protobuf.descriptor.EnumValueDescriptorProto *): EnumDescriptorProto = addAllValue(__vs)
def addAllValue(__vs: Iterable[com.google.protobuf.descriptor.EnumValueDescriptorProto]): EnumDescriptorProto = copy(value = value ++ __vs)
def withValue(__v: _root_.scala.Seq[com.google.protobuf.descriptor.EnumValueDescriptorProto]): EnumDescriptorProto = copy(value = __v)
def getOptions: com.google.protobuf.descriptor.EnumOptions = options.getOrElse(com.google.protobuf.descriptor.EnumOptions.defaultInstance)
def clearOptions: EnumDescriptorProto = copy(options = _root_.scala.None)
def withOptions(__v: com.google.protobuf.descriptor.EnumOptions): EnumDescriptorProto = copy(options = Option(__v))
def clearReservedRange = copy(reservedRange = _root_.scala.Seq.empty)
def addReservedRange(__vs: com.google.protobuf.descriptor.EnumDescriptorProto.EnumReservedRange*): EnumDescriptorProto = addAllReservedRange(__vs)
def addReservedRange(__vs: com.google.protobuf.descriptor.EnumDescriptorProto.EnumReservedRange *): EnumDescriptorProto = addAllReservedRange(__vs)
def addAllReservedRange(__vs: Iterable[com.google.protobuf.descriptor.EnumDescriptorProto.EnumReservedRange]): EnumDescriptorProto = copy(reservedRange = reservedRange ++ __vs)
def withReservedRange(__v: _root_.scala.Seq[com.google.protobuf.descriptor.EnumDescriptorProto.EnumReservedRange]): EnumDescriptorProto = copy(reservedRange = __v)
def clearReservedName = copy(reservedName = _root_.scala.Seq.empty)
def addReservedName(__vs: _root_.scala.Predef.String*): EnumDescriptorProto = addAllReservedName(__vs)
def addReservedName(__vs: _root_.scala.Predef.String *): EnumDescriptorProto = addAllReservedName(__vs)
def addAllReservedName(__vs: Iterable[_root_.scala.Predef.String]): EnumDescriptorProto = copy(reservedName = reservedName ++ __vs)
def withReservedName(__v: _root_.scala.Seq[_root_.scala.Predef.String]): EnumDescriptorProto = copy(reservedName = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ final case class EnumOptions(
def clearDeprecated: EnumOptions = copy(deprecated = _root_.scala.None)
def withDeprecated(__v: _root_.scala.Boolean): EnumOptions = copy(deprecated = Option(__v))
def clearUninterpretedOption = copy(uninterpretedOption = _root_.scala.Seq.empty)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption*): EnumOptions = addAllUninterpretedOption(__vs)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption *): EnumOptions = addAllUninterpretedOption(__vs)
def addAllUninterpretedOption(__vs: Iterable[com.google.protobuf.descriptor.UninterpretedOption]): EnumOptions = copy(uninterpretedOption = uninterpretedOption ++ __vs)
def withUninterpretedOption(__v: _root_.scala.Seq[com.google.protobuf.descriptor.UninterpretedOption]): EnumOptions = copy(uninterpretedOption = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ final case class EnumValueOptions(
def clearDeprecated: EnumValueOptions = copy(deprecated = _root_.scala.None)
def withDeprecated(__v: _root_.scala.Boolean): EnumValueOptions = copy(deprecated = Option(__v))
def clearUninterpretedOption = copy(uninterpretedOption = _root_.scala.Seq.empty)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption*): EnumValueOptions = addAllUninterpretedOption(__vs)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption *): EnumValueOptions = addAllUninterpretedOption(__vs)
def addAllUninterpretedOption(__vs: Iterable[com.google.protobuf.descriptor.UninterpretedOption]): EnumValueOptions = copy(uninterpretedOption = uninterpretedOption ++ __vs)
def withUninterpretedOption(__v: _root_.scala.Seq[com.google.protobuf.descriptor.UninterpretedOption]): EnumValueOptions = copy(uninterpretedOption = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ final case class ExtensionRangeOptions(
unknownFields.writeTo(_output__)
}
def clearUninterpretedOption = copy(uninterpretedOption = _root_.scala.Seq.empty)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption*): ExtensionRangeOptions = addAllUninterpretedOption(__vs)
def addUninterpretedOption(__vs: com.google.protobuf.descriptor.UninterpretedOption *): ExtensionRangeOptions = addAllUninterpretedOption(__vs)
def addAllUninterpretedOption(__vs: Iterable[com.google.protobuf.descriptor.UninterpretedOption]): ExtensionRangeOptions = copy(uninterpretedOption = uninterpretedOption ++ __vs)
def withUninterpretedOption(__v: _root_.scala.Seq[com.google.protobuf.descriptor.UninterpretedOption]): ExtensionRangeOptions = copy(uninterpretedOption = __v)
def withUnknownFields(__v: _root_.scalapb.UnknownFieldSet) = copy(unknownFields = __v)
Expand Down
Loading

0 comments on commit 2515709

Please sign in to comment.