// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

// Author: robinson@google.com (Will Robinson)

// LINT: LEGACY_NAMES

syntax = "proto2";

package google.protobuf.internal;

// A message where tag numbers are listed out of order, to allow us to test our
// canonicalization of serialized output, which should always be in tag order.
// We also mix in some extensions for extra fun.
message OutOfOrderFields {
  optional sint32 optional_sint32 = 5;
  extensions 4 to 4;
  optional uint32 optional_uint32 = 3;
  extensions 2 to 2;
  optional int32 optional_int32 = 1;
}

extend OutOfOrderFields {
  optional uint64 optional_uint64 = 4;
  optional int64 optional_int64 = 2;
}

enum is {  // top level enum keyword
  default = 0;
  else = 1;  // top level enum value keyword
}

message class {  // message keyword
  optional int32 int_field = 1 [json_name = "json_int"];
  optional int32 if = 2;  // field keyword
  optional is as = 3;     // enum field keyword
  optional is enum_field = 4;
  enum for {                            // nested enum keyword
    default = 0;
    True = 1;  // nested enum value keyword
  }
  optional for nested_enum_field = 5;
  message try {
    optional int32 field = 1;
    extensions 999 to 9999;
  }
  optional try
    nested_message = 6;
  extensions 999 to 9999;
}

extend class {
  optional int32 continue = 1001;  // top level extension keyword
}

extend class.try {
  optional int32 with = 1001;
}

message ExtendClass {
  extend class {
    optional int32 return = 1002;  // nested extension keyword
  }
}

message TestRecursiveMapMessage {
  optional TestRecursiveMapMessage a = 1;
  optional int32 i = 2;
  map<int32, TestRecursiveMapMessage> map_field = 3;
}

message TestFullKeyword {
  optional google.protobuf.internal.OutOfOrderFields field1 = 1;
  optional google.protobuf.internal.class field2 = 2;
}

// TODO: Add keyword support for service.
// service False {
//   rpc Bar(class) returns (class);
// }

message LotsNestedMessage {
  message B0 {}
  message B1 {}
  message B2 {}
  message B3 {}
  message B4 {}
  message B5 {}
  message B6 {}
  message B7 {}
  message B8 {}
  message B9 {}
  message B10 {}
  message B11 {}
  message B12 {}
  message B13 {}
  message B14 {}
  message B15 {}
  message B16 {}
  message B17 {}
  message B18 {}
  message B19 {}
  message B20 {}
  message B21 {}
  message B22 {}
  message B23 {}
  message B24 {}
  message B25 {}
  message B26 {}
  message B27 {}
  message B28 {}
  message B29 {}
  message B30 {}
  message B31 {}
  message B32 {}
  message B33 {}
  message B34 {}
  message B35 {}
  message B36 {}
  message B37 {}
  message B38 {}
  message B39 {}
  message B40 {}
  message B41 {}
  message B42 {}
  message B43 {}
  message B44 {}
  message B45 {}
  message B46 {}
  message B47 {}
  message B48 {}
  message B49 {}
  message B50 {}
  message B51 {}
  message B52 {}
  message B53 {}
  message B54 {}
  message B55 {}
  message B56 {}
  message B57 {}
  message B58 {}
  message B59 {}
  message B60 {}
  message B61 {}
  message B62 {}
  message B63 {}
  message B64 {}
  message B65 {}
  message B66 {}
  message B67 {}
  message B68 {}
  message B69 {}
  message B70 {}
  message B71 {}
  message B72 {}
  message B73 {}
  message B74 {}
  message B75 {}
  message B76 {}
  message B77 {}
  message B78 {}
  message B79 {}
  message B80 {}
  message B81 {}
  message B82 {}
  message B83 {}
  message B84 {}
  message B85 {}
  message B86 {}
  message B87 {}
  message B88 {}
  message B89 {}
  message B90 {}
  message B91 {}
  message B92 {}
  message B93 {}
  message B94 {}
  message B95 {}
  message B96 {}
  message B97 {}
  message B98 {}
  message B99 {}
  message B100 {}
  message B101 {}
  message B102 {}
  message B103 {}
  message B104 {}
  message B105 {}
  message B106 {}
  message B107 {}
  message B108 {}
  message B109 {}
  message B110 {}
  message B111 {}
  message B112 {}
  message B113 {}
  message B114 {}
  message B115 {}
  message B116 {}
  message B117 {}
  message B118 {}
  message B119 {}
  message B120 {}
  message B121 {}
  message B122 {}
  message B123 {}
  message B124 {}
  message B125 {}
  message B126 {}
  message B127 {}
  message B128 {}
  message B129 {}
  message B130 {}
  message B131 {}
  message B132 {}
  message B133 {}
  message B134 {}
  message B135 {}
  message B136 {}
  message B137 {}
  message B138 {}
  message B139 {}
  message B140 {}
  message B141 {}
  message B142 {}
  message B143 {}
  message B144 {}
  message B145 {}
  message B146 {}
  message B147 {}
  message B148 {}
  message B149 {}
  message B150 {}
  message B151 {}
  message B152 {}
  message B153 {}
  message B154 {}
  message B155 {}
  message B156 {}
  message B157 {}
  message B158 {}
  message B159 {}
  message B160 {}
  message B161 {}
  message B162 {}
  message B163 {}
  message B164 {}
  message B165 {}
  message B166 {}
  message B167 {}
  message B168 {}
  message B169 {}
  message B170 {}
  message B171 {}
  message B172 {}
  message B173 {}
  message B174 {}
  message B175 {}
  message B176 {}
  message B177 {}
  message B178 {}
  message B179 {}
  message B180 {}
  message B181 {}
  message B182 {}
  message B183 {}
  message B184 {}
  message B185 {}
  message B186 {}
  message B187 {}
  message B188 {}
  message B189 {}
  message B190 {}
  message B191 {}
  message B192 {}
  message B193 {}
  message B194 {}
  message B195 {}
  message B196 {}
  message B197 {}
  message B198 {}
  message B199 {}
  message B200 {}
  message B201 {}
  message B202 {}
  message B203 {}
  message B204 {}
  message B205 {}
  message B206 {}
  message B207 {}
  message B208 {}
  message B209 {}
  message B210 {}
  message B211 {}
  message B212 {}
  message B213 {}
  message B214 {}
  message B215 {}
  message B216 {}
  message B217 {}
  message B218 {}
  message B219 {}
  message B220 {}
  message B221 {}
  message B222 {}
  message B223 {}
  message B224 {}
  message B225 {}
  message B226 {}
  message B227 {}
  message B228 {}
  message B229 {}
  message B230 {}
  message B231 {}
  message B232 {}
  message B233 {}
  message B234 {}
  message B235 {}
  message B236 {}
  message B237 {}
  message B238 {}
  message B239 {}
  message B240 {}
  message B241 {}
  message B242 {}
  message B243 {}
  message B244 {}
  message B245 {}
  message B246 {}
  message B247 {}
  message B248 {}
  message B249 {}
  message B250 {}
  message B251 {}
  message B252 {}
  message B253 {}
  message B254 {}
  message B255 {}
}

message LotsOfMessageFields {
  optional LotsOfMessageFields a1 = 1;
  optional LotsOfMessageFields a2 = 2;
  optional LotsOfMessageFields a3 = 3;
  optional LotsOfMessageFields a4 = 4;
  optional LotsOfMessageFields a5 = 5;
  optional LotsOfMessageFields a6 = 6;
  optional LotsOfMessageFields a7 = 7;
  optional LotsOfMessageFields a8 = 8;
  optional LotsOfMessageFields a9 = 9;
  optional LotsOfMessageFields a10 = 10;
  optional LotsOfMessageFields a11 = 11;
  optional LotsOfMessageFields a12 = 12;
  optional LotsOfMessageFields a13 = 13;
  optional LotsOfMessageFields a14 = 14;
  optional LotsOfMessageFields a15 = 15;
  optional LotsOfMessageFields a16 = 16;
  optional LotsOfMessageFields a17 = 17;
  optional LotsOfMessageFields a18 = 18;
  optional LotsOfMessageFields a19 = 19;
  optional LotsOfMessageFields a20 = 20;

  optional int32 b = 100;
}

message RequiredField {
  required int32 id = 1;
}

message RequiredWrapper {
  optional RequiredField request = 1;
}

message ConflictJsonName {
  optional int32 value = 1 [json_name = "old_value"];
  optional int32 new_value = 2 [json_name = "value"];
}
