This file contains a list of people who have made large contributions
to the public version of Protocol Buffers.

Original Protocol Buffers design and implementation:
  Sanjay Ghemawat <sanjay@google.com>
  Jeff Dean <jeff@google.com>
  Daniel Dulitz <daniel@google.com>
  Craig Silverstein
  Paul Haahr <haahr@google.com>
  Corey Anderson <corin@google.com>
  (and many others)

Proto2 C++ and Java primary author:
  Kenton Varda <kenton@google.com>

Proto2 Python primary authors:
  Will Robinson <robinson@google.com>
  Petar Petrov <petar@google.com>

Large code contributions:
  Jason Hsueh <jasonh@google.com>
  Joseph Schorr <jschorr@google.com>
  Wenbo Zhu <wenboz@google.com>

Large quantity of code reviews:
  Scott Bruce <sbruce@google.com>
  Frank Yellin
  Neal Norwitz <nnorwitz@google.com>
  Jeffrey Yasskin <jyasskin@google.com>
  Ambrose Feinstein <ambrose@google.com>

Documentation:
  Lisa Carey <lcarey@google.com>

Maven packaging:
  Gregory Kick <gak@google.com>

Patch contributors:
  Kevin Ko <kevin.s.ko@gmail.com>
    * Small patch to handle trailing slashes in --proto_path flag.
  Johan Euphrosine <proppy@aminche.com>
    * Small patch to fix Python CallMethod().
  Ulrich Kunitz <kune@deine-taler.de>
    * Small optimizations to Python serialization.
  Leandro Lucarella <llucax@gmail.com>
    * VI syntax highlighting tweaks.
    * Fix compiler to not make output executable.
  Dilip Joseph <dilip.antony.joseph@gmail.com>
    * Heuristic detection of sub-messages when printing unknown fields in
      text format.
  Brian Atkinson <nairb774@gmail.com>
    * Added @Override annotation to generated Java code where appropriate.
  Vincent Choinière <Choiniere.Vincent@hydro.qc.ca>
    * Tru64 support.
  Monty Taylor <monty.taylor@gmail.com>
    * Solaris 10 + Sun Studio fixes.
  Alek Storm <alek.storm@gmail.com>
    * Slicing support for repeated scalar fields for the Python API.
  Oleg Smolsky <oleg.smolsky@gmail.com>
    * MS Visual Studio error format option.
    * Detect unordered_map in stl_hash.m4.
  Brian Olson <brianolson@google.com>
    * gzip/zlib I/O support.
  Michael Poole <mdpoole@troilus.org>
    * Fixed warnings about generated constructors not explicitly initializing
      all fields (only present with certain compiler settings).
    * Added generation of field number constants.
  Wink Saville <wink@google.com>
    * Fixed initialization ordering problem in logging code.
  Will Pierce <willp@nuclei.com>
    * Small patch improving performance of in Python serialization.
  Alexandre Vassalotti <alexandre@peadrop.com>
    * Emacs mode for Protocol Buffers (editors/protobuf-mode.el).
  Scott Stafford <scott.stafford@gmail.com>
    * Added Swap(), SwapElements(), and RemoveLast() to Reflection interface.
  Alexander Melnikov <alm@sibmail.ru>
    * HPUX support.
  Oliver Jowett <oliver.jowett@gmail.com>
    * Detect whether zlib is new enough in configure script.
    * Fixes for Solaris 10 32/64-bit confusion.
  Evan Jones <evanj@mit.edu>
    * Optimize Java serialization code when writing a small message to a stream.
    * Optimize Java serialization of strings so that UTF-8 encoding happens only
      once per string per serialization call.
    * Clean up some Java warnings.
    * Fix bug with permanent callbacks that delete themselves when run.
  Michael Kucharski <m.kucharski@gmail.com>
    * Added CodedInputStream.getTotalBytesRead().
  Kacper Kowalik <xarthisius.kk@gmail.com>
    * Fixed m4/acx_pthread.m4 problem for some Linux distributions.
  William Orr <will@worrbase.com>
    * Fixed detection of sched_yield on Solaris.
    * Added atomicops for Solaris
