Updating to use maven plugin and updating to latest versions

Change-Id: I73f1c3dfca68f94a71654c85a46efd9c1e5385cb
diff --git a/order-redirect/java/pom.xml b/order-redirect/java/pom.xml
index fdca852..d159c16 100644
--- a/order-redirect/java/pom.xml
+++ b/order-redirect/java/pom.xml
@@ -9,10 +9,10 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <java.version>11.0</java.version>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-        <protobuf.version>3.22.0</protobuf.version>
+        <java.version>23.0</java.version>
+        <maven.compiler.source>23</maven.compiler.source>
+        <maven.compiler.target>23</maven.compiler.target>
+        <protobuf.version>4.29.3</protobuf.version>
     </properties>
     <dependencies>
         <dependency>
@@ -63,6 +63,22 @@
                     </execution>
                 </executions>
             </plugin>
-        </plugins>
+          <plugin>
+        <groupId>org.xolstice.maven.plugins</groupId>
+        <artifactId>protobuf-maven-plugin</artifactId>
+        <version>0.6.1</version>
+        <configuration>
+          <protocExecutable>protoc</protocExecutable>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>compile</goal>
+              <goal>test-compile</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
     </build>
-</project>
\ No newline at end of file
+</project>
diff --git a/order-redirect/java/src/main/proto/action.proto b/order-redirect/java/src/main/proto/action.proto
new file mode 100644
index 0000000..9a8d50e
--- /dev/null
+++ b/order-redirect/java/src/main/proto/action.proto
@@ -0,0 +1,46 @@
+
+// Feeds declaration
+syntax = "proto3";
+
+package madden.ingestion;
+
+option java_multiple_files = true;
+option java_package = "com.google.madden.ingestion";
+option go_package = "google/madden/ingestion";
+
+message ActionFeed {
+  repeated ActionDetail data = 1;
+}
+
+message ActionDetail {
+  // Reference to entity id
+  optional string entity_id = 2;
+  optional string link_id = 3;
+  // Deep link for action detail
+  optional string url = 4;
+  repeated Action actions = 1;
+}
+
+// Information about an Action which could be performed.
+message Action {
+  // Deprecated fields not to be reused.
+  reserved 1;
+  oneof action_info {
+    FoodOrderingInfo food_ordering_info = 3;
+  }
+}
+
+message AppointmentInfo {
+  // Deep link for appointment action.
+  string url = 1;
+}
+
+message FoodOrderingInfo {
+  // Service type for food ordering action.
+  enum ServiceType {
+    UNKNOWN = 0;
+    DELIVERY = 1;
+    TAKEOUT = 2;
+  }
+  ServiceType service_type = 1;
+}
diff --git a/order-redirect/java/src/main/proto/entity.proto b/order-redirect/java/src/main/proto/entity.proto
new file mode 100644
index 0000000..451c639
--- /dev/null
+++ b/order-redirect/java/src/main/proto/entity.proto
@@ -0,0 +1,71 @@
+// Feeds declaration
+syntax = "proto3";
+
+package madden.ingestion;
+
+option java_multiple_files = true;
+option java_package = "com.google.madden.ingestion";
+option go_package = "google/madden/ingestion";
+
+message EntityFeed {
+  repeated Entity data = 1;
+}
+
+//
+// Information about an Entity that is on the partner's platform. For example,
+// an Entity could be a retail store, a hospital, an online business etc.
+//
+message Entity {
+  // An opaque string generated by the partner that identifies an Entity.
+  // Must be unique across all entities.
+  // Strongly recommended to only include URL-safe characters. (required)
+  string entity_id = 1;
+
+  // If present, the name, telephone, url and location are used to support
+  // matching partner inventory with entities already present on Google. This
+  // information will not be displayed.
+
+  // The name of the Entity. (required)
+  string name = 2;
+
+  // The contact telephone number of the Entity including its country and area
+  // codes, e.g. +14567891234. Highly recommended. (optional)
+  string telephone = 3;
+
+  // The url of the Entity's public website. Highly recommended. (optional)
+  string url = 4;
+
+  // The location of the Entity (required)
+  madden.ingestion.GeoCoordinates location = 5;
+}
+
+// The Geo data of a location, including latitude, longitude, and address.
+// At least one of [lat/lng or address] should be provided (or both).
+message GeoCoordinates {
+  double latitude = 1;   // In degrees. (optional)
+  double longitude = 2;  // In degrees. (optional)
+
+  // Address for a location, could either be structured or unstructured.
+  oneof addresses {
+    // Postal address of the location, preferred.
+    PostalAddress address = 3;
+    // An unstructured address could also be provided as a fallback.
+    // E.g. "1600 amphitheatre parkway mountain view, ca 94043"
+    string unstructured_address = 4;
+  }
+}
+
+// The postal address for a merchant.
+message PostalAddress {
+  // The country, using ISO 3166-1 alpha-2 country code, e.g. "US" (required)
+  string country = 1;
+  // The locality/city, e.g. "Mountain View". (required)
+  string locality = 2;
+  // The region/state/province, e.g. "CA". This field is only required in
+  // countries where region is commonly a part of the address. (optional)
+  string region = 3;
+  // The postal code, e.g. "94043". (required)
+  string postal_code = 4;
+  // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
+  string street_address = 5;
+}
\ No newline at end of file
diff --git a/order-redirect/java/src/main/proto/food-service.proto b/order-redirect/java/src/main/proto/food-service.proto
new file mode 100644
index 0000000..e5151c9
--- /dev/null
+++ b/order-redirect/java/src/main/proto/food-service.proto
@@ -0,0 +1,313 @@
+
+// Feeds declaration
+syntax = "proto3";
+
+package food.ordering.service.v1;
+
+option go_package = "google/food/ordering/services/v1";
+option java_package = "com.google.food.ordering.services.v1";
+option java_multiple_files = true;
+
+import "google/protobuf/duration.proto";
+import "google/protobuf/timestamp.proto";
+import "google/type/timeofday.proto";
+import "google/type/latlng.proto";
+import "google/type/money.proto";
+import "google/type/dayofweek.proto";
+
+// Food Ordering Team's EPA Service Feeds Spec.
+message FoodServiceFeed {
+  // Service feed entity data.
+  repeated ServiceData data = 1;
+}
+
+// Service feed entity data.
+message ServiceData {
+  oneof type {
+    FoodOrderingService service = 1;
+    ServiceHours service_hours = 2;
+    ServiceArea service_area = 3;
+    Fee fee = 4;
+  }
+}
+
+message FoodOrderingService {
+  // Unique identifier of the provided service.
+  // Required.
+  string service_id = 1
+      ;
+  enum ServiceType {
+    SERVICE_TYPE_UNKNOWN = 0;
+    DELIVERY = 1;
+    TAKEOUT = 2;
+  }
+  // The type of the service.
+  // Required and cannot be SERVICE_TYPE_UNKNOWN.
+  ServiceType service_type = 2
+      ;
+  // The parent entity’s ID.
+  // Required.
+  string parent_entity_id = 3
+      ;
+  // Indicates if the entity is disabled.
+  // Optional.
+  optional bool disabled = 4;
+  // The lead time given in the service entity will apply to all
+  // the service hours unless an overridden property is set in the
+  // service hours entity.
+  // Required.
+  ETA lead_time = 5
+      ;
+
+  // Parent action detail's link ID.
+  // Required.
+  string action_link_id = 6
+      ;
+}
+
+// Lead time range [min, max). At least one of min or max needs to be provided.
+// In the case of only one field is given, the lead time is treated as a fixed
+// value instead of a range.
+message ETA {
+  // Indicates a range of ETA duration.
+  google.protobuf.Duration min_lead_time_duration = 1
+      ;
+  google.protobuf.Duration max_lead_time_duration = 2
+      ;
+}
+
+// A closed-open time range.
+message TimeOfDayRange {
+  // A Time indicating the beginning time of the day of the range (inclusive).
+  // Required. If not given, we assume 00:00:00.
+  google.type.TimeOfDay open_time = 1;
+  // A Time indicating the ending time of the day of the range (exclusive).
+  // Required. If not given, we assume 23:59:59.
+  google.type.TimeOfDay close_time = 2;
+}
+
+// A closed-open duration range.
+message DurationInterval {
+  // The minimum duration (inclusive).
+  // Required.
+  google.protobuf.Duration min_offset = 1
+      ;
+  // The maximum duration (exclusive).
+  // Required.
+  google.protobuf.Duration max_offset = 2
+      ;
+}
+
+// A closed-open timestamp range.
+message ValidityRange {
+  // The beginning time of the range (inclusive).
+  // Optional.
+  google.protobuf.Timestamp valid_from_time = 1
+      ;
+  // The ending time of the range (exclusive).
+  // Optional.
+  google.protobuf.Timestamp valid_through_time = 2
+      ;
+}
+
+// The TimeWindow object is a composite entity that describes a list
+// of windows the user's order can be either placed or fulfilled.
+message TimeOfDayWindow {
+  // The time window the order can be placed/fulfilled.
+  // Required.
+  TimeOfDayRange time_windows = 1
+      ;
+  // The list of days in a week the windows are applied.
+  // Required. If not given, we assume 7 days a week.
+  repeated google.type.DayOfWeek day_of_week = 2
+      ;
+}
+
+message AsapTimeWindow {
+  // A time window the ASAP order can be placed and fulfilled.
+  // Required.
+  TimeOfDayWindow time_windows = 1
+      ;
+
+  // Indicates the lead time, specific to service_time, the service can
+  // be fulfilled.
+  // Optional.
+  ETA lead_time = 2;
+}
+
+// The fulfillment time window for advance orders.
+message AdvanceTimeWindow {
+  // A time window the advance order can be fulfilled.
+  // Required.
+  TimeOfDayWindow time_windows = 1
+      ;
+  // a window that an advance order can be placed.  For example, an advance
+  // order must be placed at least 60 minutes ahead and not exceeding 2
+  // days, the interval would be [PT60M, P2D).
+  // Optional.
+  DurationInterval advance_booking_interval = 2;
+}
+
+// Service hours entity for ASAP/Advance orders.
+message ServiceHours {
+  // Unique identifier of the provided advance service hours.
+  // Required.
+  string hours_id = 1
+      ;
+
+  // The unique identifier of the Service entity correlated to this ServiceHours
+  // entity.
+  // Required.
+  repeated string service_ids = 2
+      ;
+  // The hours the orders can be fulfilled. For ASAP services, this is also
+  // orderable time.
+  // One of the fields (asap_hours/advance_hours) is required to be set.
+  repeated AsapTimeWindow asap_hours = 3
+      ;
+  repeated AdvanceTimeWindow advance_hours = 4;
+
+  // When advance ordering services, this is the time windows the orders can be
+  // placed.
+  // Required when advance_hour is given. Invalid when asap_hour is given.
+  repeated TimeOfDayWindow orderable_time = 5
+      ;
+
+  // Indicates if the service hours are for special occasions
+  // (e.g. Thanksgiving/...)
+  // Optional
+  optional bool special_hour = 6;
+  // A timestamp window indicating the validity of the special hours.
+  // Optional. Required if it's special hours.
+  ValidityRange validity_range = 7
+      ;
+}
+
+// Geographical circular area described by a point and radius.
+message GeoCircle {
+  // Geographical center of the area.
+  // Required.
+  google.type.LatLng center =
+      1
+      ;
+
+  // Radius for the circular area, in meters. Must be greater than 0.
+  // Required.
+  double radius = 2
+      ;
+}
+
+// Geolocation of interests.
+message Locality {
+  string country_code = 1
+      ;
+
+  // Postal code in the country's local format in string.
+  string postal_code =
+      2
+      ;
+}
+
+// Represents a loop of geo coordinates. This should be a valid S2Loop.
+message Loop {
+  // Points making the boundary of loop.
+  repeated google.type.LatLng point =
+      1
+      ;
+}
+
+// Represents a polygon shaped region.
+message Polygon {
+  reserved 1;
+
+  // List of S2Loops which defines a polygon. A point is considered in the
+  // polygon if it is contained in odd number of loops.
+  repeated Loop loops = 2
+      ;
+}
+
+message ServiceArea {
+  // Unique identifier.
+  // Required.
+  string area_id = 1
+      ;
+  // Identifier to the parent service entity.
+  // Required.
+  repeated string service_ids = 2
+      ;
+  // One of the following needs to be provided to define the service area.
+  // Required.
+  oneof region {
+
+    GeoCircle circle = 3;
+    Locality locality = 4;
+    Polygon polygon = 5;
+  }
+
+  // Sets to true if the assigned area is excluded from serving.
+  // Optional.
+  optional bool excluded_area = 6;
+}
+
+// Wrapper for a range of monetary amount that could be bounded or unbounded.
+// At least one of min_amount or max_amount is required.
+message MoneyRange {
+  // Minimum amount.
+  google.type.Money min_amount = 1
+      ;
+  // Maximum amount.
+  google.type.Money max_amount = 2
+      ;
+}
+
+// Variable fee which changes based on the price of the order.
+message PercentageBasedFee {
+  // Optional, base fee not including the variable percentage based fee.
+  google.type.Money base_value = 1
+      ;
+
+  // Optional, overall range of possible values of the PercentageBasedFee.
+  optional MoneyRange range = 2;
+
+  // Optional, percentage representing an additional variable fee based on
+  // the cart subtotal. E.g. 15.0 represents a fee of 15% of the cart.
+  optional double percentage_of_cart_value = 3
+      ;
+}
+
+message Fee {
+  // Unique identifier to the Fee entity.
+  // Required.
+  string fee_id = 1
+      ;
+  enum FeeType {
+    FEE_TYPE_UNKNOWN = 0;
+    DELIVERY = 1;
+    SERVICE = 2;
+  }
+  // Indicates the nature of the service, e.g. delivery fee/service fee.
+  // Required.
+  FeeType fee_type = 2
+      ;
+
+  oneof amount {
+
+    // A fixed amount of fees to be collected.
+    google.type.Money fixed_amount = 3;
+    // A range of fees that could be collected. Will mirror
+    // madden.ingestion.MoneyRange for the starting point.
+    MoneyRange range_amount = 4;
+    // Fees in terms of amount percentage. Will mirror
+    // madden.ingestion.QuantitativeValue for the starter.
+    PercentageBasedFee cart_percentage = 5;
+  }
+  // Service association needs to be provided.
+  // Required.
+  repeated string service_ids = 6
+      ;
+  // Service area can be provided to further restrict eligibility of the
+  // fee.
+  // Optional.
+  repeated string area_ids = 7
+      ;
+}
diff --git a/order-redirect/java/src/main/proto/google/protobuf/duration.proto b/order-redirect/java/src/main/proto/google/protobuf/duration.proto
new file mode 100644
index 0000000..41f40c2
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/protobuf/duration.proto
@@ -0,0 +1,115 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/durationpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DurationProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Duration represents a signed, fixed-length span of time represented
+// as a count of seconds and fractions of seconds at nanosecond
+// resolution. It is independent of any calendar and concepts like "day"
+// or "month". It is related to Timestamp in that the difference between
+// two Timestamp values is a Duration and it can be added or subtracted
+// from a Timestamp. Range is approximately +-10,000 years.
+//
+// # Examples
+//
+// Example 1: Compute Duration from two Timestamps in pseudo code.
+//
+//     Timestamp start = ...;
+//     Timestamp end = ...;
+//     Duration duration = ...;
+//
+//     duration.seconds = end.seconds - start.seconds;
+//     duration.nanos = end.nanos - start.nanos;
+//
+//     if (duration.seconds < 0 && duration.nanos > 0) {
+//       duration.seconds += 1;
+//       duration.nanos -= 1000000000;
+//     } else if (duration.seconds > 0 && duration.nanos < 0) {
+//       duration.seconds -= 1;
+//       duration.nanos += 1000000000;
+//     }
+//
+// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+//
+//     Timestamp start = ...;
+//     Duration duration = ...;
+//     Timestamp end = ...;
+//
+//     end.seconds = start.seconds + duration.seconds;
+//     end.nanos = start.nanos + duration.nanos;
+//
+//     if (end.nanos < 0) {
+//       end.seconds -= 1;
+//       end.nanos += 1000000000;
+//     } else if (end.nanos >= 1000000000) {
+//       end.seconds += 1;
+//       end.nanos -= 1000000000;
+//     }
+//
+// Example 3: Compute Duration from datetime.timedelta in Python.
+//
+//     td = datetime.timedelta(days=3, minutes=10)
+//     duration = Duration()
+//     duration.FromTimedelta(td)
+//
+// # JSON Mapping
+//
+// In JSON format, the Duration type is encoded as a string rather than an
+// object, where the string ends in the suffix "s" (indicating seconds) and
+// is preceded by the number of seconds, with nanoseconds expressed as
+// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
+// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
+// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
+// microsecond should be expressed in JSON format as "3.000001s".
+//
+message Duration {
+  // Signed seconds of the span of time. Must be from -315,576,000,000
+  // to +315,576,000,000 inclusive. Note: these bounds are computed from:
+  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+  int64 seconds = 1;
+
+  // Signed fractions of a second at nanosecond resolution of the span
+  // of time. Durations less than one second are represented with a 0
+  // `seconds` field and a positive or negative `nanos` field. For durations
+  // of one second or more, a non-zero value for the `nanos` field must be
+  // of the same sign as the `seconds` field. Must be from -999,999,999
+  // to +999,999,999 inclusive.
+  int32 nanos = 2;
+}
diff --git a/order-redirect/java/src/main/proto/google/protobuf/timestamp.proto b/order-redirect/java/src/main/proto/google/protobuf/timestamp.proto
new file mode 100644
index 0000000..fd0bc07
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/protobuf/timestamp.proto
@@ -0,0 +1,144 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/timestamppb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TimestampProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Timestamp represents a point in time independent of any time zone or local
+// calendar, encoded as a count of seconds and fractions of seconds at
+// nanosecond resolution. The count is relative to an epoch at UTC midnight on
+// January 1, 1970, in the proleptic Gregorian calendar which extends the
+// Gregorian calendar backwards to year one.
+//
+// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+// second table is needed for interpretation, using a [24-hour linear
+// smear](https://developers.google.com/time/smear).
+//
+// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+// restricting to that range, we ensure that we can convert to and from [RFC
+// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+//
+// # Examples
+//
+// Example 1: Compute Timestamp from POSIX `time()`.
+//
+//     Timestamp timestamp;
+//     timestamp.set_seconds(time(NULL));
+//     timestamp.set_nanos(0);
+//
+// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+//
+//     struct timeval tv;
+//     gettimeofday(&tv, NULL);
+//
+//     Timestamp timestamp;
+//     timestamp.set_seconds(tv.tv_sec);
+//     timestamp.set_nanos(tv.tv_usec * 1000);
+//
+// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+//
+//     FILETIME ft;
+//     GetSystemTimeAsFileTime(&ft);
+//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+//
+//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+//     Timestamp timestamp;
+//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+//
+// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+//
+//     long millis = System.currentTimeMillis();
+//
+//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+//         .setNanos((int) ((millis % 1000) * 1000000)).build();
+//
+// Example 5: Compute Timestamp from Java `Instant.now()`.
+//
+//     Instant now = Instant.now();
+//
+//     Timestamp timestamp =
+//         Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+//             .setNanos(now.getNano()).build();
+//
+// Example 6: Compute Timestamp from current time in Python.
+//
+//     timestamp = Timestamp()
+//     timestamp.GetCurrentTime()
+//
+// # JSON Mapping
+//
+// In JSON format, the Timestamp type is encoded as a string in the
+// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+// where {year} is always expressed using four digits while {month}, {day},
+// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+// is required. A proto3 JSON serializer should always use UTC (as indicated by
+// "Z") when printing the Timestamp type and a proto3 JSON parser should be
+// able to accept both UTC and other timezones (as indicated by an offset).
+//
+// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+// 01:30 UTC on January 15, 2017.
+//
+// In JavaScript, one can convert a Date object to this format using the
+// standard
+// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+// method. In Python, a standard `datetime.datetime` object can be converted
+// to this format using
+// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+// the Joda Time's [`ISODateTimeFormat.dateTime()`](
+// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
+// ) to obtain a formatter capable of generating timestamps in this format.
+//
+message Timestamp {
+  // Represents seconds of UTC time since Unix epoch
+  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+  // 9999-12-31T23:59:59Z inclusive.
+  int64 seconds = 1;
+
+  // Non-negative fractions of a second at nanosecond resolution. Negative
+  // second values with fractions must still have non-negative nanos values
+  // that count forward in time. Must be from 0 to 999,999,999
+  // inclusive.
+  int32 nanos = 2;
+}
diff --git a/order-redirect/java/src/main/proto/google/type/dayofweek.proto b/order-redirect/java/src/main/proto/google/type/dayofweek.proto
new file mode 100644
index 0000000..4c80c62
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/type/dayofweek.proto
@@ -0,0 +1,50 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option go_package = "google.golang.org/genproto/googleapis/type/dayofweek;dayofweek";
+option java_multiple_files = true;
+option java_outer_classname = "DayOfWeekProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Represents a day of the week.
+enum DayOfWeek {
+  // The day of the week is unspecified.
+  DAY_OF_WEEK_UNSPECIFIED = 0;
+
+  // Monday
+  MONDAY = 1;
+
+  // Tuesday
+  TUESDAY = 2;
+
+  // Wednesday
+  WEDNESDAY = 3;
+
+  // Thursday
+  THURSDAY = 4;
+
+  // Friday
+  FRIDAY = 5;
+
+  // Saturday
+  SATURDAY = 6;
+
+  // Sunday
+  SUNDAY = 7;
+}
diff --git a/order-redirect/java/src/main/proto/google/type/latlng.proto b/order-redirect/java/src/main/proto/google/type/latlng.proto
new file mode 100644
index 0000000..9231456
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/type/latlng.proto
@@ -0,0 +1,37 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/latlng;latlng";
+option java_multiple_files = true;
+option java_outer_classname = "LatLngProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// An object that represents a latitude/longitude pair. This is expressed as a
+// pair of doubles to represent degrees latitude and degrees longitude. Unless
+// specified otherwise, this must conform to the
+// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
+// standard</a>. Values must be within normalized ranges.
+message LatLng {
+  // The latitude in degrees. It must be in the range [-90.0, +90.0].
+  double latitude = 1;
+
+  // The longitude in degrees. It must be in the range [-180.0, +180.0].
+  double longitude = 2;
+}
diff --git a/order-redirect/java/src/main/proto/google/type/money.proto b/order-redirect/java/src/main/proto/google/type/money.proto
new file mode 100644
index 0000000..98d6494
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/type/money.proto
@@ -0,0 +1,42 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/money;money";
+option java_multiple_files = true;
+option java_outer_classname = "MoneyProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Represents an amount of money with its currency type.
+message Money {
+  // The three-letter currency code defined in ISO 4217.
+  string currency_code = 1;
+
+  // The whole units of the amount.
+  // For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+  int64 units = 2;
+
+  // Number of nano (10^-9) units of the amount.
+  // The value must be between -999,999,999 and +999,999,999 inclusive.
+  // If `units` is positive, `nanos` must be positive or zero.
+  // If `units` is zero, `nanos` can be positive, zero, or negative.
+  // If `units` is negative, `nanos` must be negative or zero.
+  // For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+  int32 nanos = 3;
+}
diff --git a/order-redirect/java/src/main/proto/google/type/timeofday.proto b/order-redirect/java/src/main/proto/google/type/timeofday.proto
new file mode 100644
index 0000000..5cb48aa
--- /dev/null
+++ b/order-redirect/java/src/main/proto/google/type/timeofday.proto
@@ -0,0 +1,44 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/timeofday;timeofday";
+option java_multiple_files = true;
+option java_outer_classname = "TimeOfDayProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Represents a time of day. The date and time zone are either not significant
+// or are specified elsewhere. An API may choose to allow leap seconds. Related
+// types are [google.type.Date][google.type.Date] and
+// `google.protobuf.Timestamp`.
+message TimeOfDay {
+  // Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+  // to allow the value "24:00:00" for scenarios like business closing time.
+  int32 hours = 1;
+
+  // Minutes of hour of day. Must be from 0 to 59.
+  int32 minutes = 2;
+
+  // Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+  // allow the value 60 if it allows leap-seconds.
+  int32 seconds = 3;
+
+  // Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+  int32 nanos = 4;
+}