Internal change

PiperOrigin-RevId: 494043842
diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc
index 6b750b1..360d298 100644
--- a/src/google/protobuf/descriptor.pb.cc
+++ b/src/google/protobuf/descriptor.pb.cc
@@ -330,7 +330,8 @@
   , /*decltype(_impl_.lazy_)*/false
   , /*decltype(_impl_.unverified_lazy_)*/false
   , /*decltype(_impl_.deprecated_)*/false
-  , /*decltype(_impl_.weak_)*/false} {}
+  , /*decltype(_impl_.weak_)*/false
+  , /*decltype(_impl_.debug_redact_)*/false} {}
 struct FieldOptionsDefaultTypeInternal {
   PROTOBUF_CONSTEXPR FieldOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
   ~FieldOptionsDefaultTypeInternal() {}
@@ -848,6 +849,7 @@
     PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.unverified_lazy_),
     PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.deprecated_),
     PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.weak_),
+    PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.debug_redact_),
     PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.uninterpreted_option_),
     0,
     2,
@@ -856,6 +858,7 @@
     4,
     5,
     6,
+    7,
     ~0u,
     ~0u,  // no _has_bits_
     PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _internal_metadata_),
@@ -1025,18 +1028,18 @@
         { 206, 220, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto)},
         { 226, 255, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileOptions)},
         { 276, 289, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MessageOptions)},
-        { 294, 310, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldOptions)},
-        { 318, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofOptions)},
-        { 327, 338, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumOptions)},
-        { 341, 351, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueOptions)},
-        { 353, 363, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceOptions)},
-        { 365, 376, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodOptions)},
-        { 379, 389, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart)},
-        { 391, 406, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption)},
-        { 413, 426, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location)},
-        { 431, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo)},
-        { 440, 453, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation)},
-        { 458, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo)},
+        { 294, 311, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldOptions)},
+        { 320, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofOptions)},
+        { 329, 340, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumOptions)},
+        { 343, 353, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueOptions)},
+        { 355, 365, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceOptions)},
+        { 367, 378, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodOptions)},
+        { 381, 391, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart)},
+        { 393, 408, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption)},
+        { 415, 428, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location)},
+        { 433, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo)},
+        { 442, 455, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation)},
+        { 460, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo)},
 };
 
 static const ::_pb::Message* const file_default_instances[] = {
@@ -1170,67 +1173,68 @@
     "entry\030\007 \001(\010\022C\n\024uninterpreted_option\030\347\007 \003"
     "(\0132$.google.protobuf.UninterpretedOption"
     "*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005J\004\010\005\020\006J\004\010\006\020\007J\004\010\010\020\tJ\004\010\t\020"
-    "\n\"\276\003\n\014FieldOptions\022:\n\005ctype\030\001 \001(\0162#.goog"
+    "\n\"\333\003\n\014FieldOptions\022:\n\005ctype\030\001 \001(\0162#.goog"
     "le.protobuf.FieldOptions.CType:\006STRING\022\016"
     "\n\006packed\030\002 \001(\010\022\?\n\006jstype\030\006 \001(\0162$.google."
     "protobuf.FieldOptions.JSType:\tJS_NORMAL\022"
     "\023\n\004lazy\030\005 \001(\010:\005false\022\036\n\017unverified_lazy\030"
     "\017 \001(\010:\005false\022\031\n\ndeprecated\030\003 \001(\010:\005false\022"
-    "\023\n\004weak\030\n \001(\010:\005false\022C\n\024uninterpreted_op"
-    "tion\030\347\007 \003(\0132$.google.protobuf.Uninterpre"
-    "tedOption\"/\n\005CType\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001"
-    "\022\020\n\014STRING_PIECE\020\002\"5\n\006JSType\022\r\n\tJS_NORMA"
-    "L\020\000\022\r\n\tJS_STRING\020\001\022\r\n\tJS_NUMBER\020\002*\t\010\350\007\020\200"
-    "\200\200\200\002J\004\010\004\020\005\"^\n\014OneofOptions\022C\n\024uninterpre"
-    "ted_option\030\347\007 \003(\0132$.google.protobuf.Unin"
-    "terpretedOption*\t\010\350\007\020\200\200\200\200\002\"\223\001\n\013EnumOptio"
-    "ns\022\023\n\013allow_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 "
-    "\001(\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003("
-    "\0132$.google.protobuf.UninterpretedOption*"
-    "\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\"}\n\020EnumValueOptions\022\031\n\n"
-    "deprecated\030\001 \001(\010:\005false\022C\n\024uninterpreted"
-    "_option\030\347\007 \003(\0132$.google.protobuf.Uninter"
-    "pretedOption*\t\010\350\007\020\200\200\200\200\002\"{\n\016ServiceOption"
-    "s\022\031\n\ndeprecated\030! \001(\010:\005false\022C\n\024uninterp"
-    "reted_option\030\347\007 \003(\0132$.google.protobuf.Un"
-    "interpretedOption*\t\010\350\007\020\200\200\200\200\002\"\255\002\n\rMethodO"
-    "ptions\022\031\n\ndeprecated\030! \001(\010:\005false\022_\n\021ide"
-    "mpotency_level\030\" \001(\0162/.google.protobuf.M"
-    "ethodOptions.IdempotencyLevel:\023IDEMPOTEN"
-    "CY_UNKNOWN\022C\n\024uninterpreted_option\030\347\007 \003("
-    "\0132$.google.protobuf.UninterpretedOption\""
-    "P\n\020IdempotencyLevel\022\027\n\023IDEMPOTENCY_UNKNO"
-    "WN\020\000\022\023\n\017NO_SIDE_EFFECTS\020\001\022\016\n\nIDEMPOTENT\020"
-    "\002*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023UninterpretedOption\022;\n\004"
-    "name\030\002 \003(\0132-.google.protobuf.Uninterpret"
-    "edOption.NamePart\022\030\n\020identifier_value\030\003 "
-    "\001(\t\022\032\n\022positive_int_value\030\004 \001(\004\022\032\n\022negat"
-    "ive_int_value\030\005 \001(\003\022\024\n\014double_value\030\006 \001("
-    "\001\022\024\n\014string_value\030\007 \001(\014\022\027\n\017aggregate_val"
-    "ue\030\010 \001(\t\0323\n\010NamePart\022\021\n\tname_part\030\001 \002(\t\022"
-    "\024\n\014is_extension\030\002 \002(\010\"\325\001\n\016SourceCodeInfo"
-    "\022:\n\010location\030\001 \003(\0132(.google.protobuf.Sou"
-    "rceCodeInfo.Location\032\206\001\n\010Location\022\020\n\004pat"
-    "h\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n\020leading"
-    "_comments\030\003 \001(\t\022\031\n\021trailing_comments\030\004 \001"
-    "(\t\022!\n\031leading_detached_comments\030\006 \003(\t\"\234\002"
-    "\n\021GeneratedCodeInfo\022A\n\nannotation\030\001 \003(\0132"
-    "-.google.protobuf.GeneratedCodeInfo.Anno"
-    "tation\032\303\001\n\nAnnotation\022\020\n\004path\030\001 \003(\005B\002\020\001\022"
-    "\023\n\013source_file\030\002 \001(\t\022\r\n\005begin\030\003 \001(\005\022\013\n\003e"
-    "nd\030\004 \001(\005\022H\n\010semantic\030\005 \001(\01626.google.prot"
-    "obuf.GeneratedCodeInfo.Annotation.Semant"
-    "ic\"(\n\010Semantic\022\010\n\004NONE\020\000\022\007\n\003SET\020\001\022\t\n\005ALI"
-    "AS\020\002B~\n\023com.google.protobufB\020DescriptorP"
-    "rotosH\001Z-google.golang.org/protobuf/type"
-    "s/descriptorpb\370\001\001\242\002\003GPB\252\002\032Google.Protobu"
-    "f.Reflection"
+    "\023\n\004weak\030\n \001(\010:\005false\022\033\n\014debug_redact\030\020 \001"
+    "(\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003(\013"
+    "2$.google.protobuf.UninterpretedOption\"/"
+    "\n\005CType\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_"
+    "PIECE\020\002\"5\n\006JSType\022\r\n\tJS_NORMAL\020\000\022\r\n\tJS_S"
+    "TRING\020\001\022\r\n\tJS_NUMBER\020\002*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005\""
+    "^\n\014OneofOptions\022C\n\024uninterpreted_option\030"
+    "\347\007 \003(\0132$.google.protobuf.UninterpretedOp"
+    "tion*\t\010\350\007\020\200\200\200\200\002\"\223\001\n\013EnumOptions\022\023\n\013allow"
+    "_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 \001(\010:\005false\022"
+    "C\n\024uninterpreted_option\030\347\007 \003(\0132$.google."
+    "protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002J"
+    "\004\010\005\020\006\"}\n\020EnumValueOptions\022\031\n\ndeprecated\030"
+    "\001 \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007 "
+    "\003(\0132$.google.protobuf.UninterpretedOptio"
+    "n*\t\010\350\007\020\200\200\200\200\002\"{\n\016ServiceOptions\022\031\n\ndeprec"
+    "ated\030! \001(\010:\005false\022C\n\024uninterpreted_optio"
+    "n\030\347\007 \003(\0132$.google.protobuf.Uninterpreted"
+    "Option*\t\010\350\007\020\200\200\200\200\002\"\255\002\n\rMethodOptions\022\031\n\nd"
+    "eprecated\030! \001(\010:\005false\022_\n\021idempotency_le"
+    "vel\030\" \001(\0162/.google.protobuf.MethodOption"
+    "s.IdempotencyLevel:\023IDEMPOTENCY_UNKNOWN\022"
+    "C\n\024uninterpreted_option\030\347\007 \003(\0132$.google."
+    "protobuf.UninterpretedOption\"P\n\020Idempote"
+    "ncyLevel\022\027\n\023IDEMPOTENCY_UNKNOWN\020\000\022\023\n\017NO_"
+    "SIDE_EFFECTS\020\001\022\016\n\nIDEMPOTENT\020\002*\t\010\350\007\020\200\200\200\200"
+    "\002\"\236\002\n\023UninterpretedOption\022;\n\004name\030\002 \003(\0132"
+    "-.google.protobuf.UninterpretedOption.Na"
+    "mePart\022\030\n\020identifier_value\030\003 \001(\t\022\032\n\022posi"
+    "tive_int_value\030\004 \001(\004\022\032\n\022negative_int_val"
+    "ue\030\005 \001(\003\022\024\n\014double_value\030\006 \001(\001\022\024\n\014string"
+    "_value\030\007 \001(\014\022\027\n\017aggregate_value\030\010 \001(\t\0323\n"
+    "\010NamePart\022\021\n\tname_part\030\001 \002(\t\022\024\n\014is_exten"
+    "sion\030\002 \002(\010\"\325\001\n\016SourceCodeInfo\022:\n\010locatio"
+    "n\030\001 \003(\0132(.google.protobuf.SourceCodeInfo"
+    ".Location\032\206\001\n\010Location\022\020\n\004path\030\001 \003(\005B\002\020\001"
+    "\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n\020leading_comments\030\003"
+    " \001(\t\022\031\n\021trailing_comments\030\004 \001(\t\022!\n\031leadi"
+    "ng_detached_comments\030\006 \003(\t\"\234\002\n\021Generated"
+    "CodeInfo\022A\n\nannotation\030\001 \003(\0132-.google.pr"
+    "otobuf.GeneratedCodeInfo.Annotation\032\303\001\n\n"
+    "Annotation\022\020\n\004path\030\001 \003(\005B\002\020\001\022\023\n\013source_f"
+    "ile\030\002 \001(\t\022\r\n\005begin\030\003 \001(\005\022\013\n\003end\030\004 \001(\005\022H\n"
+    "\010semantic\030\005 \001(\01626.google.protobuf.Genera"
+    "tedCodeInfo.Annotation.Semantic\"(\n\010Seman"
+    "tic\022\010\n\004NONE\020\000\022\007\n\003SET\020\001\022\t\n\005ALIAS\020\002B~\n\023com"
+    ".google.protobufB\020DescriptorProtosH\001Z-go"
+    "ogle.golang.org/protobuf/types/descripto"
+    "rpb\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Reflectio"
+    "n"
 };
 static ::absl::once_flag descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once;
 const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fdescriptor_2eproto = {
     false,
     false,
-    6212,
+    6241,
     descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
     "google/protobuf/descriptor.proto",
     &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
@@ -8017,6 +8021,9 @@
   static void set_has_weak(HasBits* has_bits) {
     (*has_bits)[0] |= 64u;
   }
+  static void set_has_debug_redact(HasBits* has_bits) {
+    (*has_bits)[0] |= 128u;
+  }
 };
 
 FieldOptions::FieldOptions(::PROTOBUF_NAMESPACE_ID::Arena* arena,
@@ -8039,13 +8046,14 @@
     , decltype(_impl_.lazy_){}
     , decltype(_impl_.unverified_lazy_){}
     , decltype(_impl_.deprecated_){}
-    , decltype(_impl_.weak_){}};
+    , decltype(_impl_.weak_){}
+    , decltype(_impl_.debug_redact_){}};
 
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   _impl_._extensions_.MergeFrom(internal_default_instance(), from._impl_._extensions_);
   ::memcpy(&_impl_.ctype_, &from._impl_.ctype_,
-    static_cast<::size_t>(reinterpret_cast<char*>(&_impl_.weak_) -
-    reinterpret_cast<char*>(&_impl_.ctype_)) + sizeof(_impl_.weak_));
+    static_cast<::size_t>(reinterpret_cast<char*>(&_impl_.debug_redact_) -
+    reinterpret_cast<char*>(&_impl_.ctype_)) + sizeof(_impl_.debug_redact_));
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions)
 }
 
@@ -8065,6 +8073,7 @@
     , decltype(_impl_.unverified_lazy_){false}
     , decltype(_impl_.deprecated_){false}
     , decltype(_impl_.weak_){false}
+    , decltype(_impl_.debug_redact_){false}
   };
 }
 
@@ -8096,10 +8105,10 @@
   _impl_._extensions_.Clear();
   _impl_.uninterpreted_option_.Clear();
   cached_has_bits = _impl_._has_bits_[0];
-  if (cached_has_bits & 0x0000007fu) {
+  if (cached_has_bits & 0x000000ffu) {
     ::memset(&_impl_.ctype_, 0, static_cast<::size_t>(
-        reinterpret_cast<char*>(&_impl_.weak_) -
-        reinterpret_cast<char*>(&_impl_.ctype_)) + sizeof(_impl_.weak_));
+        reinterpret_cast<char*>(&_impl_.debug_redact_) -
+        reinterpret_cast<char*>(&_impl_.ctype_)) + sizeof(_impl_.debug_redact_));
   }
   _impl_._has_bits_.Clear();
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
@@ -8191,6 +8200,16 @@
           goto handle_unusual;
         }
         continue;
+      // optional bool debug_redact = 16 [default = false];
+      case 16:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::uint8_t>(tag) == 128)) {
+          _Internal::set_has_debug_redact(&has_bits);
+          _impl_.debug_redact_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+        } else {
+          goto handle_unusual;
+        }
+        continue;
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999:
         if (PROTOBUF_PREDICT_TRUE(static_cast<::uint8_t>(tag) == 58)) {
@@ -8286,6 +8305,12 @@
     target = ::_pbi::WireFormatLite::WriteBoolToArray(15, this->_internal_unverified_lazy(), target);
   }
 
+  // optional bool debug_redact = 16 [default = false];
+  if (cached_has_bits & 0x00000080u) {
+    target = stream->EnsureSpace(target);
+    target = ::_pbi::WireFormatLite::WriteBoolToArray(16, this->_internal_debug_redact(), target);
+  }
+
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   for (unsigned i = 0,
       n = static_cast<unsigned>(this->_internal_uninterpreted_option_size()); i < n; i++) {
@@ -8325,7 +8350,7 @@
   }
 
   cached_has_bits = _impl_._has_bits_[0];
-  if (cached_has_bits & 0x0000007fu) {
+  if (cached_has_bits & 0x000000ffu) {
     // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
     if (cached_has_bits & 0x00000001u) {
       total_size += 1 +
@@ -8363,6 +8388,11 @@
       total_size += 1 + 1;
     }
 
+    // optional bool debug_redact = 16 [default = false];
+    if (cached_has_bits & 0x00000080u) {
+      total_size += 2 + 1;
+    }
+
   }
   return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
 }
@@ -8385,7 +8415,7 @@
 
   _this->_impl_.uninterpreted_option_.MergeFrom(from._impl_.uninterpreted_option_);
   cached_has_bits = from._impl_._has_bits_[0];
-  if (cached_has_bits & 0x0000007fu) {
+  if (cached_has_bits & 0x000000ffu) {
     if (cached_has_bits & 0x00000001u) {
       _this->_impl_.ctype_ = from._impl_.ctype_;
     }
@@ -8407,6 +8437,9 @@
     if (cached_has_bits & 0x00000040u) {
       _this->_impl_.weak_ = from._impl_.weak_;
     }
+    if (cached_has_bits & 0x00000080u) {
+      _this->_impl_.debug_redact_ = from._impl_.debug_redact_;
+    }
     _this->_impl_._has_bits_[0] |= cached_has_bits;
   }
   _this->_impl_._extensions_.MergeFrom(internal_default_instance(), from._impl_._extensions_);
@@ -8437,8 +8470,8 @@
   swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
   _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.weak_)
-      + sizeof(FieldOptions::_impl_.weak_)
+      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.debug_redact_)
+      + sizeof(FieldOptions::_impl_.debug_redact_)
       - PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.ctype_)>(
           reinterpret_cast<char*>(&_impl_.ctype_),
           reinterpret_cast<char*>(&other->_impl_.ctype_));
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index 40413f1..93a1f48 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -4860,6 +4860,7 @@
     kUnverifiedLazyFieldNumber = 15,
     kDeprecatedFieldNumber = 3,
     kWeakFieldNumber = 10,
+    kDebugRedactFieldNumber = 16,
   };
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
@@ -4949,6 +4950,16 @@
   void _internal_set_weak(bool value);
   public:
 
+  // optional bool debug_redact = 16 [default = false];
+  bool has_debug_redact() const;
+  void clear_debug_redact();
+  bool debug_redact() const;
+  void set_debug_redact(bool value);
+  private:
+  bool _internal_debug_redact() const;
+  void _internal_set_debug_redact(bool value);
+  public:
+
 
   template <typename _proto_TypeTraits,
             ::PROTOBUF_NAMESPACE_ID::internal::FieldType _field_type,
@@ -5159,6 +5170,7 @@
     bool unverified_lazy_;
     bool deprecated_;
     bool weak_;
+    bool debug_redact_;
   };
   union { Impl_ _impl_; };
   friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
@@ -12851,6 +12863,31 @@
   // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.weak)
 }
 
+// optional bool debug_redact = 16 [default = false];
+inline bool FieldOptions::has_debug_redact() const {
+  bool value = (_impl_._has_bits_[0] & 0x00000080u) != 0;
+  return value;
+}
+inline void FieldOptions::clear_debug_redact() {
+  _impl_.debug_redact_ = false;
+  _impl_._has_bits_[0] &= ~0x00000080u;
+}
+inline bool FieldOptions::_internal_debug_redact() const {
+  return _impl_.debug_redact_;
+}
+inline bool FieldOptions::debug_redact() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.debug_redact)
+  return _internal_debug_redact();
+}
+inline void FieldOptions::_internal_set_debug_redact(bool value) {
+  _impl_._has_bits_[0] |= 0x00000080u;
+  _impl_.debug_redact_ = value;
+}
+inline void FieldOptions::set_debug_redact(bool value) {
+  _internal_set_debug_redact(value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.debug_redact)
+}
+
 // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
 inline int FieldOptions::_internal_uninterpreted_option_size() const {
   return _impl_.uninterpreted_option_.size();
diff --git a/src/google/protobuf/descriptor.proto b/src/google/protobuf/descriptor.proto
index 0636a87..7410042 100644
--- a/src/google/protobuf/descriptor.proto
+++ b/src/google/protobuf/descriptor.proto
@@ -615,6 +615,10 @@
   // For Google-internal migration only. Do not use.
   optional bool weak = 10 [default = false];
 
+  // Indicate that the field value should not be printed out when using debug
+  // formats, e.g. when the field contains sensitive credentials.
+  optional bool debug_redact = 16 [default = false];
+
   // The parser stores options it doesn't recognize here. See above.
   repeated UninterpretedOption uninterpreted_option = 999;
 
diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc
index d6298c8..778e67a 100644
--- a/src/google/protobuf/text_format.cc
+++ b/src/google/protobuf/text_format.cc
@@ -2123,12 +2123,6 @@
                                 io::ZeroCopyOutputStream* output) const {
   TextGenerator generator(output, insert_silent_marker_, initial_indent_level_);
 
-#ifndef PROTO2_OPENSOURCE
-#ifdef SUPPORT_EXPLICIT_DEBUG_STRING
-  internal::PrintTextMarker(&generator, redact_debug_string_,
-                            randomize_debug_string_, single_line_mode_);
-#endif
-#endif
 
   Print(message, &generator);
 
@@ -2579,15 +2573,11 @@
       << "Index must be -1 for non-repeated fields";
 
   const FastFieldValuePrinter* printer = GetFieldPrinter(field);
-#ifndef PROTO2_OPENSOURCE
-#ifdef SUPPORT_EXPLICIT_DEBUG_STRING
-  if (redact_debug_string_ && internal::ShouldRedactField(field)) {
-    std::string redacted_value = "go/redact-debug-string";
-    generator->PrintString(redacted_value);
+  if (redact_debug_string_ && field->options().debug_redact()) {
+    // TODO(b/258975650): Create OSS redaction documentation
+    generator->PrintString("[REDACTED]");
     return;
   }
-#endif
-#endif
 
   switch (field->cpp_type()) {
 #define OUTPUT_FIELD(CPPTYPE, METHOD)                                \
diff --git a/src/google/protobuf/text_format_unittest.cc b/src/google/protobuf/text_format_unittest.cc
index 71dd756..d9c1b05 100644
--- a/src/google/protobuf/text_format_unittest.cc
+++ b/src/google/protobuf/text_format_unittest.cc
@@ -2281,6 +2281,59 @@
   EXPECT_FALSE(parser.ParseFromString("unknown_field: 1", &proto));
 }
 
+template <bool silent, bool redact, bool randomize>
+class TextFormatBaseMarkerTest : public testing::Test {
+ public:
+  void SetUp() override {
+    saved_enable_debug_text_format_marker_ =
+        internal::enable_debug_text_format_marker;
+    saved_enable_debug_text_redaction_marker_ =
+        internal::enable_debug_text_redaction_marker;
+    saved_enable_debug_text_random_marker_ =
+        internal::enable_debug_text_random_marker;
+
+    internal::enable_debug_text_format_marker = silent;
+    internal::enable_debug_text_redaction_marker = redact;
+    internal::enable_debug_text_random_marker = randomize;
+  }
+
+  void TearDown() override {
+    internal::enable_debug_text_format_marker =
+        saved_enable_debug_text_format_marker_;
+    internal::enable_debug_text_redaction_marker =
+        saved_enable_debug_text_redaction_marker_;
+    internal::enable_debug_text_random_marker =
+        saved_enable_debug_text_random_marker_;
+  }
+
+ private:
+  bool saved_enable_debug_text_format_marker_;
+  bool saved_enable_debug_text_redaction_marker_;
+  bool saved_enable_debug_text_random_marker_;
+};
+
+using TextFormatRedactionTest = TextFormatBaseMarkerTest<false, true, false>;
+
+TEST_F(TextFormatRedactionTest, TestRedactedField) {
+  unittest::RedactedFields proto;
+  proto.set_optional_redacted_string("foo");
+  EXPECT_THAT(
+      proto.DebugString(),
+      testing::MatchesRegex("optional_redacted_string: \\[REDACTED\\]\n"));
+  EXPECT_THAT(
+      proto.ShortDebugString(),
+      testing::MatchesRegex("optional_redacted_string: \\[REDACTED\\]"));
+}
+
+TEST_F(TextFormatRedactionTest, TestTextFormatIsNotRedacted) {
+  unittest::RedactedFields proto;
+  proto.set_optional_redacted_string("foo");
+
+  std::string text;
+  ASSERT_TRUE(TextFormat::PrintToString(proto, &text));
+  EXPECT_EQ("optional_redacted_string: \"foo\"\n", text);
+}
+
 TEST(TextFormatFloatingPointTest, PreservesNegative0) {
   proto3_unittest::TestAllTypes in_message;
   in_message.set_optional_float(-0.0f);
diff --git a/src/google/protobuf/unittest.proto b/src/google/protobuf/unittest.proto
index fa95bbd..ef09f8e 100644
--- a/src/google/protobuf/unittest.proto
+++ b/src/google/protobuf/unittest.proto
@@ -1580,3 +1580,7 @@
   optional int32 OptionalInt32 = 1;
   optional int32 for = 2;
 }
+
+message RedactedFields{
+  optional string optional_redacted_string = 1 [debug_redact = true];
+}