# This is the official list of people who can contribute
# (and typically have contributed) code to the Go frontend
# repository.  The AUTHORS file lists the copyright holders; this file
# lists people.  For example, Google employees are listed here
# but not in AUTHORS, because Google holds the copyright.
#
# The submission process automatically checks to make sure
# that people submitting code are listed in this file (by email address).
#
# Names should be added to this file only after verifying that
# the individual or the individual's organization has agreed to
# the appropriate Contributor License Agreement, found here:
#
#     http://code.google.com/legal/individual-cla-v1.0.html
#     http://code.google.com/legal/corporate-cla-v1.0.html
#
# The agreement for individuals can be filled out on the web.
#
# When adding J Random Contributor's name to this file,
# either J's name or J's organization's name should be
# added to the AUTHORS file, depending on whether the
# individual or corporate CLA was used.

# Names should be added to this file like so:
#     Name <email address>

# Please keep the list sorted.

Alexander Shopov <ash@kambanaria.org> <ash%kambanaria.org@gtempaccount.com>
Andreas Krebbel <krebbel@linux.vnet.ibm.com>
Andreas Schwab <schwab@suse.de>
Andrew Wilkins <axwalk@gmail.com>
Baokun Lee <nototon@gmail.com>
Ben Shi <powerman1st@163.com>
Benny Siegert <bsiegert@gmail.com>
Cherry Zhang <cherryyz@google.com>
Chris Manghane <cmang@golang.org>
Christopher Wedgwood <cw@f00f.org>
Clément Chigot <clement.chigot@atos.net>
Dave Cheney <dave@cheney.net>
David Daney <david.daney@cavium.com>
Diego Novillo <dnovillo@google.com>
Dominik Vogt <vogt@linux.vnet.ibm.com>
Eric Fang <eric.fang@arm.com>
Ettl Martin <ettl.martin78@googlemail.com>
Evan Shaw <edsrzf@gmail.com>
Ian Lance Taylor <iant@golang.org>
James Clarke <jrtc27@jrtc27.com>
James Cowgill <james.cowgill@imgtec.com>
Janne Snabb <snabb@epipe.com>
Joel Sherrill <joel.sherrill@gmail.com>
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Lynn A. Boger <laboger@linux.vnet.ibm.com>
Maciej W. Rozycki <macro@wdc.com>
Marek Polacek <mpolacek@redhat.com>
Massimiliano Ghilardi <massimiliano.ghilardi@gmail.com>
Matthias Klose <doko@ubuntu.com>
Matthieu Sarter <matthieu.sarter.external@atos.net>
Michael Hudson-Doyle <michael.hudson@linaro.org>
Michael Matloob <matloob@google.com>
Nikhil Benesch <nikhil.benesch@gmail.com>
Paul Murphy <murp@ibm.com>
Peter Collingbourne <pcc@google.com>
Rainer Orth <ro@cebitec.uni-bielefeld.de>
Rémy Oudompheng <oudomphe@phare.normalesup.org> <remyoudompheng@gmail.com>
Richard Henderson <rth@redhat.com>
Roberto Lublinerman Reitzes <rluble@google.com> <rluble@gmail.com>
Robin Dapp <rdapp@linux.ibm.com>
Sanjoy Das <sanjoy@playingwithpointers.com> <thedigitalangel@gmail.com>
Shenghou Ma <minux@golang.org> <minux.ma@gmail.com>
Svante Signell <svante.signell@gmail.com>
Tim Shen <timshen@google.com>
Than McIntosh <thanm@google.com>
Tobias Klauser <tklauser@distanz.ch>
Tony Reix <tony.reix@bull.net>
Uros Bizjak <ubizjak@gmail.com>
Vinu Rajashekhar <vinutheraj@gmail.com>
Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
Xia Bin <snyh@snyh.org>
Xiangdong JI <xiangdong.ji@arm.com>
